Pyramid Scheme ist eine Sprache, die von @ ConorO'Brien entwickelt wird . In Pyramid Scheme sieht der von Ihnen geschriebene Code folgendermaßen aus:
^ ^
/ \ /3\
/ \ ---
/ + \
^-------^
/9\ /3\
/123\ ---
-----
Nun, dieser Code hat zwei offensichtliche Eigenschaften: Es ist schwierig zu analysieren und es ist schwierig zu schreiben. Conor hat das erste Problem gelöst, es wird jedoch Ihre Aufgabe sein, das zweite Problem zu lösen.
Der obige Code wird vom PyramidScheme-Interpreter in ein verschachteltes String-Array wie folgt verarbeitet:
[["+", ["9123", "3"]], "3"]
Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die bei einem verschachtelten Array von Zeichenfolgen den neu erstellten PyramidScheme-Code ausgibt oder zurückgibt. Sie können davon ausgehen, dass das Eingabearray immer gültig ist.
Eine Pyramide ist ein gleichschenkliges Dreieck. Die Oberseite ist ^
, die Seiten schräg weg mit /
und abfallen \
, und die Unterseite ist -
. Die beiden unteren Ecken sind entweder leer oder enthalten den Anfang anderer Pyramiden, bei denen es sich um Argumente handelt. Die Mitte ist mit dem Namen der Pyramide gefüllt, wobei Zeilenumbrüche ignoriert werden.
So konvertiert der Parser den Code in ein verwendbares Format. Zunächst wird nach einer Pyramide der obersten Ebene gesucht. Wenn es keine Argumente akzeptiert, wird es mit einer einzelnen Zeichenfolge dargestellt und fortgesetzt. Andernfalls wird es als Array dargestellt["name",[arg1,arg2]]
oder dargestellt ["name",[arg1]]
. Die Argumente sind die Pyramiden links unten und rechts unten in der Pyramide, bei denen es sich entweder um eine Zeichenfolge oder um mehrere wie oben beschriebene Arrays handeln kann. Möglicherweise stellen Sie fest, dass dies etwas an Lisp erinnert. In diesem Fall haben Sie möglicherweise auch das schreckliche Wortspiel bemerkt, das der Name der Sprache ist. Nachdem die Pyramide vollständig dargestellt ist, fährt der Parser mit der nächsten fort.
Dies ist Code-Golf , der kürzeste Code gewinnt!
Testfälle: Dies sind nicht die einzigen gültigen Ausgaben, sondern Beispiele für gültige Ausgaben.
[["+", ["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\
---
Beachten Sie im zweiten Testfall, dass sowohl die zweite als auch die dritte out
Pyramide a haben["chr", ["108"]]
einen Parameter haben, der zu einem Pyramidenstapel zusammengefasst wird, der von zwei obersten gemeinsam genutzt wird. Dies ist eine gültige Optimierung, die Ihr Code möglicherweise unterstützt, die jedoch vollständig optional ist. Die Bewertung basiert nicht auf der Länge Ihrer Ausgabe.
Für die Neugierigen wird der erste Fall 9126 3
aufgrund des impliziten Druckens von Pyramiden der obersten Ebene angezeigt, der zweite wird gedruckt Hello
, und der letzte ist ein Syntaxfehler, der nur deshalb enthalten ist, weil er eine ordentliche Struktur aufweist.
Sie gehen davon aus , dass der Eingang nur druckbare ASCII enthält, ohne Leerzeichen ^
, /
, \
, und -
. Die Eingabe ist immer gültig und enthält mindestens eine Pyramide. Es gibt keine Begrenzung für die Größe des Arrays oder der Eingabezeichenfolgen. Sie können Ihren Code jedoch so schreiben, als ob der standardmäßige Ganzzahltyp Ihrer Sprache unendlich genau wäre und Ihr Computer über einen beliebigen Speicher verfügt. Wenn Sie Eingaben als einzelne Zeichenfolge verwenden, können Sie alles verwenden, was zumutbar ist (Komma, Leerzeichen usw.), sofern es sich um druckbare ASCII-Zeichen handelt und nicht"
oder []
, um Arrays abzugrenzen. Sie müssen keine eckigen Klammern einschließen, sondern mehrere durch Trennzeichen getrennte Arrays verwenden.
Ihre Ausgabe muss nicht golfen werden, Sie können zusätzlichen Platz einfügen oder Ihre Pyramiden größer als erforderlich machen. Pyramiden der obersten Ebene sollten sich in der ersten Zeile befinden. Die Ausgabe sollte eine Zeichenfolge mit Zeilenumbrüchen oder eine Liste von Zeichenfolgen sein.
Jeder, der eine Version seines Codes enthält, mit der die Pyramiden optimal golfen werden, kann eine Wiederholung in Form von positiven Stimmen / Kopfgeldern (aber wahrscheinlich nur positiven Stimmen) erhalten.
Antworten:
Common Lisp -
25241890 BytesVielen Dank an @coredump für eine Reihe von Golf-Tricks. Beispielausgabe der Frage:
Hier ist die originale (meistens) ungolfed Version:
Probieren Sie es online!
quelle
()
. Sie können auchloop while (not x)
istloop until x
,(cdr (cdr x))
ist(cddr x)
,(setf a b c d)
ist kürzer als(setf a b)
gefolgt von(setf c d)
, etc. Aber das ist schon eine gute Antwort