Атомные шахматы - это (очень забавный) вариант шахмат, в котором каждый захват вызывает «взрыв», уничтожая захваченную фигуру, фигуру, выполняющую захват, и всех не пешек в радиусе 1 квадрата. Цель этой задачи не в том, чтобы сыграть всю игру в атомные шахматы, а просто в том, чтобы имитировать то, что происходит, когда делается определенный ход.
Отказ от ответственности: взрыв звуковые эффекты не включены.
вход
Позиция доски будет указана в нотации Форсайт-Эдвардс (обычно известной как FEN), но только с первым полем. Например, ввод:
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
представляет начальную позицию:
Это должно быть воспринято как строка или эквивалент вашего языка. Это гарантированно будет действительным; например, вам не нужно заботиться о том, есть ли десять королей, или нет короля вообще.
Вам также будет дан ход, который вы должны смоделировать, который представлен в виде двух квадратных имен: квадрат, на котором находится перемещаемая фигура, и квадрат, на который она перемещается. Например, перемещение пешки короля на две позиции вперед на изображении выше будет представлено как:
e2e4
Это также должно быть воспринято как строка. Движение всегда будет действительным, и вам не нужно поддерживать рокировку . Вам необходимо поддержать en passant , что будет объяснено более подробно в следующем разделе.
Выход
Выходные данные вашей программы должны быть в той же записи с частичным FEN, что и входные, с указанным выполненным ходом (и любые фрагменты, если необходимо, взорванные).
Точные правила взрыва - когда часть захвачена:
Удалите захваченную фигуру (это всегда будет фигура во втором квадрате, названном на входе, за исключением случая, когда захват является проходным ).
Удалите часть, которая делает захват (это всегда будет часть на первом квадрате, названном во входе).
Удалить каждый кусок, который является:
расположен на одном из 8 квадратов, окружающих тот, где произошел захват (для en passant , это квадрат, на котором была бы пешка захвата, если бы она не взорвалась).
не пешка.
Краткий обзор правил en passant для тех, кто незнаком: если пешка перемещается на два пробела вперед от своего начального ранга, и есть пешка, которая могла бы захватить ее, если бы она двигалась только на одну клетку вперед, она может захватить ее в любом случае, но только на последующий ход. Этот захват, как говорят, делается « мимоходом » (или по-французски: « en passant »).
Контрольные примеры
На рисунках зеленые стрелки обозначают движение, которое предстоит сделать, а зеленые кружки представляют собой взорванные части.
Вход: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
, g1f3
выход:rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R
Вход: 3kBb1r/pp5p/3p4/4pn2/P7/1P2P1pP/2rP1P2/R1B3RK
, f2g3
выход: 3kBb1r/pp5p/3p4/4pn2/P7/1P2P2P/2rP4/R1B3RK
(украдено из http://en.lichess.org/ocoSfS5I/white#36 )
Вход: rnbqk1nr/1pp5/p2pp1pp/5p2/1bN5/2P1PQ1N/PP1P1PPP/R1B1KB1R
, f3b7
выход: 3qk1nr/2p5/p2pp1pp/5p2/1bN5/2P1P2N/PP1P1PPP/R1B1KB1R
(украдено из http://en.lichess.org/NCUnA6LV/white#14 )
Вход: rnbqk2r/pp2p2p/2p3pb/3pP3/5P2/2N5/PPPP2P1/R1BQKB1R
, e5d6
выход: rnbqk2r/pp2p2p/2p3pb/8/5P2/2N5/PPPP2P1/R1BQKB1R
(украдено из http://en.lichess.org/AvgU4Skq/white#16 , это не фактический ход, но я не мог быть обеспокоен , чтобы найти атомную игру , которая на самом деле была Мимоходом: П)
Вход: 5r2/2k5/p1B5/1pP1p3/1P4P1/3P4/P7/1K3R1q
, c6h1
выход: 5r2/2k5/p7/1pP1p3/1P4P1/3P4/P7/1K3R2
(украдено из http://en.lichess.org/l77efXEb/white#58 )
счет
Это код-гольф , поэтому выигрывает самый короткий код в байтах.
Ответы:
JavaScript ( ES6 ) 305
310 321Как функция с двумя реальными параметрами (и многое другое со значениями по умолчанию, используется как быстрый и грязный способ определения местных жителей)
Тестовый запуск фрагмента ниже (будь то EcmaScript 6, только Firefox)
Ungolfed
источник
Ява (
946777776 символов)1 символ благодаря @ edc65
Примечание. Символы учитываются без учета контрольных примеров.
Код
Я не уверен, является ли это решение оптимальным, но я больше работаю над его игрой в гольф, любые предложения приветствуются. Я могу также прокомментировать весь код, если кому-то захочется, но я думаю, что он в основном не требует пояснений, за исключением непонятного перечисления переменных.
объяснение
расширенный
старый
источник
String m,i="";m="";char[]n=m.toCharArray()
->String i=a[0];char[]n=a[1].toCharArray()
короче , и поэтому вы получите параметры извне (как вы должны в любом случае)