Це програючий квадрат?


19

Існує гра під назвою Get Home, яка грається на шаховій дошці. У цій грі є одна фігура, яка рухається обома гравцями по черзі. Існує кілька правил, як можна перемістити шматок. На черзі гравець повинен зробити один з наступних кроків для позитивного n .

  • n пробілів вгору

  • n пробілів зліва

  • n пробілів вгору та ліворуч (діагональ)

Гравець, який перемістить твір у верхній лівий кут дошки, виграє гру.

Тепер ми визначимо поняття програючого квадрата. У цьому відео (звідки я взяв ідею) програшний квадрат визначається як квадрат, на якому будь-який гравець, що розпочав свою чергу, буде змушений зробити крок, що дозволяє опоненту примусити перемогу. Найпростішим прикладом програючого квадрата буде квадрат у (1,2). Шматок у (1,2) може переміститися в будь-яке з наступних місць.

Ілюстрація

Усі вони мають прямий шлях до перемоги для наступного гравця.

Звідси випливає, що будь-який квадрат, який має шлях в один рух до площі, що програє, дозволяє гравцеві, що починається на цьому квадраті, примусити виграти. Це означає, що будь-який квадрат, який не знаходиться в одній відстані від площі, що програє, також є програшним квадратом.

Це підводить нас до цього досить акуратного визначення втраченого квадрата:

Квадрат, що програє, - це квадрат, з якого жоден рух не може дійти до іншого програючого квадрата, і (0,0) - це програючий квадрат.

Завдання

З огляду на координати квадрата на шаховій дошці довільного розміру визначте, чи є це програючий квадрат. Виведіть два значення, одне для втрати квадратів та одне для інших.

Це тому відповіді будуть набиратись у байтах, а менша кількість байтів - краща.

Випробування

Ось усі втрачені квадрати на звичайній шаховій дошці 8 на 8 (позначено 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

Ось зображення дошки 100 на 100 із втраченими квадратами, позначеними чорним кольором (кожен квадрат - 2 пікселі на 2 пікселі).

Дошка 100 на 100


2
Я не думаю, що є достатньо тестових випадків, щоб знайти шаблон. Я думаю, що я бачу шаблон, але я не міг сказати точно. Чи 10, 7є програш квадрат? Є 10, 8? Про що 15, 11?
DJMcMayhem

1
@WheatWizard Ви не проти зробити зображення трохи більшим?
Ерік Аутгольфер

1
@WheatWizard Я мав на увазі більші пікселі ... наприклад, 5x5 пікселів замість 1x1, можливо, якась сітка теж якщо не занадто жорстка (btw спасибі за 100x100)
Erik the Outgolfer

2
Також пов'язані (поверніть оптимальний хід або сигнал, що позиція втрачається).
Згарб

1
Я думаю, що це нормально, щоб дозволити неточності з плаваючою комою перешкоджати продуктивності навіть при довільно великих цілих можливостях ...
Джонатан Аллан

Відповіді:


8

Python 3 , 112 50 46 42 байт

-4 байти завдяки Джонатану Аллану !

-2 байти завдяки xnor !

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

Спробуйте в Інтернеті!

На основі формули холодних позицій у грі Вайтофа та внесення деяких модифікацій, щоб отримати чітку формулу. Пояснення вхідне, як тільки я фактично закінчую належну методологію виведення формули.


Чи не могли б ви змінити , 0<=xщоб x>0і зберегти байти або два?
Джонатан Фрех

@JonathanFrech Це повинно бути <=або >=для включення позиції 0, 0.
notjagan

Ви праві, лише один байт можна зберегти.
Джонатан Фрех

1
Один менший байт з іншою реалізацією того ж:lambda r,c:int(abs(r-c)*(5**.5+1)**2/4)==max(r,c)
Джонатан Аллан

1
/2//1виглядає так само, як //2.
xnor

5

Желе , 8 байт

ạ/×ØpḞ⁼Ṃ

Спробуйте в Інтернеті! або побачити верхню ліву частину 60 на 60 як сітку .

Як?

Холодна позиція в грі Вайтофа - програш. Координати [n,m]дають положення , коли холодного n = floor(kφ) = floor(mφ) - mабо m = floor(kφφ) = ceil(nφ) = n + kдля деякого натурального числа, kі золотий перетин, φ. Перший тримається, коли nменше m; останній, коли mменше n(обидва тримаються в 0,0).

kТаким чином , абсолютна різниця між nі mі якщо floor(abs(n-m)φ)=min(n,m)умова виконується.

ạ/×Ø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 байти

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

Зараз я бачу, що це не найкраща методика, але мені довелося придумати її самостійно, бо втратив Інтернет незабаром після завантаження цієї сторінки. (Був би опублікований деякий час тому, якби не ці проблеми з Інтернетом ...)

У ідеальному світі точність поплавця не буде проблемою, і я можу зберегти 9 байт:

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

Ще 6 байт можна зберегти, якщо JS підтримував ланцюжок порівняння Python:

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

0

Піта, 39 байт

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

Я написав це з названою функцією (ew), і був надзвичайно ледачий з гольфу. Пізніше сьогодні ввечері планується відіграти велику кількість байтів

Спробуйте в Інтернеті, з моїми власними генерованими тестами, призначеними для чергування True / False

Пояснення:

Діагоналі матриці розчину мають втратний квадрат відповідно до послідовності повторних чисел у OEIS A005206 . Від Lнаскрізний ;досить проста польська нотація визначити y(b)=b-y(y(b-1)).

Решта пояснень випливає далі

=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

Пакетна, 204 байти

@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

Повертається через код виходу. Пояснення: Оскільки Batch має лише цілу арифметику, я повинен був розробити чисто арифметичне рішення. Виключаючи 0,0запис, пари втрачаючих квадратних координат дотримуються наступного правила: якщо наступне - 11вільне двійкове число є рівним, тоді додайте 3,2інакше, додайте 2,1. Тест на 11безкоштовне двійкове число - це якщо немає переносів, коли воно помножується на три, іншими словами це (i*2)+i==(i*2)^i. Ось перші кілька11 безкоштовних двійкових чисел та їх координат:

   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

і т.д. Загадково цього правила достатньо, щоб послідовності доповнювались. Потім залишається обчислити послідовність, поки вона не досягне більшої координати, і тоді ми можемо визначити, чи втрачає квадрат.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.