Схема пірамід - це мова, яку розробляє @ ConorO'Brien . У схемі пірамід код, який ви пишете, виглядає приблизно так:
^ ^
/ \ /3\
/ \ ---
/ + \
^-------^
/9\ /3\
/123\ ---
-----
Тепер цей код має дві очевидні якості: Важко розібратися, і складно написати. Конор вирішив перше, проте вирішити це друге питання буде ваша робота.
Вищевказаний код обробляється інтерпретатором PyramidScheme в вкладений масив рядків, як це:
[["+", ["9123", "3"]], "3"]
Ваше завдання - написати програму або функцію, яка надає вкладений масив рядків, видає або повертає відтворений код PyramidScheme. Ви можете припустити, що вхідний масив завжди буде дійсним.
Піраміда - рівнобедрений трикутник. Верх - ^
сторони, нахили по діагоналі від /
і до \
, а дно - -
. Два нижні кути або порожні, або містять початок інших пірамід, які є аргументами. Середина заповнена назвою піраміди, ігноруючи розриви рядків.
Ось як аналізатор перетворює код у корисний формат. По-перше, вона сканує піраміду верхнього рівня. Якщо він не бере ніяких аргументів, він представляє його єдиним рядком і рухається далі. В іншому випадку він представляє собою масив ["name",[arg1,arg2]]
або ["name",[arg1]]
. Аргументами є піраміди в нижній лівій і нижній правій частині піраміди, яка може бути або рядком, або кількома масивами, описаними вище. Ви можете помітити, що це дещо нагадує Lisp, і в цьому випадку ви, можливо, також помітили жахливий каламбур, який є мовою. Після повного представлення піраміди парсер переходить до наступної.
Це код-гольф , найкоротший виграш коду!
Тестові випадки: це не єдино допустимі результати, це приклад дійсних результатів.
[["+", ["9123", "3"]], "3"]
^ ^
/ \ /3\
/ \ ---
/ + \
^-------^
/9\ /3\
/123\ ---
-----
[["out", [["chr", ["72"]], ["chr", ["101"]]]], ["out", [["chr", ["108"]]]], ["out", [["chr", ["108"]]]], ["out", [["chr", ["111"]]]]]
^ ^ ^ ^
/ \ / \ / \ / \
/out\ /out\ /out\ /out\
^-----^ -----^----- -----^
/ \ / \ / \ / \
/chr\ /chr\ /chr\ /chr\
^----- -----^ -----^ ^-----
/ \ / \ / \ / \
/72 \ /101\ /108\ /111\
----- ----- ----- -----
[ ["+", [ ["asdfghjkl"], ["do", [ "1" ]] ]] ]
^
/ \
/ + \
/ \
^-------^
/a\ /d\
/sdf\ /o \
/ghjkl\ ^-----
-------/1\
---
Зауважте, у другому тестовому випадку out
обидві другі і третій піраміди мають ["chr", ["108"]]
параметр, який згортається в один стек пірамід, поділених двома верхніми рівнями. Це дійсна оптимізація, яку може підтримувати ваш код, але вона є абсолютно необов’язковою; оцінка не ґрунтується на тривалості результату.
Для допитливих, перший випадок відображається 9126 3
завдяки неявній друку пірамід топлерів, другий друкується Hello
, а останній - синтаксична помилка, включена лише тому, що вона має акуратну структуру.
Можна припустити , що введення містить тільки друковані ASCII, за винятком простору, ^
, /
, \
, і -
. Вхід завжди буде дійсним і міститиме хоча б одну піраміду. Немає обмежень щодо розміру масиву або вхідних рядків, проте ви можете записати свій код так, як якщо б цілий тип вашої мови за замовчуванням був безмежною точністю і що ваш комп'ютер має довільну пам'ять. Якщо ви приймаєте введення як один рядок, ви можете використовувати що-небудь розумне (кома, пробіл тощо), доки він знаходиться в друкованому файлі ascii, а не "
або []
) для обмеження масивів. Вам не потрібно включати дужки, що оточують всю річ, а замість цього взяти кілька масивів, розділених вашим роздільником.
Вихідні дані не потребують гольфу, ви можете вставити зайве місце або зробити свої піраміди більшими, ніж потрібно. Піраміди вгорі повинні бути на першому рядку. Виведенням має бути рядок з новими рядками або списком рядків.
Той , хто робить включати в себе версію свого коду , який оптимально Гольфи піраміди може отримати деяку репутацію у вигляді upvotes / щедрот (але , ймовірно , просто upvotes).