Проблема:
В шахматах есть довольно известное правило о ничьей повторением. Если одна и та же позиция повторяется 3 раза (или более), то игрок, намеревающийся сделать ход, который вызовет это повторение, может претендовать на ничью.
Иногда это легко определить для арбитра, если последние несколько ходов - это просто игроки, двигающиеся вперед и назад. Иногда это менее тривиально, когда фигуры значительно переместились между повторными позициями.
Проблема в этой задаче состоит в том, чтобы вывести истинное значение, если заявленная позиция нарисована повторением (было просмотрено 3 или более раз), и значение Falsey, если заявленная позиция не нарисована повторением, учитывая список ходов в координатной записи как описано ниже, или любое обозначение по вашему выбору (но вам придется преобразовать контрольные примеры).
Какая позиция?
В сценарии реального мира на положение будут влиять такие вещи, как то, может ли игрок сделать замок или возможен ли en-passant; Вы не должны учитывать это в своем решении проблемы. В этой задаче положение определяется просто конфигурацией фигур на доске. Таким образом, для целей этой проблемы две позиции считаются одинаковыми, если каждый квадрат на обеих досках занят одним и тем же типом фигуры одного цвета. Это не обязательно должна быть точная фигура, например, белые кони могут поменять квадраты, и если все остальные фигуры будут соответствовать критериям, это все равно будет та же самая позиция.
Как выглядит действительная запись?
Хотя я и продолжу объяснять обозначения координат, вы можете свободно принимать ввод с помощью выбранной вами системы обозначений. При условии, что:
- Каждый элемент в обозначениях описывает любую или все: часть / части, вовлеченные; поставлен ли чек, мат, двойная проверка, мат или пат; если произошел случайный захват; начальная позиция; окончательная позиция.
- Вы не можете иметь информацию о повторении в вашей записи.
Поэтому, пока эти критерии соблюдены, я с радостью приму, если вы укажете в своем ответе, свою систему обозначений. Это может быть, например, 0 проиндексированных строк, кортежей столбцов или что-либо еще, что имеет смысл для вашей программы.
Обозначение координат
Обозначение координат - это обозначение, которое описывает чисто движения как систему координат.
Перемещение описывается как сначала начальная координата из набора, {A1-H8}
а затем снова координата назначения из того же набора. Таким образом , гамбит короля будет выглядеть (как набор строк)
{"E2-E4","E7-E5","F2-F4"}
Я считаю, что это лучшее обозначение для этой проблемы, потому что оно не усеяно посторонней информацией, такой как проверка или тип перемещения детали. Как упоминалось ранее, нотация может быть на ваш выбор, поэтому вы можете использовать другую нотацию, например, алгебраическую нотацию, или вы можете адаптировать эту нотацию (например, удалить тире или взять в качестве списка кортежей)
Правила:
- Вы не должны думать, является ли позиция или ход действительным, только если это вызывает повторение
- Вы можете предположить, что расклинание и продвижение пешек не произойдет.
- Вы должны взять список строк в качестве входных данных и вывести истинное или ложное значение, соответствующее тому, произошло ли третье (или более) повторение на последнем шаге
- Игра всегда начинается со стандартной стартовой позиции для шахмат. Начальная позиция может рассчитывать на повторение.
- Ничья путем повторения не произошла, если позиция не повторяется последним ходом
Основные правила:
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования. - К вашему ответу применяются стандартные правила с правилами ввода / вывода по умолчанию , поэтому вам разрешено использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода (например, TIO ).
- Кроме того, добавление объяснения для вашего ответа настоятельно рекомендуется.
Тестовые случаи
Вы должны вернуть правдивые значения для:
{"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"}
И фальси значения для:
{}
{"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"}
источник
C6-B8
начальная позиция произошла трижды.Ответы:
APL (Dyalog Extended) ,
5549474544 байта SBCS-4 благодаря нгн.
Полная программа. Запрашивает обратный список пар обратных координат:
например
{"B1-C3","B8-C6"}
,[[[8,2],[6,3]],[[1,2],[3,3]]]
Попробуйте онлайн! (включает функцию полезности,
Coords
которая переводит формат OP)Настройте список состояний:
s←3
назначить трех доs
(для з Tates)Так как 3 не является допустимым состоянием доски, это не повлияет на наш счетчик повторений, и нам нужно сквозное значение назначения…
Построить представление шахматной доски:
5
… Отбросить это для результата применения следующей производной функции между 5 и 3:⍥⍳
расширить оба аргумента до их ɩ ndices;[1,2,3,4,5]
…[1,2,3]
,∘⌽
Левая сторона соединена с обратной стороной правой стороны,[1,2,3,4,5,3,2,1]
это представляет офицеров⍪
сделать в стол;[[1],
[2],
[3],
[4],
[5],
[3],
[2],
[1]]
6,
добавьте (к каждому ряду) шестерку, представляющую пешки;[[6,1],
[6,2],
[6,3],
[6,4],
[6,5],
[6,3],
[6,2],
[6,1]]
⍉
транспонировать;[[6,6,6,6,6,6,6,6],
[1,2,3,4,5,3,2,1]]
¯4↑
взять отрицательные (т.е. последние) четыре (строки), заполненные нулями, представляющими пустые квадраты;[[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]]
(
…)
Примените к этому следующую молчаливую функцию:-
отрицать (это представляет противоположный цвет);[[ 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]]
⊖⍪
поместите перевернутый аргумент поверх этого, давая нам полный пансион;[[ 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]]
Составьте список ходов с последующим исходным состоянием:
⊂
приложить это (рассматривать это как единое целое)⎕,
запросить список ходов и добавить его в исходное состояниеУменьшите * на функцию, которая добавляет текущее состояние в список и делает ход:
{
…}/
Уменьшить на следующую анонимную лямбду:⍵
правильный аргумент (текущее состояние)⊂
приложите это, чтобы рассматривать это как единое целоеs,←
на месте добавить его в список штатов⊃
раскрыть его, чтобы использовать это состояние…
@⍺
В элементах с двумя координатами, которые представляет левый аргумент, поместите:0
ноль,,
за∘
которым следует⊃
первое значение,это эффективно «перемещает» значение в первой координате во вторую координату, оставляя после себя ноль
Проверьте, есть ли у нас три или более конечных состояния:
s∩
пересечение всех состояний с этим последним; подмножество идентичных ему состояний≢
подсчитать их2≤
проверить, есть ли два или более (то есть три или более, включая конечное состояние)* APL ассоциирован справа, поэтому сначала вызывается функция с начальным состоянием в качестве правого аргумента и начальным перемещением в качестве левого аргумента, а затем ее результат, новое состояние, становится новым правым аргументом со вторым ходом в качестве нового левого аргумента и т. д. Окончательный результат
источник
\
вместо уменьшения/
⍳3⊣s←⍬
->⍳s←3
. это работает, потому что3
не является допустимой доской, поэтому это не повлияет на обнаружение повторений(0,⊃)@
->0,∘⊃@
R ,
180177144 байтПопробуйте онлайн!
-3 байт благодаря Giuseppe
-29 байт благодаря использованию Ник Кеннеди
Reduce
и-rev(l)
-4 байтов в обратном
z
В качестве входных данных принимает вектор целых чисел от 1 до 64, обозначающий квадраты. TIO включает в себя функцию для преобразования в этот формат. Различные части хранятся в виде целых чисел от 1 до 6 и от -1 до -6.
Объяснение:
источник
Reduce
по своей сути использует накопительный . Это 148 байтов.Желе ,
4137 байтПопробуйте онлайн!
Монадическая ссылка, которая принимает входные данные в виде списка пар 1-индексированных ходов основных строк
[from, to]
и возвращает 1 для ничьих и 0 для нет.Обратите внимание, что код нижнего колонтитула в TIO переводит ходы, предоставленные OP, в числовой формат, но согласно обсуждению ниже вопроса числовой формат был бы допустимым вводом.
объяснение
источник
JavaScript (Node.js) ,
121111 байтОжидает движение в[ 0..63 ] с а8 = 0 , b8 = 1 , ..., h1 = 63 ,
[sq0, sq1]
формате, где каждый квадрат находится вВозвращает логическое значение.
Попробуйте онлайн!
Как?
Частей
Значения, используемые для идентификации частей, на самом деле не имеют значения, если для каждого типа элементов существует одно уникальное значение.
Мы используем:
Доска и начальная позиция
Доска хранится в массивеб который инициализируется путем разделения конкатенации следующих частей:
'89ABCA981111111'
→ 8 черных основных фигур, за которыми следуют первые 7 черных пешек10n**32n
→ последняя черная пешка на0x7e5196ee74377
→ все белые фигуры (расходуется на2222222234567543
в десятичном виде)что приводит к:
Отслеживание позиций
Переменнаяб также используется в качестве объекта для отслеживания всех встреченных позиций. Ключ для каждой позицииб сам, но на этот раз как массив и неявно приведен к строке.
Вот почему мы делаем:
комментарии
источник
Java 10,
336330287285282276 байт-11 байт благодаря @Arnauld , изменив
i%56<8?"ABCDECBA".charAt(i%56%7):i%48<16?1:0
наi%56<8?i%8*35%41%10%8+2:9>>i/16&1
.Ввод в виде двумерного массива целых чисел, где1 = 0 , Ь 1 = 1 , . , , , h 8 = 63 (т.е.
{"E2-E4",...
есть[[12,28],...
).Попробуйте онлайн.
Объяснение:
Значения частей после их заполнения
A[i]=(i%56<8?i%8*35%41%10%8+2:9>>i/16&1)*(i/32*2-1)
:Попробуйте онлайн.
источник
java.util.Arrays.deepHashCode(A)
, но, видимо, некоторые хэши все равно остаются такими же (т.е. последний тестовый пример есть-447346111=3
на карте ...), если я сравниваю результирующую карту моего текущего ответа и результирующую карту, используяdeepHashCode(A)
. Кроме того, он будет на 3 байта длиннее, а не короче, поскольку я должен использоватьdeepHashCode(A)
дважды (также для начального состояния).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
i%8*35%41%10%8+2
должно быть возможной заменой"ABCDECBA".charAt(i%8)
, сохраняя 6 байтов. Это генерирует образец[ 2, 7, 3, 5, 9, 3, 7, 2 ]
.Древесный уголь , 62 байта
Попробуйте онлайн! Ссылка на подробную версию кода. Принимает входной сигнал в виде массива пар чисел , где пронумерованы квадраты
A1
,B1
, ...H8
(0-индексированный) , так, например , первый тестовый случай будет представлен в виде[[[1, 18], [57, 42], [18, 1], [42, 57], [1, 18], [57, 42], [18, 1], [42, 57]]]
и выводит ,-
если позиция ничья повторением. Программа конвертации. Все в одном. Объяснение:Разделить число
23456432
на отдельные цифры. Они представляют собой белые фигуры.Добавьте в пешки и пустые ряды. Белые пешки имеют ценность
1
и черные пешки-1
.Добавьте отрицательную копию белых частей, которые представляют черные части.
Зацикливайтесь на движениях.
Сохраните копию доски. (Реверсирование - самый лучший способ скопировать доску.)
Обновите место назначения с помощью исходного фрагмента.
Удалить исходную часть.
Определите, была ли текущая позиция видна более одного раза.
источник
C # (интерактивный компилятор Visual C #) , 204 байта
Принимает входные данные как список кортежей целых чисел, где первое целое число - это место, откуда нужно двигаться, а второе - куда нужно двигаться. 0 представляет собой A1, 1 представляет собой A2, и 63 представляет собой H8.
Попробуйте онлайн!
источник
Java (JDK) ,
246245244 байтаПопробуйте онлайн!
источник