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
?Ответы:
JavaScript (ES8),
160159 байтПопробуйте онлайн!
комментарии
источник
Haskell ,
192190187 байтПопробуйте онлайн!
Должен быть лучший способ обработки случая arity-1, в настоящее время он занимает 45 байтов.
Редактирование:
pred
вместоn-1
.Попробуйте онлайн!
источник
Древесный уголь , 75 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Зацикливайте вводимые символы и превращайте их в список цифр с необязательными
M
суффиксами.Переверните этот список, чтобы мы могли его использовать
Pop
.Эта переменная является стеком токенов, арность которых еще не выполнена.
Эта переменная является стеком остальной арности невыполненных токенов.
Повторяйте, пока мы не сожмем все жетоны и не освободим стек.
Получить следующий токен или,
0
если нет.Распечатайте маркер и затем переместите курсор по горизонтали, если он начинается с
1
диагонали.Добавьте токен и его арность в соответствующие переменные.
Повторите, пока стек арности не пуст, но верхняя арность равна нулю.
Откажитесь от нулевой арности.
Удалите его жетон и переместите столько символов, сколько осталось.
Если остались какие-либо арности, уменьшите верхнюю арность.
источник