Шахматные фигуры (короли, королевы, грачи, слоны и рыцари) и пешки находятся на доске, но не на квадрате a1 или h8 . Ваша задача - перейти от пустого a1 к пустым h8 квадратам, проходя только через пустые квадраты. Правила передвижения следующие:
- Вы можете перейти от любого пустого квадрата к любому пустому квадрату рядом с ним (тот же ранг, следующий или предыдущий файл; или тот же файл, следующий или предыдущий ранг).
- Вы можете перейти от любого пустого квадрата к любому пустому квадрату по диагонали рядом с ним (следующий или предыдущий ранг, следующий или предыдущий файл), при условии, что в угловых квадратах содержится либо (а) две пешки, либо (б) пешки / фигуры противоположных цвет. (Две фигуры, не являющиеся пешками, или фигуры, не являющиеся пешками и пешки, одного и того же цвета достаточно сильны, чтобы препятствовать вашему продвижению через угол, но две пешки - нет; и фигуры / пешки противоположного цвета не работают в согласитесь, чтобы преградить вам путь.) Например, если вы на c4 и d5 пусто, вы можете перейти к нему, если c5 и d4 содержат пешки или фигуры / пешки противоположного цвета. См. Ниже раздел «Примеры диагоналей».
вход
Описание платы FEN . То есть: входными данными будут строка, которая включает в себя описание ранга 8 , косую черту ( /
), описание ранга 7 , косую черту, ... и описание ранга 1 . Описание каждого ранга состоит из цифр и букв, идущих из файла a в файл h , где буквы обозначают фигуры и пешки (черные: p
= пешка, n
= рыцарь, b
= слон, r
= ладья, q
= королева, k
= король, а белый одни и те же версии пишутся с заглавной буквы), а числа указывают на последовательное количество пустых квадратов. Например, rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBN
является ли доска после одного хода (пешка короля на е4) в шахматной игре.
a1 и h8 будут пустыми на входе; т.е. первая косая черта имеет цифру перед ним, а последняя косая черта имеет цифру после нее.
Выход
Правда или ложь, указывающие, возможен ли успешный переход на h8 .
Если входные данные не являются допустимым описанием платы FEN (имеется в виду, что соответствует моему объяснению выше), или если a1 или h8 заняты, то выходными данными может быть что угодно или ничего. (Другими словами: вы можете предположить, что входные данные соответствуют требованиям выше.)
счет
Это код гольф: выигрывает меньше байтов.
Пример ввода и вывода
Обратите внимание, что ваш код должен работать для всех допустимых входных данных, а не только для примеров.
Добавьте пробел и w
после каждого FEN для визуализации в http://www.dhtmlgoodies.com/scripts/chess-fen/chess-fen-3.html
. (Обратите внимание, что некоторые другие онлайн-визуализаторы FEN не позволяют использовать доску, которая является незаконной в шахматах, например, с пешкой на 1 или 8 уровне , поэтому ее нельзя использовать для наших целей.)
Правдивые примеры
8/8/8/8/8/8/8/8
- пустая доска1p1Q4/2p1Q3/2p1Q3/2p1Q3/2p1Q3/2p1Q3/Q1p1Q3/1q3q2
- есть путь a1 , b2 , b3 , b4 , b5 , b6 , b7 , c8 , d7 , ( не e8 , он заблокирован, но) d6 , d5 , d4 , d3 , d2 , d1 , e1 , f2 , f3 , f4 , f5 , f6 , f7 , f8 , g8 , h88/8/KKKKK3/K3K3/K1K1p3/Kp1K4/K1KK4/2KK4
- пример, когда квадрат, заблокированный в одной точке, должен быть пропущен позже (чтобы убедиться, что квадраты не являются непроходимыми)K1k1K1K1/1K1k1K1k/K1K1k1K1/1k1K1K1k/K1k1K1k1/1K1k1k1K/K1K1k1K1/1k1k1K1k
- есть единственный проход (просто следуйте за своим носом: на каждом шаге есть только одна клетка, если только не сделать шаг назад); это также пример, когда квадрат заблокирован в одной точке, но необходимо позже
Ложные примеры
6Q1/5N2/4Q3/3N4/2Q5/1N6/2Q5/1N6
- любая попытка на пути должна пройти через две по диагонали части одного цветаN1q1K1P1/1R1b1p1n/r1B1B1Q1/1p1Q1p1b/B1P1R1N1/1B1P1Q1R/k1k1K1q1/1K1R1P1r
- единственный путь через диагональ a8-h1 находится в f2-g3 , но для этого потребуется проход через e1-d2 или f2-e3 , которые оба невозможны.4Q3/4q3/4Q3/5Q2/6Q1/3QqP2/2Q5/1Q6
4q3/4Q3/4q3/5q2/6q1/3qQp2/2q5/1q6
Пример диагоналей
В случае, если вышеприведенная проза была неясной, вот несколько фотографий.
Проходимые диагонали
Непроходимые диагонали
Ответы:
VBA
668666633622548510489435331322319315 байтЧтение входной строки занимает до «Wend». Хороший побочный эффект - это прекращает ввод строки после того, как доска [X] полностью закодирована, так что вы можете оставить описание в конце.
В кодировке доски пешки 2, остальные 3, черный отрицательный. Пешки распознаются как 'P' & 'p', имеющие коды символов, кратные 8.
«X (7,0) = 1», устанавливающий доступность a1 , - это то место, с которого начинаются проверки пути. Это постоянно сканирует доску, пытаясь добавить доступные квадраты из квадратов, помеченных как доступные (1). Диагональный доступ и занятость проверяются в IF + logic-calc, который когда-то жил в функции, но теперь находится во вложенных соседних циклах. Проверка диагонального доступа основывается на произведении двух углов кошачьих углов, которое составляет только 6 или более, если фигуры одного цвета и, по крайней мере, одна фигура, а не пешка.
Позвонить в электронную таблицу; возвращает значение в X (0,7) - 1, если h8 доступно, и 0, если нет - что Excel распознает как правдивое / ложное. = IF (Z (C2), «да», «нет»)
Может быть, я увлекся написанием кода выше, так что здесь есть полу-незакрытая прокомментированная версия:
Заметки о прогрессе
Редактировать 1: код теперь не такой 666-devilish :-D и потерял свои функции; Я нашел достаточно короткий способ написать их, чтобы избежать накладных расходов.
Редактировать 2: Еще один большой шаг вперед, эффективно завершающий работу по удалению функций inc / dec, вздох и использование нескольких глобальных переменных. Я, возможно, наконец-то овладеваю этим ....
Кодировка фигур и квадратов изменилась. Не влияет на длину кода.
Редактировать 3: возврат (фальшивых) функций, удаление всех этих надоедливых
Call
байтов и некоторые другие изменения.Редактировать 4: Прорываясь через большие 500, ух-ху - помешал 3 цикла For в 1.
Редактировать 5: Джимини Крикет, еще одно большое падение, когда я смешал две функции вместе - моя проверка диагонального доступа всегда проходит для соседних квадратов, так что ...
Редактировать 6: Святые ниблики, еще одно массивное падение. До свидания с внешними функциями и, таким образом, с глобальными ... Я перешел к половине первоначальной длины сообщения ....
Редактировать 7: Добавить версию без гольфа
Редактировать 8: Пересмотрен процесс чтения еще на несколько долларов
Редактировать 9: сжал пару выражений для последних нескольких капель крови
Изменить 10:
Next
оператор Compund проливает несколько байтовДля интереса, графики досок после анализа доступности (кодовые номера устарели, но ...), доступные квадраты - зеленые, недоступные квадраты - белые, а другие цвета - кусочки или пешки.
Пара досок для соревнований: h8 доступен в обоих:
источник
If V>9 Then X(7-P,C)=
я думаю (не то, что я знаю VBA) статьIf V>9 Then X(P,C)=
.[some non-letter character] To
до[some non-letter character]To
Matlab, 636
887байт как сохранено (включая отступ)Это решение не очень удачное, но я хотел пойти дальше и поставить его.
Читает строку доски,
x
как указано выше, и превращает ее в более полно представленныйo
, затем находит все ходы (ребра графа) между пробелами, затем выясняет, какие ходы возможны (не в заполненные пробелы), затем выясняет, какие возможные ходы имеют " ворота "из двух частей, чтобы пройти между ними, а затем выясняет, открыты ли ворота (пешки, противоположные цвета) или закрыты (того же цвета, включая пешку). Затем он проходит, чтобы найти места, достижимые путями из нижнего левого квадрата, и если путь может достигнуть пространства 64, это доска «Да».источник
=
s? (Я не знаю, MATLAB: возможно, это невозможно.)