Bewerten Sie einen bestimmten Omnifix-Ausdruck.
Omnifix ist wie die Infixnotation der normalen Mathematik, jedoch mit zusätzlichen Kopien jedes Symbols, das die Argumente umgibt. Die äußeren Symbole ersetzen Klammern, sodass keine zusätzlichen Klammern erforderlich sind.
Sie müssen Addition, Subtraktion, Multiplikation, Division und positive reelle Zahlen (negative können geschrieben werden -0-n-
) in einem für Ihre Sprache angemessenen Bereich unterstützen.
Plus und Minus müssen +
und sein -
, aber Sie können *
oder ×
für Zeiten und /
oder ÷
zum Teilen verwenden. Andere sinnvolle Symbole sind auf Anfrage zulässig.
Brownie-Punkte für Erklärungen und zusätzliche Funktionen (wie zusätzliche Operationen, negative Zahlen, Zeichenfolgen usw.) Auch wenn Ihre Antwort diese Funktionen nicht enthält, können Sie zeigen, wie dies möglich ist.
Bitte geben Sie einen Link an, um Ihre Lösung zu testen, sofern dies möglich ist.
Beispiele
In den folgenden Erläuterungen werden zur Verdeutlichung ¯
negative Zahlen mit einem hohen Minuszeichen ( ) angegeben. Sie können negative Zahlen in jedem vernünftigen Format zurückgeben.
-5-2-
→ 3
+2+×3×2×+
→ 8
( +2+×3×2×+
→ +2+6+
→ 8
)
-14--3-1--
→ 12
( -4--3-1--
→ -14-2-
→ 12
)
+2.1+×3.5×2.2×+
→ 9.8
( +2.1+×3.5×2.2×+
→ +2.1+7.7+
→ 9.8
)
×3×÷-0-6-÷2÷×
→ -9
( ×3×÷-0-6-÷2÷×
→ ×3×÷¯6÷2÷×
→ ×3ׯ3×
→ ¯9
)
÷4÷-3-÷1÷2÷-÷
→ 1.6
( ÷4÷-3-÷1÷2÷-÷
→ ÷4÷-3-0.5-÷
→ ÷4÷2.5÷
→ 1.6
)
The explanations below use high minus (`¯`) to indicate negative numbers.
Sie lieben definitiv APL.-
s mit-
s verwechselt werden kann, während¯
s nicht mit-
s verwechselt werden kann .Antworten:
C # (.NET Core) ,
198 197188 BytesProbieren Sie es online!
Verwendet
*
und/
.Eine rekursive Funktion. Zunächst wird versucht, die Eingabezeichenfolge als
float
. Wenn dies fehlschlägt, ruft es sich selbst auf und übergibt rekursiv den ersten und den zweiten Operanden als Argumente. Anschließend führt es die ausgewählte Operation für die Ergebnisse aus.quelle
IndefOf(f, 1)
kann seinIndexOf(f,1)
float
stattdessen s und die Zeichencodes, wenn Sie sie haben, können Sie sie wahrscheinlich mit>
und<
an einigen Stellen kürzen .i+1,s.Length-i-2
zu++i,s.Length+~i
.Python 3,
159158152144136135132 BytesProbieren Sie es online!
Erlaubt keine negativen Zahlen (obwohl das
-0-5-
natürlich funktioniert) und erfordert Python-Operatoren.quelle
while~-(l[i]in'+-*/'):i+=1;a=1
und*l,=input()
für 152 Bytesif a:l[i]='(';i=t(t(i+1));l[i-1]=')'
mitreturn-~i
für 135 Bytes: PRetina ,
290287286 BytesProbieren Sie es online! Hinweis: Nur für Ganzzahlarithmetik geeignet, daher wurden einige der Testfälle entfernt. Akzeptiert negative Zahlen und gibt sie mit dem
¯
Präfix zurück. Bearbeiten:34 Bytes dank @Cowsquack gespeichert. Erläuterung:Ich brauchte eine Möglichkeit, mit Null umzugehen, also verwende ich
¦
als positives Zahlenpräfix. Die Zahlen werden dann in unäre Zahlen umgewandelt.Negative Zahlen benötigen jedoch nur ein
¯
Präfix.Zitate werden
+
hässlich, also mache ich Additionen zu Subtraktionen.Wenn der absolute Wert der linken Hälfte einer Subtraktion kleiner als die rechte Hälfte ist, vertauschen Sie diese und negieren Sie beide Seiten.
Auch wenn die LHS einer Multiplikation oder Division negativ ist, negieren Sie beide Seiten.
Auch wenn die LHS einer Multiplikation Null ist, ist das Ergebnis Null. Auch zwei Minuspunkte sind von Vorteil.
Aber ein Minus und ein Plus (oder umgekehrt) ergeben ein Minus.
Subtrahieren Sie zwei Zahlen desselben Vorzeichens. Wiederholen Sie dies, bis keine weiteren Subtraktionen mehr vorhanden sind.
Wenn es immer noch eine Subtraktion gibt, müssen die Vorzeichen unterschiedlich sein, also addieren Sie die Zahlen. (Tun Sie dies jedoch nur einmal, da dies möglicherweise erneut eine Subtraktion von zwei Zahlen desselben Vorzeichens ergibt.)
Multiplikation durch wiederholte Addition durchführen.
Führen Sie eine Ganzzahldivision durch. Einer der obigen Schritte hat den Ausdruck vereinfacht, also wiederholen Sie den Vorgang, bis keine Operationen mehr vorhanden sind.
Zurück in Dezimalzahl konvertieren.
quelle
+`-(([¯¦])1*)(1*)-\2\3-
,[¯¦]
kann sich¯|¦
([×÷])
;)PHP ,
116114109 Bytes-5 Danke an Martin Ender
Verwendet
*
zur Multiplikation und/
zur Division. Negative Zahlen funktionieren, obwohl ich keine konkreten Versuche unternehme, dass dies der Fall ist.Probieren Sie es online!
Ungolfed und erklärt
Ich erkläre auch den regulären Ausdruck, weil er ein bisschen magisch ist:
Zunächst möchten wir einen der vier Operatoren zuordnen:
*+/-
Dann müssen wir entweder einer Zahl
[\d.]+
oder einem anderen gültigen Omnifix-Ausdruck entsprechen(?R)
.Dann stimmen wir mit demselben Operator überein, der am Anfang war.
Dann machen wir dasselbe wie in Gruppe 3: stimmen mit einer Zahl oder einem Omnifix-Ausdruck überein.
Passen Sie schließlich den Anfangsoperator erneut an.
Was auch immer damit übereinstimmt, wird durch ersetzt
($2)
. Dadurch wird das Teil in die umgebenden Operatoren eingeschlossen und in eckige Klammern gesetzt, sodass es wie eine normale Infixnotation aussieht.quelle
QuadR ,
333227 Bytes-1 dank Cows Quack . -5 Danke an Erik den Outgolfer .
mit dem Argument / flag
≡
Probieren Sie es online!
Dies entspricht der 40-Byte-Dyalog-APL-Lösung:
Probieren Sie es online!
Erläuterung
(Der in Klammern gesetzte Text bezieht sich auf Dyalog APL anstelle von QuadR.)
(
...){2}\2
das folgende Muster zweimal, und das ganze Spiel zweimal zu:(.)
jedes Zeichen[
...]+
gefolgt von einer oder mehrere der folgenden Gruppe von Zeichen:\d
d igits,¯
hoch minus (negatives Vorzeichen)\.
Periode(
⎕R
Wird R eplaced mit :)(
{
…}
Das Ergebnis der folgenden anonymen Funktion für den Namespace ⍵ :)⍵M
(⍵.Match
) Der Text des M atchs löscht¯1↓
das letzte Zeichen (das Symbol+
-
×
oder÷
) löscht1↓
das erste Zeichen (Symbol) und⍎
führt es als APL-Code aus(
⍕
Stringify).≡
(⍣≡
) Wiederholen Sie den Austausch, bis keine Änderungen mehr vorgenommen werdenquelle
⍕
⎕R
kann nicht mit numerischen Daten arbeiten. Vielen Dank.Haskell , 132 Zeichen
(134 Bytes, weil
×
und÷
nehmen zwei Bytes in UTF-8)Probieren Sie es online!
f
parst so viel wie möglich von der Eingabe und liefert das Ergebnis sowie die verbleibende Zeichenfolge (die in den Testfällen leer ist). Wenn dies nicht regelkonform ist, entfernen Sie den nicht analysierbaren Reststring mitHaskell , 139 Zeichen
quelle
Perl,
6453 BytesInclude
+1
für-p
Implementiert
,
(wirft das erste Argument weg) und.
fügt manchmal die Argumente an..
funktioniert jedoch nicht sehr zuverlässig, da es sowohl auf der Analyse- als auch auf der Auswertungsebene mit dem Dezimalpunkt interferiertquelle
Java 8,
205200 BytesPort von @Charlies C # Antwort .
-5 Bytes dank @ceilingcat .
Probieren Sie es online aus.
quelle