Apakah ini undian dengan pengulangan?

13

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 , 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"}
Data Kedaluwarsa
sumber
Bisakah kita mengambil input sebagai, katakanlah, daftar pasangan kotak bernomor dalam urutan utama, menyingkirkan catur sepenuhnya? Bagaimana dengan daftar pasangan pasang koordinat?
kata ganti saya adalah monicareinstate
Anda tidak akan bisa menyingkirkan catur sepenuhnya, karena bidak itu sendiri dan bidak menangkap keduanya masih penting. Anda dapat menentukan sistem koordinat Anda sesuka Anda. Saya akan mengklarifikasi dalam pertanyaan properti apa yang akan dimiliki oleh set input yang valid.
Data Kedaluwarsa
1
@KevinCruijssen Saya akan menambahkan secara eksplisit bahwa keadaan awal TIDAK dihitung. Saya pikir Anda melihat bahwa kepingan itu penting, begitu juga warna kepingnya. Kasus uji terakhir kedua adalah tempat ksatria hitam dan putih bertukar. Dalam yang terakhir ratu dan raja bertukar sekitar untuk kedua pemain
Data Kedaluwarsa
1
@ExpiredData Bisakah Anda menjelaskan mengapa case falsey ke-3 adalah falsey? Setelah yang terakhir C6-B8posisi awal telah terjadi tiga kali.
Adám
2
Ah, itu harus menjadi posisi terakhir yang muncul setidaknya dua kali sebelumnya.
Adám

Jawaban:

9

APL (Dyalog Extended) , 55 49 47 45 44 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]]]

2≤≢s∩{0,∘⊃@⍺⊃s,←⊂⍵}/⎕,⊂(⊖⍪-)¯4↑⍉6,⍪5,∘⌽⍥⍳s3

Cobalah online! (termasuk fungsi utilitas Coordsyang menerjemahkan format OP)

Siapkan daftar negara:

