Wir haben es alle geschafft, na ja, vielleicht auch nicht, aber das Erstellen einer eigenen fremden Sprache und eines eigenen Nummerierungssystems ist eine Grundvoraussetzung für besonders fantasievolles Schreiben, aber meistens nur eine unterhaltsame Aktivität.
Die Aufgabe ist einfach, nehmen Sie zwei Eingaben:
Eine geordnete Liste enthält 10 [zehn] eindeutige 'Ziffern' (beliebige druckbare ASCII-Zeichen) und interpretiert diese nacheinander als die Werte 0, 1, 2, 3, ..., 9
+ Es gibt Ausnahmen von dem, was hier eine Ziffer sein kann. Arithmetische Operatoren (+, -, *, /), Klammern und Leerzeichen können nicht als eine der Ziffern verwendet werden.
Ein arithmetisches Problem, bei dem nur diese 'Ziffern' verwendet werden
Und das äquivalente ganzzahlige Ergebnis in der angegebenen Form ausgeben.
Hier ist ein Beispiel:
INPUT
abcdefghij
bcd + efg + hij
OUTPUT
bdgi
Im Beispiel entspricht die Eingabeliste (Sie können wählen, in welcher Form die Liste angezeigt wird) von 'abcdefghij' '0123456789', genau wie 'hjkloiwdfp' auch 1 zu 1 mit '0123456789' entsprechen würde, wobei anstelle von 'a' eine Zuordnung zu erfolgt Null, "h" tut. Die folgende Arithmetik 'übersetzt' zu 123 + 456 + 789, was 1368 entspricht. Dies muss dann in der Form ausgegeben werden, die wir ihm gegeben haben, also b (die 1 darstellt) d (für 2) g (für 6) und i (für 8).
TESTFÄLLE
abcdefghij
abc + def - ghij
-gedc
qwertyuiop
qwerty / uiop
e
%y83l;[=9|
(83l * 9) + 8%
y9|8
MEHR REGELN
- Standardlücken sind verboten!
- Dies ist Codegolf, also gewinnt die kürzeste Antwort in Bytes.
- Muss ein vollständiges Programm oder eine vollständige Funktion sein, die die Ein- und Ausgänge in dem für Sie am besten geeigneten Format verwendet. (Nur können keine zusätzlichen Informationen in die Eingaben eingefügt werden, nur 'Ziffern' und der Ausdruck.
- Verwenden Sie eine beliebige Sprache (sofern sie anderen Regeln entspricht)
quelle
q.ioiopewioyetqorw...
. Wenn ja, welche Art von Rundung sollte angewendet werden?1
für5/3
nicht2
aufgrund ganzzahlige Teilung (nicht Rundung). Dies macht die Herausforderung nicht ungültig, aber Sie müssen möglicherweise unterschiedliche zulässige Antworten für denselben Testfall zulassen (siehe meine T-SQL-Antwort unten).Antworten:
05AB1E ,
109 Bytes(Jetzt) Ausgabe als Liste von Zeichen.
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Die neue Version von 05AB1E wurde in Elixir erstellt . Die
.E
Funktion ruft aufcall_unary(fn x -> {result, _} = Code.eval_string(to_string(x)); result end, a)
, wo dasCode.eval_string
Elixier eingebaut ist .Beachten Sie, dass die ältere Version von 05AB1E hierfür nicht funktioniert, da sie in Python erstellt wurde. Die Zahlen mit führenden Nullen werden nicht ausgewertet:
Alle Testfälle in der
Åв
Vorgängerversion anzeigen (die die 10-Byte-Version verwendet, da die integrierte Version neu ist).quelle
R , 58 Bytes
Probieren Sie es online!
Verwendet die Zeichenübersetzung
chartr
, um die Ziffern,parse
s undeval
s den Ausdruck und dannchartr
s zurück zu den ursprünglichen Ziffern zu tauschen .Wenn eine Rundung auf die nächste Ganzzahl erforderlich ist, ist dies
R , 65 Bytes
Probieren Sie es online!
quelle
[
eines kürzeren Namens für eine Funktion mit 3 Parametern ist sehr sinnvoll. Gut gemacht.T-SQL, 117 Bytes
Zeilenumbrüche dienen nur der Lesbarkeit.
Die Eingabe erfolgt gemäß unseren IO-Regeln über eine bereits vorhandene Tabelle t mit Textspalten c (Zeichen) und e (Gleichung) .
Verwendet die SQL 2017-Funktion
TRANSLATE
, um zwischen Zeichen zu wechseln und eine Zeichenfolge zu generieren, die nicht nur die Gleichung, sondern auch den Code enthält, der in die ursprünglichen Zeichen zurückübersetzt werden soll:Diese Zeichenfolge wird dann mit ausgewertet
EXEC()
.Möglicherweise gibt es einige Zeichen (z. B. ein einfaches Anführungszeichen
'
), die diesen Code beschädigen. Ich habe nicht alle möglichen ASCII-Zeichen getestet.Je nach Herausforderung bewerte ich den Ausdruck als gegeben, abhängig davon, wie meine Sprache diese Operatoren interpretiert. Daher gibt der zweite Testfall aufgrund der Ganzzahldivision 1 (
w
) und nicht 2 (e
) zurück.quelle
Perl 6 , 38 Bytes
Probieren Sie es online!
Ich bin mir nicht sicher, wie die Rundung funktionieren soll. Wenn es am Ende rundet, kann ich
.round
für +6 Bytes hinzufügen . Wenn das Verhalten von/
anders sein sollte, kann es länger sein. Nimmt Eingaben wie gewohnt entgegenf(arithmetic)(numerals)(arithmetic)
.Erläuterung:
quelle
Stax ,
746665 BytesFühren Sie es aus und debuggen Sie es
Stax geht es hier nicht gut, es fehlt eine echte "Eval" -Anweisung. Es hat eine, die in den Dokumenten als "eval" bezeichnet wird, funktioniert jedoch nur mit Literalwerten, nicht mit vollständigen Ausdrücken.
quelle
Bash, 97 Bytes
Könnte weniger sein, wenn wir kürzen könnten, als rund. Es ist auch schwierig, mit führenden Nullen umzugehen (wie in Testfall 2), da Bash Zahlen, die mit 0 beginnen, als Oktal interpretiert.
quelle
tr
ist ein Teil des coreutils,bc
ist es aber nicht. Trotzdembc
ist ein sehr verbreitetes Werkzeug. Jeder andere Befehl in dieser Antwort ist bash.$T
Ist nur ein Byte kürzer als0-9
, verwenden Sie es nur zweimal und geben Sie 8 Bytes aus, um es zu definieren.Bean ,
9490 BytesHexdump
JavaScript
Erläuterung
Dieses Programm weist implizit die ersten und zweiten Eingabezeilen als Strings auf die Variablen
a
undb
jeweils.Jedes Zeichen
c
in der Zeileb
wird durch den jeweiligen Indexi
des in der Zeile gefundenen Zeichensa
oder durch sich selbst ersetzt, wenn es nicht gefunden wird.Anschließend wird jede Sequenz von einer oder mehreren
0
Zeichenfolgen, denen eine Grenze vorangestellt ist, aus der resultierenden Zeichenfolge entfernt. Dies soll verhindern, dasseval()
eine Ziffernfolge, die mit0
einem oktalen Literal beginnt, ausgewertet wird .Nach
eval()
undMath.round()
wird das Ergebnis wieder in eine Zeichenfolge umgewandelt, und jedes Ziffernzeicheni
wird durch das entsprechende Zeichen ausa
der Indexzeile ersetzti
.Testfälle
Demo
Demo
Demo
Demo
quelle
Perl 5
-p
, 63 BytesProbieren Sie es online!
Übernimmt den Ausdruck in der ersten Eingabezeile und die Übersetzungsliste in der zweiten.
quelle
Perl 5 , 130 Bytes
Probieren Sie es online!
Vielleicht kann dieses Double-Eval in etwas verwandelt werden
s/.../.../geer
.quelle
Holzkohle , 14 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Hinweis: Der Ausdruck wird gemäß der Python 3-Semantik ausgewertet, sodass beispielsweise führende Nullen bei Zahlen ungleich Null unzulässig sind. Erläuterung:
quelle
0
funktionieren führende s nicht in Python, was in den Testfällen vorhanden ist.Python 3 , 137 Bytes
Ein nicht regulärer Ansatz, bei dem die Zeichen durch
str.translate
undstr.maketrans
ersetzt werden. Ich habe viele Zeichen verloren, als ich die führenden Nullen abgeschnitten habe ...Probieren Sie es online!
quelle
Python 3 , 167 Bytes
Probieren Sie es online!
Raum für Verbesserung...
quelle
Wolfram Language (Mathematica) , 121 Byte
Ich definiere eine reine Funktion mit zwei Argumenten. Da einige Funktionen wiederholt werden, speichere ich sie in einer Variablen, um einige Zeichen zu speichern. Dieser Code ersetzt einfach einige Zeichenfolgen und
ToExpression
wertet dann den Ausdruck mit dem Wolfram-Kernel aus.Probieren Sie es online!
quelle
Lua ,
162151150 Bytesload
anstelle vonfunction(...) end
Probieren Sie es online!
Nicht die kürzeste Sache auf der Welt (Lua zwingt Sie dazu, ziemlich scharf zu sein, besonders bei großen Stichwörtern), aber es hat Spaß gemacht, sie zu erstellen. Vollständiges Programm, das Eingaben als Argumente verwendet und das Ergebnis druckt.
Erläuterung
Einführung
Weisen Sie Variablen Werte aus Argumenten zu. Unser Wörterbuch ist
l
und Ausdruck istp
.Der folgende Ausdruck ist ziemlich schwer zu verstehen, da er eine seltsame Ausführungsreihenfolge hat. Deshalb erkläre ich ihn Schritt für Schritt:
Umwandlung in normale Zahlen
Ersetzen Sie die Ausdruckszeichenfolge: Nehmen Sie jedes Symbol und übergeben Sie es der Funktion (
load
erwies sich hier als kurzgeschlossen als normale Deklaration).Die Funktion findet die Position des Vorkommens in der diktierten Zeichenfolge für das übergebene Symbol mit
find
....
Dies ist das erste (und einzige) Argument, da wir uns in der Vaarg-Funktion befinden (jede beliebigeload
ist dies), die unser aktuelles Symbol ist. Die folgenden Argumente sind erforderlich, umfind
spezielle Symbole zu ignorieren (dies1
ist nur ein kurzer Wert, der alstrue
boolescher Wert ausgewertet wird ): Startposition (hier ist eine Standardeinstellung) undplain
die tatsächliche Deaktivierung der Musterbehandlung. Ohne diese Programme scheitert der dritte Testfall an%
der Besonderheit.Wenn eine Übereinstimmung gefunden wird, subtrahieren Sie eine, da Lua-Zeichenfolgen (und auch Arrays) auf 1 basieren. Wenn keine Übereinstimmung gefunden wird, wird nichts zurückgegeben, was dazu führt, dass kein Ersatz erfolgt.
Lösen
Stellen Sie
return
unseren Ausdruck vor, damit er das Ergebnis zurückgibt , berechnen Sie ihn, indem Sie ihn als Lua-Funktion kompilieren und aufrufen, und runden Sie ihn ( dies wurde umgekehrt, um ihn kürzer zu machen).Am Ende erhalten wir eine numerische Lösung für unser Problem, nur die Rückkonvertierung bleibt erhalten.
Mach es wieder verrückt
Die erste Zeile ist ein kurzer Weg, um eine Zahl in einen String umzuwandeln. Jetzt können wir String-Methoden auf kurze Weise aufrufen. Lass es uns tun!
Jetzt
gsub
wird nochmal gerufen, alles wieder auf Wahnsinn zu setzen. Diese Zeit%d
wird anstelle eines.
Ersatzmusters verwendet, da unsere Funktion möglicherweise nur Zahlen verarbeiten muss (.
was zu Fehlern bei negativen Zahlen führen würde). Diese Zeitfunktion (load
erneut1
bearbeitet, um Bytes zu speichern) fügt zuerst ihr erstes (und einziges) Vaargument hinzu, konvertiert es in eine Position in einer diktierten Zeichenfolge und gibt dann an dieser Position ein Zeichen aus.Hurra, fast da!
Dramatisches Finale oder Warum Brackets wichtig sind
Nun, warum eigentlich zwei Paar Klammern? Es ist Zeit, über Parallelen zu sprechen ... wie, mehrfache Rückkehr in Lua. Eine Funktion kann nur wenige Werte von einem Aufruf zurückgeben ( weitere Beispiele finden Sie in dieser Meta-Frage ).
Hier wurden zuletzt
gsub
zwei Werte zurückgegeben: die Antwortzeichenfolge, die wir benötigen, und die Anzahl der durchgeführten Ersetzungen (Anzahl der Stellen tatsächlich, aber wen interessiert das?). Wenn es kein internes Paar gäbe, würden sowohl die Zeichenfolge als auch die Nummer gedruckt, was uns fertig macht. Also opfern wir hier zwei Bytes, um das zweite Ergebnis wegzulassen und schließlich das Produkt dieser Wahnsinnsfabrik zu drucken.Nun, ich habe es genossen, fast so viel zu erklären wie das Golfen an erster Stelle, ich hoffe, Sie haben verstanden, was hier los ist.
quelle