Піт - це, мабуть, найуспішніша мова гольфу загального призначення. Хоча воно дещо занепадає через новітні мови, з 2014 по 2016 рік стислий синтаксис Pyth, постійні оновлення, перевантаження та (для його епохи) багато вбудованих програм зробили його улюбленим для більшості питань.
Код Pyth часто важко читати. Навіть вихід з режиму налагодження (транспільований Python) часто складається з довгого рядка, іноді з дужками, вкладеними на десять глибин. Однак правильно відформатований Pyth дуже читабельний.
Ось фрагмент коду Pyth, написаний @isaacg у Play The Word Word .
.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), скільки необхідно для заповнення аргументів програми; вони повинні бути представлені 0s.
Групуйте жетони в рядки.
Аритність токена - це значення його цифри.
Маркер 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]
Ms може бути іншим типом даних від цілих чисел.
M?