Einführung
In der Kindheit kann es vorkommen, dass Sie das Addieren und Multiplizieren beherrschen. Dann kommt jemand und informiert Sie darüber, dass:
a * b + c = (a * b) + c! = a * (b + c),
und dass es kein so einfacher oder linearer Prozess war, wie Ihnen zuvor beigebracht wurde. Sie erfahren, dass es etwas gibt, das als Operationsreihenfolge bezeichnet wird . Dies ist eine sehr wichtige Methode, um ein gewisses Maß an Konsistenz und Ausdrucksweise beizubehalten, ohne dass Klammern im Weg stehen.
Generische Handlung
Eines Tages wachst du mit Panik auf den Straßen auf. Eine extremistische Gruppe unter dem Namen " The 2560 " (Abkürzung für "Organization Against the Order of Operations") hat mit ihren bösen Methoden die Kontrolle über alle Atomwaffen der Welt übernommen. Sie halten den ganzen Planeten als Geiseln und haben eine einfache Forderung: kehren Sie die akzeptierte Reihenfolge der Operationen oder der Ausrottung des Gesichts um (Klammern sollen ihre Priorität behalten). Das neue System heißt PSADME (Klammern, Subtraktion / Addition, Division / Multiplikation, Exponenten), und Ausdrücke werden von rechts nach links ausgewertet:
a - b - c = a - (b - c) = a + c - b
Tage vergehen und der Übergang ist im Gange. Während Mathematiker und Physiker damit beschäftigt sind, ihre Gleichungen neu zu schreiben, stehen die Informatiker vor der Aufgabe, die Art und Weise zu ändern, in der mathematische Ausdrücke von Computern interpretiert werden. Sie gehören zu einer geheimen Rebellen-Programmgruppe, die den neuen globalen Overlords so viel Leid zufügen soll - und Sie werden von The 2560 zufällig ausgewählt und mit der Erstellung des Benchmark-Berechnungsprogramms beauftragt.
Deine Mission
Schreiben Sie ein Programm (oder eine Funktion), das einen (numerischen) mathematischen Ausdruck als Eingabe verwendet, den Ausdruck unter Verwendung von PSADME als Reihenfolge der Operationen berechnet und das Ergebnis ausgibt. Ausdrücke sollten von rechts nach links ausgewertet werden, also
Der Einfachheit halber sind alle angegebenen Zahlen Ganzzahlen, und die Berechnungen führen zu ganzzahligen Ergebnissen.
Regeln und Wertung
- Das Programm sollte Eingaben mit einer Länge von bis zu 128 Zeichen akzeptieren - wenn Ihre Sprache / Plattform eine niedrigere maximale Eingabelänge hat, ist dies eine akzeptable Ausrede.
- Standardlücken sind verboten.
- Der Gewinncode wird am 18. November (4 Wochen ab diesem Postdatum) ausgewählt.
- Sie können gerne eine Postleitzahl eingeben, die nicht als golfwürdig eingestuft wird. Hier geht es um Spaß. Wenn Sie eine interessante Möglichkeit haben, dies aber nicht selbst tun können (oder aufgrund Ihrer Methode), können Sie es trotzdem posten.
Wie üblich ist der Gewinncode der mit der geringsten Anzahl von Bytes, mit einigen Unterhaltungswertboni:
- -5, um die Verwendung der Zeichen im angegebenen Ausdruck zu vermeiden: + , - , ( , ) , ^ , * , /
- -5 Die Berechnung auf einem Standardcomputer dauert länger als 5 Minuten (jedoch nicht länger als 10 Minuten), ohne dass die Methode offensichtlich ist (unter Verwendung der Uhr oder unnötiger Schleifen). Ziel ist es, die neuen Overlords davon zu überzeugen, dass Sie nicht versuchen , ihre Schicksalsberechnungen zu stören.
- - (5 + N) für eine direkte beleidigende Nachricht (Länge N, ohne führende / nachfolgende Leerzeichen) über die Mitglieder von The 2560, die in Ihrem Code gut sichtbar geschrieben werden soll, mit einer lächerlichen Erklärung, warum dies erforderlich ist Dort. Wenn es entfernt wird, muss der Code nicht richtig funktionieren. Ja, kostenlose Punkte für den Unterhaltungswert.
Beispiele und Erklärungen
[program] 2 - 2 - 2
2
2 - (2 - 2) = 2
[program] (2 + 2 * 3 + 3) / 3 + 3
4
(4 · 6) / (3 + 3) = 4
[program] 3 + 2 + 1 ^ 3
216
(3 + 2 + 1) ^ 3 = 216
[program] -5^2
25
(-5) ^ 2 = 25
[program] 32 / 8 * 3 - 1
2
32 / (8 * (3 - 1)) = 32/16 = 2
1 - 3 + 4 = 1 - 7
? Von rechts nach links würde dies nahelegen, aber das setzt im Gegensatz zu PSADME Addition vor Subtraktion, nein?P(SA)(DM)E
.Antworten:
Haskell, 134 Bytes
Neudefinition der mathematischen Operatoren mit neuen Fixities und Prioritäten. Jetzt:
quelle
perl -e'$_="import qualified Prelude as Pl 6^r 8+r 8-r 7*r 7/";s/(. \d(.))/\ninfix\1\n(\2)=(P.\2)/g;s~\./~.div~;print'>a.hs;ghci a.hs
Leider hat ein Tippfehler dazu geführt, dass der generierte Code kein Leerzeichen zwischen der Ziffer und dem Symbol enthält, aber trotzdem einwandfrei funktioniert. Dies bedeutet, dass Ihr Code 5 Bytes verlieren kann und meine "Verbesserung" übertrifft.sed
, um Shell-Code zu generieren und auszuwerten. Wahrscheinlich eine gute Meta-Frage.GNU sed -r mit exec-Erweiterung, 398
Nicht besonders kurz, aber erledigt den Job.
sed ist in Ordnung, um die Priorität zu analysieren, führt aber keine Arithmetik durch. Daher verwenden wir die GNU sed exec-Erweiterung des
s
Befehls, um die erforderliche Arithmetik an die Shell auszulagern.Vorerst gehen alle Bediener davon aus, mit Ausnahme von
^
genau einem Leerzeichen davor und dahinter.Testausgang:
quelle
JavaScript (ES6) 287
300Edit Bug behoben (nur ein Tippfehler, 6 hätte 4 sein müssen) - Eine vollständige Erklärung wurde am Ende des Snippets hinzugefügt
Bearbeiten 2 einer anderen Herausforderung wurde eine Verbesserung festgestellt
Noch eine Portierung des gleichen Parsers mit nur minimalen Unterschieden. (vergleiche damit )
quelle