Вы должны написать программу или функцию, которая получает строку, представляющую шахматную доску с только пешками в качестве входных и выходных данных или возвращает, возможен ли какой-либо захват на доске.
Входные данные находятся в FEN- подобной нотации, описывающей позиции белых и черных пешек без каких-либо других фигур. Вы должны решить, есть ли пешка, которая может захватить пешку противника.
Каждый ранг описан, начиная с ранга 8 и заканчивая рангом 1; в пределах каждого ранга содержимое каждого квадрата описывается от файла "a" до файла "h". Каждая пешка обозначена одной буквой (белая пешка = "P", черная пешка = "p",). Пустые квадраты отмечаются цифрами от 1 до 8 (количество пустых квадратов), а "/" разделяет ранги. (частично взято из Википедии)
Например
8/pppppppp/8/8/4P3/8/PPPP1PPP/8
описывает доску
--------
pppppppp
P
PPPP PPP
--------
Белая пешка может захватить черную, если черная расположена по диагонали вверх от нее (черные - вверх-влево или вверх-вправо), а черная пешка может захватить белую пешку, если белая находится по диагонали от нее (белая вниз-влево или вниз-вправо). Никакое другое движение захвата ( en passant ) не должно рассматриваться.
вход
- А Fen -как строка , состоящая из символов
12345678pP/
. - Входные данные описывают пешки действительной шахматной позиции. Это означает (среди других более сложных ограничений) будет максимум 8 пешек для каждой стороны и не будет пешек в рядах 1 и 8.
Выход
- Если есть возможность захвата для любой из сторон, вы должны вывести истинное значение и ложное значение в противном случае.
Примеры
Входы с правдивым выходом (по одному на строку)
8/7p/6P1/8/8/8/8/8
8/8/p7/1P6/3P3p/8/8/8
8/2P5/8/4P1p1/2p2P2/3p4/3p1P2/8
8/P7/8/5P2/2pp4/3P2p1/3pP3/8
8/P7/p7/p1P1P3/1P3p2/8/1p6/8
8/4p1P1/2P2P1P/2p1pPpp/8/6P1/pP1p4/8
Входы с ложным выходом (по одному на линию)
8/8/8/8/8/8/8/8
8/7P/6p1/8/8/8/8/8
8/7p/7P/8/8/8/8/8
8/pppppppp/8/8/8/8/PPPPPPPP/8
8/p7/8/1p6/5P2/8/8/8
8/p7/P7/2P1p1p1/2p5/8/PP6/8
Это код гольф, поэтому выигрывает самый короткий вход.
8/pppppppp/8/8/8/7P/PPPP1PPP/8
?7P
будет означать, что пешка находится на последнем восьмом файле. (Диаграмма была неправильной, хотя, я исправил это.)Ответы:
Pyth, 25 байт
Тестирование
шаги:
Преобразуйте ввод, заменив цифры эквивалентным количеством кавычек (
N
). Это сохраняется вJ
. Затем мы отрезаем первые 8 или 10 символов и сжимаем результат с оригиналом. Любая пара захвата будет преобразована в"Pp"
, поэтому мы находим количество этой строки в результирующем списке. Это выход.В качестве бонуса это фактически подсчитывает количество возможных захватов на входе.
источник
:sXz`M9*LN9"p.{7}(..)?P"1
сожалению, последний параметр:
не является обязательным (я думаю, что это должно быть).Сетчатка ,
3329 байтЧтобы запустить код из одного файла, используйте
-s
флаг.Должно быть легко разбито чем-то вроде Perl, где разложение цифр в строки пробелов (или других символов) не занимает 17 байт.
Выход является положительным (правдивым), если есть возможный захват, и нулевым (ложным), если нет.
объяснение
Это цикл из двух этапов. Первый - это этап транслитерации, который уменьшает каждую цифру и превращает нули в подчеркивания. Почему? Потому
d
иw
расширим следующие две строки:Если целевой набор этапа транслитерации длиннее исходного набора, посторонние символы игнорируются, что ведет к снижению поведения (честно говоря, мне просто повезло, что я решил поставить подчеркивание перед цифрами при расширении
w
класса символов) ,Затем вторым этапом является замена, которая добавляет
.
к каждой цифре. Это означает , что для каждой цифрыn
,n
периоды добавляются до того, что цифра превратилась в подчеркивание.Это только избавляет от подчеркивания.
Наконец, мы находим спички. Так как мы игнорируем en passant, захват возможен только при наличии
p
и затем поP
диагонали под ним. В линейной строке это просто означает, что между двумя пешками должно быть 7 или 9 символов. Это соответствует.{7}(..)?
(т.е. соответствует 7 символам, а затем, по выбору, соответствует еще двум).Такой этап совпадения возвращает количество найденных совпадений.
источник
Javascript, 272 символа
Там, вероятно, много возможностей для улучшения.
источник
Рубин,
145 12346 байтЯ не знаю, почему я вообще не думал об этом. Это намного короче и также довольно читабельно.
Вот тест: http://ideone.com/Gzav8N
Старый подход:
Онлайн тест: http://ideone.com/9L01lf , версия до игры в гольф: http://ideone.com/CSmqlW
История изменений доступна здесь .
источник
ES6, 64 байта
Соответствующее количество байтов, если оно длится!
Я действительно думал об этом решении, не читая сначала другие ответы, но я не буду возражать, если вы мне не верите.
источник
Perl 5, 30 байт
29, плюс 1
-pe
вместо-e
Perl-копия ответа Ruby на w0lf .
источник
PHP,
948780 байтЭта петля +
strtr
намного короче, чемpreg_replace_callback
сstr_pad
.источник
Желе,
888479726965646360 байтОпределенно возможности для улучшения. Неконкурентоспособен, потому что Желе было создано до вопроса. Спасибо @lirtosiast за это!
источник