Ihre Aufgabe ist es, eine Liste von Argumenten zu erstellen, die entweder Ganzzahlen oder Operatoren sind, und diese wie folgt zu analysieren:
Es gibt einen aktuellen Operator, der mit + beginnt.
Jedes Mal, wenn ein Operator gefunden wird, wechselt der aktuelle Operator zu ihm.
Die möglichen Operatoren sind: "+", "-", "*", "/" und "%", die ihrer Bedeutung in C und den meisten Sprachen entsprechen.
Es wird eine laufende Lösung geführt, die bei 0 beginnt.
Jedes Mal, wenn eine Ganzzahl gefunden wird, wird die Lösung abhängig vom Operator um die Zahl geändert. zB wenn der Operator "/" ist, wird die Lösung durch die Zahl geteilt.
Wenn eine Operation zu einer gemischten Zahl führen würde (dh mit einer Dezimalzahl), muss sie auf eine Ganzzahl zurückgesetzt werden (dh die Dezimalzahl muss abgeschnitten werden).
Geben Sie die endgültige Lösung aus.
Beispielsweise:
Die Argumente 5 8 25 * 9 6 2 - 104 / 4 7 + 6 % 14
würden ergeben:
5 8 25 * 9 6 2 - 104 / 4 7 + 6 % 14
0 5 13 38 342 2052 4104 4000 1000 142 148 8 -> 8
Die Eingaben erfolgen als Befehlszeilen- oder Funktionsargumente oder als Entsprechung für Ihre Sprache.
Kürzester Code gewinnt!
%
Richtung -inf statt 0 runden?Antworten:
Pyth -
24232220 Bytes2 Bytes gespart dank @issacg und 1 dank @orlp!
Verwendungsreduzierung mit Basisfall von
0
und Überprüfung auf'
Repräsentation zur Erkennung von String vs. Int.Funktioniert nicht online, da ich Full Eval verwende, das aus Sicherheitsgründen online deaktiviert ist. Nimmt die Eingabe von stdin in einer Liste als solche:
5, 8, 25, "*", 9, 6, 2, "-", 104, "/", 4, 7, "+", 6
.quelle
?
zu.x
, da nur der else - Block eine Ausnahme auslösen kann, und es wird so jedes Mal tun. Du kannst es aber nichtK
mehr benutzen .u.xsv++GbH&=bHG+\+QZ
speziell.JavaScript (ES6) 53
Eine Funktion, die ein Array als Eingabe verwendet.
Führen Sie das Snippet zum Testen in Firefox aus.
quelle
Julia,
8583 BytesDadurch wird eine unbenannte Funktion erstellt, die eine Zeichenfolge als Eingabe akzeptiert und eine Ganzzahl zurückgibt.
Ungolfed:
Problem behoben und 2 Bytes dank Glen O gespart.
quelle
o is not defined
wenn Sie versuchen, die Funktion neu zu starten. Es wird versucht, die Funktion "o = ifloor ..." in Main und nicht in der Funktion auszuführen (siehe hier github.com/JuliaLang/julia/issues/2386 ). Darf ich vorschlagens->(o=0;p="+";for i=split(s) isdigit(i)?o=eval(parse("ifloor($o$p$i)")):p=i;end;o)
?Elisp, 101 Bytes
Mit den Argumenten als Anführungszeichen übergeben: zB
(c '(5 5 * 10))
Version mit neuen Zeilen:
quelle
CJam, 24 Bytes
Dies ist ein vollständiges Programm, das die Eingabe als Befehlszeilenargumente liest.
Um den Code online im CJam-Interpreter zu testen (der keine Befehlszeilenargumente unterstützt), ersetzen Sie ihn
ea
mitlS/
, um aus simuliertem STDIN zu lesen.Wie es funktioniert
quelle
JavaScript, 85 Bytes
quelle
o+ +t
? Sie bauen sowieso eine Zeichenkette, ohne sie in eine Zahl umwandeln zu müssen. Außerdem.forEach
hat Code Golf keinen Platz: use.map
prompt(o="+",r=0).split(" ").forEach(t=>+t+1?r=+eval(r+o+ +t):o=t);alert(r)
-> 75 Bytes.Lua, 142 Bytes
Ungolfed:
quelle
Powershell, 57 Bytes
ungolfed;
Wenn die implizite Variable in der for-each-Anweisung kein Zahl, sondern ein Operator ist, schlagen die POSH-Anweisungen (Invoke-Expression
eval()
) fehl und der Ausführungsstatus$?
ist falsch.Boden in POSH ist unhandlich -
$foo=[math]::floor($foo)
und$foo-=$foo%1
war die golferischste Alternative, die ich mir vorstellen konnte.quelle
if
nach Ziffern, aber im Wesentlichen gleich. 89 Bytes$o="+";$r=0;$args-split'\s+'|%{if($_-match'^\d+$'){$r=iex $r$o$_;$r-=$r%1}Else{$o=$_}};$r
GNU Sed (mit der Erweiterung eval, + dc), 102
(Die Punktzahl enthält +1 für die Option -r für sed.)
Wandelt den Eingabeausdruck in eine umgekehrte polnische Notation um und
dc
wertet sie dann aus.Testausgang:
quelle
CJam, 34 Bytes
Probieren Sie es online aus
Ich dachte, das wäre ziemlich vernünftig. Aber ich war nicht schnell genug, es zu veröffentlichen, um zumindest für einen Moment die kürzeste CJam-Antwort zu sein. :(
quelle
Python 3 -
131 Bytes129 Bytes121 Bytes116 BytesDank an Maltysen für das Abschneiden von zwei Bytes, Beta Decay für das Abschneiden von 8 Bytes und Steven Rumbalski für das Abschneiden von 5 Bytes.
Ich versuche, einen Weg zu finden, um die Länge der if-Anweisung zu reduzieren, aber im Moment scheint dies so gut wie möglich zu funktionieren. Übernimmt die Eingabe als Liste.
quelle
int
durch//1
in
und das Zitat brauchen ..split()
.Bash, 69
Dies funktioniert nur mit nicht negativen ganzen Zahlen - es ist in der Frage nicht klar, ob dies in Ordnung ist oder nicht.
quelle
Groovy, 79 Bytes
Demo:
Ungolfed:
quelle
gcc (mit Warnungen) 165 (wenn das Zeilenende als 1 zählt)
Wenn Sie es jedoch mit mingw32 kompilieren, müssen Sie das Globbing deaktivieren (siehe https://www.cygwin.com/ml/cygwin/1999-11/msg00052.html) ), indem Sie wie kompilieren:
quelle
Perl 5.10+, 52 Bytes
Demo:
(Beachten Sie, dass
*
es in meiner Shell maskiert werden muss, damit es nicht als Glob-Muster interpretiert wird.)Ungolfed:
quelle
C #, 132
165 168BytesDiese Funktion setzt voraus, dass die Eingabe gültig ist. Dies ist schwierig für C #, vorausgesetzt, es gibt keine
eval
Äquivalent gibt.Danke edc65 für das Speichern von 33 Bytes!
Zur Verdeutlichung eingerückt.
quelle
?:
->int C(string[]a){int o=1,r=0,n;foreach(var b in a)n=int.TryParse(b,out n)?r=o<0?r%n:o<1?r*n:o<3?r+n:o<5?r-n:r/n:o=b[0]-42;return r;}
Ruby, 59 Bytes
Testlauf:
quelle