Hitung n% 12


27

Hitung nmodulo 12untuk integer 32 bit yang tidak ditandatangani.

Aturan:

  • Harus berfungsi untuk semua nantara 0 dan 23. Nomor lainnya opsional.
  • Harus hanya menggunakan salah satu operator +-*, ~&^|atau <<, >>seperti yang biasa didefinisikan pada uints 32 bit.
  • Dapat menggunakan jumlah konstan konstanta
  • Tidak boleh menggunakan bentuk pointer apa pun, termasuk array, atau ifpernyataan apa pun , termasuk hal-hal yang dikompilasi jika pernyataan seperti operator ternary atau operator "lebih besar dari".

Skor:

  • Operator + -dan operator bitwise ~ & ^ | << >>(BUKAN, DAN, XOR, ATAU, pergeseran bit) memberikan skor 1, *memberikan skor 2.
  • Total skor terendah menang.

6
Anda mungkin ingin menentukan operator untuk pengguna bahasa selain C / Java. Saya mengerti +-*adalah menambah, mengurangi, memperbanyak; ~&^|TIDAK bitwise, DAN, XOR, ATAU; dan << >>bithift.
Level River St

@steveverrill - terima kasih. Itu memang niatnya.
nbubis

Bisakah saya menggunakan for i in x:y:z, .dostuff?
Kamis

Bisakah saya menetapkan variabel sama dengan nilai yang digunakan dalam ekspresi?
xnor

4
kebanyakan kompiler akan mengoptimalkan n % 12multiplikasi dan perubahan seperti dalam kegembiraan hacker, jadi ini sepele, cukup output perakitan dan lihat
phuclv

Jawaban:


29

4

(Bahasa tidak relevan)

n-((48&(11-n))>>2)

Merayu! Harus 4.

11-n akan memastikan semua bit urutan tinggi diatur jika dan hanya jika n> = 12.

48&(11-n) == jika n> 11 maka 48 lainnya 0

(48&(11-n))>>2 == jika n> 11 maka 12 lainnya 0

n-((48&(11-n))>>2) adalah jawabannya


1
Aww menyebalkan, Anda mengalahkan saya dengan pendekatan ini! Saya hanya beberapa saat dari posting n - (((11 - n) & 0xC0000000) >> 28). Bagus, saya tidak berpikir itu bisa dilakukan dalam waktu kurang dari empat.
Runer112

1
@ Runner112 Ya, saya berharap tidak ada yang akan mengalahkan saya ketika saya mempostingnya. Bagus sekali untuk menemukannya sendiri
isaacg

1
Luar biasa :) 4 memang sebuah prestasi.
nbubis

11

4

Solusi dengan tabel pencarian (terlihat i ^ (i % 12)):

i ^ (0x1d4c000 >> (i & 0xfc) & 30)

4

Berikut solusi lain dengan 4 operasi:

i - ((0xffff >> (i - 12)) & 12)

Diasumsikan bahwa jumlah operan bithift secara implisit diambil mod 32, yaitu x >> -1sama dengan x >> 31.

5

Pendekatan lain, menggunakan tabel pencarian:

i - (16773120 >> i & 1) * 12

7

bash - 1

echo `seq 0 11` `seq 0 11` | awk '{print $(number+1)}'

misalnya

$ echo `seq 0 11` `seq 0 11` | awk '{print $(0+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(11+1)}'
11

$ echo `seq 0 11` `seq 0 11` | awk '{print $(12+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(23+1)}'
11

1
Ini tidak valid karena menggunakan pointer.
curiousdannii

@curiousdannii Petunjuk apa yang Anda maksud? The stdindan stdoutsungai? Tentu, secara internal, mereka adalah pointer, tetapi kemudian kita mungkin mendiskualifikasi Java karena menggunakan Integerkelas secara internal untuk banyak hal.
Cole Johnson

Bukankah $ () secara efektif setara dengan sebuah pointer?
curiousdannii

@curiousdannii - dokumentasi awk mengatakan bahwa mereka adalah variabel bawaan.

5

C, little-endian - 2

Ini mungkin curang tapi saya pikir itu memenuhi aturan ...

union {
    int i;
    struct {
        int a:4;
        int b:2;
        int c:10;
    } s;
    struct {
        int a:2;
        int b:14;
    } t;
} u;

u.i = 11-n;
u.s.a = 0;
u.s.c = 0;
result = n-u.t.b;

Bagaimana cara kerjanya?
nbubis

1
Menyontek agak, karena Anda menggunakan = 0 bukan & 0x0, yang seharusnya dihitung sebagai 2 operasi tambahan. Tapi +1 untuk kreativitas :)
nbubis

4

