Latar Belakang
Jika Anda melakukan banyak kode golf, kemungkinan Anda mengetahui operasi XOR bitwise . Diberikan dua bilangan bulat, ini memberikan bilangan bulat lain dengan 1
s dalam bit di mana dua input berbeda. Jadi, misalnya 1010 XOR 0011 = 1001
,.
Ternyata sangat berguna dalam teori permainan, di mana itu lebih dikenal sebagai "nim sum". Jika Anda memiliki jumlah dari dua game (yaitu, Anda bergerak dalam satu game pada satu waktu), nilai dari posisi adalah jumlah nim dari nilai-nilai posisi dalam setiap game individu.
Tapi kita bisa mengambil langkah ini lebih jauh. Dengan penambahan nim dan definisi yang sesuai untuk perkalian nim , kita dapat membentuk bidang dari bilangan bulat non-negatif. Jadi tantangannya adalah multiplikasi golf nim.
Definisi
Perkalian
nim mematuhi aturan berikut: Produk nim dari Fermat 2-power n = (2 ^ (2 ^ k)) dengan jumlah yang lebih kecil adalah produk biasa.
Produk nim dari Fermat 2-power n dengan sendirinya adalah 3n / 2.
Perkalian nim mendistribusikan lebih dari penambahan nim.
Perkalian nim bersifat komutatif dan asosiatif (seperti halnya penambahan nim).
Identitas multiplikatif adalah 1 (dan identitas aditif adalah 0).
Setiap integer nonnegatif dapat ditulis sebagai nim sum dari kekuatan yang berbeda dari dua, dan kekuatan apa pun dari dua dapat ditulis sebagai produk dari nomor Fermat yang berbeda, jadi ini cukup untuk mendefinisikan perkalian nim untuk semua bilangan bulat nonnegatif.
Contoh
Itu semua sangat abstrak, jadi mari kita bekerja melalui contoh. Saya akan gunakan +
untuk menunjukkan penambahan nim (XOR) dan *
untuk perkalian nim.
6 * 13
= (4 + 2) * (8 + 4 + 1)
= (4 + 2) * ((4 * 2) + 4 + 1)
= (4 * 4 * 2) + (4 * 2 * 2) + (4 * 4) + (4 * 2) + (4 * 1) + (2 * 1)
= (6 * 2) + (4 * 3) + 6 + 8 + 4 + 2
= ((4 + 2) * 2) + 12 + 6 + 8 + 4 + 2
= (4 * 2) + (2 * 2) + 12 + 6 + 8 + 4 + 2
= 8 + 3 + 12 + 6 + 8 + 4 + 2
= 15
Kasus Uji Tambahan
4, 4 -> 6
4, 3 -> 12
4, 7 -> 10
2, 4 -> 8
2, 3 -> 1
1, 42 -> 42
Tantangan
Tulis program atau fungsi yang, mengingat dua bilangan bulat negatif dalam bentuk apa pun, menghitung produk nim mereka.
Ini adalah kode-golf , jadi pengiriman terpendek menang.
Jawaban:
Nim , 120 byte
Cobalah online!
OK, ini mungkin gila, tetapi seseorang harus melakukan perkalian Nim di Nim ...
Ini adalah algoritma standar dari Wikipedia. Masalahnya adalah saya tidak tahu bahasa, jadi harus mempelajari dasar-dasarnya dengan cepat. Secara khusus, saya terkejut
-=
danmin
tidak bekerja untuk set, dan cara terbaik saya berhasil menemukan untuk mengekstraksi minimum adalah dengan menggunakan iterator dan mengembalikan nilai pertama. Semoga para ahli Nim akan membantu saya untuk meningkatkan ini.sumber
Python 2 , 85 byte
Cobalah online!
Lambat seperti sih. Menghitung mex ({α ′ β ⊕ α β ′ ⊕ α 'β ′: α ′ <α, β ′ <β}) secara rekursif.
sumber
Jelly , 16 byte
Menggunakan rumus rekursif xy = mex ({ay ⊕ xb ⊕ ab: a <x, b <y}) untuk perkalian nimber .
Cobalah online!
Bagaimana itu bekerja
sumber
CGSuite ,
523922 byteTidak menyadari bahwa ia memiliki "prosedur" bawaan ini, dan anonim.
Versi asli, 36 byte:
Atau 25 byte jika input / output bisa berupa nimbers:
Yah, aku berharap
*a**b
/a*b
bekerja, tetapi ternyata tidak.sumber
Pyth , 21 byte
Demonstrasi
Menggunakan formulasi elemen minimum yang dikecualikan dari perkalian nim, seperti yang diberikan di sini .
Dua peta bersarang digunakan untuk beralih pada semua nilai yang lebih kecil (
mm ... GH
), kemudian hasilnya diratakan (s
). Bagian pintar datang denganf-T ... 0
, di mana kita beralih bilangan bulat ke atas dari 0 untuk menemukan yang pertama tidak terkandung dalam set yang disebutkan di atas. Dengan melakukannya dengan cara ini, kita tidak perlu menghitung iterasi batas atas, menghemat beberapa byte.Pada akhirnya, fungsi
g
menghitung produk nim.sumber
JavaScript (ES6),
142128 byteLangkah pertama adalah untuk membagi keduanya
x
dany
menjadi XOR kekuatan2
, mengambil produk nim berpasangan mereka, dan kemudian XOR hasilnya (karena produk nim mendistribusikan lebih dari XOR). Setelah kami berulang pada kasusx
dany
kedua kekuatan 2, kami mencatat bahwa kekuatan Fermat saling berlipat ganda menggunakan aritmatika biasa, sehingga kami dapat memfaktorkanx
dany
menjadi kekuatan Fermat. Jikax
dany
tidak membagikan kekuatan Fermat, kami dapat membalik prosesnya dan mengembalikannyax * y
. Namun jika mereka berbagi kekuatan Fermat, maka kami membagi keduanyax
dany
dengan kekuatan itu, menghitung produk nim, kemudian mengambil produk nim dengan nim square dari kekuatan Fermat. Tidak Terkumpul:sumber
Bahasa Wolfram (Mathematica) , 81 byte
Cobalah online!
Menggunakan rumus:
sumber