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.