Contexte
Alice et Bob créent un langage de golf pour gagner chaque défi PPCG. Alice veut faire un langage bidimensionnel, comme> <>, mais Bob préfère une syntaxe préfixe-infixe comme dans J. Comme compromis, ils décident de créer un langage préfixe-infixé bidimensionnel. L'analyseur est une douleur à écrire, et ils ont besoin de votre aide!
Spécification de syntaxe
Dans le langage d'Alice et de Bob, il existe des variables , qui sont représentées par des lettres ASCII minuscules a-z
, et des fonctions , qui sont représentées par des lettres ASCII majuscules A-Z
. Une fonction peut être invoquée avec un ou deux arguments. Un programme est une grille rectangulaire de lettres a-zA-Z
et d'espaces, et le coin supérieur gauche ne doit pas contenir d'espace. Voici un exemple de programme valide:
F Gy
H
R x
Lorsque le programme est analysé, il est transformé en une expression d'un langage de style C (C, Java, Python ...) contenant des variables à une lettre et des appels de fonction au format <func>(<arg>)
ou <func>(<arg1>,<arg2>)
. Par exemple, le programme ci-dessus donne cette expression:
F(H(R(x)),G(x,y))
Les détails du processus d'analyse sont les suivants:
- Les espaces sont juste remplis, donc ils ne sont pas analysés.
- Chaque variable
a-z
est toujours analysée comme elle-même. - Chaque fonction
A-Z
est analysée comme un appel de fonction. Ses arguments sont les expressions les plus proches en dessous et à sa droite dans la grille, dans cet ordre. Si un seul d'entre eux est présent, il est donné comme seul argument. Vous pouvez supposer que toutes les fonctions ont au moins un argument dans la grille.
Dans l'exemple ci-dessus, les variables x
et y
sont analysées comme elles-mêmes. La fonction R
n'a rien en dessous et x
à sa droite, elle est donc analysée comme l'invocation à un argument R(x)
. De même, H
est analysé comme H(R(x))
, car il a en R
dessous. La fonction G
a en x
dessous et y
à droite, donc elle est analysée comme G(x,y)
, et de même pour F
. L'expression analysée dans le coin supérieur gauche est le résultat du processus d'analyse.
Entrée et sortie
Votre entrée est un tableau rectangulaire de caractères non vide. Ce sera toujours un programme valide dans le langage d'Alice et de Bob, mais il peut contenir des expressions qui ne sont pas utilisées dans la sortie. Votre sortie doit être l'expression analysée résultant du processus ci-dessus.
Règles et notation
Vous pouvez écrire un programme complet d'une fonction. Le nombre d'octets le plus bas l'emporte et les failles standard sont interdites.
Cas de test
Ceux-ci sont donnés dans le format grid <newline> expression
, avec des tirets ---
entre les cas. Le format SE laisse certaines lignes vides, mais elles doivent être remplies d'espaces.
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)))
elle convenir ou le format est-il fixe?Réponses:
CJam,
676260585754 octetsMerci à Dennis d'avoir économisé 4 octets.
Ceci définit un bloc nommé (fonction)
J
et le laisse sur la pile. La fonction elle-même attend un tableau de chaînes sur la pile, qui représente la grille d'entrée, et laisse la chaîne souhaitée à sa place.Testez-le ici.
Je voulais aborder celui-ci depuis sa publication, mais apparemment, j'avais besoin d'une prime et d'une solution Pyth trop longue pour me motiver suffisamment.
Explication
La solution est bien sûr récursive et construit progressivement la chaîne.
la source
Python 2,
227223192182 182179177 octets(Les quatre espaces sont en fait des tabulations)
Prend une liste 2D de caractères comme premier argument de r.
la source
Pyth, 97 octets
Mon dieu qui a mis beaucoup de temps à faire (environ 5/6 heures?). Pyth n'était vraiment pas conçu pour ça ...
Essayez-le ici .
Tentative d'explication ainsi que l'équivalent python
Où les fonctions
Pprint
etassign
retourner ce qui leur est donné.la source
Haskell,
124122120 120119 octetsExemple d'utilisation:
(#id) ["RT Hq ","I xR k"]
->"R(I(x),T(H(R(k),q)))"
.Comment ça marche: outre la grille d'entrée
r
, la fonction#
prend une autre fonctiong
comme argument qui est appliquér
chaque fois que le caractère en haut à gauche est un espace. S'il s'agit plutôt d'un caractère minuscule, renvoyez-le. Sinon, il doit s'agir d'un caractère majuscule et#
est appelé récursivement, une fois avectail
pour descendre et une fois avecmap tail
pour aller à droite.!
joint les résultats des appels récursifs avec un,
, si nécessaire. Tout commence par la grille d'entrée et la fonction d'identité.la source
Python 3, 187 octets
Toujours à la recherche de façons de jouer au golf, mais je suis juste content d'avoir réussi à le transformer en un doublé.
la source