Bu kaybedilen bir kare mi?


19

Satranç tahtasında oynanan Get Home adlı bir oyun var . Bu oyunda her iki oyuncu tarafından sırayla taşınan tek bir parça var. Parçanın nasıl taşınabileceğine dair bazı kurallar vardır. Bir dönüşte bir oyuncu pozitif n için aşağıdaki hamlelerden birini yapmalıdır .

  • n boşluk bıraktı

  • n soldaki boşluklar

  • n yukarı ve sola boşluklar (köşegen)

Parçayı tahtanın sol üst köşesine hareket ettiren oyuncu oyunu kazanır.

Şimdi kaybedecek bir kare kavramını tanımlayacağız. Gelen bu video (ı fikre nereden itibaren) kaybeden bir kare sıranın kendilerine başlayan herhangi bir oyuncu kendi rakip bir galibiyet zorlamak için izin veren bir hamle yapmak zorunda kalacak olan bir kareyle olarak tanımlanır. Kaybeden bir karenin en basit örneği (1,2) 'deki karedir. (1,2) 'deki bir parça aşağıdaki yerlerden herhangi birine gidebilir.

örnekleme

Hepsinin bir sonraki oyuncu için doğrudan zafere giden yolu var.

Ayrıca, kaybedilen bir kareye tek bir hareket yolu olan herhangi bir karenin, o kareden başlayan oyuncunun kazanmayı zorlamasına izin verdiği görülür. Bu, kaybeden bir kareden bir hamle olmayan herhangi bir karenin de kaybedilen bir kare olduğu anlamına gelir.

Bu bizi kaybeden bir karenin oldukça düzgün tanımına getiriyor:

Kaybeden kare, kaybeden başka bir kareye hiçbir hareketin ulaşamayacağı bir karedir ve (0,0) kaybedilen bir karedir.

Görev

Rasgele boyutlu bir satranç tahtasındaki bir karenin koordinatları göz önüne alındığında, kaybeden bir kare olup olmadığını belirleyin. Biri kareleri kaybetmek için diğeri diğeri için olmak üzere iki değer çıktı.

Bu bu yüzden cevaplar daha az bayt daha iyi olacak şekilde bayt cinsinden puanlanır.

Test Durumları

İşte normal 8'e 8 satranç tahtasında (0 ile işaretlenmiş) kaybedilen tüm kareler.

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

Burada siyahla işaretlenmiş kareleri kaybeden 100 x 100 bir tahta görüntüsü (her kare 2 piksel x 2 piksel).

100 x 100 tahta


2
Bir örüntü bulmak için yeterli test vakası olduğunu sanmıyorum . Mı 10, 7bir kaybetme kare? Öyle 10, 8mi? Ne olmuş 15, 11?
DJMcMayhem

1
@WheatWizard Görüntüyü biraz büyütmeyi düşünür müsünüz?
Outgolfer Erik

1
@WheatWizard Daha büyük pikselleri kastediyordum ... örneğin 1x1 yerine 5x5 piksel, çok zor olmasa da bazı ızgaralar da olabilir (100x100 için btw teşekkürler)
Erik The Outgolfer

2
Ayrıca ilgili (en iyi hareketi veya konumun kaybolduğunu gösteren sinyali döndür).
Zgarb

1
Bence kayan nokta yanlışlıklarının keyfi olarak tamsayı özelliği ile bile performansı engellemesine izin vermek normaldir ...
Jonathan Allan

Yanıtlar:


8

Python 3 , 112 50 46 42 bayt

Jonathan Allan sayesinde -4 bayt !

Xnor sayesinde -2 bayt !

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

Çevrimiçi deneyin!

Wythoff'un oyunundaki soğuk pozisyonlar formülüne dayanarak ve açık bir formül üretmek için bazı değişiklikler yapmak. Formülün türetilmesi için uygun bir metodolojiyi gerçekten bitirdikten sonra gelen açıklama.


Değiştirmek Could 0<=xiçin x>0bir byte ya da iki ve kaydetme?
Jonathan Frech

@JonathanFrech Pozisyonu dahil etmek için ya <=da ya olmalıdır . >=0, 0
notjagan

Haklısın, sadece bir bayt kaydedilebilir.
Jonathan Frech

1
Farklı bir uygulama ile daha az bayt:lambda r,c:int(abs(r-c)*(5**.5+1)**2/4)==max(r,c)
Jonathan Allan

1
/2//1ile aynı görünüyor //2.
xnor

5

Jöle , 8 bayt

ạ/×ØpḞ⁼Ṃ

Çevrimiçi deneyin! veya sol üstteki 60 x 60'ı ızgara olarak görün .

Nasıl?

Wythoff'un oyununda soğuk bir pozisyon kaybetme pozisyonudur. Koordinatları [n,m]için soğuk pozisyon vermek n = floor(kφ) = floor(mφ) - mya da m = floor(kφφ) = ceil(nφ) = n + kbazı doğal sayı k, ve altın oranı φ. İlki ndaha küçükken m; ikincisi mdaha küçük olduğunda n(her ikisinde de bekletilir 0,0)

karasındaki mutlak fark böylece olan nve mve eğer floor(abs(n-m)φ)=min(n,m)durum karşılanmaktadır.

ạ/×Ø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?

2

JavaScript (ES6), 64 bayt

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

Şimdi bunun en iyi teknik olmadığını görüyorum, ama kendim gelmek zorunda kaldım çünkü bu sayfayı yükledikten kısa bir süre sonra interneti kaybettim. (Bu internet sorunları olmasaydı bir süre önce yayınlardım ...)

Mükemmel bir dünyada, şamandıra hassasiyeti bir sorun olmaz ve 9 bayt tasarruf edebilirim:

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

JS Python'un karşılaştırma zincirini destekliyorsa 6 bayt daha kaydedilebilir:

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

0

Pyth, 39 Bayt

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

Ben adlandırılmış bir işlev (ew) ile yazdı ve golf ile son derece tembel oldu. Bu akşam ilerleyen saatlerde çok sayıda baytla golf yapmayı planlıyoruz

True / False yerine alternatif olarak oluşturduğum kendi testlerimle çevrimiçi deneyin

Açıklama:

Çözelti matrisinin köşegenleri, OEIS A005206'da tekrarlanan sayılar dizisine göre kaybedilen bir kareye sahiptir . Gönderen Lthrough ;tanımlamak için oldukça basit cila notasyondur y(b)=b-y(y(b-1)).

Açıklamanın geri kalanı şöyle

=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

0

Toplu, 204 bayt

@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

Çıkış kodu ile döner. Açıklama: Batch sadece tamsayı aritmetiği olduğundan tamamen aritmetik bir çözüm tasarlamak zorunda kaldım. Giriş hariç, 0,0kare koordinatlarını kaybeden çiftler aşağıdaki kuralı izler: eğer bir sonraki 11serbest sayı çiftse, 3,2başka bir şekilde ekleyin 2,1. 11-Ücretsiz ikili sayı için yapılan test, üç ile çarpıldığında taşıma yoksa başka bir deyişle (i*2)+i==(i*2)^i. İşte ilk birkaç 11serbest ikili sayı ve koordinatları:

   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

Gizemli bir şekilde bu kural sekansları tamamlayıcı hale getirmek için yeterlidir. Daha sonra diziyi daha büyük koordinatlara ulaşana kadar hesaplamaya devam eder, bu noktada karenin kaybedip kaybetmediğini belirleyebiliriz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.