PHP - skor 0

Aku bertanya-tanya bagaimana mungkin tidak ada yang datang dengan ini sebelum aku !!!

$n = 18;
$s = str_repeat("a", $n);
$s2 = preg_replace('/aaaaaaaaaaaa/', '', $s);
echo strlen($s2);

2
Bagus. Saya pikir mungkin ada masalah, karena array tidak diizinkan. Sangat bagus.
AJMansfield

@AJMansfield One dapat berargumen bahwa ini tidak memiliki array tetapi string (ya, pada string level rendah adalah byte array). :)
seequ

1
@seequ One juga bisa berpendapat bahwa ini tidak valid karena penggunaan RAM (ya, pada level rendah, ram secara teknis adalah array yang diindeks) ¯_ (ツ) _ / ¯
Stan Strum

2

C, skor 5

Bekerja hingga 23, tidak dijamin di atas itu.

( ((n+4)>>2)&4 ) + n & 15

((n+4)>>2)&4mengembalikan 4 untuk n> = 12. Tambahkan ke n dan Anda mendapatkan jawaban yang benar dalam 4 bit paling tidak signifikan, kemudian potong bit lainnya.


Sudah selesai dilakukan dengan baik!! Sekarang mari kita lihat apakah seseorang dapat mencapai 4 ..
nbubis

2

bahasa apa pun: 5

tidak akan menang, tetapi berpartisipasi karena bersenang-senang dan mungkin karena lebih mudah dipahami daripada yang lain:

n - ((n+20)>>5)*12

ini setara dengan

n - (n>11)*12

ini sama karena ketika Anda menambahkan 20 hingga 12, Anda mendapatkan 32, sehingga bit 5 menjadi 1. Ini hanya ketika n> 1 karena 32 adalah angka terkecil di mana bit 5 menjadi 1.

juga perhatikan bahwa mudah diperluas untuk rentang yang lebih tinggi, seperti yang dapat Anda lakukan

n - ((n+20)>>5)*12 - ((n+41)>>5)*12

untuk mencapai kisaran hingga 35


1

Python 2.x - 4

j=input();m=lambda a,b:a*b;a=(m(j,357913942)>>32);print j-m(12,a)

Apakah =seorang operator?

Dalam hal ini nilainya adalah 6.

j-12*(j*357913942>>32)

Solusi BTW @steveverrill dapat langsung digunakan dalam Python juga.

Bekerja untuk kisaran 0 .. 23

Jadi apa yang terjadi ? Kalikan dengan 357913942 dan bagi 2 ^ 32 (atau shift kanan 32)


Saya suka bagaimana Anda menggunakan fungsi untuk menggandakan hanya sekali. tetapi saya baru saja mengganti nama multiplikasi ke fungsi m (,), yang bagi saya berarti Anda menggunakannya dua kali.
Pinna_be

tergantung bagaimana aturan ditafsirkan, tetapi Anda memiliki titik yang valid
Willem

1

C - 6

(n - (((n * 0xAAAB) >> 19)) * 12 )

Ini harus menjadi bagian dari pertanyaan atau hanya jawaban lain. Saya menyarankan yang terakhir.
Jwosty

@Josty - berubah.
nbubis

0

Cobra - 2 (atau 3)

def modulo12(n as uint32) as uint32
        for i in 11:n to int64:12,n-=12
        return n

Ini mungkin sedikit membengkokkan aturan, tapi saya sudah bertanya dan diizinkan untuk menggunakan ini.

Ini juga berfungsi untuk nomor apa pun.


0

Kona - 5

Mungkin tidak valid karena saya tidak yakin apakah operator lantai diizinkan, tapi saya punya dua *dan minus:

mod:{x-(_0.08333*x)*12}

Yang harus bekerja untuk bilangan bulat apa pun.


Saya tidak yakin tentang operasi lantai, tapi saya yakin bahwa perkalian pertama beroperasi pada sesuatu selain bilangan bulat 32-bit.
Runer112

@ Runer112: OP mengatakan input harus 32 bit dan operator sebagaimana didefinisikan biasanya dengan uints 32 bit; ia tidak mengatakan apa-apa tentang nilai-nilai non-integer dalam kode.
Kyle Kanos

Kecuali saya salah mengerti sesuatu, 0,08333 * x tidak tampak seperti perkalian sebagaimana didefinisikan pada uints 32-bit, karena 0,08333 bukan uint 32-bit.
Runer112

1
"Boleh gunakan jumlah konstan konstanta." - Yaitu tidak dapat menggunakan mengapung sewenang-wenang.
nbubis

1
@nbubis: garis itu sebenarnya tidak membatasi float.
Kyle Kanos
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.