Herausforderung:
Ihre Aufgabe ist es, einen einfachen Dolmetscher für eine einfache Golfsprache zu erstellen.
Eingang:
Die Eingabe erfolgt in Form einer durch Leerzeichen getrennten Zeichenfolge.
Sie können die Raumtrennung durch das ersetzen, was Sie möchten
Ausgabe:
Das Ergebnis (eine Zahl oder eine Zeichenfolge) ausgeben, das nach Ausführung aller Vorgänge erhalten wurde. Wenn es mehr als einen Ausgang gibt, verbinden Sie die beiden, um ein einzelnes Ergebnis zu erhalten (keine Trennzeichen). Der Anfangswert der Variablen ist immer Null. Das heißt: Es beginnt um0
Sprachensyntax:
Die Sprache hat folgende Operatoren:
inc ---> add one to variable
dec ---> remove one from variable
mult ---> multiply variable by 2
half ---> divide the variable by 2
Pri ---> print the variable to console (or whatever your language has)
exit ---> end the program (anything after this is ignored)
Beispiele:
inc inc inc dec Pri exit ---> 2
dec inc mult inc inc Pri ---> 2
inc inc inc mult half Pri exit inc ---> 3
inc Pri inc Pri inc Pri exit half mult ---> 123
Pri exit ---> 0
inc half Pri exit ---> 0.5
Beschränkung:
Dies ist Code-Golf, so dass der kürzeste Code in Bytes für jede Sprache gewinnt.
Hinweis:
- Die Eingabe ist immer gültig. (durch Leerzeichen getrennte Zeichenfolge von Operatoren)
- Sie können auf die nächste Ganzzahl abrunden, wenn Sie keine Dezimalstellen möchten.
code-golf
math
interpreter
Muhammad Salman
quelle
quelle
Antworten:
Bash , 61 Bytes
Probieren Sie es online!
Konvertiert das Programm in ein DC-Programm und wertet es dann als DC-Code aus. Dies nimmt die Eingabe durch Zeilenumbrüche getrennt. Beachten Sie, dass DC stapelbasiert ist und die umgekehrte polnische Notation verwendet.
Der Eingang wird zuerst zu sed geleitet
1i0
Fügen Sie in der ersten Eingabezeile eine 0 ein (voranstellen), dies ist der Akkumulators/.//2g
entferne alles außer dem ersten Zeichen in jeder Zeiley"idmhe"+-*/q"
transliterateidmhe
in+-*/q
, + - * / sind die arithmetischen Befehle und q beendet das Programm/+\|-/
Fügen Sie in jede Zeile, die + oder - enthält,i1
eine 1 ein/*\|\//
Fügen Sie in jede Zeile, die * oder / enthält,i2
eine 2 ein/P/
cdn
Ändern Sie in jeder Zeile, die P enthält, diese indn
, was dem Duplizieren entspricht, und geben Sie sie ohne neue Zeile in dc ausDies wird nun als ein DC-Ausdruck ausgewertet.
quelle
sed
Syntax beim Golfen noch fremder wird als bisher für möglich gehalten.Jelly , 21 Bytes
Probieren Sie es online!
Beachten Sie, dass die ASCII-Werte der ersten Zeichen (
idmhPe
) modulo 11 eindeutig modulo 6 sind.Modulo 16 verwenden:
Jelly , 21 Bytes
Probieren Sie es online!
Die Zeichenfolge, in die indiziert wird, ist
ḤH‘’IȮ
in diesem Fall. Die‘’
sind nicht mehr an den Grenzen.quelle
“”
braucht 2 Bytes,¤
braucht 1 Byte, die Daten selbst brauchen 6 Bytes, es sind noch 2 Bytes übrig, um etwas zu tun. Derzeit ist es⁾
undj
, aberịØJ
oderṃØJ
ist viel schlimmer undỌ
funktioniert nicht (weil Unicode).R ,
128125 BytesProbieren Sie es online!
Muss mit aufgerufen werden
source(echo=FALSE)
, um zu verhindern, dass der Rückgabewert automatisch gedruckt wird. Die Alternative wäre, allesinvisible
einzupacken, aber das ist viel weniger golfen (und ruiniert meine [noch] nette Byteanzahl).quelle
05AB1E , 25 Bytes
Probieren Sie es online!
Ordnet jede Sprachfunktion der entsprechenden 05AB1E-Funktion zu (unter Verwendung des ersten Zeichens jeder Funktion) und führt dann die resultierende Zeichenfolge als 05AB1E-Code aus.
quelle
Rot , 121 Bytes
Probieren Sie es online!
Lesbar:
quelle
Python 2 ,
131125122121118117115 BytesProbieren Sie es online!
-6 und -3 danke an @Rod
-3 und -2 danke an @etene
-1 durch Ersetzen
"Pri"==x
durch"P"in x
quelle
split
weiter"exit"
und den ersten Block erhalten, anstattbreak
ing 4 Bytes Speicher'idmh'
undfind
stattdessen verwendenindex
, um ein paar Bytes zu sparenex
, um weitere 2v=(v+1,v-1,v*2,v/2.)
mitv+=(1,-1,v,-v/2.)
es funktionieren sollte, allerdings nicht haben getestethalf
. So einfach! Vielen Dank.Python 3 ,
1109182 Bytesexit
führt dazu, dass das Programm mit einem Fehler beendet wird.Probieren Sie es online!
quelle
i='x+=1';d='x-=1';...
undexec
ändern Sie es dann in Ihrem Anruf zuexec(eval(c[0]))
print
Aussage !JavaScript (ES6),
8379 Bytes4 Bytes gespart dank @ l4m2
Ersetzt die Anweisungen iterativ entweder durch die Ausgabe oder durch leere Zeichenfolgen.
Probieren Sie es online!
Kommentiert
quelle
s=>s.replace(/\S+./g,w=>k<s?'':w<{}?k:(k+={d:-1,e:w,i:1,m:k}[w[0]]||-k/2,''),k=0)
w<{}
ist das pure Böse: ps=>s.replace(/\S+./g,e=>m<s?'':e<{}?m:(m+={d:-1,e,i:1,m}[e[0]]||-m/2,''),m=0)
auch arbeitenKohle ,
37-35BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Inspiriert von @ RickHitchcocks Antwort. Erläuterung:
Löschen Sie die Variable.
Kürzen Sie die Eingabe am
x
es eine gibt, und schalten Sie dann jedes Zeichen der Eingabe (den Rest der Eingabe) in einer Schleife ein.n
ich n Inkrementen die Variable.d
d ecrements die Variable.m
m multipliziert die Variable mit zwei (dh doppelt).h
h alves die Variable.r
p r fügt die Variable in einen String um.quelle
JavaScript (ES6),
77 bis75 Byte(Geliehen ( gestohlen ) @ Arnauld's Trick zu benutzen
m
als Variablennamen 2 Bytes zu sparen.)Durchläuft die Zeichenfolge rekursiv, sucht nach eindeutigen Buchstaben pro Anweisung und ignoriert den Rest:
Nutzt die Tatsache, dass sie
undefined
weder größer noch kleiner als ist'x'
, und beendet die Rekursion am Ende der Zeichenfolge oder wenn sie auf den'x'
In- Exit stößt .Code-Snippet anzeigen
quelle
JavaScript (Node.js) , 107 Byte
Probieren Sie es online!
quelle
f=
JavaScript (Node.js) , 91 Byte
Probieren Sie es online!
JavaScript (Node.js) , 96 Byte
Probieren Sie es online!
JavaScript (Node.js) , 99 Byte
Probieren Sie es online!
quelle
JavaScript, 107 Bytes
quelle
Haskell , 93 Bytes
Probieren Sie es online!
Im Wesentlichen eine Übersetzung der Python-Antwort von mbomb007 .
quelle
Lua, 207 Bytes
quelle
Python 3 ,
114110109116 BytesEigentlich hätte Python 2 zwei Bytes weniger gekostet, da
exec
es sich um eine Anweisung handelt und keine Klammern benötigt ...4 zusätzliche Bytes dank @ElPedro gespeichert
Sie haben ein zusätzliches Byte gespeichert, indem Sie die Tatsache ausgenutzt haben, dass
find
bei einem Fehler -1 zurückgegeben wird, das dann als Index verwendet werden kann+7 Bytes, weil ich die No-Newlines-Regel nicht bemerkt hatte :(
Probieren Sie es online!
Ordnet das erste Zeichen jedes Eingabeworts einem Teil des Python-Codes zu. Diese werden dann verkettet und
exec
bearbeitet.Ziemlich unkomplizierte Herangehensweise, die man wahrscheinlich etwas mehr golfen könnte. Die Schwierigkeit besteht hauptsächlich darin, aus vielen möglichen Formen die kürzeste zu finden ...
quelle
print(i,end='')
. Siehe den 4. Testfall.Ruby +
-na
,817365 BytesProbieren Sie es online!
Ziemlich einfach. Suchen Sie für den ersten Buchstaben jedes Wortes die entsprechende Befehlszeichenfolge und
eval
diese. Verwendet die Ganzzahldivision undexits
wirft aZeroDivisionError
.-5 Bytes: Verwenden Sie diese Option
.ord%11%6
anstelle einer Zeichenfolgensuche. Das Guthaben geht an user202729-3 Bytes:
.ord
berücksichtigt nur das erste Zeichen der Zeichenkette, so dass ich a überspringen kann[0]
.-8 Bytes: Benutze
-a
Flag, um die Eingabe dank Kirill L automatisch aufzuteilen.quelle
-a
Option , um den Autosplit für Sie zu tun, wie diesEmojicode , 270 Bytes
Probieren Sie es online!
quelle
SNOBOL4 (CSNOBOL4) , 165 Bytes
Probieren Sie es online!
Brutto.
quelle
C # (.NET Core), 186 Bytes
quelle
i
mitv
, eine ASCII - Tabelle Beratung , so dass Sie kleine Zahlen verwenden können, die Neuanordnungif
s, und dann ein ternäres mit:class Z{static void Main(string[]a){int v=0,i;foreach(var s in a){i=s[0]%'d';if(i==1)break;if(i>9)System.Console.Write(v);else v=i<1?v-1:i<5?v/2:i<6?v+1:v*2;}}}
(PS eine Erklärung, wie es funktioniert und wie man den Einsatz es (zB erwartet Befehlszeilenargumente) wird immer geschätzt!%50
stattdessen verwenden sollen%'d'
)Perl 5
-a
, 61 BytesProbieren Sie es online!
Hat den
ord%11%6
Trick von @ user202729 gestohlenWie?
quelle
Pyth, 44 Bytes
Test Suite
Erläuterung
quelle
TI-BASIC, 112 Bytes
Dies stützt sich auf einige Annahmen, die von AFAIK durchaus akzeptiert werden. Nummer eins ist, dass alle Variablen vor der Ausführung auf Null initialisiert werden; Nummer zwei ist, dass die Eingabe über übernommen wird
Ans
.quelle
Java (OpenJDK 8) , 164 Byte
Probieren Sie es online!
Oben ist meine Lösung, die auf ganze Zahlen abrundet, unten ist meine Lösung, die Dezimalzahlen verarbeitet. Die widerwärtige Art und Weise, wie Java das Doppelte druckt, fügt der Partitur weitere 55 Byes hinzu. Ich habe die neuen Zeilen belassen, um den Code in der zweiten Einreichung besser lesbar zu machen, nur weil es im Wesentlichen dieselbe Lösung mit einem zusätzlichen Befehl und einer import-Anweisung ist.
Java (OpenJDK 8) , 219 Byte
Probieren Sie es online!
quelle
C (GCC) ,
120114111 Bytes-6 bytes dank ceilingcat.
Probieren Sie es online!
124 Bytes
Gleitkomma-Version:
Probieren Sie es online!
Ich habe mich nicht mit einer abrundenden Version befasst, sondern mit einer Ausnahme für 0, die zulässig wäre, wenn ich die Kommentarkette richtig verstehe.
quelle
33 , 62 Bytes
Probieren Sie es online!
Dieses Programm nimmt die durch Zeilenumbrüche begrenzten Anweisungen entgegen
Erläuterung:
Der Code vor diesem Segment definiert alle Funktionen.
quelle