Hintergrund
Sie wurden kürzlich von einer kleinen Wirtschaftsprüfungsgesellschaft eingestellt. Die Welt des Rechnungswesens ist für Sie etwas fremd. Sie sind sich also nicht sicher, ob Sie alle professionellen Richtlinien einhalten. Insbesondere wissen Sie nicht, wann Sie all diese Zahlen runden sollten und in welche Richtung. In den meisten Fällen drehen Sie also einfach los und hoffen auf das Beste.
Eingang
Ihre Eingabe ist eine einzelne Zeichenfolge, die eine einfache Berechnung darstellt. Es enthält eine Anzahl nichtnegativer Ganzzahlen, die durch die Zeichen begrenzt werden +-*/
. Die Zeichenfolge liest von links nach rechts und die normalen Prioritätsregeln werden ignoriert. Das "23+1*3/4"
bedeutet also "Beginnen Sie mit 23, addieren Sie 1, multiplizieren Sie mit 3 und dividieren Sie mit 4". Das Ergebnis ist 18. Die Eingabe enthält keine Zahlen, die mit beginnen 0
(außer sich 0
selbst), noch eine Division durch Null.
Ausgabe
In jeder Stufe der Berechnung können Sie das Ergebnis entweder auf die nächste Ganzzahl auf- oder abrunden oder es so lassen, wie es ist. Zuletzt runden Sie entweder auf oder ab, um ein ganzzahliges Ergebnis zu erhalten. Ihre Ausgabe ist die Liste der Ganzzahlen, die sich aus einer solchen Berechnung ergeben können, sortiert und ohne Duplikate.
Regeln
Sie können entweder ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.
Testfälle
"42" -> [42]
"2+0+4-0" -> [6]
"23+1*3/4" -> [18]
"5/2" -> [2,3]
"5/2+7/3*6-1" -> [17,18,19,23]
"23/2/2*30-170/3" -> [-7,-6,-2,-1,0,1,3,4]
"1/3*2*2*2*2*2*2" -> [0,16,20,21,22,24,32,64]
"1/3*9" -> [0,3,9]
1/3*9
, der fehlschlagen kann, wenn Sie Gleitkommazahlen verwenden.Antworten:
J 84 Bytes
Ausgehend von einer Liste mit 1 Elementen behält die Funktion alle möglichen Zwischennummern in der Liste bei, indem sie den nächsten Ausdruck auswertet und die auf- und abgerundeten Kopien hinzufügt.
Werde weiter Golf spielen und morgen eine Erklärung hinzufügen.Es gibt keine offensichtlichen Möglichkeiten, mehr Golf zu spielen.Besteht alle Tests.
Verwendung:
Probieren Sie es hier aus.
quelle
x
am Ende der Liste anhänge .Python 2, 220 Zeichen
Es führt eine Liste aller möglichen Nummern und generiert bei jedem Schritt drei Nummern für jede Nummer in der Liste, auch wenn es Duplikate gibt. Somit ist die Laufzeitkomplexität exponentiell. Bei diesen kleinen Beispielen funktioniert es jedoch sofort. Dupes werden am Ende entfernt.
Es wird verwendet
fractions.Fraction
, um eine exakte Division durchzuführen, wobei Gleitkommaungenauigkeiten vermieden werden.Fügen Sie 5 Zeichen (
r=map(X,g)
->r=set(map(X,g))
) hinzu, um die Leistung erheblich zu steigern.quelle
\D
r"(\D)"
oder"(\\D)"
. Auch, wenn Sie Python 3 verwenden, können Sie die Indizierung in ersetzenF
mit Sterne - Zuordnung, zum Beispiel:A,B,*F=F
, VerwendungA
undB
stattF[0]
undF[1]
, und loszuwerdenF=F[2:]
."\D"
funktioniert trotzdem und es ist kürzer. Es ist keine gültige Escape-Sequenz, daher enthält Python nur\
undD
wörtlich. Tatsächlich ein guter Python3-Tipp, ich werde es überprüfen, obwohl ich Backticks durch ersetzenrepr()
und dasmap
Ergebnis in eine Liste umwandeln muss . Markierte Zuordnung ist etwas, was ich Python 2Python,
421370354 BytesEntschuldigung, bitte tragen Sie mit mir. Ich bin wirklich neu in Python (ich habe nur nach einer Sprache gesucht, die Fraktiosn unterstützt) und habe all die wenigen Tricks angewendet, die ich zum Kürzen des Codes kannte, aber es ist immer noch ein Monster, wenn man bedenkt, dass es eine Python-Lösung von fast der Hälfte der Größe gibt. Ich habe viel gelernt und dachte, ich würde es trotzdem einreichen =)
Neue Version dank @ kirbyfan64sos und @Zgarb
Alte Version
quelle
if
s (d={'+': operator.add, '-': operator.sub, ...}; d[op](a, b)
) verwenden. Auch[floor(k) for k in n]
kann auf gekürzt werdenmap(floor, n)
, und dien.add
Anrufe können werdenn.extend([floor(f), ceil(f), f])
.F
nur einmal, damit du einfrom fractions import*
paar Bytes machen und sparen kannst . Gleiche mitmath
. Entfernen Sie die Leerzeichen=
, sie sind nicht erforderlich. Außerdem sollten Sie die Eingabes
anstelle der Hardcodierung zuweisen .s=input()
anstatts = "1/3*9"
, entfernen Sie Ihre Kommentare usw.Mathematica, 134
quelle
MATLAB, 283 Zeichen
Ungolfed:
Als ich dies schrieb, wurde mir klar, dass es eine noch kürzere Möglichkeit gibt, die ich hinzufügen werde, sobald ich damit fertig bin.
quelle
VBA, 347 Bytes
quelle