Успешная подача кода в гольф по своей природе наполнена сумасшедшими символами повсюду. Чтобы облегчить понимание их представления, многие игроки в коде предпочитают включать объяснение своего кода. В их объяснении строка кода превращается в вертикально разнесенную диаграмму.
Например, если бы это был мой код:
1_'[3:~2@+]`
Одна из многих возможных диаграмм, которые я мог бы создать, выглядела бы так:
1
_'
[ ]
[3: ]
[ ~ ]
[ 2@ ]
[ +]
`
Цель
В этом задании вы напишете инструмент автоматического форматирования объяснений, который берет строку кода и создает диаграмму, к которой можно легко добавить пояснительный текст.
Для того, чтобы сделать это более задачу полезной , пользователь сможет указать содержимое каждой строки, предоставив строку форматирования. Строка форматирования будет второй строкой, содержащей только буквы A-Za-z
, такой же длины, что и программа. Буквы показывают порядок, в котором символы программы должны быть напечатаны в объяснении.
Вот пример ввода / вывода без форматирования в скобках :
123423
AabcBC
1
2
3
2
3
4
Скобки
Если более одного символа в программе имеет один и тот же уровень приоритета, то этот набор символов действует как отдельный блок кода (если они образуют группу) или набор скобок (если они содержат другие промежуточные символы). Общие правила просты:
Символы не появляются в строке диаграммы до тех пор, пока все другие символы более высокого приоритета уже не появятся в строках над ним на диаграмме.
Символы одинакового приоритета всегда печатаются на одних и тех же строках. Если в строке появляется определенный символ, все остальные символы с равным приоритетом появляются в строке.
Набор символов с одинаковым приоритетом продолжает появляться в каждой строке до тех пор, пока все остальные символы, заключенные в него, не появятся хотя бы один раз. Это учитывает "подобные скобкам" конструкции. Если
bceab
есть приоритеты, тоb
символы появятся во второй строке (они имеют наивысший приоритет) и будут отображаться до тех пор, пока не появятся всеcea
символы. Если строка приоритета имеет значениеabcadeafga
, то все изbcdefg
них считаются содержащимися в ней, все 4a
секунды будут появляться до техg
пор, пока не появится.
Больше требований к форматированию
Все строки вывода должны иметь одинаковую длину (длину входных строк), дополненные пробелами по мере необходимости. Строка входной программы может содержать пробелы, хотя этим пробелам также будет дана буква приоритета. Конечные переводы строк на выходе / вводе являются необязательными.
счет
Это код гольф, выигрывает наименьшее количество байтов.
Примеры
Вот закомментированный пример фрагмента кода с более сложным форматированием.
1_'[3:~2@+]`
abbcddeffgch
1 #highest priority is denoted by the lowercase letter a
_' #priority b
[ ] #all characters with priority c
[3: ] #priority d, but priority c still printed because it encloses more
[ ~ ] #priority e
[ 2@ ] #priority f
[ +] #priority g, last line of c because all enclosed characters have appeared
` #priority h
Пример в Perl:
$_=<>;s/[^aeiou\W]/$&o$&/gi;print
aaaaaabbccccccccccbdddddbbbbeeeee
$_=<>;
s/ / /gi;
s/[^aeiou\W]/ /gi;
s/ /$&o$&/gi;
print
Вот несколько примеров в CJam, предоставленных Мартином Бюттнером:
l~2*{_2%{3*)}{2/}?_p_(}g;
aabbcdddefffeeggeehhiiccj
l~
2*
{ }g
{_2% }g
{ { }{ }? }g
{ {3*)}{ }? }g
{ { }{2/}? }g
{ _p }g
{ _(}g
;
q{_eu'[,66>"EIOU"-#)g{'o1$}*}/
abcccddddddeeeeeeefgghiijjhhbb
q
{ }/
{_eu }/
{ '[,66> }/
{ "EIOU"- }/
{ # }/
{ )g }/
{ { }*}/
{ {'o }*}/
{ { 1$}*}/
Вот безумный пример, чтобы просто с тобой связываться:
1_'[3:~2@+]`
azTABACBDCAT
[ : ]
[3: 2 ]
[3:~2 +]
[ :~ @+]
' `
1
_
Вот более явный пример того, что происходит, когда скобки совпадают abab
. (Обычно это не тот способ, которым вы бы выбрали форматирование объяснения.)
aabbccddaaeebb
aabbccddaaeebb
aa aa
aabb aa bb
aabbcc aa bb
aabb ddaa bb
bb eebb #"aa" no longer appears because all of "bbccdd" have already appeared.
источник
oNo
можно заменитьn
на TIO .CJam, 48 байтов
объяснение
источник
IDL 8,4,
316318304 байтаНовая версия, все еще слишком длинная, но короче! И, в истинном духе IDL, полностью векторизовано, что означает (поскольку нет цикла for), что теперь я могу сделать это одной строкой и запустить саму себя, как только я полностью обновлю свою версию до 8.4. Это будет отредактировано позже.
Однострочная версия:
С разрывами строки (одинаковое количество байтов, подстановка \ n против &) и комментарий:
Вот алгоритмическая разбивка для строки 9:
... и 10:
Строки 9 и 10 выполняют реальную работу, а остальные задают переменные, необходимые для конца. Я думаю, что это примерно как гольф, который я собираюсь получить, я не могу найти где-нибудь еще, чтобы сделать это лучше.
Старая версия (все ниже здесь устарело):
Этого далеко не достаточно, чтобы выиграть, потому что это ужасный язык игры в гольф, но никто никогда не отвечает в IDL, поэтому я просто собираюсь пойти на это.
Я не уверен, есть ли какой-нибудь способ, которым я могу сократить это больше ... Я мог бы вызвать strmid одновременно для a и b, но затем я трачу больше байтов, индексируя d, и это работает одинаково. Я буду продолжать работать над этим, хотя! (А завтра я отредактирую объяснение алгоритма.)
источник