Учитывая сетку букв 8x8, представляющую текущее состояние игры в шахматы, задача вашей программы состоит в том, чтобы найти следующий ход для белых, который приводит к мату (ответ всегда будет матом за один ход).
вход
Ввод будет осуществляться через STDIN - 8 строк по 8 символов в каждой. Значения каждого символа следующие:
K/k - king
Q/q - queen
B/b - bishop
N/n - knight
R/r - rook
P/p - pawn
- - empty square
Буквы в верхнем регистре обозначают белые части, а строчные - в черном. Доска будет ориентирована так, чтобы белые играли снизу вверх, а черные сверху вниз.
Выход
Ход белых, который приводит к мату, в алгебраической нотации . Вам не нужно отмечать, когда фигура взята, и вам не нужно беспокоиться о неоднозначности между двумя одинаковыми фигурами, которые могут сделать один и тот же ход.
Пример ввода
Пример 1
Входные данные:
------R-
--p-kp-p
-----n--
--PPK---
p----P-r
B-------
--------
--------
Выход:
c6
Пример 2
Входные данные:
--b-r--r
ppq-kp-p
-np-pn-B
--------
---N----
--P----P
PP---PP-
R--QRBK-
Выход:
Nf5
Пример 3
Входные данные:
---r-nr-
-pqb-p-k
pn--p-p-
R-------
--------
-P-B-N-P
-BP--PP-
---QR-K-
Выход:
Rh5
Вы можете предположить, что решение не будет включать рокировку или проход.
Это код-гольф - выигрывает самое короткое решение.
(Примеры взяты с сайта mateinone.com - пазлы 81, 82 и 83)
Ответы:
Ruby,
589512510499493 символаВвод осуществляется через стандартный ввод, например:
Результатом является не только один ход, который заставляет партнера в одном, но каждый ход, который делает это.
Редактировать 1: функция
e
использовалась только один раз, поэтому я добавил ее. Во-вторых, кодировка теперь основана на числе 5, а не 10. И рефакторинг клонирования доски сэкономил немало символов.Редактировать 2: Все еще не так много улучшений, как я хотел. Меняем хеш с
{a=>b,c=>d}
наHash[a,b,c,d]
. Это стоит 4 символа, но сохраняет один на пару ключ-значение.Правка 3: Только незначительные сокращения: встраивание M (4 символа),
t==?-
->t<?.
(2), удаление Pawn в алгебраической нотации в конце (2), замененные путы (3). В программе сейчас менее 500 символов.Редактировать 4: Интересно, сколько еще можно найти в такой программе. Переместил инвариант за пределы цикла и нашел еще один дубликат вычисления.
источник
[*$<]
вместо$<.map{|l|l}
.