Zwei-Symbol-Mathematik

8

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 + yals x - -yoder 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 = outputIhr Programm 2 * 2auf 8/2Wunsch 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 , also gewinnt die kürzeste Antwort in Bytes. Krawatten werden per First-Post gelöst.

Sokratischer Phönix
quelle
2
Übrigens x / 1/y= x/yweil 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.
Linus
1
@Linus: Es ist auch nicht gleichbedeutend, wenn y=0, aber ich vermute , dass die Herausforderung dies implizit voraussetzt n/d => d != 0.
Tim
@ TimČas ahh! Daran habe ich nicht gedacht. Ich werde die Herausforderung aktualisieren, nur wissen, dass es richtig gehandhabt werden muss
Socratic Phoenix
So wie es aussieht, hindert uns kaum etwas daran, den Ausdruck einfach auszuwerten und das Ergebnis zurückzugeben (schließlich sind sie mathematisch gleich). Ich würde empfehlen, dies zu ändern, es sei denn, Sie möchten veine geeignete Lösung in Pyth sein.
Steven H.
Warten Sie, wenn es also Variablen gibt (wie x und y), wie können wir teilen, ohne die Division durch Null zu riskieren? 5 * (a - b)wenn a = b. Und müssen wir Dinge wie entdecken 5 * (a - a)? Wie wäre es mit 5 * (4 - 4)und 5 * (a / a - 1)oder 5 * (4 / 4 - 1)?
Adám

Antworten:

4

Python 3, 267 Bytes

Vielen Dank an @ ConorO'Brien

import re
q=re.sub
g=lambda m:'--'+m.group()[1:]
h=lambda m:'/(1/'+m.group()[1:]+')'
i=lambda m:'0/'+m.group()[:-2]
print(q(r'\*[^\(\)]+',h,q(r'[^\(\)]\*0',i,q(r'\+[^\(\)]+',g,q(r'\*\([^\)]+\)',h,q(r'\([^\)]+\)\*0',i,q(r'\+\([^\)]+\)',g,input().replace(' ',''))))))))

Ideone es!

Beta-Zerfall
quelle
Ehrlich gesagt, ich habe keine Ahnung, welche dunkle Magie Sie eingesetzt haben, aber +1 für FGITW
Socratic Phoenix
@SocraticPhoenix Haha, die dunkle Magie heißt Regex;)
Beta Decay
1

Dyalog APL , 42 Bytes

Dadurch wird die Reihenfolge der APLs beibehalten. Beachten Sie das ÷xist1÷x

'\+' '×'R'--' '÷÷'('(.*)×0'R'0÷\1'~∘' ')

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:

  1. Weisen Sie zufällige Zahlen ungleich Null auf x, y, l, g, und a.

  2. Führen Sie die ursprünglichen Ausdrücke aus.

  3. Führen Sie die geänderten Ausdrücke aus.

  4. Vergleichen Sie die Ergebnisse.

Adam
quelle
0

SED 272 246 239 213

s,^\+,,;s,[^+*/()-]\+,(&),g;t;:;s,)[^)]*)\*(0,&,;tr;s,\((.*)\)\*(0),(0/\1),;ty;s,\*([^)]*(,&,;tr;s,\*\(([^)]*)\),/(1/\1),;ty;s,\+([^)]*(,&,;tr;s,\+\(([^)]*)\),-(-\1),;ty;p;q;:r;s,(\([^()]*\)),!\1@,;t;:y;y,!@,(),;b

Nehmen 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:

s,^\+,, #remove leading +
s,[^+*/()-]\+,(&),g #suround numbers/variables in ()
t start #reset the test because the line above will always match

:start
#------------- deal with *0 ------------------
s,)[^)]*)\*(0,&, #remove inner matching ()
t replace
s,\((.*)\)\*(0),(0/\1),
t y
#------------- deal with generic * -----------
s,\*([^)]*(,&, #remove inner matching ()
t replace
s,\*\(([^)]*)\),/(1/\1),
t y
#------------- deal with + -------------------
s,\+([^)]*(,&, #remove inner matching ()
t replace
s,\+\(([^)]*)\),-(-\1),
t y

b end #all done, branch to the end

#------------- replace a set of () with !@ ---
#repeated application of this helps find the matching ( or )
:replace
s,(\([^()]*\)),!\1@,
t start

:y
y,!@,(),
b start

:end
Riley
quelle