3var ist eine Variante von Deadfish, die drei Variablen namens A, B und R verwendet. A und B sind Akkumulatoren, während R als Ergebnisvariable verwendet wird.
In diesem Code-Golf- Herausforderung müssen Sie einen Interpreter für eine abgespeckte Version dieser Sprache erstellen .
Erforderliche Befehle:
i Increments A
d Decrements A
s Squares A
p Prints A
P Prints the ASCII character of A
> Sets A to R
a Increments B
k Decrements B
m Squares B
o Prints B
O Prints the ASCII character of B
< Sets B to R
+ Adds A and B, stores in R
- Subtracts B from A, stores in R
* Multiplies A and B, stores in R
/ Divides A by B, stores in R
w Prints R
@ Resets A to 0
# Resets B to 0
e Resets R to 0
Alles andere (einschließlich Leerzeichen) wird ignoriert.
Klarstellungen
o
undp
sollte ohne irgendetwas danach ausgeben.- Division ist eine Ganzzahldivision.
- Nummern über 255 und Nummern unter 0 werden unterstützt.
- 'w' sollte nach R ein Leerzeichen oder eine neue Zeile ausgeben
- Division durch 0 stoppt ohne Fehler. (Keine Ausgabe nach STDERR)
- A, B und R sind anfänglich 0
Regeln
- Das ist Code-Golf, also gewinnt die kürzeste Antwort.
- Bei einem Gleichstand gewinnt die älteste Antwort.
- Die Datei wird über Befehlszeilenargumente oder STDIN bereitgestellt.
- Jede Sprache ist erlaubt.
- Eval ist erlaubt.
Testfälle
Hello world!
(aus Esolangs)
iisssaa/>e
maa->e#
aamam->e#
dddddddddddddddddddddddddPiiiiiiiiiiiiiiiiiiiiiiiii
iiiiPiiiiiiiPPiiiP
@#e
iis
aamaaaa
*>P
@#e
iisssaa/>e
maa->e#
aamam->e#
iiiiiiiiiiiiiiiiiiiiiiP
ddddddddP
iiiP
ddddddP
ddddddddP
@#e
iiss
aa*>
iP
Ausgänge 20spooky22me
:
iipois+iis<-<aaaO<OkOOkkkkOP@#iippisa+<m+>PaO
Ausgänge 9P-1420 100 3Q-1 162 0
:
iiispsdPkokmo/w<+w#aaaommO-w@ii*wew
Bestenlisten
Hier ist ein Stapel Snippet sowohl eine regelmäßige Rangliste und einen Überblick über die Gewinner von Sprache zu erzeugen.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
# Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=63008,OVERRIDE_USER=45220;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
quelle
dddddp
Ergebnisse in -5 undiiiissp
Ergebnisse in 256 , wie man erwarten würde, anstatt 0.r
tun? es ist nicht auf der Liste der gültigen Befehle enthalten@#e
.Antworten:
CJam, 112
Probieren Sie es online aus
Erläuterung:
Das Programm baut eine Reihe von Codestücken ausgeführt werden, und führt das entsprechende Stück für jedes Zeichen. Der Umgang mit der Division durch Null ist schwieriger, weil CJam noch keinen „Bruch“ Operator hat. Stattdessen & pgr das Programm Schub als Marker (da keine Gleitkommazahl kann anders erscheinen), und am Ende hält es nur die Ausgabe vor dem ersten π.
Das Programm verwendet außerdem die Variablen T, U und V anstelle von A, B und R, da diese in CJam mit 0 vorinitialisiert sind.
Die tatsächlichen Befehlsimplementierungen (vom Programm erstellt):
quelle
JavaScript (ES7) 208
213 223 237 241 311Edit3 sie kopieren, ich und Dendrobium kollabieren zusammen.
Edit2 Mit EcmaScript 7 nur 2 Bytes zu speichern, miteinander verbunden und eine Handhabungs B
Bearbeiten Folgen Sie den Änderungen der Regeln.
Beachten Sie, dass ich denr
Befehl hinzugefügt habe, der in der Frage nicht benötigt wird, nur um das alte Beispiel Hello World auszuführenquelle
A=B=R=0,
[...'@#e'+p]
GNU Sed (mit Evaluierungsoption)
dc
Ausdrucks), 254Deadfish ordnet eine Untermenge von ziemlich gut zu
dc
. Also verwenden wir sed, um dieses Mapping durchzuführen:quelle
Javascript
ES6ES7,217215213208 BytesUngolfed
quelle
A=B=R=0,
for(c of '@#e'+s)
w
APL, 191
Dies ist eine Funktion, die das Programm als Argument verwendet, zB:
Es kann als anonyme Funktion verwendet werden, ich habe es nur der Klarheit halber benannt.
Erläuterung:
0::→
: Wenn ein Fehler auftritt (z. B. Division durch Null), halten Sie an, ohne die Fehlermeldung zu druckenA B R←0
: Variablen initialisieren{
...}¨⍵
: für jeden Befehl:⍵∊G←'aikdms<>'
: Wenn der Befehl vom Typ var ← fn (var, x) ist , finden Sie die richtigen fn und x , ersetzen Sie sie in und werten Sie sie dann aus:⍎
: bewerten'AB'[1+2|G⍳⍵
:A
wenn die Position von⍵
in gerade'aikdms<>'
ist,B
sonst.'+-*∘'[M]
: addiere, subtrahiere, macht oder nichts, abhängig vonM
(später definiert)'←'
: zuweisen'112R'[M←⌈2÷⍨G⍳⍵]
:1
(zum Addieren und Subtrahieren),2
(für Potenz) undR
(für nichts, dh es setzt nur die Variable aufR
), abhängig vonM
, ob der Befehl zum ersten, zweiten, dritten oder vierten Paar gehört.⍵∊G←'PpOo'
: Ausgabe:⍞←
: Ausgabe⎕UCS⍣(2|G⍳⍵)
: ASCII (naja, Unicode) oder Zahl, je nachdem, ob der Befehl an einer ungeraden oder geraden Position warPpOo
,⊢A B[⌈2÷⍨G⍳⍵]
:A
oderB
, abhängig davon, ob der Befehl in der ersten oder zweiten Hälfte war.⍵∊G←'+-*/
: Mathematik:R∘←⌊A(⍎'+-×÷'[G⍳⍵])B
: AufR
das Ergebnis der Anwendung des angegebenen Operators aufA
und setzenB
.⍵∊G←'@#e':
zurücksetzen:⍎
: bewerten'ABR'[G⍳⍵]
: Wählen Sie die richtige Variable'∘←0
': auf null gesetzt⍵='w':⍞←R
: Wenn der Befehl istw
, AusgabeR
.quelle
C
253241 BytesDieser Code verwendet die Zeichenfolge
id@s>ak#m<e+-*/wpoPO
als Befehlstabelle. Die Zeichenfolge ist entsprechend dem Ziel des berechneten Ausdrucks angeordnet. Es kommt einfach so vor, dass es 5 Befehle gibt, die jede der Variablen aktualisieren:id@s>
- aktualisierena
ak#m<
- aktualisierenb
e+-*/
- aktualisierenr
wpoPO
- aktualisieren ... den Speicherort nacha
,b
undr
. Ich hoffe es ist nicht zu wichtig :)Nachdem das eingegebene Zeichen in der Befehlsfolge gefunden wurde, wird sein Index wiederholt verringert, und je nachdem, wann es 0 erreicht, wird ein Ausdruck ausgewählt.
Wenn es nach 15 Subtraktionen nicht 0 erreicht, ist es a
printf
mit einigen richtig gewählten Argumenten.Außerdem wird beim Teilen die Division durch 0 durch Aufrufen vermieden
exit()
.Dieser Code sollte ohne Optimierungen kompiliert werden, da dies vorausgesetzt
a
wirdb
und err
sich an benachbarten Adressen im Stapel befindet (nicht in CPU-Registern).Außerdem sollte es im 32-Bit-Modus kompiliert werden, da es Zeiger in Ganzzahlen konvertiert und umgekehrt.
quelle
VBA,
484, 453,380 BytesZu lange, um zu gewinnen, aber eine super einfache Art, Dinge zu tun, nichts Besonderes, nur gut alt
Select Case
Hinzufügen von Integer Division und Div 0Fehlerbehandlung hat
eine Menge Bytesverbraucht Fehlerbehandlung wurde entfernt, da es so aussieht, als würde die normale Fehlerbehandlung dieselbe Funktionalität zur Folge haben. Problem, bei dem Int Division wie erwartet funktionierte - gefixt War auch kürzer.quelle
DefInt A-Z
, wodurch das Weglassen der Notwendigkeit, ausdrücklich erklärtA
,B
undR
wieInteger
:DefInt A-Z:Dim A, B, R
. Es könnte genauso gut arbeiten , um nur zuweisen, ohne Erklärung:A=0:B=0:R=0
. Die Berechnungen sollten auch für Varianten funktionieren.DefInt
was ich jeden Tag benutze, aber in Zukunft wird es sehr nützlich sein, VBA zu spielen. LeiderA=0
wird es bei meinen Tests nur wie ein Doppelgänger wirken. Es für die Herstellung voniiiaa/w
Produkten führen eine Dezimalzahl eher dann ein Ganzes.PHP, 310 Bytes
Zum ersten Mal in meinem Leben mit
:eval
Übernimmt die erste Befehlszeileneingabe:
Ausgabe aus den Beispielen:
quelle
C 357
Makros FTW!
(Wen ich veräpple - c wird dieses nie gewinnen)
quelle
JavaScript (ES6),
293262 ByteVerwendung
Erläuterung
Es gibt einige Details der Sprache, bei denen ich mir nicht sicher bin (Ganzzahlgrößen, Umgang mit nicht erkannten Zeichen usw.), aber diese Lösung scheint ausreichend zu funktionieren und ignoriert Leerzeichen wie die Zeilenumbrüche im Testfall.
quelle
:$=>
durch$
ersetzen und dann einen Ersatz für die Zeichenfolge hinzufügen.Simplex v.0.8 , 211 Bytes
(UTF-8-codiert.)
Erläuterung
Da dies die längste ist Simplex-Programm ist, das ich bisher geschrieben habe, werde ich im Allgemeinen anhand von Stichpunkten erklären, wie dies funktioniert.
h@u]
- definiert Makro 0. Dieses Makro schreibt einfach in das Register und lässt ein Lambda nichts zurückgeben.u2
- geht zum obigen Strip und setzt das aktuelle Byte auf 2; Dies definiert die Arität der zu definierenden Lambdas.ƒ
- Lambda-Ausdruck beginnen; einmal abgeschlossen durch]
, wird die Lambda-Funktion auf den Lambda-Stack übertragen. Es nimmt (Aritäts-) Zellen aus dem Zeiger in seinen lokalen Streifen und setzt nach Abschluss seinen lokalen Streifen auf die entnommenen Zellen, es sei denn, das aktuelle Byte ist nicht geschrieben. Der Zeiger ist nicht betroffen. Makro 0 ermöglicht, dass eine Funktion zurückkehrt, ohne irgendetwas in dem Streifen zu ändern.§
- bewegt sich zur ersten geschriebenen Zelle im aktuellen Streifen, d. hA
. .ð
- bewegt sich zur letzten geschriebenen Zelle im aktuellen Streifen, dB
. h .{"idspP>akmoO<+-*/w@#e"RlyG^u·u†vøÏ}
{...Ï}
Wiederholen, bis der Eingabestapel leer ist"idspP>akmoO<+-*/w@#e"
- die BefehleRly
- Legen Sie den Streifen in ein TupelG^u
- der Index der Eingabe im Tupel·
- die aktuelle Byte lädt th in den Lambda - AuswerteruRL
- geht zum StripA
und hältB
(schreibtA
undB
wenn sie nicht existieren)†
- führt Lambda aus (dies ist der Lambda-Evaluator)vø
- Wird unter dem Streifen zurückgesetztPuh, ich bin beeindruckt. Es ist lang für Simplex, aber kurz für alles andere.
;)
quelle
Minkolang 0,11 , 222 Bytes
Ich bin mir sicher, dass man hier weiter Golf spielen kann, aber es hat Spaß gemacht. Außerdem erster Minkolang-Dolmetscher einer anderen Sprache!
Probieren Sie es hier aus.
Erläuterung
Der Rest der Zeilen ist ziemlich einfach, vielleicht mit Ausnahme von denen mit
1$((dl%"0"+$rl:d)$Ok
, was eine Redewendung ist, die eine Zahl ohne nachfolgendes Leerzeichen ausgibt. (Ich habe die Funktion zum Konvertieren dieser Zahl in eine Zeichenfolge noch nicht implementiert1Z
.) Oh, ja, sie haben alle einev
am Anfang, die sie zum Anfang zurückführt.quelle
GNU Sed (mit Eval-Option zur Bewertung des DC-Ausdrucks), 289
Inspiriert von Digital Trauma, das leider nicht erkannt hat, dass a) unzulässige Zeichen ignoriert werden müssen, b) DC das gesamte konvertierte Programm in einem Argument benötigt und c) die Division durch 0 das Programm ohne Fehler beenden muss.
Wenn all diese Regeln nicht zutreffen würden, wäre meine Lösung nur 235 Bytes lang;)
quelle
AWK,
311309TIL-Klammern wurden um printf nicht benötigt. 2 Bytes gespeichert!
Ungolfed-Version zum leichteren Lesen:
quelle
Python 2, 272
quelle
print
Anweisungen enthalten einen nachgestellten Zeilenumbruch.Ruby, 199 Bytes
Durch Entfernen
.read
aus der zweiten Zeile können 5 Bytes gespart werden, wenn Sie eine Warnung tolerieren, die in einer neueren Version von Ruby an stderr ausgegeben wird.quelle
Python, 244
Etwas spät, aber ich wollte es versuchen.
quelle
Prolog, 759 Bytes
Nicht das kürzeste Programm, aber zumindest strukturiert und lesbar.
Beispiel Eingabe
Probieren Sie es hier online aus
quelle