Masalah:
Dalam catur, ada aturan yang cukup terkenal tentang menggambar dengan pengulangan. Jika posisi yang sama diulang 3 kali (atau lebih) maka pemain yang berniat untuk melakukan langkah yang akan menyebabkan pengulangan ini dapat mengklaim hasil seri.
Kadang-kadang ini adalah tugas yang mudah bagi seorang wasit untuk dikenali, jika beberapa gerakan terakhir hanyalah para pemain yang bergerak maju dan mundur. Kadang-kadang itu kurang sepele, ketika potongan telah bergerak secara signifikan antara posisi yang diulang.
Masalah dalam tantangan ini adalah untuk menghasilkan nilai yang benar jika posisi yang diklaim diundi oleh pengulangan (telah terlihat 3 kali atau lebih) dan nilai yang salah jika posisi yang diklaim tidak diundi oleh pengulangan, mengingat daftar gerakan dalam notasi koordinat seperti yang dijelaskan di bawah ini, atau notasi apa pun yang Anda pilih (tetapi Anda harus mengonversi kasus uji).
Apa itu posisi?
Dalam skenario dunia nyata, posisi akan dipengaruhi oleh hal-hal seperti apakah seorang pemain bisa bermain kastil atau apakah en-passant dimungkinkan; Anda seharusnya tidak mempertimbangkan ini dalam solusi Anda untuk masalah tersebut. Dalam masalah ini posisi didefinisikan hanya dengan konfigurasi potongan di papan tulis. Jadi, untuk keperluan masalah ini, dua posisi terlihat sama jika setiap kotak pada kedua papan ditempati oleh jenis potongan yang sama dengan warna yang sama. Ini tidak harus menjadi bagian yang tepat misalnya ksatria putih bisa bertukar kotak dan jika semua bagian lainnya memenuhi kriteria ini masih akan berada di posisi yang sama.
Seperti apa bentuk notasi yang valid?
Meskipun saya akan terus menjelaskan notasi koordinat, Anda bebas mengambil input oleh sistem notasi yang Anda pilih. Dengan ketentuan:
- Setiap item dalam notasi menggambarkan salah satu atau semua: bagian / potongan yang terlibat; apakah cek, skakmat, periksa, skakmat atau jalan buntu telah dikirimkan; jika penangkapan en-passant telah terjadi; posisi awal; posisi akhir.
- Anda mungkin tidak memiliki informasi tentang pengulangan dalam notasi Anda.
Jadi, selama kriteria ini dipenuhi, saya senang menerima, selama Anda menentukan dalam jawaban Anda, sistem notasi Anda. Ini bisa berupa 0 baris yang diindeks, tupel kolom atau apa pun yang masuk akal untuk program Anda.
Notasi Koordinat
Notasi koordinat adalah notasi yang murni menggambarkan gerakan sebagai sistem koordinat.
Langkah digambarkan sebagai pertama koordinat awal dari set {A1-H8}
dan kemudian tujuan mengoordinasikan lagi dari set yang sama. Jadi Gambit Raja akan terlihat seperti (sebagai kumpulan string)
{"E2-E4","E7-E5","F2-F4"}
Saya percaya ini adalah notasi terbaik untuk digunakan untuk masalah ini karena tidak dikotori dengan informasi asing seperti apakah cek telah terjadi atau apa jenis potongan bergerak. Seperti yang disebutkan sebelumnya notasi dapat menjadi pilihan Anda, sehingga Anda dapat menggunakan notasi lain misalnya notasi aljabar atau Anda dapat menyesuaikan notasi ini (mis. Hapus tanda hubung, atau ambil sebagai daftar tupel)
Aturan:
- Anda tidak boleh mempertimbangkan apakah suatu posisi atau perpindahan itu valid, hanya apakah itu menyebabkan pengulangan
- Anda dapat mengasumsikan bahwa promosi casting dan gadai tidak akan terjadi.
- Anda harus mengambil daftar string sebagai input dan output nilai kebenaran atau falsey yang sesuai dengan apakah pengulangan ketiga (atau lebih) telah terjadi pada langkah terakhir
- Permainan selalu dimulai pada posisi awal standar untuk catur. Posisi awal dapat diperhitungkan sebagai pengulangan.
- Draw by repetition belum terjadi jika posisi tidak diulang oleh langkah terakhir
Aturan umum:
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'. - Aturan standar berlaku untuk jawaban Anda dengan aturan I / O standar , sehingga Anda diizinkan untuk menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
- Celah default tidak diperbolehkan.
- Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda (yaitu TIO ).
- Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.
Uji Kasus
Anda harus mengembalikan nilai kebenaran untuk:
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8"}
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8"}
{"B1-C3","B8-C6","D2-D4","D7-D5","D1-D3","D8-D6","C3-B1","C6-B8","B1-C3","B8-C6","D3-D1","D6-D8","D1-D3","D8-D6"}
{"D2-D4","B8-C6","E2-E4","C6-D4","D1-E2","D4-E6","E2-F3","E6-D4","F3-D1","D4-C6","D1-E2","C6-D4","E1-D1","D4-C6","D1-E1","C6-D4"}
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","B1-C3"}
Dan nilai falsey untuk:
{}
{"E2-E4","E7-E5","F2-F4"}
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","F2-F4","F7-F5"}
{"E2-E4","E7-E5","G1-F3","B8-C6","F1-C4","G8-F6","F3-G5","D7-D5","E4-D5","F6-D5","G5-F7"}
{"D2-D4","B8-C6","E2-E4","C6-D4","D1-E2","D4-C6","E2-D1","C6-D4","D1-E2","D4-C6","E2-D1"}
{"B1-C3","B8-C6","C3-B5","C6-B4","B5-D4","B4-D5","D4-C6","D5-C3","C6-B8","C3-B1","B8-C6","B1-C3","C6-B8","C3-B1"}
{"E2-E4","E7-E5","D1-E2","E8-E7","E1-D1","D8-E8","E2-E1","E7-D8","E1-E2","E8-E7","E2-E1","E7-E8"}
sumber
C6-B8
posisi awal telah terjadi tiga kali.Jawaban:
APL (Dyalog Extended) ,
5549474544 byte SBCS-4 Terima kasih kepada ngn.
Program lengkap. Anjuran untuk daftar terbalik dari terbalik pasangan koordinat:
misalnya
{"B1-C3","B8-C6"}
adalah[[[8,2],[6,3]],[[1,2],[3,3]]]
Cobalah online! (termasuk fungsi utilitas
Coords
yang menerjemahkan format OP)Siapkan daftar negara:
s←3
menetapkan tiga sampais
(untuk s tates)Karena 3 bukan status dewan yang valid, itu tidak akan mempengaruhi jumlah pengulangan kami, dan kami membutuhkan nilai pass-through dari penugasan ...
Membangun representasi papan catur:
5
... buang bahwa untuk hasil penerapan fungsi turunan berikut antara 5 dan 3:⍥⍳
perluas kedua argumen itu ke ɩ naskahnya;[1,2,3,4,5]
...[1,2,3]
,∘⌽
sisi kiri dipadukan dengan kebalikan dari sisi kanan[1,2,3,4,5,3,2,1]
ini mewakili para perwira⍪
buat menjadi meja;[[1],
[2],
[3],
[4],
[5],
[3],
[2],
[1]]
6,
prepend (ke setiap baris) enam, mewakili pion;[[6,1],
[6,2],
[6,3],
[6,4],
[6,5],
[6,3],
[6,2],
[6,1]]
⍉
mengubah urutan;[[6,6,6,6,6,6,6,6],
[1,2,3,4,5,3,2,1]]
¯4↑
ambil negatif (yaitu yang terakhir) empat (baris), padding dengan nol, mewakili kotak kosong;[[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[6,6,6,6,6,6,6,6],
[1,2,3,4,5,3,2,1]]
(
...)
terapkan fungsi tersembunyi berikut untuk itu:-
negate (ini mewakili warna yang berlawanan);[[ 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[-6,-6,-6,-6,-6,-6,-6,-6],
[-1,-2,-3,-4,-5,-3,-2,-1]]
⊖⍪
tumpukan argumen terbalik di atas itu, memberi kami papan penuh;[[ 1, 2, 3, 4, 5, 3, 2, 1],
[ 6, 6, 6, 6, 6, 6, 6, 6],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[-6,-6,-6,-6,-6,-6,-6,-6],
[-1,-2,-3,-4,-5,-3,-2,-1]]
Buat daftar gerakan yang diikuti oleh kondisi awal:
⊂
lampirkan itu (untuk memperlakukannya sebagai satu unit)⎕,
meminta daftar gerakan, dan menambahkannya ke kondisi awalKurangi * dengan fungsi yang menambahkan status saat ini ke daftar dan membuat langkah:
{
...}/
kurangi dengan lambda anonim berikut:⍵
argumen yang benar (kondisi saat ini)⊂
lampirkan untuk memperlakukannya sebagai satu units,←
di tempat menambahkannya ke daftar negara⊃
mengungkapkannya untuk menggunakan keadaan itu...
@⍺
pada elemen dengan dua koordinat yang diwakili oleh argumen kiri, masukkan:0
nol,
diikuti∘
dengan⊃
nilai pertamaini secara efektif "memindahkan" nilai pada koordinat pertama ke koordinat kedua, meninggalkan nol
Periksa apakah kami memiliki tiga atau lebih dari status akhir:
s∩
persimpangan semua negara bagian dengan yang terakhir; himpunan bagian identik dengan itu≢
menghitung mereka2≤
periksa apakah ada dua atau lebih (yaitu tiga atau lebih termasuk keadaan akhir)* APL benar-asosiatif, jadi pertama fungsi dipanggil dengan keadaan awal sebagai argumen kanan dan langkah awal sebagai argumen kiri, dan kemudian hasilnya, keadaan baru, menjadi argumen kanan baru dengan langkah kedua sebagai argumen kiri baru , dll. Hasil akhirnya adalah
sumber
\
alih-alih mengurangi/
⍳3⊣s←⍬
->⍳s←3
. ini bekerja karena3
bukan papan yang valid sehingga tidak akan mempengaruhi deteksi pengulangan(0,⊃)@
->0,∘⊃@
R ,
180177144 byteCobalah online!
-3 bytes berkat Giuseppe
-29 bytes berkat penggunaan Nick Kennedy
Reduce
dan-rev(l)
-4 bytes dengan membalikkan
z
Dibawa sebagai input vektor bilangan bulat antara 1 dan 64 yang menunjukkan kotak. TIO mencakup fungsi untuk berubah menjadi format itu. Potongan-potongan yang berbeda disimpan sebagai bilangan bulat antara 1 dan 6 dan antara -1 dan -6.
Penjelasan:
sumber
Reduce
pada intinya. Ini 148 byte.Jelly ,
4137 byteCobalah online!
Tautan monadik yang mengambil input sebagai daftar pasangan pergerakan baris-utama 1-terindeks
[from, to]
dan mengembalikan 1 untuk menarik dan 0 untuk tidak.Perhatikan bahwa kode footer pada TIO menerjemahkan gerakan yang disediakan oleh OP ke format numerik, tetapi per diskusi di bawah pertanyaan, format numerik akan menjadi input yang valid.
Penjelasan
sumber
JavaScript (Node.js) ,
121111 byte[sq0, sq1]
Mengembalikan nilai Boolean.
Cobalah online!
Bagaimana?
Potongan
Nilai-nilai yang digunakan untuk mengidentifikasi potongan tidak terlalu penting asalkan ada satu nilai unik per jenis potongan.
Kita gunakan:
Papan dan posisi awal
'89ABCA981111111'
→ 8 bagian utama hitam, diikuti oleh 7 pion hitam pertama10n**32n
0x7e5196ee74377
→ semua potongan putih (dikeluarkan2222222234567543
dalam desimal)yang mengakibatkan:
Melacak posisi
Variabelb juga digunakan sebagai objek untuk melacak semua posisi yang ditemui. Kunci untuk setiap posisi adalahb itu sendiri, tetapi kali ini sebagai array dan secara implisit dipaksa untuk sebuah string.
Inilah mengapa kami melakukannya:
Berkomentar
sumber
Java 10,
336330287285282276 byte-11 byte terima kasih kepada @Arnauld dengan mengubah
i%56<8?"ABCDECBA".charAt(i%56%7):i%48<16?1:0
kei%56<8?i%8*35%41%10%8+2:9>>i/16&1
.Input sebagai array 2D bilangan bulat tempata 1 = 0 , b 1 = 1 , . . . , h 8 = 63 (yaitu
{"E2-E4",...
adalah[[12,28],...
).Cobalah online.
Penjelasan:
Nilai potongan setelah diisi
A[i]=(i%56<8?i%8*35%41%10%8+2:9>>i/16&1)*(i/32*2-1)
adalah:Cobalah online.
sumber
java.util.Arrays.deepHashCode(A)
, tapi rupanya beberapa hash masih sama entah bagaimana (yaitu kasus tes terakhir ada-447346111=3
di peta ..) jika saya membandingkan peta yang dihasilkan dari jawaban saya saat ini dan peta yang dihasilkan menggunakandeepHashCode(A)
. Juga, itu akan menjadi 3 byte lebih lama daripada pendek, karena saya harus menggunakandeepHashCode(A)
dua kali (untuk kondisi awal juga).two positions are seen to be the same if each square on both boards is occupied by the same type of piece of the same colour
i%8*35%41%10%8+2
harus menjadi pengganti yang mungkin untuk"ABCDECBA".charAt(i%8)
, menghemat 6 byte. Ini menghasilkan pola[ 2, 7, 3, 5, 9, 3, 7, 2 ]
.Arang , 62 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mengambil input sebagai array dari pasangan angka di mana kuadrat diberi nomor
A1
,,B1
...H8
(0-diindeks) jadi misalnya test case pertama akan direpresentasikan sebagai[[[1, 18], [57, 42], [18, 1], [42, 57], [1, 18], [57, 42], [18, 1], [42, 57]]]
dan menghasilkan a-
jika posisi adalah draw dengan pengulangan. Program konversi. Semua dalam satu. Penjelasan:Membagi angka
23456432
menjadi masing-masing digit. Ini mewakili potongan putih.Tambahkan pion dan baris kosong. Pion putih memiliki nilai
1
dan pion hitam-1
.Tambahkan salinan putih yang dinegasikan, yang mewakili potongan hitam.
Ulangi gerakan.
Simpan salinan dewan. (Membalik adalah cara paling golf untuk menyalin papan.)
Perbarui tujuan dengan bagian sumber.
Hapus bagian sumber.
Tentukan apakah posisi saat ini terlihat lebih dari sekali sebelumnya.
sumber
C # (Visual C # Interactive Compiler) , 204 byte
Mengambil input sebagai daftar tupel bilangan bulat, di mana bilangan bulat pertama adalah tempat untuk pindah, dan yang kedua adalah tempat untuk pindah. 0 mewakili A1, 1 adalah A2, dan 63 adalah H8.
Cobalah online!
sumber
Java (JDK) ,
246245244 byteCobalah online!
sumber