Latar Belakang
Dalam permainan Nim , pemain secara bergantian menghilangkan "batu" dari "tumpukan": di setiap belokan, pemain harus melepas di antara satu dan semua batu dari satu tumpukan. Tujuan Nim adalah untuk mengambil batu terakhir atau, dalam varian misere, untuk memaksa lawan Anda melakukannya - namun, ternyata strateginya hampir identik.
Nim membuat permainan bar yang menyenangkan. Anda dapat menggunakan korek api atau koin untuk "batu," dan "tumpukan" biasanya disusun dalam garis. Di bawah ini adalah pengaturan klasik dengan tumpukan 1, 3, 5, dan 7:
Jika Anda belum pernah bermain Nim sebelumnya, Anda dapat mencobanya sebelum mencoba tantangan ini. Inilah versi yang disebut "Mutiara Sebelum Babi" .
Strategi
Strategi optimal dalam Nim cukup rumit sehingga kebanyakan orang awam kehilangan secara konsisten oleh seorang ahli, tetapi sederhana untuk digambarkan dengan aritmatika biner .
Melakukan operasi biner XOR mental, bagaimanapun, itu sulit, jadi untungnya ada cara yang setara untuk memvisualisasikan strategi yang benar yang lebih mudah untuk diterapkan secara real time, bahkan ketika mabuk.
Hanya ada tiga langkah:
- Secara mental kelompok "batu" di setiap baris ke dalam subkelompok yang ukurannya adalah kekuatan 2, dimulai dengan ukuran terbesar yang mungkin: 8, 4, 2, dan 1 cukup untuk sebagian besar permainan.
- Cobalah untuk mencocokkan setiap kelompok dengan kembaran di baris lain, sehingga setiap kelompok memiliki pasangan.
- Jika ini tidak memungkinkan, hapus "batu" tidak berpasangan dari satu baris (ini akan selalu mungkin - lihat tautan Wikipedia untuk alasannya) sehingga langkah 2. menjadi mungkin.
Atau, katakan dengan cara lain: "Keluarkan beberapa batu dari satu tumpukan sehingga jika Anda kemudian mengelompokkan tumpukan menjadi kekuatan 2 semua kelompok dapat dipasangkan dengan grup di tumpukan lain." Dengan peringatan bahwa Anda tidak dapat memecah kekuatan yang lebih besar dari 2 menjadi yang lebih kecil - misalnya, Anda tidak dapat mengelompokkan garis dengan 8 batu menjadi dua kelompok yang terdiri dari 4.
Misalnya, inilah cara Anda memvisualisasikan papan di atas:
Papan ini seimbang sempurna, jadi Anda ingin lawan Anda bergerak terlebih dahulu.
Tantangan
Diberikan daftar bilangan bulat positif yang mewakili ukuran "tumpukan" Nim, kembalikan visualisasi teks polos papan Nim seperti yang dilihat oleh seorang ahli.
Apa yang merupakan visualisasi yang valid paling baik dijelaskan dengan contoh, tetapi Anda harus:
- Tetapkan karakter yang berbeda untuk setiap "subkelompok kekuatan-2" dan pasangannya (subkelompok tidak berpasangan tidak memenuhi syarat), dan gunakan karakter itu untuk mewakili "batu" di kedua subkelompok dan pasangan.
- Mewakili setiap berpasangan "batu" (yaitu, orang-orang ahli akan menghapus ketika bermain yang normal - tidak misere - Nim) menggunakan tanda hubung:
-
.
Akan ada banyak cara untuk mencapai visualisasi yang valid, dan semuanya valid. Mari kita bahas beberapa kasus uji:
Uji Kasus
Input: 1, 3, 5, 7
Kemungkinan Output 1:
A
BBA
CCCCD
CCCCBBD
Anda dapat secara opsional memasukkan spasi di antara karakter, serta garis kosong di antara baris:
Kemungkinan Output 2:
A
B B A
C C C C D
C C C C B B D
Input: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Urutan dan pilihan karakter dapat apa saja yang Anda suka:
Kemungkinan Output 1:
G
E E
E E G
C C C C
C C C C F
B B B B D D
B B B B D D F
H H I - - - - -
A A A A A A A A I
A A A A A A A A H H
Simbol Unicode juga ok:
Kemungkinan Output 2:
◎
◈ ◈
◈ ◈ ◎
△ △ △ △
△ △ △ △ ◉
◐ ◐ ◐ ◐ ◀ ◀
◐ ◐ ◐ ◐ ◀ ◀ ◉
▽ ▽ ◒ - - - - -
▥ ▥ ▥ ▥ ▥ ▥ ▥ ▥ ◒
▥ ▥ ▥ ▥ ▥ ▥ ▥ ▥ ▽ ▽
Input: 7
Dari aturan berikut bahwa "tumpukan tunggal" harus dihapus sepenuhnya.
Kemungkinan Output 1:
-------
Kemungkinan Output 2:
- - - - - - -
Input: 5, 5
Kemungkinan Output:
A A A A B
A A A A B
Aturan tambahan
- Ini adalah kode golf dengan aturan standar. Kode terpendek menang.
- Input fleksibel, dan dapat diambil dalam bentuk list-ish apa pun yang nyaman bagi Anda.
- Keluaran juga fleksibel, seperti contoh di atas. Variasi paling masuk akal akan diizinkan. Tanyakan apakah Anda tidak yakin tentang sesuatu.
["H","EE","EEH","CCCC","CCCCI","DDDDFF","DDDDFFI","AAAAAAAA","AAAAAAAA-","----------"]
AAAABBBB
sebenarnya tidak valid, danABB
tidak - tetapi itu membuat output kurang dapat dibaca jadi saya pikir hanya membuat penurunan dalam garis aturan eksplisit adalah yang terbaik.Jawaban:
Ruby,
169164148 byteCobalah online!
Pertama, kita menginisialisasi
s=eval a*?^
(yang lebih pendek daria.reduce:^
)c
, yang menyimpan karakter unik pertama yang tidak digunakanm
yang memetakan kekuatan dua hingga panjang karakter yang digunakan untuk mewakili merekaKemudian, mengulangi setiap tumpukan, kami menjalankan yang berikut:
Menurut strategi Wikipedia , jika tumpukan XOR nim-sum kurang dari tumpukan , kita harus menghilangkan batu dari tumpukan tersebut sehingga panjangnya menjadi tumpukan XOR nim-sum . Dengan menyimpan perbedaan dalam variabel
z
, kita dapat menguji untuk melihat apakah perbedaan ini positif, dan jika demikian 1.) mencetak banyak tanda hubung, 2.) kurangi dari tumpukan, dan 3.) atur variabel nim-sum ke nol untuk mencegah pemindahan batu lebih lanjut.Sekarang kita "loop" pada setiap bit dan melacak nilainya dengan berulang kali membagi
x
dengan2
dan mengalikan akumulatorn
dengan2
. Loop sebenarnya adalah waktu yang dievaluasi stringx
, yang jauh lebih besar darilog2(x)
waktu yang diperlukan, tetapi tidak ada salahnya dilakukan (selain dari inefisiensi). Untuk setiap bit, kami menjalankan yang berikut jika bitnya 1 (x&1>0
):Cetak satu
n
kali karakter . Jika kita sudah mencetak kelompok yang tidak berpasangan dari banyak batu ini, gunakan karakter itu; jika tidak, gunakan karakter yang tidak digunakan berikutnya (majuc
di tempat karena!
).Jika
m[n]
ada (yaitu kami baru saja menyelesaikan pasangan), makam[n]
diatur ulang. Jika tidak, kami baru saja memulai pasangan baru, jadi setelm[n]
ke karakter yang kami gunakan (*1
adalah cara singkat untuk membuat salinanc
).sumber
Python 2 ,
150196206 byteCobalah online!
sumber
4, 9, 10
.14, 21, 35
.There will be multiple ways to achieve a valid visualization, and all are valid
JavaScript (ES6), 215 byte
Hanya memvisualisasikan hingga 36 karakter yang berbeda. Aku lega ini berhasil
1, 3, 4, 5
.sumber
Bersih , 454 byte
masih bermain golf
Cobalah online!
Menentukan fungsi
$ :: [Int] -> String
, mengambil ukuran tumpukan dan mengembalikan string di mana-
menunjukkan batu yang akan dihapus, dan kelompok diwakili oleh karakter ASCII yang naik dari-
. Jika diperlukan cukup grup, karakter akan membungkus kembali pada akhirnya, dan karenafoldr
itu membutuhkan lebih dari satu gigabyte memori untuk menjalankan test-case kedua.Versi indentasi dari pemahaman raksasa:
sumber