Hintergrund
Alice und Bob erschaffen eine Golfsprache, um jede einzelne PPCG-Herausforderung zu gewinnen. Alice möchte eine zweidimensionale Sprache wie> <> erstellen, aber Bob bevorzugt eine Präfix-Infix-Syntax wie in J. Als Kompromiss entscheiden sie sich, eine zweidimensionale Präfix-Infix-Sprache zu erstellen. Der Parser ist eine Qual zum Schreiben, und sie brauchen Ihre Hilfe!
Syntaxspezifikation
In der Sprache von Alice und Bob gibt es Variablen , die durch ASCII-Kleinbuchstaben dargestellt werden a-z
, und Funktionen , die durch ASCII-Großbuchstaben dargestellt werden A-Z
. Eine Funktion kann mit einem oder zwei Argumenten aufgerufen werden. Ein Programm ist ein rechteckiges Gitter aus Buchstaben a-zA-Z
und Leerzeichen. Die linke obere Ecke darf kein Leerzeichen enthalten. Dies ist ein Beispiel für ein gültiges Programm:
F Gy
H
R x
Wenn das Programm analysiert wird, wird es in einen Ausdruck einer C-artigen Sprache (C, Java, Python ...) umgewandelt, die Variablen mit einem Buchstaben und Funktionsaufrufe im Format <func>(<arg>)
oder enthält <func>(<arg1>,<arg2>)
. Das obige Programm führt zum Beispiel zu folgendem Ausdruck:
F(H(R(x)),G(x,y))
Die Details des Analyseprozesses lauten wie folgt:
- Die Leerzeichen sind nur Füllzeichen, daher werden sie nicht analysiert.
- Jede Variable
a-z
wird immer als sich selbst analysiert. - Jede Funktion
A-Z
wird als Funktionsaufruf analysiert. Seine Argumente sind die engsten Ausdrücke darunter und rechts davon im Raster, in dieser Reihenfolge. Wenn nur eines davon vorhanden ist, wird es als einziges Argument angegeben. Sie können davon ausgehen, dass alle Funktionen mindestens ein Argument im Raster haben.
Im obigen Beispiel werden die Variablen x
und y
als sich selbst analysiert. Die Funktion R
hat nichts unter sich und x
rechts davon, daher wird sie als Aufruf mit einem Argument analysiert R(x)
. Ebenso H
wird analysiert, wie H(R(x))
, da es R
darunter hat. Die Funktion G
befindet sich rechts x
darunter und wird y
analysiert als G(x,y)
und in ähnlicher Weise für F
. Der in der oberen linken Ecke analysierte Ausdruck ist das Ergebnis des Analyseprozesses.
Ein- und Ausgabe
Ihre Eingabe ist ein nicht leeres rechteckiges Zeichenfeld. Es ist immer ein gültiges Programm in der Sprache von Alice und Bob, es kann jedoch Ausdrücke enthalten, die in der Ausgabe nicht verwendet werden. Ihre Ausgabe soll der analysierte Ausdruck sein, der sich aus dem obigen Prozess ergibt.
Regeln und Wertung
Sie können ein vollständiges Programm einer Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.
Testfälle
Diese werden im Format grid <newline> expression
mit Bindestrichen ---
zwischen den Fällen angegeben. Das SE-Format lässt einige Zeilen leer, sie sollten jedoch mit Leerzeichen gefüllt sein.
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)))
passend oder ist das Format festgelegt?Antworten:
CJam,
676260585754 BytesVielen Dank an Dennis für das Speichern von 4 Bytes.
Dies definiert einen benannten Block (Funktion)
J
und belässt ihn auf dem Stapel. Die Funktion selbst erwartet ein Array von Zeichenfolgen auf dem Stapel, das das Eingaberaster darstellt, und lässt die gewünschte Zeichenfolge an ihrer Stelle.Teste es hier.
Ich hatte vor, dieses Problem anzugehen, seit es veröffentlicht wurde, aber anscheinend brauchte ich ein Kopfgeld und eine zu lange Pyth-Lösung, um mich ausreichend zu motivieren.
Erläuterung
Die Lösung ist natürlich rekursiv und baut den String schrittweise auf.
quelle
Python 2,
227223192182179177 Bytes(Die vier Leerzeichen sind in der Tat Registerkarten)
Nimmt eine 2D-Liste von Zeichen als erstes Argument für r.
quelle
Pyth, 97 Bytes
Mein Gott, das hat lange gedauert (ca. 5/6 Stunden?). Pyth war wirklich nicht dafür gedacht ...
Probieren Sie es hier aus .
Erklärungsversuch sowie Python-Äquivalent
Wo die Funktionen
Pprint
undassign
zurückgeben, was sie gegeben sind.quelle
Haskell,
124122120119 BytesAnwendungsbeispiel:
(#id) ["RT Hq ","I xR k"]
->"R(I(x),T(H(R(k),q)))"
.r
Funktionsweise : Neben dem Eingaberaster#
übernimmt die Funktion eine weitere Funktiong
als Argument, das angewendet wird,r
wenn das Zeichen oben links ein Leerzeichen ist. Wenn es sich stattdessen um ein Kleinbuchstabenzeichen handelt, geben Sie es zurück. Andernfalls muss es ein Großbuchstabe sein und#
wird rekursiv aufgerufen, einmal mittail
nach unten und einmal mitmap tail
nach rechts.!
Verbindet die Ergebnisse der rekursiven Aufrufe bei,
Bedarf mit einem . Alles beginnt mit dem Eingaberaster und der Identitätsfunktion.quelle
Python 3, 187 Bytes
Ich bin immer noch auf der Suche nach Möglichkeiten, dies herunterzuspielen, aber ich bin nur froh, dass ich es geschafft habe, daraus einen Einzeiler zu machen.
quelle