Программа играет белым.
Пример stdin:
8 ║♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ║♟ ♟ ♟ ♟ … ♟ ♟ ♟
6 ║… … … … … … … …
5 ║… … … … ♟ … … …
4 ║… … … … … … … …
3 ║… … ♘ … … … … …
2 ║♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
1 ║♖ … ♗ ♕ ♔ ♗ ♘ ♖
——╚═══════════════
—— a b c d e f g h
Пример stdout:
8 ║♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ║♟ ♟ ♟ ♟ … ♟ ♟ ♟
6 ║… … … … … … … …
5 ║… … … … ♟ … … …
4 ║… … … … ♙ … … …
3 ║… … ♘ … … … … …
2 ║♙ ♙ ♙ ♙ … ♙ ♙ ♙
1 ║♖ … ♗ ♕ ♔ ♗ ♘ ♖
——╚═══════════════
—— a b c d e f g h
Любой действительный ход в порядке. «En passant» и рокировка игнорируются. Можно нормально показывать сообщения об ошибках или ничего не печатать, если нет действительного перемещения.
Ответ с наибольшим количеством голосов побеждает.
popularity-contest
chess
Христо Христов
источник
источник
Ответы:
Я не жалуюсь на голосование против, но, честно говоря, мое решение здесь не так уж и хорошо. Угорен лучше, кроме отсутствия поддержки юникода. Обязательно посмотрите все ответы перед голосованием, если вы сталкивались с этим вопросом только сейчас!
Так или иначе.
Haskell, 893
888904952(без рокировки)862 (без пешечных удвоений)(Вы не указали, должен ли это быть код гольф, но мне кажется, что так и должно быть)
Когда у вас установлен GHC (например, как часть платформы Haskell ), вы можете просто
источник
C
734672640 знаковСимволы учитываются без съемных пробелов.
Формат файла, который я использовал, не соответствует требованиям, но упрощен ASCII.
Мне нужно добавить поддержку символов Unicode, это будет стоить несколько символов.
Формат файла ввода / вывода:
должно быть ровно 8 строк ровно по 8 символов.
pnbrqk
используются для белых фигур,PNBRQK
для черных фигур, пространства для пробелов:Логика довольно проста:
для каждого возможного хода каждой белой фигуры, попробуйте каждый возможный ход каждой черной фигуры.
Если ни один черный ход не захватывает белого короля, белый ход действителен.
Плата поддерживается в
char[256]
виде матрицы 16x16, где используется только верхний левый 8x8. Позиции и векторы движения хранятся в 8-битных целых числах (x:4,y:4
). Дополнительный бит позволяет использовать простую арифметику (new_pos = old_pos + steps*direction
), с легким обнаружением края доски (&0x88
делает волшебство).r[]
кодирует три вещи:'('+vector
.Функции:
main
читает доску, конвертирует буквы во внутренний код, звонит,a
чтобы найти белые ходы, печатает доску.a
рекурсивно зацикливается на 64 квадратах. Для каждого куска правильного цвета (параметраc
) он находит правило перемещения для куска и вызываетd
.d
рекурсивно зацикливается на закодированном правиле движения, которое представляет собой список векторов, вызывающихe
каждый из них. Он даетe
исходную позицию, вектор и предел диапазона (7 для фигур выше B, 2 для пешек второго ранга, 1 в противном случае).e
проверяет все движения по вектору. Если ход возможен (т.е. пешки движутся вперед, внутри доски, не заблокированы, пешка захватывается по диагонали), проверяется одна из двух вещей. Для белых ходов, пробеги,v
чтобы проверить ход. Для черных ходов проверяет, захвачен ли белый король. Если это правда, ход играется на доске.v
проверяет ход белых. Он копирует доску в сторону, выполняет ход, чтобы проверить, иa
снова вызывает , чтобы найти ходы черных.источник
Python 2.6,
886- 1425 символовМоя первоначальная версия (в ревизиях) содержала 886 символов, но не полностью удовлетворяла спецификации (она не проверяла, чтобы не было матов; она даже не учитывала возможные ходы черных фигур).
Теперь это происходит (и я исправил несколько ошибок в оригинале). Увы, это связано с расходами на персонажей: на данный момент 1425, но все еще не должно быть места для улучшений. Эта версия должна быть намного более надежной в обработке крайних случаев, чем предыдущая.
Пример ввода и вывода:
источник