Задний план
Программисты LISP покорили мир! Скобки были объявлены как священные символы, и теперь они могут использоваться только в программах LISP. Было решено, что скобки в литературных произведениях должны быть заменены сносками, и ваша задача автоматизировать это для упрощенного текста уценки.
вход
Ваш ввод представляет собой одну строку, содержащую буквенные символы ASCII, пробелы и специальные символы ,.!?()
. Он не будет содержать новых строк или цифр. Скобки будут правильно сопоставлены.
Выход
Вы должны преобразовать каждую соответствующую пару скобок во входной строке в сноску. Это происходит следующим образом:
- Замените первую подходящую пару скобок и подстроку между ними на порядковый номер, который начинается с
1
тегов Markdown<sup>
и</sup>
. - Добавить в конец строки
- две новые строки,
- тег уценки
<sub>
, - число с шага 1,
- пространство,
- подстрока между скобками, и
- закрывающий тег
</sub>
, в этом порядке.
- Если в строке остались скобки, перейдите к шагу 1.
Ваш вывод - полученная строка, возможно, с завершающим переводом строки. Вам не нужно реализовывать этот точный алгоритм, если ваш вывод верен. Обратите внимание, что могут быть вложенные скобки; в этом случае у нас будут сноски, которые содержат ссылки на другие сноски. Подстрока между скобками также может быть пустой. Смотрите примеры ниже.
Правила и оценки
Вы можете написать либо полную программу, либо функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Если ваш язык изначально не поддерживает десятичные числа ( кашель Retina от кашля ), вы можете дать номера сноски в другой базе, в том числе двоичном или унарный; однако использование одинарных чисел влечет наложение штрафа в размере + 20% .
Тестовые случаи
Входные данные:
This input contains no parentheses.
Выход:
This input contains no parentheses.
Входные данные:
This has (some) parentheses (but not so many).
Выход:
This has <sup>1</sup> parentheses <sup>2</sup>.
<sub>1 some</sub>
<sub>2 but not so many</sub>
Входные данные:
This has (nested (deeply (or highly?) nested)) parentheses (and several groups).
Выход:
This has <sup>1</sup> parentheses <sup>2</sup>.
<sub>1 nested <sup>3</sup></sub>
<sub>2 and several groups</sub>
<sub>3 deeply <sup>4</sup> nested</sub>
<sub>4 or highly?</sub>
Входные данные:
Hmm()(()(,)) a()((trt)(v( (((((wut)))))(X)(Y)(Z) )!?!?!?!))oooooooo(oooo)oooo
Выход:
Hmm<sup>1</sup><sup>2</sup> a<sup>3</sup><sup>4</sup>oooooooo<sup>5</sup>oooo
<sub>1 </sub>
<sub>2 <sup>6</sup><sup>7</sup></sub>
<sub>3 </sub>
<sub>4 <sup>8</sup><sup>9</sup></sub>
<sub>5 oooo</sub>
<sub>6 </sub>
<sub>7 ,</sub>
<sub>8 trt</sub>
<sub>9 v<sup>10</sup>!?!?!?!</sub>
<sub>10 <sup>11</sup><sup>12</sup><sup>13</sup><sup>14</sup> </sub>
<sub>11 <sup>15</sup></sub>
<sub>12 X</sub>
<sub>13 Y</sub>
<sub>14 Z</sub>
<sub>15 <sup>16</sup></sub>
<sub>16 <sup>17</sup></sub>
<sub>17 <sup>18</sup></sub>
<sub>18 wut</sub>
Обратите внимание на пустые строки между сносками.
foo (bar)\nfoot (note)
?Ответы:
Perl,
817572 байта71 байт код + 1 байт аргумент командной строки.
Требуется Perl 5.10 или новее (для поддержки рекурсивных регулярных выражений)
Использование:
объяснение
-p
Параметр выводит результат применения заданных команд к входу, избегая необходимости явной печати.Регулярное выражение
(\(((?1)|.)*?)\))
ищет крайний набор скобок с начала строки. Когда это найдено, мы выполняем замену, гарантируя, что мы добавим только в самом конце ввода (захватывая все до конца ввода, используя(.*)
).Затем мы повторяем подстановку регулярных выражений для теперь замещенной строки, используя
redo
, что будет постоянно применять подстановку регулярных выражений, пока она не перестанет совпадать. Вs
Модификатор гарантирует , что.
в регулярном выражении будет соответствовать новые линии, что необходимо , потому что мы повторно применить регулярное выражение матч на результат предыдущего замещения регулярных выражений.источник
[^)]
или даже.
вместо[^()]
becuase гарантии , что вход будет сбалансирован правильно..
, сделав матч ленивым. @xebtl, в заявке говорится: «В ней не будет символов новой строки или цифр»Emacs Lisp, 335 байт
Предисловие. Этот ответ и ответ Схемы в настоящее время являются единственными ответами, официально одобренными как Могучей Народной Республикой ЛИСП, так и Церковью Эмача. Другие ответы, более короткие или нет, считаются угрозой миру. В частности, и с глубоким пренебрежением к любым клеветническим обвинениям в Маккартизме, которые время от времени звучат от враждебных противников государства, мы призываем любого, кто имеет информацию о реальной личности анонимных авторов, пишущих ответы Nonlisp, обращаться в местное бюро. Напоминаем, что каждому следует уделить время на то, чтобы обдумать и выразить свое мнение в соответствии с тем, что, по его глубокому убеждению, не будет угрожать его или ее будущему взаимодействию с официальными представителями действующей власти. Код это данные. Данные это код.
Более элегантно:
источник
Сетчатка ,
968683 байта * 120% = 99,6Исходный код этого решения состоит из двух файлов:
объяснение
Это очень прямая реализация алгоритма, описанного в задаче. Код состоит из одной подстановки регулярных выражений, которая превращает первый набор скобок в сноску. Эта замена повторяется через
+
до пор, пока строка не перестанет изменяться, что означает, что регулярное выражение больше не соответствует (потому что больше не может найти круглые скобки).Сноски перечислены в одинарном формате, так что я могу просто найти номер последней сноски и добавить
1
чтобы создать следующую.Регулярное выражение для нахождения первого набора скобок основано на стандартном методе сопоставления скобок с уравновешивающими группами (hrhr, «сопоставление скобок»). Он был немного сокращен за счет использования неназванной группы и предположения, что круглые скобки правильно сбалансированы (что означает, что мы можем опустить
(
класс отрицанных символов и сопоставить финал)
с простым.
и нам также не нужно гарантировать, что стек захвата пуст).После сопоставления скобок и захвата их содержимого в группу
1
, мы собираем остаток строки с помощью(.*)
в группу,4
а затем ищем в строке первый набор1
s с отрицательным взглядом сзади. Если мы найдем такую подстроку, мы храним в группе5
. Если мы этого не сделаем, мы посмотрим, что не получится, но это нормально, потому что это необязательно - это просто означает, что$5
даст пустую строку, которая является унарным представлением0
и которая также является правильной.Затем строка подстановки просто объединяет все вместе на основе групп захвата. Номер сноски увеличивается путем добавления
1
к последнему номеру с помощью1$5
.источник
Священный JavaScript , 1510 байт
Товарищи-повстанцы, не поддавайтесь их тираническому сносу скобок! Вы должны продолжать! С самого начала программирование было свободным предприятием. Теперь это стало повсеместным проявлением благочестия. Мы должны показать не что иное, как абсолютную боязнь. Поэтому я отбивался!
Нет правил против использования священных символов на не-лиспском языке. Нет, совсем нет. (Чуть менее компактно :)
Это компилируется в расширенный JavaScript в моем другом ответе . Это шутка подчинения.
источник
Луа,
222216204201 байтGolfed:
Ungolfed:
источник
repeat a,b=l(s,g) ... untill a<1
петля не будет короче вашего времени?Схема, 92 байта
Разочарованные реализацией поиска в ширину в Real Lisp, 1 власть имущие решили принять более прагматичный подход. В конце концов, круглые скобки священны, а скобки - нет. 2
1. не слушайте тех еретиков из так называемой «церкви» Emacs!
2. Они не программисты Racket, не так ли?
источник
Haskell, 210 байт
Пример использования:
Как это работает:
источник
Схема 533 байта
С отступом:
Да, это 533 байта, когда все дополнительные пробелы удалены. Греться в функциональной славе.
Я реализовал более или менее алгоритм в описании:
x
группирует ввод в скобках иf
заменяет первый уровень групп сносками, повторяя до тех пор, пока не останется больше групп. Я уверен, что это можно сделать короче, но я не вижу, как это можно сделать много короче без перехода на другой алгоритм.Как написано, это полная программа. Вы можете попробовать это здесь , но поскольку repl.it, очевидно, не может справиться с этим,
(read-line)
вы должны поместить входную строку на место. Абсолютно незагрязненная версия здесь .РЕДАКТИРОВАТЬ: Как указано в комментариях, я изменил скобки
()
в скобках[]
в версиях repl.it. Это было сделано исключительно для удобства во время программирования и отладки. Версия, опубликованная сейчас, работает с()
.источник
#\[
«#]» на соответствующие скобки (и обновлю тесты), это работает без проблем. Есть ли причина, по которой вы оставили квадратные? это связано с вашим предыдущим ответом?JavaScript ES6, 244 байта
Серьезный ответ (работает только на FireFox, насколько мне известно)
Expanded:
источник
гания , 315 байт
В настоящее время это неконкурентоспособно, поскольку не совсем подходит и для вложенных.
Expanded:
}
источник