Manchmal ist es nützlich, ein mathematisches Problem mit mehreren Eingaben auszuführen. Ziel dieser Herausforderung ist es, ein Programm zu entwickeln, das diese Aufgabe erleichtert.
Zahlenerzeugende Ausdrücke
Sie müssen 3 Ausdruckstypen unterstützen:
- Single Number Generator: Sehr einfach, nur eine wörtliche Zahl
- Generator mit mehreren Nummern: Etwas komplizierter. Sie sind von eckigen Klammern (
[]
) umgeben. Zahlen werden,
im Ausdruck durch Kommas ( ) getrennt. Beispiel[-1,2,3.26]
. - Bereichsgenerator: Dieser ist von geschweiften Klammern (
{}
) umgeben. Es werden 3 durch Komma getrennte Zahlen angezeigt. Das Format dieses Ausdrucks ist{start,stop,step}
.start
undstop
sind inklusive.
Regeln für die Bewertung
- Sie müssen die Reihenfolge der Operationen unterstützen. ( https://en.wikipedia.org/wiki/Order_of_operations#Definition )
- Klammern müssen nicht unterstützt werden.
- Der Ausdruck darf beliebig viele Leerzeichen enthalten.
- Sie müssen Gleitkommazahlen unterstützen (unabhängig von der Genauigkeit, mit der Ihre Sprache standardmäßig arbeitet).
- Division durch
0
Ergebnisse inNaN
(keine Zahl).
Ihr Programm muss Multiplikation ( *
), Division ( /
), Addition ( +
) und Subtraktion ( -
) unterstützen.
Ausgabe
Jede Ausgabezeile ist eine der Kombinationen der Generatoren. Das Format ist der Ausdruck (mit den reellen Zahlen), gefolgt von einem Gleichheitszeichen ( =
) und dem Ergebnis der Auswertung. Alle Kombinationen der Generatoren müssen in der Ausgabe dargestellt werden.
Beispiele
( >>>
bezeichnet die Eingabe)
>>>3 * [3,2]
3 * 3 = 9
3 * 2 = 6
>>>{1,2,3}
1 = 1 <-- this is because 1 + 3 > the end
>>>{0,2,1} + {0,1,1}
0 + 0 = 0
1 + 0 = 1
2 + 0 = 2
0 + 1 = 1
1 + 1 = 2
2 + 1 = 3
>>>6/[2,3]
6/2 = 3
6/3 = 2
>>>{1.5,2.5,0.5}
1.5 = 1.5
2 = 2
2.5 = 2.5
>>>3-{6,5,-1}
3-6 = -3
3-5 = -2
>>>5/{-1,1,1}
5/-1 = -5
5/0 = NaN
5/1 = 5
>>>4.4 / [1,2.2] + {0,2,1}
4.4 / 1 + 0 = 4.4
4.4 / 1 + 1 = 5.4
4.4 / 1 + 2 = 6.4
4.4 / 2.2 + 0 = 2
4.4 / 2.2 + 1 = 3
4.4 / 2.2 + 2 = 4
>>> [1,2] / 0 + 5
1 / 0 + 5 = NaN
2 / 0 + 5 = NaN
Das Programm muss kurz sein, damit ich es mir merken und überall verwenden kann.
Vielen Dank an @PeterTaylor und @geokavel, die mir bei diesem Beitrag im Sandkasten geholfen haben
x/0
Ergebnis in sofortige Auswertung NaN, oder muss ich NaN als Wert behandeln?Antworten:
JavaScript (ES6),
213211 ByteErläuterung
Eine rekursive Funktion, die den Ausdruck ausführt, wenn sie keine Generatoren für mehrere Zahlen oder Bereiche enthält oder wenn sie einen dieser Generatoren enthält, ruft sich selbst auf, wobei der Generator durch jede von ihr erzeugte Zahl ersetzt wird.
Das Teilen durch
0
in JavaScript erzeugtInfinity
,Infinity
kann also einfach durch ersetzt werdenNaN
.Mit dieser Methode werden die Multi-Generatoren von vorne nach hinten und nicht wie in den Testfällen von vorne nach hinten analysiert. Dies bedeutet nur, dass die Reihenfolge der Ausgabeausdrücke manchmal anders ist.
Prüfung
Test verwendet aus Gründen der Browserkompatibilität keine destrukturierenden Zuweisungen.
quelle
Haskell,
474362 BytesDie Funktion f nimmt einen String als Eingabe und druckt die Ergebnisse
Tests:
Ausgabe:
quelle
Python 3, 387 Bytes
Sie können es mit dem folgenden Code testen:
Hier ist der Code ungolfed:
Es funktioniert, indem der erste Satz von Klammern eines beliebigen Typs gefunden und dann alle darin enthaltenen Werte durchlaufen werden, indem die Klammern und ihr Inhalt durch den Wert ersetzt werden und die Methode rekursiv ausgeführt wird. Wird verwendet,
eval
wenn sich keine Klammern in der Zeile befinden. Es wird zurückgegeben,NaN
wenn eine Ausnahme ausgeführt wirdeval
.quelle
e[:]=s[:]
? Würde das nichte[:]=s
auch so sein?Java, 874 Bytes
Ausführlicher Versuch hier
quelle
Dyalog APL , 164 BytesDiese Antwort entspricht nicht den aktualisierten Anforderungen und ist daher nicht konkurrierend:
Es verwendet reguläre Ausdrücke, um den angegebenen Ausdruck in die entsprechende APL zu ändern (und alle Operatoren werden zur Implementierung geändert
NaN
) und die Operatoren zu extrahieren. Es ersetzt alle Operatoren durch Verkettung und führt den Ausdruck aus, um die endgültigen Eingabenummern zu erhalten. Anschließend wird alles zusammengefügt, um die endgültige Ausgabe zu erhalten.Erhält die Reihenfolge der Bewertung von APL (strikt von rechts nach links).
Behandelt Klammern richtig.
Testfälle (mit zusätzlichen Klammern, um eine mathematische Ausführungsreihenfolge zu erzwingen):
quelle