Sie erhalten eine Zeichenfolge, die aus den Zeichen besteht 0123456789+*()
. Sie können davon ausgehen, dass die Zeichenfolge immer ein gültiger mathematischer Ausdruck ist.
Ihre Aufgabe ist es, die unnötigen Klammern zu entfernen, vorausgesetzt, die Multiplikation hat eine höhere Priorität als die Addition.
Die Klammern sollten nur entfernt werden, wenn sie strukturell nicht benötigt werden :
- wegen multiplikation höhere priorität:
3+(4*5)
=>3+4*5
- wegen Multiplikation oder Addition Assoziativität:
3*(4*5)
=>3*4*5
- Wenn sie um einen Ausdruck herum redundant sind:
3*((4+5))
=>3*(4+5)
Klammern sollten beibehalten werden, wenn sie aufgrund bestimmter Zahlenwerte vereinfacht werden könnten:
1*(2+3)
sollte nicht vereinfacht werden1*2+3
0*(1+0)
sollte nicht vereinfacht werden0*1+0
Beispiele:
(4*12)+11 ==> 4*12+11
(1+2)*3 ==> (1+2)*3
3*(4*5) ==> 3*4*5
((((523)))) ==> 523
(1+1) ==> 1+1
1*(2*(3+4)*5)*6 ==> 1*2*(3+4)*5*6
1*(2+3) ==> 1*(2+3)
0*(1+0) ==> 0*(1+0)
(((2+92+82)*46*70*(24*62)+(94+25))+6) ==> (2+92+82)*46*70*24*62+94+25+6
1*(2*(3+4)*5)*6
sollte ein interessanter Testfall sein (für den meine Lösung derzeit ausfällt).(2+2)*1
Antworten:
Mathematica,
1059791 Bytes-6 Bytes dank Roman !
Ersetzt
+
und*
mit~~
(StringExpression
) bzw.**
(NonCommutativeMultiply
), wertet es aus, fasst es zusammen und ersetzt die Operatoren zurück.quelle
StringExpression
anstelle vonDot
und Entfernen der" "->""
Klausel:a=StringReplace;ToString@ToExpression@a[#,{"*"->"**","+"->"~~"}]~a~{" ** "->"*","~~"->"+"}&
JavaScript (ES6) 163
178Bearbeite 15 Bytes gespeichert dank @IsmaelMiguel
Weniger golfen
Prüfung
quelle
y.indexOf('+')
anstatty.indexOf`+`[...]
? ([...] hinzugefügt, um das Auslösen der Formatierung zu vermeiden) War es fehlerhaft?a=>eval(`for(b=s=[]${_=';a!=b;a=b.replace(/'}\\(([^()]*)\\)(?=(.?))/,(x,y,z,p)=>~y.indexOf('+')<0?-s.push(b[p-1]=='*'|z=='*'?x:y):y))b=a;for(b=0${_}-\\d+/,x=>s[~x]))b=a`)
for(b=
,=='*'
und andere wiederholten Bits. Ist das nicht~y.indexOf('+')<0
dasselbe wie~y.indexOf('+')
? Da der einzige zurückgegebene WertindexOf()
ein falscher Wert ist-1
,<0
scheint der redundant zu sein. Oder, wenn ich es falsch verstanden habe, könnten Sie es tuny.indexOf('+')>1
<0
Mist bleibt von der ungolften Version und sollte entfernt werden. 2: Denken Sie noch einmal darüber nach,for
dass es überarbeitet werden kann, um in den wiederholten Teil aufgenommen zu werden.Python3 + PEG-Implementierung in Python , 271 Byte
Vor einiger Zeit habe ich eine PEG-Implementierung in Python durchgeführt . Das kann ich hier wohl nutzen.
Analysiert den Ausdruck in eine Baumstruktur und behält Klammern nur bei, wenn das untergeordnete Element eine Addition und das übergeordnete Element eine Multiplikation ist.
quelle
Perl, 132 Bytes
129 Bytes Quelle + 3 für
-p
Flag:Verwenden von:
quelle
Ruby,
140-130Bytes127 Byte Quelle + 3 für
-p
Flag:Und ungolfed:
quelle
0 while
Syntax?expr while cond
entsprichtwhile cond; expr; end
. Hier möchte ich nurcond
wiederholt auftreten und habe eigentlich keinen Loop-Body. Normalerweise würde man dies alswhile cond; end
oder vielleicht schreiben,loop{ break unless cond }
aber0 while cond
es sind weniger Bytes. Der0
macht gar nichts; es ist nur da, weil die Kurzform der while-Schleife einen Körper erfordert.Netzhaut, 155 Bytes
Probieren Sie es online!
Überprüfen Sie alle Testfälle auf einmal.
Erläuterung
Die Hauptsache ist dieser Code:
Dieser reguläre Ausdruck kann mit jeder Zeichenfolge übereinstimmen, bei der die Klammern ausgeglichen sind, z . B.
1+(2+(3))+4
oder2+3
.Zur Erleichterung der Erklärung sei dieser reguläre Ausdruck
B
.Verwenden wir stattdessen
<
und>
für die Klammern sowiep
undm
für\+
und\*
.Der Code wird:
Die ersten beiden Zeilen stimmen mit Klammern überein, die nur aus Multiplikation bestehen, z . B.
(1*2*3)
oder sogar(1*(2+3)*4)
. Sie werden durch ihren Inhalt im Inneren ersetzt.Die letzten beiden Zeilen stimmen für Klammern überein, die nicht vorangestellt sind und denen keine Multiplikation folgt. Sie werden durch ihren Inhalt im Inneren ersetzt.
Die Initiale
{`
bedeutet "Ersetzen bis idempotent", was bedeutet, dass die Ersetzungen durchgeführt werden, bis sie entweder nicht mehr übereinstimmen oder durch sich selbst ersetzt werden.In diesem Fall werden die Ersetzungen so lange durchgeführt, bis sie nicht mehr übereinstimmen.
quelle
1*(2*(3+4)*5)*6
.(1*(2+3)+4)*5
Python 3,
274269359337336 BytesDiese Methode entfernt grundsätzlich jedes mögliche Klammerpaar und prüft, ob es immer noch gleich ist.
Testgeschirr
Aktualisierung
re
libl
) Lambda entferntquelle
1*(2+3)
, weil OP sagte, für spezielle Nummernfälle nicht zu vereinfachen. Gute Antwort aber; Das hat meine Zustimmung.PHP, 358 Bytes
Keine beeindruckende Länge, das ist es, was ich dafür bekomme, dass ich einen weniger als optimalen Ansatz (und eine weniger als optimale Sprache) gewählt habe.
Entfernt ein Paar Klammern und wertet den resultierenden Ausdruck aus. Wenn das Ergebnis mit dem Original übereinstimmt, wird es zu einer Karte gültiger Ausdrücke hinzugefügt und solange wiederholt, bis keine neuen Ausdrücke mehr gefunden werden. Dann wird der kürzeste gültige Ausdruck gedruckt.
Bricht ab, wenn das Ergebnis des Ausdrucks groß wird und die Doppel- / Exponenten-Notation angezeigt wird.
quelle
Prolog (SWI) ,
122118 BytesProbieren Sie es online!
Definiert ein Prädikat
//2
, das Klammern aus dem Zeichenfolgenwert des ersten Arguments entfernt und eine Zeichenfolge über das zweite Argument ausgibt. Wenn der Eingang in Prolog Bedingungen sein könnte, wäre dies nur sein8177 Bytes definieren ,+/2
ohne mit dem ausführlichen beschäftigen zu müssenterm_string/2
, aber eine Menge unnötiger Klammer einfach nicht bestanden hat mit dieser Art und Weise zu beginnen , so dass es ziemlich nah an betrügen würde, da Alles, was das+/2
tut, ist die Assoziativität.Ich habe versucht, es
=../2
für alles zu verwenden , aber es kam viel länger heraus, weil ein Drei-Byte-Operator, der mit Listen arbeitet, nicht gerade knapp ist:Prolog (SWI) , 124 Bytes
Probieren Sie es online!
quelle