На шахматной доске есть игра 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 пикселя).
источник
10, 7
проигрышный квадрат? Есть10, 8
? Как насчет15, 11
?Ответы:
Python 3 ,
112504642 байта-4 байта благодаря Джонатану Аллану !
-2 байта благодаря xnor !
Попробуйте онлайн!
На основе формулы для холодных позиций в игре Витоффа и внесения некоторых модификаций для получения явной формулы. Объяснение входящего, как только я закончу правильную методологию для получения формулы.
источник
0<=x
чтобыx>0
и сохранить байты или два?<=
или>=
для того , чтобы включить положение0, 0
.lambda r,c:int(abs(r-c)*(5**.5+1)**2/4)==max(r,c)
/2//1
выглядит так же, как//2
.Желе , 8 байт
Попробуйте онлайн! или посмотрите верхний левый 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)
условие выполняется.источник
JavaScript (ES6), 64 байта
Теперь я вижу, что это не самый лучший метод, но мне пришлось придумать его сам, потому что я потерял интернет вскоре после загрузки этой страницы. (Если бы не эти интернет-проблемы, выложили бы некоторое время назад ...)
В идеальном мире точность с плавающей точкой не была бы проблемой, и я мог бы сэкономить 9 байт:
Можно сохранить еще 6 байтов, если JS поддерживает цепочку сравнения Python:
источник
Pyth, 39 байт
Я написал это с именованной функцией (ew) и очень лениво играл в гольф. Планируем сыграть в гольф сегодня вечером довольно много байтов
Попробуйте онлайн с моими собственными сгенерированными тестами, предназначенными для чередования True / False
Объяснение:
Диагонали матрицы решений имеют квадрат проигрыша в соответствии с последовательностью повторяющихся чисел в OEIS A005206 . От
L
сквозной;
довольно проста польская нотация определитьy(b)=b-y(y(b-1))
.Остальная часть объяснения следует
источник
Пакетный, 204 байта
Возвращает через код выхода. Пояснение: поскольку в пакетном режиме используется только целочисленная арифметика, мне пришлось придумать чисто арифметическое решение. Исключая
0,0
запись, пары теряющих квадратные координаты следуют следующему правилу: если следующее11
-свободное двоичное число является четным, то добавить добавить3,2
иначе2,1
. Проверка на наличие11
свободного двоичного числа заключается в том, что нет переносов, если его умножить на три, другими словами,(i*2)+i==(i*2)^i
. Вот первые несколько11
свободных двоичных чисел и их координаты:и т.д. Таинственным образом этого правила достаточно, чтобы сделать последовательности дополнительными. Затем остается вычислить последовательность, пока она не достигнет большей координаты, и в этот момент мы можем определить, проигрывает ли квадрат.
источник