Задний план
Алиса и Боб создают язык игры в гольф, чтобы выиграть каждый вызов PPCG. Алиса хочет создать двумерный язык, например> <>, но Боб предпочитает синтаксис префикса-инфикса, как в J. В качестве компромисса они решают создать двумерный язык префикса-инфикса. Парсер - это боль писать, и им нужна ваша помощь!
Синтаксическая спецификация
В языке Алисы и Боба есть переменные , которые представлены строчными буквами ASCII a-z
, и функции , которые представлены прописными буквами ASCII A-Z
. Функция может быть вызвана с одним или двумя аргументами. Программа представляет собой прямоугольную сетку из букв a-zA-Z
и пробелов, а верхний левый угол не должен содержать пробелы. Это пример правильной программы:
F Gy
H
R x
Когда программа анализируется, она преобразуется в выражение языка стиля C (C, Java, Python ...), содержащее однобуквенные переменные и вызовы функций в формате <func>(<arg>)
или <func>(<arg1>,<arg2>)
. Например, приведенная выше программа приводит к следующему выражению:
F(H(R(x)),G(x,y))
Детали процесса разбора следующие:
- Пространства просто заполнители, поэтому они не анализируются.
- Каждая переменная
a-z
всегда анализируется как сама. - Каждая функция
A-Z
анализируется как вызов функции. Его аргументы являются ближайшими выражениями под ним и справа от него в сетке, в этом порядке. Если присутствует только один из них, он приводится в качестве единственного аргумента. Можно предположить, что все функции имеют хотя бы один аргумент в сетке.
В приведенном выше примере переменные x
и y
анализируются как сами по себе. Функция не R
имеет ничего ниже и x
справа от нее, поэтому она анализируется как вызов с одним аргументом R(x)
. Точно так же H
разбирается как H(R(x))
, так как имеет R
под ним. Функция G
расположена x
ниже и y
справа от нее, поэтому она анализируется как G(x,y)
и аналогично для F
. Выражение, проанализированное в верхнем левом углу, является результатом процесса синтаксического анализа.
Вход и выход
Ваш ввод представляет собой непустой прямоугольный массив символов. Это всегда будет действительная программа на языке Алисы и Боба, но она может содержать выражения, которые не используются в выводе. Ваш вывод должен быть разобранным выражением, полученным в результате вышеуказанного процесса.
Правила и оценки
Вы можете написать полную программу функции. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Контрольные примеры
Они приведены в формате grid <newline> expression
с дефисами ---
между падежами. Формат SE оставляет некоторые строки пустыми, но они должны быть заполнены пробелами.
x
x
---
x y
z
x
---
Fx
F(x)
---
Fx
y
F(y,x)
---
ABu
A(B(u))
---
G
H
k
G(H(k))
---
ABCA
x xs
DFk
A(x,B(D(F(k)),C(x,A(s))))
---
A B
C D x
A(C(D(x)),B(D(x)))
---
RT Hq
I xR k
R(I(x),T(H(R(k),q)))
---
A A A a
S A b
B C Dx
d X u f
A(B(d,C(D(f,x))),A(X(u),A(u,a)))
(A (B (D x)) (C (D x)))
, или формат фиксирован?Ответы:
CJam,
676260585754 байтаСпасибо Деннису за сохранение 4 байта.
Это определяет именованный блок (функцию)
J
и оставляет его в стеке. Сама функция ожидает массив строк в стеке, который представляет входную сетку, и оставляет желаемую строку вместо нее.Проверьте это здесь.
Я собирался заняться этим с момента его публикации, но, видимо, мне нужно было вознаграждение и слишком длинное решение Pyth, чтобы мотивировать себя достаточно.
объяснение
Решение, конечно, рекурсивное и постепенно создает строку.
источник
Python 2,
227223192182179177 байт(Четыре пробела фактически являются вкладками)
Принимает 2-й список символов в качестве первого аргумента для r.
источник
Pyth, 97 байт
Боже мой, что заняло много времени (около 5/6 часов?). Пиф действительно не был предназначен для этого ...
Попробуй это здесь .
Попытка объяснения, а также эквивалент Python
Где функции
Pprint
иassign
вернуть то, что им дают.источник
Haskell,
124122120119 байтовПример использования:
(#id) ["RT Hq ","I xR k"]
->"R(I(x),T(H(R(k),q)))"
.Как это работает: помимо входной сетки
r
, функция#
принимаетg
в качестве аргумента еще одну функцию, которая применяетсяr
всякий раз, когда верхний левый символ является пробелом. Если это строчный символ, верните его. В противном случае это должен быть заглавный символ, и он#
вызывается рекурсивно, один разtail
для перехода вниз и один разmap tail
для перехода вправо.!
объединяет результаты рекурсивных вызовов с,
, если необходимо. Все начинается с входной сетки и функции идентификации.источник
Python 3, 187 байт
Все еще ищу способы сыграть в эту игру, но я просто рад, что мне удалось превратить ее в однострочник.
источник