Haftungsausschluss: Nein, dies ist keine Scherzaufforderung, um eine Zeichenfolge umzukehren.
Aufgabe
Es gibt nur eine zu unterstützende Operation: subtraction ( -
).
Sie müssen auch nur zwei Atome unterstützen: null ( 0
) und eins ( 1
).
Hier entspricht die Präfixnotation -AB
der Postfixnotation AB-
, wobei A
und B
Ausdrücke sind.
Ihre Aufgabe ist es, einen Ausdruck in Präfixnotation (rekursiv) in den entsprechenden Ausdruck in Postfixnotation umzuwandeln.
Definitionen
Ein Ausdruck in Präfixnotation wird von der folgenden Grammatik generiert:
S > -SS
S > 0
S > 1
Ein Ausdruck in Postfix-Notation wird von der folgenden Grammatik generiert:
S > SS-
S > 0
S > 1
Beispiel
Prefix notation: --01-0-01
Parentheses: -(-01)(-0(-01))
Convert: (01-)(0(01-)-)-
Postfix notation: 01-001---
Regeln und Freiheit
- Sie können die Operation und die Atome in ein beliebiges Zeichen umbenennen, sofern dies konsistent ist.
- Das Eingabeformat muss mit dem Ausgabeformat übereinstimmen (abgesehen von der Tatsache, dass die Eingabe in Präfixnotation und die Ausgabe in Postfixnotation erfolgt).
Testfall
Input Output
1 1
0 0
-01 01-
-10 10-
--01-0-01 01-001---
Testet Credits für Dada .
Antworten:
Brainfuck , 32 Bytes
Probieren Sie es online!
Ich habe
@
als Operation verwendet, weil der Codepunkt (64) praktisch ist.U
ist auch bei gleicher Byteanzahl mit 3 * 85 + 1 = 256 = 0 möglich.Erläuterung
Das Band wird als Stapel verwendet. In jeder Iteration der Hauptschleife startet der Datenzeiger zwei Zellen rechts oben im Stapel.
quelle
Retina ,
373029 BytesProbieren Sie es online! Durch die Erkenntnis, dass Begriffe immer mit einer Ziffer beginnen, wurden 7 Bytes eingespart, sodass ich die Übereinstimmung
-
nicht mehr auf die letzte Stelle beschränken muss (zuvor war dies die einzige Stelle, auf die garantiert zwei Begriffe folgen). 1 Byte gespart, indem-
s nicht in die eigene Zeile gesetzt wird. Zum Beispiel-01
wird-0¶1
das dann durch ersetzt01-
. Nun, wenn ich--010
also--0¶1¶0
dann will ich den inneren zu ändern ,-0¶1
um01-
so , dass ich die ersetzen kann-01-¶0
mit01-0-
, aber es funktioniert nicht wirklich unabhängig davon , welche der beiden-
s ich entfernen, so dass ich die man am Anfang der Zeile entfernen, wie Das ist einfacher zu testen.quelle
-0-0-00
sollte zB werden0000---
.Haskell ,
6259 BytesProbieren Sie es online! Verbrauch:
fst.f $ "--01-0-01"
.0
und1
können beliebige Zeichen sein, die größer als das Zeichen sind-
.Edit: -3 Bytes dank Zgarb!
Die Funktion
f
analysiert rekursiv einen Ausdruck und gibt ein Tupel dieses Ausdrucks in Postfix-Notation und die Restzeichenfolge zurück. Dabei wird der einfachen Grammatik gefolgt, aus der gültige Präfix-Ausdrücke erstellt werden können:Wenn das erste Zeichen
a
der Eingabezeichenfolge größer als ist-
, befinden wir uns an einem atomaren Ausdruck und geben ein Tupel einer Zeichenfolge mit dem Zeichena
und dem Rest der Eingabezeichenfolge zurück.Wenn wir einen finden
-
, müssen zwei Ausdrücke analysiert werden. Dies kann erreicht werden, indem(a,x)<-f r
der erste Ausdrucka
abgerufen und dann die Restzeichenfolgex
erneut analysiert wird(b,c)<-f x
, um den zweiten Ausdruckb
und die endgültige Restzeichenfolge abzurufenc
.(a,(b,c))<-f<$>f r
Tut genau das, weil<$>
bei Tupeln eine Funktion zwei das zweite Element eines Tupels abbildet und dabei drei Bytes kürzer ist als(a,x)<-f r,(b,c)<-f x
. Nachdem beide Ausdrücke und den Rest - String zu erhalten, werden die Ausdrücke verkettet und ein „-“ angefügt:(a++b++"-",c)
.quelle
f(x:r)|x>'-'=([x],r)|(a,(b,c))<-f<$>f r=(a++b++"-",c)
f(x:r)|x<'0',(a,(b,c))<-f<$>f r=(a++b++"-",c)|1<3=([x],r)
als ich nach einer Version mit beiden Fällen zusammen gesucht habe, die Byte länger ist.Haskell, 54 Bytes
Die Funktion
v
übernimmt eine Zeichenfolge und eine Funktion, ordnet den anfänglichen Unterausdruck neu an und wendet die Funktion dann auf den Rest der Zeichenfolge an, bis alles neu angeordnet wurde. Der Aufrufstapel und das Funktionsargument verfolgen zusammen, welcher Ausdruck analysiert wird. Die Funktionh
beantwortet die Herausforderung und ist gerechtv
als erstes Dummy-Argument mit sich selbst aufgerufen.quelle
v f l=l
wenn Sie sie an zweiter Stelle verschieben.v id
.last
Trick um ein Byte zu übertreffen .Perl 5 , 57 Bytes
Ich benutze
x
als Operator statt-
(siehe den TryItOnline-Link unten).Probieren Sie es online!
Erklärungen:
/x((?0)|.)((?0)|.)/
Stimmt rekursiv mit einem vollständigen Ausdruck überein: ax
am Anfang, dann ein Ausdruck(?0)
(es ist ein rekursiver Aufruf) oder ein Atom (.
), gefolgt von einem anderen Ausdruck oder Atom.Dann muss ich den zweiten Ausdruck / atom (
my$n=$2;
) speichern, da er sonst von den rekursiven Aufrufen überschrieben wird.Die Funktion wird dann rekursiv auf den ersten Ausdruck (
f($1)
), dann auf den zweitenf($n)
undx
am Ende (.x
) angehängt .quelle
Python 3,
1171121051009876626159 BytesÄnderungsprotokoll:
!=
auf>
(-1 Byte, kopiert von @ovs Vorschlag)Benutze es so:
quelle
return
lambda x:p(x)[0]
könnte wohl deinef
funktion ersetzen .else
.d="-"
Bytes wirklich?def p(s):x=next(s);yield from[x]*(x>"-")or[*p(s),*p(s),"-"]
für 59 BytesPyth, 20 Bytes
Dies schafft eine Funktion
y
, die eine Zeichenfolge als Parameter erwartet.Probieren Sie es online aus: Demonstration oder Test Suite
Erläuterung:
Die Funktion
y
analysiert und konvertiert den ersten Präfix-Ausdruck in einen Postfix-Ausdruck. Wenn es also so heißty"10"
, wird es nur zurückkehren1
.quelle
Retina ,
343129 BytesProbieren Sie es online!
;
werden verwendet, um Knoten anzugeben, die anfänglich aus einer einzelnen Zahl bestehen und dann zu allem wachsen, was bereits analysiert wurde.-
werden in Zeilenumbrüche umgewandelt, damit.+
wir alles erfassen können, was nicht ungeparst ist-
.quelle
Perl 6 , 45 Bytes
Probieren Sie es online!
quelle