Deadfish ist eine Scherz- "Programmiersprache" mit vier Befehlen. Da die Esolang-Seite etwas widersprüchlich ist und die Interpreten auf dieser Seite nicht alle genau gleich funktionieren, sollten Sie die folgende Variante implementieren:
Spezifikation
- Es gibt einen Akkumulator mit einer Größe von mindestens 16 Bit, mehr ist zulässig, weniger nicht. Negative Zahlen müssen nicht unterstützt werden. Der Akku ist,
0
wenn das Programm startet. - Es gibt die folgenden zwei Sätze von vier Befehlen, und Ihr Programm muss beide gleichzeitig unterstützen.
Standard Deadfish (XKCD-Variante) Bedeutung ─────────────────────┼──────────────────┼───────── ─────────────────────────── i │ x │ Inkrementspeicher d │ d │ Dekrementspeicher s │ k │ Quadrat (acc = acc * acc) o │ c │ Akkumulator als Zahl ausgeben
- Wenn der Akku nach Ausführung eines Befehls entweder
-1
oder ist256
, muss der Akku auf Null zurückgesetzt werden. Beachten Sie, dass dies kein normaler Umlauf ist. Wenn zum Beispiel der Akku ist20
und ders
Befehl ausgeführt wird, sollte der Akku400
danach sein. Wenn der Akku ist257
und derd
Befehl ausgeführt wird , sollte der Akku in ähnlicher Weise werden0
. - Alle Eingaben, die nicht zu diesen Befehlen gehören, sollten ignoriert werden.
Testprogramme
xiskso
sollte ausgeben0
xiskisc
sollte ausgeben289
I / O
Ihr Programm sollte eine Eingabeaufforderung angezeigt: >>
. Die Eingabeaufforderung muss am Anfang einer neuen Zeile stehen. Anschließend sollte eine Zeile mit Benutzereingaben gelesen und die angegebenen Befehle von links nach rechts ausgeführt werden. Bei der Ausgabe von Zahlen müssen die Zahlen getrennt werden. Das heißt, 12 34
ist in Ordnung, 12,34
ist in Ordnung,
12
34
ist OK, ist es aber 1234
nicht.
Ihr Programm sollte dies in einer Schleife tun, zumindest bis EOF
es erreicht ist.
Beispielsitzung:
>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>>
code-golf
interpreter
deadfish
Marinus
quelle
quelle
#{STDIN.gets}
funktionieren würde, aber in der Tat funktioniert es nicht.Antworten:
K, 77 Bytes
Beachten Sie, dass dies K4 ist . Eine K6- Lösung ist etwas länger, weil die IO-Verben länger sind, auch wenn alles andere besser ist:
""0:
gibt das Argument aus und gibt es zurück. Beachten Sie in K4, dass wir uns einfach auf 1 beziehen .0 f/ args
zeigt reduzieren mit einem Anfangswert, dhf[f[0;first arg];second arg]…
{x*2=-1 256?x…
klassifiziert x in 0 (für -1), 1 (für 256) und 2 für alle anderen Werte.2=
Das heißt, wir erhalten1
für nicht klassifizierte Werte und0
ansonsten ist das Multiplizieren mitx
kürzer als eine Bedingung. In K6 können wir ein wenig besser, weil{x*^-1 256?x:y@x}
auf der Tatsache beruht , dass-1 256?x
Renditen0N
(null) und^
erkennt Nullen."xkcdiso"
anstelle der vorgeschlagenen Reihenfolge, da7#
die vier Argumente, dh die7#"abcd"
Rückgabewerte, umbrochen werden,"abcdabc"
wodurch unsere Tabelle kleiner bleibt"x"
und"i"
an dem Vorsprung1+
, die der Funktion entspricht ,{1+x}
jedoch kürzer."d"
in die Projektion übersetzt , die-1+
der Funktion entspricht,{-1+x}
jedoch kürzer ist."k"
und"s"
in die Funktion{x*x}
"c"
und"o"
in die Ausgabefunktion,{-1@$x;x}
die wiederum in K6 etwas länger ist:{""0:,$x;x}
Beide geben jedoch ihre Ausgabe gefolgt von einer neuen Zeile aus und geben dann das Argument zurück.o`
was kürzer ist.quelle
Perl 5 , 90 Bytes
Probieren Sie es online!
Vielen Dank an @xfix für seine Hilfe! 4 Bytes gespart dank @Xcali !
quelle
1
wenn der Akku überläuft. Außerdem können Sie Ihr Programm um fünf Zeichen verkürzen, indem$a
auf$?
(die initialisiert wird0
, und wird sich nicht ändern , bis Sie einen externen Programm von Perl laufen).issso
als ein Befehl ausgeführt werden, nicht wenn Sie jeden einzeln ausführen ... Ich werde dies später genauer betrachten und es mit Sicherheit verwenden$?
. Vielen Dank!''
anstatt mit""
so belassen , wenn die mitperl -e '...'
der Map verwendete mit dem Ergebnis enden würdes///
. Danke noch einmal!Powershell,
131126121114113for($x=0){...}
- Setzen Sie den Akku auf 0 und wiederholen Sie die Schleife für immerread-host '>>'
- Holen Sie sich die Benutzereingabe mit Eingabeaufforderung>>
[char[]](...)
- Konvertieren Sie die Benutzereingaben in ein Array von Zeichen|%{...}
- Führe{}
für jeden Charakter aus , was drin istswitch -r($_)
- Regex-Schalter für jedes Zeichen"i|x"{$x++}
- Akkumulator angleicheni
oderx
- erhöhen"d"{$x-=!!$x}
- matchd
- verringern$x
um!!$x
, was ist,0
wenn$x
ist0
, und1
sonst. Dadurch wird sichergestellt, dass der Akku niemals erreicht-1
."s|k"{$x*=$x}
- Spiels
oderk
- Quadrat"o|c"{$x}
- den Akku abgleicheno
oderc
- ausgeben$x*=$x-ne256
- Multiplizieren Sie den Akku mit,0
wenn dies der Fall ist256
oder auf1
andere WeiseBeispielausgabe
Ich vermute, dass die Implementierung von
read-host
hostspezifisch ist, sodass dieser Powershell-Host (ConsoleHost):
an die angegebene Eingabeaufforderung angehängt wird .quelle
!!$x
Ich liebe das Dekrement von , schade, dass ich das nicht nutzen kann ...Rebol 3,
178169161159Schönere Version:
quelle
Haskell, 202
quelle
e
undv
in Operatoren ändern . Ich habe auch versucht, neu zu schreibenv
undg
damit der Parameterx
in IO bleibt,print
usw. aufgehoben zu werden. Ich habe es nicht geschafft, es zum Laufen zu bringen, aber ich denke, das könnte ein guter Ort für jemanden sein, der sein Haschisch kennt.IO
ist, dass sie entweder zu oft drucken (weshalb ich sier n
anstelle von verwendet habex
) oder nicht genug, weil der Wert nie abgefragt wird. So wie ich ändern würdee
undv
in Betreiber?'i'%x=x+1;'d'%x=x-1
... und rufen Sie es einfach in v aufdo n<-x;r$w$o%n
. Der Grund, warum Operatoren Platz sparen, ist, dass sie keine Leerzeichen in ihrer Umgebung benötigen.Rubin,
140138Beispielsitzung (wie Ihre):
quelle
K 121
.
quelle
Ada
Hier ist eine Ada-Implementierung für die wenigen, die sich für diese Sprache interessieren. Ich habe einige Zeit gebraucht, um einige der Best Practices von Ada anzuwenden (z. B. die Verwendung von Indefinite_Holders anstelle von Access) und um zu verstehen, wie Deadfish funktionieren muss.
Und die Ausgabe:
Wenn einige Leute, die in Ada experimentiert haben, mir Optimierungshinweise geben könnten, wäre ich dankbar.
quelle
C 159 Zeichen
Ich habe einen anderen Ansatz ausprobiert, der auf dem Einrichten einer Nachschlagetabelle für die Befehlsdecodierung basiert, aber das endete leider länger ( 169 ). Ich habe es mit einbezogen, da sich jemand eine clevere Einstellung einfallen lassen könnte, um die Größe zu reduzieren. (Muss ohne Argumente ausgeführt werden)
quelle
C 163
quelle
Python 3,
181175171162Dies gibt eine neue Zeile nach dem ausNicht mehr!>>
, aber das OP hat nicht gesagt, dass dies nicht erlaubt ist.Dank
GlitchMr
,minitech
undgolfer9338
!quelle
lambda
anstelle vondef
eine Funktion verwenden, die sofort zurückkehrt.x in(-1,256)
speichert zwei Zeichen. Alternativs=lambda x:"a=%d"%(x!=-1and x!=256and x)
könnten einige sparen.print(">>")
und verwendenfor i in input(">>")
;input()
Ermöglicht die Angabe einer Eingabeaufforderung. Dann wird es keine neue Zeile mehr geben>>
und Sie speichern Zeichen.R
161,148, 138Ungolfed-Version:
Beispielsitzung (im interaktiven Modus):
quelle
Python 3, 141
Ich weiß, dass ich zu spät bin, aber ich wollte die Gelegenheit nutzen, um eine kürzere Python-Version (und meinen ersten CodeGolf-Versuch) zu veröffentlichen. :)
Die print-Anweisung war dafür etwas knifflig. Wenn die Eingabeaufforderung mit einem Leerzeichen enden muss, fügen Sie der Zählung ein Zeichen hinzu. :)
Erläuterung
v
ist der Akku.m
prüft, ob der angegebene Wert-1
oder ist256
. Wenn ja,0
wird der Wert ansonsten zurückgegeben.In den folgenden Zeilen werden die Operationen den entsprechenden Variablen zugewiesen (da einige dieselbe Bedeutung haben (wie
i
undx
), ist dies kürzer als das Instanziieren eines neuen Wörterbuchs). Diese werden dann im verwendetexec
Folgenden verwendet.while 1:
ist die HauptschleifeJetzt fängt der Spaß an. Wie bei der @ jazzpi -Lösung wird jedes Zeichen der Eingabe durchlaufen .
locals()
ist das Wörterbuch aller aktuellen (sichtbaren) Variablen. Mit.get(n,'')
dem entsprechenden Schlüssel wird in die Exec-Zeichenkette (eine leere Zeichenkette, falls der Schlüssel (= andere Eingabe) nicht gefunden wurde) gesetzt. Dies wird dann, wenn es ausgeführt wird, verkettetv
und weitergeleitetm
. Der Rückgabewert wird erneut gespeichertv
.Wiederholen Sie diesen Vorgang, bis Sie sich langweilen. :)
quelle
y*(-1!=y!=256)
für -3 Bytes seinPython 2, 139
Das ist ordentlich, aber auch ziemlich unkompliziert. Hier ist eine längere, coolere Version:
Mit 190 Zeichen ist dies möglicherweise nicht die wettbewerbsfähigste Antwort. Auf der anderen Seite sind Coroutinen ziemlich radikal und ich suche immer nach einer Ausrede, um sie zu benutzen (und zu teilen)
quelle
TI-BASIC,
104 10710210098Für Taschenrechner der Serie TI-83 + / 84 +.
Nennen Sie das
prgmD
; es überläuft schließlich den Stapel, indem es sich selbst aufruft. Ersetzen Sie die Rekursion durch einWhile 1
, um dieses Problem zu beheben.Y ist standardmäßig 0, führen Sie dies also entweder mit einem neu gelöschten Taschenrechner aus oder speichern Sie 0 bis Y manuell, bevor Sie dies ausführen.
Schade, dass die Kleinbuchstaben (in den String-Literalen) jeweils zwei Bytes sind; Andernfalls wäre dies kürzer als die Antwort von Dom Hastings.
BEARBEITEN: Fehler beim Teilen durch Null (0 ^ 0) auf Kosten von drei Bytes behoben.
107 -> 102: Speichert mit dem Trick der imaginären Potenzierung vier Bytes (einschließlich 1 aus Klammern und -1 aus der Verlängerung der Suchzeichenfolge) und verwendet Y anstelle von X, für dessen Initialisierung ein Byte weniger benötigt wird.
quelle
Nachschrift 272
Ungolfed:
quelle
C (
224212 Zeichen)Dies ist wahrscheinlich eine schlechte Sprachwahl, aber na ja. Es ist nicht so, dass eine Sprache wie C besser kann als eine dynamische Programmiersprache. Auf Clang müssen Sie einen Wert für angeben
return
(dies ist für gcc nicht erforderlich).quelle
define q
und nur zu verwendenprintf
?q
wird 3 mal verwendet,define q
spart also ~ 2 Zeichen.Lua
230,228Nicht das Schlimmste, nicht das Beste.
HINWEIS: Wie von @mniip gemeldet, funktioniert dies
256or
möglicherweise nicht in Ihrem Interpreter. Mehr Infos in Kommentaren.(mehr oder weniger) Lesbare Version:
Ausgabe:
Edit: danke an @mniip für 2 Zeichen Optimierung:
until nil
->until _
quelle
repeat until x
(x ist nil wie nicht definiert) ist 2 Zeichen kürzer undwhile 1 do end
hat exakt die gleiche Länge. Was ist das für eine Lua-Version?256or
In meinem Interpreter ist die Syntax ungültigrepeat until x
. Ich verwende die neueste Windows-Binärdatei von hier . Wie Sie sehen können,a=a+1 elseif
haben Sie Platz. Das liegt daran, dasse
es sich um eine hexadezimale Ziffer handelto
in256or
nicht ist, so mein Dolmetscher nimmtor
als eine andere Anweisung / Block / howYouCallIt.256or
auch0repeat
und1then
; Ich verwende das offizielle lua von lua.org, Ihr Code wird weder in 5.1, 5.2 noch in 5.3Haskell ,
186178 BytesDies muss mit
runhaskell
(oder inghci
) ausgeführt werden, da beide standardmäßig den Wert auf setzenBufferMode
,NoBuffering
wodurch eine ganze Menge Bytes gespart werden:Probieren Sie es online!
Erläuterung
Dies definiert einen neuen Betreiber
state # source
(die Unveränderlichkeit Erklärung ermöglicht es uns , Klammern zu fallen , wenn sie in Verbindung mit anderen Operatoren(+)
,(-)
,(^)
,(:)
und(>>)
):-1
und256
r#_
), werden neue gelesen und der alte Zustand wird beibehaltenUm den Prozess zu starten, initialisieren wir den Zustand mit
0
und lesen eine neue Quellzeile, dh. Beginnen Sie mit einer leeren Quelle:quelle
Windows Batch,
204256Ignoriert erfolgreich andere Befehle. Wirklich wurde aufgebläht, ohne zu haben
or
arbeiten zu müssen ...Bearbeiten:
quelle
Windows-Befehlsskript - 154
Abusin unbekannte Merkmale bis zur max.
quelle
> <> 258 Bytes
Ich habe eine andere> <> Antwort gemacht, da ich die Phase nicht testen konnte und sie ohnehin vorab gestapelte Befehle verwendete, anstatt eine Shell zu emulieren.
Es kann durchaus Golf gespielt werden, aber ich bin mir nicht sicher, ob ich den nötigen Mut zum
Wahnsinn habe!Ich habe es mit dem offiziellen Interpreter unter Python 3.5 unter Cygwin unter Windows 7 getestet und konnte den Testlauf nachvollziehen:
Falls Sie es auf Ihrem Computer nicht ausführen können (Eingabe scheint schwierig zu sein) oder es nur ohne andere Software ausprobieren möchten, können Sie die folgende Version im Online-Interpreter verwenden .
Es ignoriert offensichtlich \ n und EOF, da Sie sie nicht im Online-Interpreter eingeben können, sondern sich so verhalten, als ob die Eingabetaste nach jedem Ausgabebefehl gedrückt worden wäre.
quelle
C (gcc) 139 Bytes
Kompilieren Sie mit
-Dk="_nZZiaeY"
(in der Byteanzahl enthalten). -2 Bytes, wenn die Eingabeaufforderung>>\n
zulässig ist.Probieren Sie es online!
Degolf
quelle
Keg , 68B
quelle
Haskell, 230
Wenn ich nur diesen lästigen
hFlush stdout
Anruf loswerden könnte ! Ohne diese Option wird die Eingabeaufforderung erst angezeigt, wenn eineo
Operation ausgeführt wird. Irgendein Rat?quelle
hFlush
indem Sie verwenden,runhaskell
anstatt zu kompilieren (siehe meine Antwort ), aber für diese Lösung ist es nicht gültig und es treten Fehler auf.PHP + HTML 345
Die Ausgabe ist etwas lückenhaft (Verlauf / Sitzung wird in einem Textbereich angezeigt, und bei aktivierter Fehlerberichterstattung werden viele Warnungen gedruckt), aber alles funktioniert
quelle
> <>, 239
Der Anfangsstapel ist die Eingabe. Sie können es hier online ausprobieren .
quelle
Golf-Basic 84, 88 Zeichen
Fordert wie in mindestens drei anderen Lösungen jeweils einen Befehl auf. Hier ist ein Testlauf für
xiskisc
:Auch
xiskso
gibt 0, wie es sollte.quelle
JavaScript (Node.js), 204 Bytes
Dies kann wahrscheinlich Golf gespielt werden. Node.js beweist erneut, dass es sich um eine seltsam getarnte Ausführlichkeit handelt. Code erklärt:
quelle
C #, 311 Bytes
wäre 283 Byte, wenn die Verwendung und Klassendeklaration usw. weggelassen werden könnten, indem nur eine Funktionsdefinition angegeben wird
quelle