Apakah ini kotak yang kalah?

19

Ada permainan bernama Get Home yang dimainkan di papan catur. Dalam game ini ada satu bagian yang digerakkan oleh kedua pemain secara bergantian. Ada beberapa aturan tentang bagaimana karya itu bisa dipindahkan. Pada gilirannya pemain harus membuat salah satu dari langkah berikut untuk positif n .

  • n spasi

  • n spasi ke kiri

  • n spasi ke atas dan ke kiri (diagonal)

Pemain yang memindahkan potongan ke sudut kiri atas papan memenangkan permainan.

Sekarang kita akan mendefinisikan konsep kuadrat kalah. Dalam video ini (dari mana saya mendapat ide), kotak yang kalah didefinisikan sebagai kotak, di mana, setiap pemain yang memulai giliran mereka akan dipaksa untuk membuat langkah yang memungkinkan lawan mereka untuk memaksa menang. Contoh paling sederhana dari kuadrat kalah adalah kuadrat di (1,2). Sepotong di (1,2) dapat pindah ke salah satu tempat berikut.

Ilustrasi

Semuanya memiliki jalur langsung menuju kemenangan untuk pemain berikutnya.

Ini juga mengikuti bahwa setiap kotak yang memiliki jalur satu langkah ke kotak yang kalah memungkinkan pemain mulai dari kotak itu untuk memaksa menang. Ini berarti bahwa setiap kotak yang tidak satu bergerak menjauh dari kotak yang kalah juga merupakan kotak yang hilang.

Ini membawa kita ke definisi yang agak rapi tentang kehilangan persegi:

Kuadrat yang kalah adalah kuadrat dari mana tidak ada gerakan yang bisa tiba di kuadrat yang kalah dan (0,0) adalah kuadrat yang kalah.

Tugas

Mengingat koordinat kotak pada papan catur berukuran sewenang-wenang menentukan apakah itu kotak yang kalah. Keluarkan dua nilai satu untuk kehilangan kotak dan satu untuk yang lain.

Ini adalah sehingga jawaban akan dinilai dalam byte dengan lebih sedikit byte lebih baik.

Uji Kasus

Berikut adalah semua kotak yang hilang pada papan catur reguler 8 x 8 (ditandai dengan 0).

0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1
1 0 1 1 1 1 1 1
1 1 1 1 1 0 1 1
1 1 1 1 1 1 1 0
1 1 1 0 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1

Berikut adalah gambar papan 100 x 100 dengan kotak yang hilang ditandai dengan warna hitam (masing-masing kotak berukuran 2 piksel kali 2 piksel).

100 oleh 100 papan

Wisaya Gandum
sumber
2
Saya tidak berpikir ada cukup kasus uji untuk menemukan pola. Saya pikir saya melihat pola, tetapi saya tidak bisa mengatakan dengan pasti. Apakah 10, 7kotak kalah? Benarkah 10, 8? Bagaimana dengan 15, 11?
DJMcMayhem
1
@WheatWizard Apakah Anda keberatan membuat gambar sedikit lebih besar?
Erik the Outgolfer
1
@Watwizard Saya maksudkan piksel lebih besar ... mis. 5x5 piksel bukan 1x1, mungkin beberapa kotak juga jika tidak terlalu keras (btw terima kasih untuk 100x100)
Erik the Outgolfer
2
Juga terkait (kembalikan gerakan optimal atau sinyal bahwa posisi itu hilang)
Zgarb
1
Saya pikir itu normal untuk memungkinkan ketidakakuratan floating point untuk menghambat kinerja bahkan dengan kemampuan bilangan bulat yang besar ...
Jonathan Allan

Jawaban:

8

Python 3 , 112 50 46 42 byte

-4 byte terima kasih kepada Jonathan Allan !

-2 byte terima kasih kepada xnor !

lambda r,c:abs(r-c)*(3+5**.5)//2==max(r,c)

Cobalah online!

Berdasarkan formula untuk posisi dingin dalam permainan Wythoff dan membuat beberapa modifikasi untuk menghasilkan formula eksplisit. Penjelasan inbound setelah saya benar-benar menyelesaikan metodologi yang tepat untuk derivasi formula.

notjagan
sumber
Tidak bisa Anda mengubah 0<=xke x>0dan menyimpan atau dua byte?
Jonathan Frech
@ JonathanFrech Harus berupa <=atau >=untuk memasukkan posisi 0, 0.
notjagan
Anda benar, hanya satu byte yang bisa disimpan.
Jonathan Frech
1
Satu byte kurang dengan implementasi yang berbeda dari yang sama:lambda r,c:int(abs(r-c)*(5**.5+1)**2/4)==max(r,c)
Jonathan Allan
1
/2//1terlihat sama dengan //2.
xnor
5

Jelly , 8 byte

ạ/×ØpḞ⁼Ṃ

Cobalah online! , atau lihat bagian kiri atas 60 kali 60 sebagai kisi .

Bagaimana?