s←3 menetapkan tiga sampai s(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 awal

Kurangi * 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 unit

s,← 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 pertama
ini 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 mereka

2≤ 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

Adm
sumber
Saya cukup yakin ini dapat diperpendek secara signifikan dengan menggunakan pemindaian \alih-alih mengurangi/
Adám
simpan 2 byte dengan hack jelek ini: ⍳3⊣s←⍬-> ⍳s←3. ini bekerja karena 3bukan papan yang valid sehingga tidak akan mempengaruhi deteksi pengulangan
ngn
@ngn Ugh. Terima kasih. Kami mendekati Jelly.
Adám
(0,⊃)@->0,∘⊃@
ngn
@ ngn Selesai. Terima kasih.
Adám
6

R , 180 177 144 byte

function(M,`+`=rep,l=c(1:5,3:1,6+8,0+16)){z=rev(Reduce(function(x,y){x[y[2:1]]=x[y]*1:0;x},M,c(l,-rev(l)),,T));sum(sapply(z,identical,el(z)))>2}

Cobalah online!

-3 bytes berkat Giuseppe
-29 bytes berkat penggunaan Nick Kennedy Reducedan -rev(l)
-4 bytes dengan membalikkanz

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:

function(M,                                # M is the vector of moves 
         `+` = rep,
         l = c(1:5, 3:1, 6 + 8, 0 + 16)) { # initial position of white pieces
  z = rev(Reduce(function(x, y) {
    x[y[2:1]] = x[y] * 1:0                 # a piece moves from y[1] to y[2]; y[1] becomes 0
    x
  }, M, c(l, -rev(l)), , T))
  sum(sapply(z, identical, el(z))) > 2    # find number of past positions identical to the last position
}
Robin Ryder
sumber
1
Saya telah memasukkan versi revisi Anda di [ bit.ly/2OHPexp] . Tidak apa-apa TIO tetapi tautannya terlalu panjang untuk dikomentari. Kode ini terinspirasi oleh Anda, tetapi menggunakan kumulatif Reducepada intinya. Ini 148 byte.
Nick Kennedy
@NickKennedy Terima kasih! Saya sebenarnya akan melihat menggunakan bilangan bulat negatif untuk potongan-potongan hitam; Saya senang Anda melakukannya dulu. Saya suka apa yang Anda lakukan dengan Reduce: Saya jelas perlu belajar lebih banyak tentang ini.
Robin Ryder
@NickKennedy Saya mendapat tambahan 4 byte dari versi Anda dengan membalikkan z.
Robin Ryder
3

Jelly , 41 37 byte

Ø0;6x8;“Ġ²F’D¤UN;ƊW;µị@⁹Ṫ¤¦0⁹¦$\ċṪ$>1

Cobalah 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

Ø0                                    | 0,0
  ;6                                  | concatenate to 6 (pawn)
    x8                                | repeat each 8 times (two blank rows and 1 row of pawns)
      ;“Ġ²F’D¤                        | concatenate to 1,2,3,4,5,3,2,1
              UN;Ɗ                    | concatenate a negated flipped version to this one
                  W;                  | wrap as a list and concatenate the input list to the board
                    µ                 | start a new monadic chain
                              $\      | reduce using the two links below
                     ị@⁹Ṫ¤¦           | replace the item pointed to by the second coordinate by the value of the one at the first
                           0⁹¦        | replace the item at first coordinate with zero
                                ċṪ$   | finally count the items equal to the final one (not including it)
                                   >1 | and check of >1
Nick Kennedy
sumber
3

JavaScript (Node.js) ,  121  111 byte

[sq0, sq1][0..63]a8=0b8=1h1=63 .

Mengembalikan nilai Boolean.

a=>[a,...a].map(([x,y])=>r=b[b[b[y]=b[x],x]=0,b]=-~b[b],b=[...'89ABCA981111111'+10n**32n+0x7e5196ee74377])&&r>2

Cobalah online!

Bagaimana?

Potongan

Nilai-nilai yang digunakan untuk mengidentifikasi potongan tidak terlalu penting asalkan ada satu nilai unik per jenis potongan.

Kita gunakan:

  • 0 untuk kotak kosong
  • 1 / 8 / 9 / A / B / C untuk ♟ / ♜ / ♞ / ♝ / ♛ / ♚
  • 2 / 3 / 4 / 5 / 6 / 7 untuk ♙ / ♖ / ♘ / ♗ / ♕ / ♔

Papan dan posisi awal

b

  • '89ABCA981111111' → 8 bagian utama hitam, diikuti oleh 7 pion hitam pertama
  • 10n**32nh7 (1) diikuti oleh 32 kotak kosong (0)
  • 0x7e5196ee74377→ semua potongan putih (dikeluarkan 2222222234567543dalam desimal)

yang mengakibatkan:

    a b c d e f g h
  +----------------
8 | 8 9 A B C A 9 8
7 | 1 1 1 1 1 1 1 1
6 | 0 0 0 0 0 0 0 0
5 | 0 0 0 0 0 0 0 0
4 | 0 0 0 0 0 0 0 0
3 | 0 0 0 0 0 0 0 0
2 | 2 2 2 2 2 2 2 2
1 | 3 4 5 6 7 5 4 3

Melacak posisi

Variabel bjuga digunakan sebagai objek untuk melacak semua posisi yang ditemui. Kunci untuk setiap posisi adalahbitu sendiri, tetapi kali ini sebagai array dan secara implisit dipaksa untuk sebuah string.

Inilah mengapa kami melakukannya:

b[b] = -~b[b]

Berkomentar

a =>                    // a[] = input
  [ a,                  // dummy entry to mark the initial position as encountered once
    ...a                // append the actual data
  ].map(([x, y]) =>     // for each pair of squares [x, y] in this array:
    r =                 //   store the last result in r
    b[                  //   update b[b]:
      b[                //     update b[x]:
        b[y] = b[x],    //       set b[y] to b[x]
        x               //       set b[x] ...
      ] = 0,            //     ... to 0
      b                 //     set b[b] ...
    ] = -~b[b],         //   ... to b[b] + 1 (or 1 if b[b] is undefined)
    b = [...(…)]        //   initialize b[] (see above)
  )                     // end of map()
  && r > 2              // return true if the last result is greater than 2
Arnauld
sumber
Saya belum menulis test case untuk itu, tetapi apakah ini bekerja jika 2 buah dengan warna yang sama bertukar (mis. Pengulangan di mana dua ksatria putih ditukar)? Saya akan menulis test case ketika saya mendapat kesempatan.
Data Kedaluwarsa
Ya maksud saya, saya akan memperbarui bila saya bisa
Expired Data
1
@ExpiredData Sekarang ini sudah berfungsi seperti yang diharapkan.
Arnauld
3

Java 10, 336 330 287 285 282 276 byte

m->{var V=new java.util.HashMap();int i=64,A[]=new int[i];var t="";for(;i-->0;)t+=A[i]=(i%56<8?i%8*35%41%10%8+2:9>>i/16&1)*(i/32*2-1);V.put(t,1);for(var a:m){for(t="",A[a[1]]=A[a[0]],A[a[0]]=0,i=64;i-->0;)t+=A[i];V.compute(t,(k,v)->v!=null?(int)v+1:1);}return(int)V.get(t)>2;}

-11 byte terima kasih kepada @Arnauld dengan mengubah i%56<8?"ABCDECBA".charAt(i%56%7):i%48<16?1:0ke i%56<8?i%8*35%41%10%8+2:9>>i/16&1.

Input sebagai array 2D bilangan bulat tempat Sebuah1=0,b1=1,...,h8=63(yaitu {"E2-E4",...adalah [[12,28],...).

Cobalah online.

Penjelasan:

m->{                   // Method with 3D character array parameter and boolean return-type
  var V=new java.util.HashMap();
                       //  Create a Map to store the occurrences of the board-states
  int i=64,            //  Index integer, starting at 64
      A[]=new int[i];  //  Create the 8 by 8 board
  var t="";            //  Temp-String, starting empty
  for(;i-->0;)         //  Loop `i` in the range (64,0]:
    t+=                //    Append the string `t` with:
      A[i]=            //     Fill the `i`'th cell with:
        i%56<8?        //      If it's either the first or eighth row:
         i%8*35%41%10%8+2
                       //       Fill it with 2,7,3,5,9,3,7,2 based on index `i`
        :9>>i/16&1)    //      Else if it's either the second or seventh row:
                       //       Fill it with 1
                       //      Else (the third, fourth, fifth, or sixth rows):
                       //       Fill it with 0
        *(i/32*2-1);   //      Then multiply it by -1 or 1 depending on whether `i`
                       //      is below 32 or not
  V.put(t,1);          //  Then set string `t` in the map to 1 for the initial state
  for(var a:m){        //  Loop over each of the input's integer-pairs:
    for(t="",          //   Make the String empty again
        A[a[1]]=       //   Set the to-cell of the current integer-pair of the input to:
          A[a[0]],     //    The value in the from-cell of the same integer-pair
        A[a[0]]=0,     //   And then empty this from-cell
        i=65;i-->0;)   //   Inner loop `i` in the range (64,0]:
          t+=A[i];     //    Append the `i`'th value to the String `t`
    V.compute(t,(k,v)->v!=null?(int)v+1:1);}
                       //   Increase the value in the map for String `t` as key by 1
  return(int)V.get(t)  //  Return whether the value in the map for the last String `t`
          >2;}         //  is at least 3

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:

     a  b  c  d  e  f  g  h
  +------------------------
1 | -2 -7 -3 -5 -9 -3 -7 -2
2 | -1 -1 -1 -1 -1 -1 -1 -1
3 |  0  0  0  0  0  0  0  0
4 |  0  0  0  0  0  0  0  0
5 |  0  0  0  0  0  0  0  0
6 |  0  0  0  0  0  0  0  0
7 |  1  1  1  1  1  1  1  1
8 |  2  7  3  5  9  3  7  2

Cobalah online.

Kevin Cruijssen
sumber
Bergulat untuk sementara waktu dengan cara untuk menghindari penggunaan t, apakah tidak ada struktur yang dapat Anda gunakan untuk menyimpan status yang akan melakukan sesuatu seperti java.util.Arrays.deepHashCode? Jika demikian, ada banyak byte yang tersisa
Data Kedaluwarsa
Juga, saya bertanya-tanya apakah ini benar secara teknis berdasarkan implementasi hashmap, mungkin akan ada tabrakan hash untuk papan catur mengingat kemungkinan konfigurasi sangat besar? Tapi aku tidak akan memberimu sampel balik untuk itu!
Data Kedaluwarsa
1
@ExpiredData Memang ada java.util.Arrays.deepHashCode(A), tapi rupanya beberapa hash masih sama entah bagaimana (yaitu kasus tes terakhir ada -447346111=3di 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 menggunakan deepHashCode(A)dua kali (untuk kondisi awal juga).
Kevin Cruijssen
1
Tapi benteng hitam pertama berbeda dari benteng hitam kedua. 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
Perwujudan Ketidaktahuan
1
Tidak sepenuhnya diuji di Jawa, tetapi ekspresi i%8*35%41%10%8+2harus menjadi pengganti yang mungkin untuk "ABCDECBA".charAt(i%8), menghemat 6 byte. Ini menghasilkan pola [ 2, 7, 3, 5, 9, 3, 7, 2 ].
Arnauld
2

Arang , 62 byte

≔↨²³⁴⁵⁶⁴³²χηF⁴⁸⊞η÷⁻⁴⁰ι³²F…η⁸⊞η±ιFθ«⊞υ⮌η§≔η⊟ι§η§ι⁰§≔η⊟ι⁰»›№υ⮌η¹

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 23456432menjadi masing-masing digit. Ini mewakili potongan putih.

F⁴⁸⊞η÷⁻⁴⁰ι³²

Tambahkan pion dan baris kosong. Pion putih memiliki nilai 1dan pion hitam -1.

F…η⁸⊞η±ι

Tambahkan salinan putih yang dinegasikan, yang mewakili potongan hitam.

Fθ«

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.

Neil
sumber
2

C # (Visual C # Interactive Compiler) , 204 byte

n=>{var j=new List<char[]>();var d=("ABCDECBATTTTTTTT"+new string('Z',32)+7777777712345321).ToArray();foreach(var(a,b)in n){j.Add(d.ToArray());d[b]=d[a];d[a]='Z';}return j.Count(r=>r.SequenceEqual(d))>1;}

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!

n=>{
  var j=new List<char[]>();    //Initialize a list to save states of a board
  var d=("ABCDECBATTTTTTTT" +  //White pieces
  new string('Z',32) +         //Empty spaces
  7777777712345321)            //Black pieces
  .ToArray(); //Initialize the chessboard
  foreach(var(a,b)in n){       //Foreach (source square, destination square) in the input
    j.Add(d.ToArray());        //  Add the current board to the list
    d[b]=d[a];                 //  Set the destination square to the source square's value
    d[a]='Z';                  //  And set the souce square to empty
  }
  return j.Count(         //Return that the amount...
    r=>r.SequenceEqual(d) //  of past positions that are equal to the current position...
  )>1;                    //is at least two
}
Perwujudan Ketidaktahuan
sumber
0

Java (JDK) , 246 245 244 byte

import java.util.*;n->{var j=new ArrayList<char[]>();var d=("ABCDECBATTTTTTTT"+"".repeat(32)+7777777712345321l).toCharArray();for(var k:n){j.add(d.clone());d[k[1]]=d[k[0]];d[k[0]]=1;}return j.stream().filter(x->Arrays.equals(d,x)).count()>1;}

Cobalah online!

import java.util.*;                   //Import the java.util package

n->{                                  //Function taking in int[][], 
                                      //where each int[] is a a pair of numbers
  var j = new ArrayList<char[]>();    //List to save each position of the chessboard
  var d =                             //The chessboard's starting position
    ("ABCDECBATTTTTTTT" +             //  All the white pieces
    "&#1".repeat(32) +                //  Plus the empty squares
    7777777712345321l)                //  And the black pieces
  .toCharArray();                     //Split to array of chars
  for(var k:n){                       //Foreach [sourceSquare, destinationSquare] in input
    j.add(d.clone());                 //  Add the current position to the list
    d[ k[1] ] = d[ k[0] ];            //  Set the destination square's value
                                      //  to the source squares
    d[ k[0] ] = 1;                    //  And clear the source square 
}                                     //End foreach
return j.stream()                     //Convert list of states to stream
  .filter(x ->                        //Filter each position by
    Arrays.equals(d,x)                //  if the position equals the final position 
  ).count() > 1;                      //And return if there are at least two
                                      //positions that are left
}
Perwujudan Ketidaktahuan
sumber