Pyth, пожалуй, самый успешный универсальный язык для игры в гольф. Несмотря на то, что он несколько упал в результате появления новых языков, с 2014 по 2016 год лаконичный синтаксис Pyth, постоянные обновления, перегрузка и (для его эпохи) многие встроенные функции сделали его фаворитом для большинства вопросов.
Код Pyth часто трудно читать. Даже выходные данные режима отладки (переносимый Python) часто состоят из длинной строки, иногда с круглыми скобками, вложенными в десять. Однако правильно отформатированный Pyth очень читабелен.
Вот фрагмент кода Pyth, написанный @isaacg в разделе «Цепочка слов» .
.MlZfqhMtTeMPT+Lzs.pMyQ
Это гораздо более читабельно, как это.
.M Filter by gives-maximal-value of
l Z lambda Z:length(Z) over
f filter by (lambda T:
q equal
hM t T head-map tail T
eM P T end-map Pop T)
+L Append z to each element in
z
s .pM y Q flattened permutations of each subset of Q
Для этой задачи мы исключаем аспект сложности колмогоровской классификации символов Pyth и фокусируемся на форматировании. Вместо того, чтобы быть кодом Pyth, ввод будет состоять из символов в 0123456789M
. Цифра n
представляет функцию арности n
, иM
представляет оператора. Например, приведенный выше код представляется как 210221M101M102M011M10
. Вот шаги для унификации:
Разделите строку на токены.
Токен совпадает [0-9]M*
.0M
не будет происходить при вводе.
Добавьте конечные 0.
Когда аргументов недостаточно, Pyth добавляет Q
в код столько неявных переменных (лямбда-переменных или s), сколько необходимо для заполнения аргументов программы; они должны быть представлены 0
с.
Сгруппируйте токены в строки.
Арентность токена - это значение его цифры.
Токен arity-0 (т. Е. 0) завершает строку.
Для токена arity-1 следующий токен должен идти в той же строке, разделенной пробелом.
Для токена arity> = 2 его аргументы идут в отдельных строках в порядке их появления в коде, за каждым следуют свои собственные подаргументы и так далее. Аргументы токена имеют отступ до конца этого токена плюс один пробел.
вход
Непустая строка (или массив char, массив строк длины 1 и т. Д., Как это разрешено стандартными методами ввода / вывода), состоящая из 0123456789M
, который не будет содержать подстроку0M
.
Выход
Строка отформатирована в соответствии с вышеуказанными правилами.
Контрольные примеры
210221M101M102M011M10
2
1 0
2
2
1M 1 0
1M 1 0
2M
0
1 1M 1 0
123M4M
1 2
3M
4M
0
0
0
0
0
0
0
2MM
2MM
0
0
11011100
1 1 0
1 1 1 0
0
9000000
9
0
0
0
0
0
0
0
0
0
210221M101M102M011M10
будет[2,1,0,2,2,1,'M',1,0,1,'M',1,0,2,'M',0,1,1,'M',1,0]
M
s допускал, чтобы тип данных отличался от целых чисел.
M
?