Angenommen, ich habe einen Ausdruck:
9 * 8 + 1 - 4
Dieser Ausdruck kann je nach Rangfolge des Operators auf sechs verschiedene Arten interpretiert werden:
(((9 * 8) + 1) - 4) = 69 (* + -)
((9 * 8) + (1 - 4)) = 69 (* - +)
((9 * (8 + 1)) - 4) = 77 (+ * -)
(9 * ((8 + 1) - 4)) = 45 (+ - *)
((9 * 8) + (1 - 4)) = 69 (- * +)
(9 * (8 + (1 - 4))) = 45 (- + *)
Angenommen, ich bin ein Entwickler und möchte mir keine Rangfolgetabellen usw. merken, also rate ich einfach.
In diesem Fall wäre die größte Fehlerquote 45-77, was einer Differenz von 32 entspricht. Dies bedeutet, dass meine Vermutung nur um maximal 32 verfehlt wird.
Die Herausforderung
Bei einem gegebenen Ausdruck , der aus Zahlen und +
, -
, *
, /
(Integer - Division) und den %
Ausgang der absolute Differenz des größten und kleinsten möglichen Wertes für diesen Ausdruck, auf der Grundlage der Rangfolge der Operatoren.
Spezifikationen
- Der Eingabeausdruck enthält keine Klammern und jeder Operator ist linksassoziativ.
- Der Eingabeausdruck enthält nur nicht negative Ganzzahlen. Unterausdrücke können jedoch zu Negativen ausgewertet werden (z
1 - 4
. B. ). - Sie können den Ausdruck in jedem vernünftigen Format verwenden. Zum Beispiel:
"9 * 8 + 1 - 4"
"9*8+1-4"
[9, "*", 8, "+", 1, "-", 4]
[9, 8, 1, 4], ["*", "+", "-"]
- Die Eingabe enthält mindestens 1 und höchstens 10 Operatoren.
- Jeder Ausdruck, der eine Division oder ein Modulo durch 0 enthält, sollte ignoriert werden.
- Sie können davon ausgehen, dass Modulo keine negativen Operanden erhält.
Testfälle
9 * 8 + 1 - 4 32
1 + 3 * 4 3
1 + 1 0
8 - 6 + 1 * 0 8
60 / 8 % 8 * 6 % 4 * 5 63
code-golf
number
arithmetic
expression-building
Esolanging Fruit
quelle
quelle
%
als hätten Sie in Ihrem zweiten Beispiel zwei unterschiedliche Prioritäten.%
Operator mit negativen Zahlen? So wie C oder Python oder so?Antworten:
Python 2 ,
171156 BytesProbieren Sie es online!
Wie es funktioniert
Wir umgeben jeden Operator mit einer unterschiedlichen Anzahl von nach außen gerichteten Klammerpaaren, um unterschiedliche Prioritäten (auf alle möglichen Arten) zu simulieren, und umschließen die gesamte Zeichenfolge mit genügend nach innen gerichteten Klammerpaaren, um einen Ausdruck zu erhalten, den wir erhalten können
eval
. Zum Beispiel mit+
↦)+(
*
↦))*((
-
↦)))-(((
wir bekommen
9 * 8 + 1 - 4
↦(((9 ))*(( 8 )+( 1 )))-((( 4)))
=77
.quelle
or
Außenseite von verschiebensum
, um eine Ebene mit eckigen Klammern zu entfernen:sum([...],[])or[eval(a)]
stattsum([...]or[[eval(a)]],[])
sum
leer sein kann, ohne dass sein Argument leer ist - aber es ist tatsächlich in Ordnung, weil daseval
in diesem Fall fehlschlagen muss. Vielen Dank.Jelly , 126 Bytes
"Operator-Vorrang? Klammern? Pah, wer braucht das?" - Herausforderungen bei der Verwendung von Jelly für eine Operator-Präzedenzanforderung.
Probieren Sie es online!
Die Eingabe erfolgt als String, zB "1 + 2_3 × 4: 5% 6". Die Multiplikation verwendet "×" anstelle von "*", die Division ":" anstelle von "/" und die Subtraktion "_" anstelle von "-".
Funktionsweise Das Programm ist in drei Teile unterteilt: Generieren aller Ausdrücke mit unterschiedlicher Operatorpriorität, Auswerten dieser Ausdrücke und Zurückgeben der Differenz zwischen Maximum und Minimum.
Alle Ausdrücke werden mit dem Code generiert:
Die Links werden dabei ausgewertet (könnte ich wohl mit einer anderen Struktur verbessern):
Die Differenz zwischen Maximum und Minimum wird mit dem Code in Link (5) berechnet:
quelle
Python 2 ,
235234233226 Bytes-1 Byte (und ein Update) dank Anders Kaseorg !
-7 Bytes dank Step Hen !
Probieren Sie es online!
quelle
a
statt einer Liste ein Tupel angeben und dabei sogar 1 Byte sparen (a=()
,a+=eval(*l),
).Haskell 582 Bytes
Das lief bei weitem nicht so gut, wie ich gehofft hatte ...
Probieren Sie es online!
Der Versuch, ein langes Programm zu spielen, bringt mich dazu, schlechten Code zu schreiben :(
Ich habe versucht, Anders 'Algorithmus in Haskell zu verwenden, aber er geriet außer Kontrolle
Die Funktion e ist wie ein spezieller Fall von eval. (#) erstellt eine Liste von Zeichenfolgen, die Ganzzahlen und eine Zeichenfolge von Operatoren darstellen, und gibt die Differenz zwischen den maximal und minimal möglichen Werten zurück. z.B
quelle
#
zu##
, könnten Sie umbenennene
zu(#)
, etwa so:(n#s)(x:a)=...
r=read;j=zipWith;o=map
Ersetzen Sie dann diese Funktionen durch die Buchstabenaliase.Pyth, 45 Bytes
Ich bin mir sicher, dass noch viel mehr Optimierungsarbeit geleistet werden kann, aber bisher gefällt es mir.
Nimmt die Eingabe wie folgt aus :
[9, 8, 1, 4], ["*", "+", "-"]
.Probieren Sie es online!
quelle
Mathematica,
186164159 Bytes\[Function]
dauert 3 Bytes.Einige Alternativen (bytecount bleibt gleich)
#2-#&@MinMax[...]
ersetzenMax@#-Min@#&[...]
Head@#2
ersetzen#2[[0]]
Versuchen Sie es online unter http://sandbox.open.wolframcloud.com : Melden Sie sich
( .... )[{60, "/", 8, "%", 8, "*", 6, "%", 4, "*", 5}]
mit....
für Testfall durch obige Code ersetzt60 / 8 % 8 * 6 % 4 * 5
. Drücken SieShift + enter
, um zu bewerten.quelle
Javascript, 280 Bytes
Hinweis : Die Ganzzahldivision rundet mit der Floor-Funktion, dh negative Zahlen runden von Null ab.
Diese Lösung basiert auf dieser Antwort .
Beispielcode-Snippet:
quelle
a/b|0
stoppt die Divide / Modulo 0-Fehlerprüfung, hat aberMath.floor(a/b)
funktioniertHaskell , 254 Bytes
Probieren Sie es online!
Die Eingabe ist eine ganze Zeichenfolge, z. B. 4 + 5 * 2. Sie generiert alle Permutationen von Operationen und teilt die Zeichenfolge für jede Permutation rekursiv auf. Mit der Listenmonade werden Divisionen durch 0 gefiltert.
quelle
(%)
ist Moduloperator. Es ist der Rest einer Divisionsoperation zwischen dem linken und dem rechten Argument.Python 2 ,
262256254 BytesProbieren Sie es online!
quelle
in [
aufin[
(Leerzeichen wird nicht benötigt)PHP , 316 Bytes
Probieren Sie es online!
quelle
Python 3 , 284 Bytes
Bearbeiten: Es sieht so aus, als ob etwas mit der Bewertung des letzten Beispiels nicht stimmt. Ich werde es morgen untersuchen.
Eine weitere Antwort von Python. Konnte nicht alle anderen übertreiben, aber ich habe zu lange damit verbracht, es nicht zu ertragen.
Probieren Sie es online!
quelle
while(p)
kannwhile p
für ein byte gespeichert werden.Clojure (+ Kombinatorik),
342377 + 41 = 418 Bytes+35 Bytes wegen eines Fehlers.
Probieren Sie es online!
Für diese Funktion funktioniert, müssen Sie
use
dieclojure.math.combinatorics
Bibliothek (41 Byte):Nuancen:
Diese Funktion ist eine anonyme Funktion, was bedeutet, dass Sie dies tun müssen, um sie zu verwenden:
Außerdem verwende ich das Wort
quot
anstelle von/
(da Clojure standardmäßig Bruchteile teilt) undmod
anstelle von%
.Ungolfed-Programm:
quelle
use
Aussage treffen.The characters used to import the library will likely be counted
codegolf.meta.stackexchange.com/questions/10225/…require
Bedürfnisse werden aufgenommen in dem Code und seine Länge sollte auf die Byte - Zählung hinzugefügt werden.JavaScript (ES6), 210 Byte
Eingabe als Array von Zahlen und Operatoren
Weniger golfen
Prüfung
quelle