Einführung
Die vier grundlegenden mathematischen Operatoren (+, -, *, /) können auf nur zwei reduziert werden, da:
x + y = x - (-y)
x * y = x / (1/y), y != 0
x * 0 = 0/x
Herausforderung
Die Herausforderung besteht darin, die Eingabe als "Zeichenfolge" zu betrachten, die Folgendes enthält:
- Zahlen
- Einzelzeichenvariablen ("x", "y")
- Die vier grundlegenden mathematischen Operatoren (+, -, *, /)
- Klammer
und eine Zeichenfolge ausgeben, die so manipuliert wurde, dass sie das gleiche mathematische Ergebnis wie die Eingabe erzeugt, jedoch nur die mathematischen Symbole '-' und '/' enthält.
Besonderheiten
- Die Eingabe kann in einer beliebigen akzeptablen Form (Datei, STDIN usw.) erfolgen und kann als Zeichenfolge oder Zeichenarray (jedoch nicht als Array von Arrays) dargestellt werden.
- Die Ausgabe kann in einer beliebigen akzeptablen Form (Datei, STDIN usw.) erfolgen und kann als Zeichenfolge oder Zeichenarray (jedoch nicht als Array von Arrays) dargestellt werden.
- Sie müssen ausgewogene Klammern erkennen und beibehalten
- Standardlücken sind nicht zulässig
- Sie haben die Wahl, ob Sie
x + y
alsx - -y
oder darstellen möchtenx - (-y)
- Sie müssen die Reihenfolge der Operationen beibehalten
- Sie müssen niemals ungültige Eingaben verarbeiten
- Die Eingabe kann leer oder eine einzelne Zahl / Variable sein. In diesem Fall sollte das Programm die Eingabe ausgeben
- Hinweis: Sie müssen die Ersetzungen in der Einführung nicht verwenden, solange
input = output
Ihr Programm2 * 2
auf8/2
Wunsch geändert werden kann - Sie können davon ausgehen, dass "0" der einzige Weg ist, wie eine Null in der Gleichung erscheint (dh Sie müssen nicht damit umgehen
1 * (4 - 4)
). - Vorschlag: Um Ihr Programm zu testen, gehen Sie zu dieser Website und geben Sie ein
input = output
, wobei Eingabe die Eingabe und Ausgabe die Ausgabe ist. Wenn das Ergebnis "wahr" ist, hat Ihr Programm diesen Fall erfolgreich behandelt ( Beispiel , Beispiel ).
Testfälle
Im Folgenden finden Sie einige Testfälle, die als einzelne Zeichenfolge und als einzelne Zeichenfolge ausgegeben werden.
x + y
x - (-y)
x * y
x / (1/y)
x / y
x / y
x - y
x - y
1
1
5
5
-6
-6
+x
x
1 + (x * 4) - (512 * 3)
1 - (-(x / (1/4))) - (512 / (1/3))
1 - 3 / 4 + l / g
1 - 3/4 - (-(l / g))
5 * 0 / 2
0/5 / 2
(a + g) * 0
0/(a - (-g))
Wertung
Es ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes. Krawatten werden per First-Post gelöst.
code-golf
string
arithmetic
balanced-string
Sokratischer Phönix
quelle
quelle
x / 1/y
=x/y
weil Division nicht assoziativ ist. Ich weiß, was Sie denken, aber selbst WolframAlpha erkennt nicht, dass Leerzeichen die Reihenfolge der Operationen ändern sollen. Sie sollten dies also wahrscheinlich überdenken oder nicht als gültige Methode zur Überprüfung der Dinge anführen.y=0
, aber ich vermute , dass die Herausforderung dies implizit voraussetztn/d => d != 0
.v
eine geeignete Lösung in Pyth sein.5 * (a - b)
wenn a = b. Und müssen wir Dinge wie entdecken5 * (a - a)
? Wie wäre es mit5 * (4 - 4)
und5 * (a / a - 1)
oder5 * (4 / 4 - 1)
?Antworten:
Python 3, 267 Bytes
Vielen Dank an @ ConorO'Brien
Ideone es!
quelle
Dyalog APL , 42 Bytes
Dadurch wird die Reihenfolge der APLs beibehalten. Beachten Sie das
÷x
ist1÷x
TryAPL online!
(
auf das Ergebnis von ...~∘' '
Leerzeichen entfernen'(.*)×0'⎕R'0÷\1'
Ersetzen Sie alles, gefolgt von "× 0", durch "0 ÷", gefolgt von "× 0")
bewerten...'\+' '×'⎕R'--' '÷÷'
Ersetzen Sie "+" durch "-" und "×" durch "÷÷".Verifizieren:
Weisen Sie zufällige Zahlen ungleich Null auf
x
,y
,l
,g
, unda
.Führen Sie die ursprünglichen Ausdrücke aus.
Führen Sie die geänderten Ausdrücke aus.
Vergleichen Sie die Ergebnisse.
quelle
SED
272 246 239213Nehmen Sie Eingaben ohne Leerzeichen vor (z
x+y*2
. B. ).Dies ist einer der wenigen Fälle, in denen es tatsächlich kürzer ist, nur zu entkommen
(
und)
Gruppen zu erfassen, anstatt sie zu verwenden-r
. Ich bin mir sicher, dass dies mehr Golf gespielt werden kann, aber ich bin vorerst glücklich.Ungolfed, mit Kommentaren:
quelle