Схема пирамиды - это язык, разрабатываемый @ ConorO'Brien . В Pyramid Scheme код, который вы пишете, выглядит следующим образом:
^ ^
/ \ /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"]]
параметр a, который свернут в один стек пирамид, совместно используемый двумя верхними уровнями. Это допустимая оптимизация, которую может поддерживать ваш код, но она совершенно необязательна; Оценка не зависит от длины вашего вывода.
Для любопытных первый случай отображается 9126 3
из-за неявной печати пирамид верхнего уровня, второй печатает Hello
, а последний - синтаксическая ошибка, включенная только потому, что имеет аккуратную структуру.
Можно предположить , что ввод содержит только печатаемые ASCII, за исключением пространства, ^
, /
, \
, и -
. Входные данные всегда будут действительными и содержат как минимум одну пирамиду. Нет ограничений на размер массива или входных строк, однако вы можете написать свой код, как если бы целочисленный тип вашего языка по умолчанию был бесконечной точности, и что ваш компьютер имел произвольную память. Если вы берете входные данные в виде одной строки, вы можете использовать что-либо разумное (запятую, пробел и т. Д., Если оно находится в формате ascii для печати, а не "
или []
) для разделения массивов. Вам не нужно включать скобки, окружающие всю вещь, и вместо этого взять несколько массивов, разделенных вашим разделителем.
Ваш вывод не должен быть в гольфе, вы можете вставить дополнительное пространство или сделать ваши пирамиды больше, чем необходимо. Трехуровневые пирамиды должны быть на первой линии. Вывод должен быть строкой с символами новой строки или списком строк.
Тот , кто делает включать в себя версию своего кода , который оптимально Гольфы пирамиды может получить некоторую репутацию в виде upvotes / щедрот (но , вероятно , просто upvotes).
Ответы:
Common Lisp -
25241890 байтСпасибо @coredump за ряд трюков в гольф. Пример вывода из вопроса:
Вот оригинальная (в основном) негольфированная версия:
Попробуйте онлайн!
источник
()
; Вы также можете использовать переменные читателя, иногдаloop while (not x)
этоloop until x
,(cdr (cdr x))
это(cddr x)
,(setf a b c d)
короче , чем(setf a b)
следует(setf c d)
, и т.д. Но это уже хороший ответ