Erstellen Sie ein Programm, das einen mathematischen Ausdruck unter Verwendung der Elemente von abwechselnden Seiten des Ausdrucks löst. Anstatt von links nach rechts zu lesen, lesen Sie das erste Zeichen, dann das letzte, dann das zweite, dann das vorletzte usw. Dies gibt Ihnen einen neuen Ausdruck, den Sie auswerten und ausgeben müssen.
a*b/c+d-e
135798642 <-- Order you read the expression in
ae*-bd/+c <-- Order of operation.
Beispiel:
1*3/2+4-5
15*-34/+2 = -255
Wenn der Ausdruck nicht «funktioniert», 1
muss a an den erforderlichen Stellen eingefügt werden, damit er funktioniert.
Einige Beispiele werden es wahrscheinlich besser veranschaulichen:
Input: 1+1+1+1+1
Result: 23 // Because 1+1+1+1+1 -> 11++11++1 -> 23
Input: 1+2-3+12-5
Result: -19 // Because 1+2-3+12-5 -> 15+-22-13+ -> 15+-22-13+1 -> -19
// |
// Not valid expression
Input: 2*2*2*2*2
Result: 968 // Because 2*2*2*2*2 -> 22**22**2 -> 22*1*22*1*2 -> 968
// || ||
// Not valid, 1 must be inserted
Input: 17/2
Output: 127 // Because 17/2 = 127/ -> 127/1 -> 127
Die Operatoren, die unterstützt werden müssen, sind + - * /
. Es wird keine Klammern geben. Es werden normale mathematische Regeln und "Syntax" verwendet, was beispielsweise **
keine Exponentiation bedeutet. a++++1
ist äquivalent zu a+1
(dh MATLAB-Stil, nicht C ++).
Im Zweifelsfall sind einige gültige Operationen:
-a
+a
a++b
a+-b
a*-b
a*+b
a*++b
a/b
a/-b
a/+b
-a/--b
Alle folgenden sind nicht gültig. Es wird gezeigt, durch was sie ersetzt werden sollten:
a+ | a+1
a- | a-1
a++++ | a++++1 (This is equivalent to a+1)
a*+++ | a*+++1 (This is equivalent to a*1)
a**b | a*1*b
a*/b | a*1/b
a/*b | a/1*b
a* | a*1
*a | 1*a
***a | 1*1*1*a
Regeln:
- Der Code kann eine Funktion oder ein vollständiges Programm sein
- Die Eingabe kann STDIN oder Funktionsargument sein
- Die Eingabe muss ein gültiger mathematischer Ausdruck ohne Anführungszeichen sein
''
oder""
. - Die Ausgabe sollte die Antwort auf den neuen Ausdruck sein, als Ganzzahl, Dezimalzahl oder vereinfachter Bruch.
- Es müssen mindestens drei Stellen nach dem Komma unterstützt werden. Also
1/3 = 0.333
nicht0.33
.0.333333333
ist akzeptiert. ans = ...
ist akzeptiert.- Führende und nachfolgende Zeilenumbrüche und Leerzeichen werden akzeptiert.
- Die Eingabe besteht nur aus ganzen Zahlen
- Die Division durch Null kann zu einem Fehler, NaN, Inf usw. führen. Die Ausgabe einer Zahl wird nicht akzeptiert.
Wie immer gewinnt der kürzeste Code in Bytes. Ein Gewinner wird eine Woche nach dem Tag ausgewählt, an dem die Herausforderung veröffentlicht wurde. Später veröffentlichte Antworten können immer noch gewinnen, wenn sie kürzer als der aktuelle Anführer sind.
quelle
2^64
, und sollte es Fehler oder Wrap geben, wenn Sie darüber nachdenken?0/0
wenn der Ausdruck zu einer ganzzahligen Division oder einem Modulo durch Null wird?x/0
ist dies eine gültige Ausgabe. Solange keine falsche Antwort ausgegeben wird, ist dies in Ordnung. Fehler und "Keine Zahl" ist per Definition korrekt, und Unendlichkeit ist "richtig genug"Antworten:
Perl,
108100 BytesDer Code ist 96 Byte plus 4 für das Befehlszeilenargument
-pF//
, wobei-p
Einsätzewhile (<>) { .. } continue { print }
und-F//
teilt den Eingang und fügt ihn ein@F
.Beachten Sie, dass die Eingabe keinen nachgestellten Zeilenumbruch haben sollte. Verwenden Sie daher
/bin/echo -n 'formula' | perl ...
Weniger Golf:
Testen
Fügen Sie das Obige in eine aufgerufene Datei
114.pl
und das folgende Testskript in eine Datei daneben ein:Beim Ausführen werden folgende Ausgaben ausgeführt:
Beachten Sie,
1/0
dass dies einen Fehler durch Division durch Null verursacht: dieeval
Ausgabenundef
, die durch die leere Zeichenfolge dargestellt werden.quelle
JavaScript ES6, 105
106Bearbeiten Gespeichert 1 Byte thx @Kenney
Testschnipsel
quelle
p < '0' ? ( c=='/' | c<'+' || ' ' )+c : c ;
.