В шахматах нотация Форсайта-Эдвардса , более часто называемая «FEN», является текстовым способом расшифровки досок. Он описывает каждый из восьми рядов доски (называемых «шахматами» в шахматном порядке) сверху вниз с точки зрения белых. Части написаны как K (король), Q (ферзь), R (ладья), B (слон), N (рыцарь) и P (пешка). Черные фигуры используют эти буквы в нижнем регистре, а белые фигуры используют эти буквы в верхнем регистре. Пустые пробелы обозначаются цифрами от 1 до 8, указывающими, сколько существует последовательных пустых пробелов. Было бы совершенно пустое звание, была бы 8
одна черная ладья в крайнем правом столбце (в шахматах называемая «файлами») 7r
и две белые пешки на каждом конце ряда PP4PP
. Ряды разделены/
, Обычно добавляется другая информация, указывающая, какая сторона должна двигаться, рокировка и права прохода , номер хода и часы полуоборота, но мы будем игнорировать их для целей этой задачи.
вход
Строка FEN, из командной строки или STDIN, как вам угодно. Вы можете предположить, что эта строка всегда действительна.
Вывод
Напишите в STDOUT простое ASCII-изображение доски, как оно выглядит на самом деле:
- Части представлены их персонажем в FEN
- Пустые квадраты представлены пробелами
- Куски и квадраты разделены трубкой,
|
и на каждой стороне доски есть трубы
Таким образом, пустая доска, написанная как 8/8/8/8/8/8/8/8
в FEN, будет выглядеть как
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
Начальная позиция шахматной игры записывается как rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
и будет выглядеть как
|r|n|b|q|k|b|n|r|
|p|p|p|p|p|p|p|p|
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
|P|P|P|P|P|P|P|P|
|R|N|B|Q|K|B|N|R|
Финальная позиция Андерсена-Кизерицкого в 1851 году , называемая «Бессмертная игра» в шахматном сообществе, записывается как r1bk3r/p2pBpNp/n4n2/1p1NP2P/6P1/3P4/P1P1K3/q5b1
, и ваша программа при подаче этого ввода выдаст:
|r| |b|k| | | |r|
|p| | |p|B|p|N|p|
|n| | | | |n| | |
| |p| |N|P| | |P|
| | | | | | |P| |
| | | |P| | | | |
|P| |P| |K| | | |
|q| | | | | |b| |
+1
за интересный вызов.-2
за принятие неправильного ответа без уважительной причиныОтветы:
Perl, 28 байт
Включает +2 для
-lp
Внести вклад в STDIN
fen.pl
:На самом деле в лиге некоторых гольф-языков ...
Обратите внимание, что файловая версия нуждается в последней новой строке в файле, так что в действительности она составляет 29 байт. Но версия командной строки не нуждается в этой дополнительной новой строке, и поэтому код считается 28 байтами:
источник
Сетчатка, 13 байт
Попробуйте онлайн!
объяснение
Первая часть (обратите внимание на завершающий пробел):
это преобразовать в определенное количество пробелов. Retina имеет
$*
функцию, чтобы повторить. Это работает так:<num>$*<char>
если нет<num>
, Retina примет$&
или совпадает строку, в этом случае совпадает число.Следующая часть:
довольно просто, он заменяет все
/
с¶
которой является символом новой строки.Последняя часть работает так же:
Это заменит все (следовательно, почему в первой строке ничего нет) на
|
. Выкладывать|
везде.источник
S`/
что и на втором этапе.Рубин -
75827876756259585756 байтСохранено несколько байтов благодаря Ventero
Позвольте мне объяснить (с
\n
заменой буквального перевода строки):Это неявно возвращает значение строки, каждая из которых
/
заменяется новой строкой (по умолчанию$/
содержит новую строку )Это супер просто; это просто строка, содержащая трубу, интерполяцию строки и другую трубу. Интерполяция строки оценивается
Это заменяет каждое число таким количеством пробелов. Я могу сэкономить несколько байтов, также найдя здесь новые строки; Потому что
hex
возвращает 0, если строка не является допустимым числом, когда она находит новую строку - то есть ту, что находится в конце результатаgets
-, она заменяет ее строкой 0 длины, эффективно удаляя ее. Без этого не было бы задней трубы.$&
является магической переменной, которая представляет полный текст последнего совпадения переменных, что позволяет мне сохранить байт путем исключения|d|
. Я могу сохранить другой байт, используя.hex
вместо.to_i
, что работает, потому что каждое число меньше 9, что означает, что шестнадцатеричный и десятичный имеют одинаковые значения.Это ставит трубу между каждым персонажем. Обратите внимание, что это то, что ставит каналы по обе стороны от строк (кроме первой и последней), потому что косые черты, которые в конечном итоге превращаются в символы новой строки
tr
, считаются символами и поэтому окружены каналами. В?|
просто означает «строка из одного символа"|"
».И это все. Это откровенно скандально простая программа. Он просто использует множество хитрых синтаксических трюков.
источник
puts"|#{gets.gsub(/\d|\n/){' '*$&.hex}.chars*?|}|".split'/'
(разумеется,\n
снова замените символ буквальным переводом строки).Pyth -
242221 байтТестовый пакет .
источник
Pyth, 23 байта
Попробуйте онлайн!
Как это работает:
источник
JavaScript ES7,
8070 байтАнонимная функция, которая принимает строку в качестве входных данных.
80-байтный ES6-только аппрох.
объяснение
Мы используем понимание массива для обхода списка:
Это эквивалентно:
Если это число, у нас есть это количество пробелов. Если это
/
, у нас есть новая строка. В противном случае у нас есть персонаж. Затем мы присоединяемся к пониманию, и ничто не создает последовательности.Затем мы создаем массив длиной 3
[,...that,"\n"]
....
разделяет объединенное понимание на символы. Присоединение к этому дает результат.источник
[x for(x of a)]
Массивы ( ) - это ES7.Юлия, 62 байта
Это анонимная функция, которая принимает строку и возвращает массив строк. Чтобы вызвать его, присвойте его переменной.
Подход такой же, как и в умном Ruby- ответе QPaysTaxes . Мы заменяем каждую цифру во вводе таким количеством пробелов, помещаем
|
между каждым символом,|
прикрепляем вперед и назад и разделяем на массив/
.Попробуйте онлайн!
источник
05AB1E , 21 байт
Код:
Также 21 байт:
'|¹9GNNð×:}S'|«JJ'/¶:
.Использует кодировку CP-1252 . Попробуйте онлайн! ,
источник
JavaScript (ES6),
696762 байтаДополнительные запятые создают пустые значения во внешнем разбиении, которое создает начальный и конечный
|
символы. Вам нужны две запятые, потому что запятые в конце списков необязательны, поэтому первая остается частью предыдущего элемента.Редактировать: 5 байтов сохранено благодаря @ user81655.
источник
/[\d/]/g,c=>+c?` `.repeat(c):`\n`
работать?Сетчатка ,
50-45 байтовЭто было весело, ха-ха. Я не только новичок в Retina, но и в регулярных выражениях в целом ... Это, вероятно, может быть много в гольфе , поэтому я сделаю еще некоторые исследования.
Код:
Попробуйте онлайн!
источник
$*
функциональность :)Джольф, 28 байт
Замените
♣
персонаж\x05
или попробуйте здесь!источник
Python 3.5, 112 байт:
Попробуйте онлайн! (Ideone)
источник
C, 252 байта
Подробная попытка онлайн
источник
JavaScript (FireFox 30+), 61
Использование массива, который больше не является стандартным EcmaScript
Тестовое задание
источник
Луа, 106 байт
Ungolfed
источник
print((...):gsub(".",function(c)return(c:find("%d")and("| "):rep(c)or c=="/"and"|\n"or"|"..c)end).."|")
print((...):gsub("%d",function(c)return("| "):rep(c)end):gsub("/","|\n"):gsub("([^%d%s|])","|%1").."|")
для того же количества байтов.print((...):gsub("%d",function(c)return("| "):rep(c)end):gsub("([^%d |])","|%1"):gsub("/","\n").."|")
составляет 101 байтR (вне конкуренции)
Извините, если это не уместно, но я подумал, что это круто, что у меня просто есть функция, которая работает для этого вопроса без редактирования! Это печатает вывод Unicode, а не ascii, хотя. Я не могу вспомнить, почему я написал это, но это не было ответом на вызов.
источник
Haskell, 110 байт
Ungolfed:
источник
Java 7,
190184 байтаПодробная попытка онлайн
источник
Пайк,
2520 байтОбъяснение:
Попробуй это здесь!
источник
Python, 84 байта
Объяснение:
источник
> <>, 64 байта
4 потраченных впустую байта из-за проблем с выравниванием, хотя я не уверен, как их убрать. ¯ \ _ (ツ) _ / ¯
источник