Posisi dingin dalam permainan Wythoff adalah posisi kalah. Koordinat [n,m]memberikan posisi dingin ketika n = floor(kφ) = floor(mφ) - matau m = floor(kφφ) = ceil(nφ) = n + kuntuk beberapa bilangan asli k,, dan rasio emas φ,. Yang pertama berlaku ketika nkurang dari m; yang terakhir ketika mkurang dari n(keduanya memegang pada 0,0).

kdengan demikian perbedaan mutlak antara ndan mdan jika floor(abs(n-m)φ)=min(n,m)kondisi terpenuhi.

ạ/×ØpḞ⁼Ṃ - Link: list, c ([n,m])
 /       - reduce c by:
ạ        -   absolute difference = abs(n-m)
   Øp    - golden ratio yield
  ×      - multiply
     Ḟ   - floor
       Ṃ - minimum of c = min(n,m)
      ⁼  - equal?
Jonathan Allan
sumber
2

JavaScript (ES6), 64 byte

f=(x,y,p=5**.5/2+.5)=>x<y?f(y,x):y/p%p<1&(y/p%p-x*p%++p)**2<1e-9

Saya melihat sekarang bahwa ini bukan teknik terbaik, tetapi saya harus membuatnya sendiri karena saya kehilangan internet segera setelah memuat halaman ini. (Akan diposting beberapa waktu lalu jika bukan karena masalah internet ini ...)

Di dunia yang sempurna, presisi float tidak akan menjadi masalah dan saya bisa menghemat 9 byte:

f=(x,y,p=5**.5/2+.5)=>x<y?f(y,x):y/p%p<1&y/p%p==x*p%++p

6 byte lagi dapat disimpan jika JS mendukung rantai perbandingan Python:

f=(x,y,p=5**.5/2+.5)=>x<y?f(y,x):y/p%p==x*p%++p<1
Produksi ETH
sumber
0

Pyth, 39 Bytes

=SQL?!b0-byytb;q@myd+0.fqyZytZ@Q1)-F_Qh

Saya menulis ini dengan fungsi bernama (ew), dan sangat malas bermain golf. Berencana untuk bermain golf cukup banyak byte nanti malam

Cobalah secara online, dengan tes yang saya buat sendiri, yang dimaksudkan untuk mengganti Benar / Salah

Penjelasan:

Diagonal dari matriks solusi memiliki kuadrat kehilangan sesuai dengan urutan angka yang diulang dalam OEIS A005206 . Dari Lmelalui ;adalah notasi polish cukup mudah untuk menentukan y(b)=b-y(y(b-1)).

Berikut penjelasannya

=SQL?!b0-byytb;q@myd+0.fqyZytZ@Q1)-F_Qh    Full program, take stdin as [x, y], output True or False to stdout
=SQ                                        Sort input
   L?!b0-byytb;                            Named lambda as explained above
                    +0.f                   Make sequence of first max(x, y) numbers, starting with 0, 
                        qy y               For which are equal 
                          Z tZ             each element and the previous are equal
                myd                        Map this sequence to the y(index), not just index numbers
             q                             Check if are equal 
              @                  )-F_Q     the x-yth element of sequence (x-y represents which diagonal) 
                                     h(Q)  and the lower of [x,y] (Q is added by the interpreter to fix arity issues
Dave
sumber
0

Batch, 204 byte

@if %1 lss %2 %0 %2 %1
@if %1==0 exit/b0
@set/au=l=i=0
:g
@set/au+=2+i%%2,l+=1+i%%2
@if %1==%n% if %2==%m% exit/b0
@if %1 leq %n% exit/b1
:l
@set/a"k=3*i^2*i^i,i+=1
@if %k%==0 goto g
@goto l

Kembali melalui kode keluar. Penjelasan: Karena Batch hanya memiliki bilangan aritmetika bilangan bulat, saya harus menyusun solusi aritmatika murni. Tidak termasuk 0,0entri, pasangan koordinat kuadrat yang hilang mengikuti aturan berikut: jika 11nomor biner -gratis berikutnya bahkan kemudian tambahkan 3,2tambahkan 2,1. Tes untuk 11nomor biner -gratis adalah jika tidak ada membawa ketika itu dikalikan tiga, dengan kata lain itu (i*2)+i==(i*2)^i. Berikut adalah beberapa 11angka biner -gratis pertama dan koordinatnya:

   0     2,1  + 3,2 =  5,3
   1     5,3  + 2,1 =  7,4
  10     7,4  + 3,2 = 10,6
 100    10,6  + 3,2 = 13,8
 101    13,8  + 2,1 = 15,9
1000    15,9  + 3,2 = 18,11
1001    18,11 + 2,1 = 20,12
1010    20,12 + 3,2 = 23,14

dll. Secara misterius aturan ini cukup untuk membuat urutannya saling melengkapi. Kemudian tetap menghitung urutan sampai mencapai koordinat yang lebih besar, pada titik mana kita dapat menentukan apakah kuadratnya kalah.

Neil
sumber