Einführung
Kipple ist eine Stack-basierte, esoterische Programmiersprache, die im März 2003 von Rune Berg erfunden wurde.
Kipple hat 27 Stapel, 4 Bediener und eine Kontrollstruktur.
Stapel
Die Stapel heißen a
- z
und enthalten 32-Bit-Ganzzahlen mit Vorzeichen. Es gibt auch einen speziellen Stapel @
, um die Ausgabe von Zahlen zu vereinfachen. Wenn auf eine Nummer gedrückt wird @
, werden stattdessen die ASCII-Werte der Ziffern dieser Nummer gedrückt. (Wenn Sie beispielsweise 12 bis @
drücken, werden @
stattdessen 49 und dann 50 bis gedrückt.)
Die Eingabe wird auf den Eingabestapel geschoben, i
bevor das Programm ausgeführt wird. Der Interpreter fragt nach Werten, die i
vor der Ausführung gespeichert werden sollen . Nach Abschluss der Ausführung wird alles im o
Ausgabestapel als ASCII-Zeichen ausgegeben. Da dies der einzige E / A-Mechanismus von Kipple ist, ist die Interaktion mit einem Kipple-Programm nicht möglich.
Betreiber
Ein Operand ist entweder eine Stapelkennung oder eine vorzeichenbehaftete 32-Bit-Ganzzahl.
Drücken Sie: >
oder<
Syntax: Operand>StackIndentifier
oderStackIndentifier<Operand
Der Push-Operator nimmt den Operanden nach links und schiebt ihn auf den angegebenen Stapel. Zum Beispiel 12>a
wird der Wert 12 auf den Stapel geschoben a
. a>b
wird den obersten Wert vom Stapel nehmen a
und auf den Stapel schieben b
. Das Platzen eines leeren Stapels a<b
ergibt immer 0. ist äquivalent zu b>a
. a<b>c
Ermittelt den höchsten Wert von b
und drückt auf beide c
und a
.
Hinzufügen: +
Syntax: StackIndentifier+Operand
Der Operator Add schiebt die Summe des obersten Elements auf dem Stapel und des Operanden auf den Stapel. Wenn es sich bei dem Operanden um einen Stapel handelt, wird der Wert daraus abgerufen. Wenn zum Beispiel der oberste Wert des Stapels a
1 ist, a+2
wird 3 darauf gedrückt. Wenn a
leer, a+2
wird 2 darauf gedrückt. Wenn die obersten Werte von stack a
und b
1 und 2 sind, a+b
wird der Wert 2 vom Stack genommen b
und 3 auf den Stack geschoben a
.
Subtrahieren: -
Syntax: StackIndentifier-Operand
Der Subtraktionsoperator funktioniert genauso wie der Additionsoperator, außer dass er subtrahiert, anstatt zu addieren.
Klar: ?
Syntax: StackIndentifier?
Der Operator "Löschen" leert den Stapel, wenn das oberste Element 0 ist.
Der Dolmetscher wird alles ignorieren , die nicht neben einen Operator ist, so dass das folgende Programm funktionieren würde: a+2 this will be ignored c<i
. Die richtige Möglichkeit zum Hinzufügen von Kommentaren ist jedoch die Verwendung des #
Zeichens. Alles zwischen einem #
und einem Zeilenendezeichen wird vor der Ausführung entfernt. Das ASCII-Zeichen Nr. 10 wird in Kipple als Zeilenende definiert.
Operanden können von zwei Operatoren gemeinsam verwendet werden, z. B. a>b c>b c?
geschrieben als a>b<c?
.
Das Programm 1>a<2 a+a
führt in a
den Werten , die [1 4]
(von unten nach oben) und nicht [1 3]
. Ebenso für den -
Betreiber.
Die Kontrollstruktur
Es gibt nur eine Kontrollstruktur in Kipple: die Schleife.
Syntax: (StackIndentifier code )
Solange der angegebene Stapel nicht leer ist, wird der Code in den entsprechenden Klammern wiederholt. Loops können andere Loops enthalten. Zum Beispiel (a a>b)
werden alle Werte des Stapels a
auf den Stapel verschoben b
, obwohl die Reihenfolge umgekehrt wird . Eine funktional identische, aber elegantere Art, dies zu tun, ist (a>b)
.
Beispiele
100>@ (@>o)
Dies wird ausgegeben 100
33>o 100>o 108>o 114>o 111>o 87>o 32>o 111>o 108>o 108>o 101>o 72>o
Dies wird gedruckt "Hello World!"
. Wenn der o
Stapel ausgegeben wird, beginnt er, Zeichen von oben nach unten zu platzieren.
#prime.k by Jannis Harder
u<200
#change 200
k<2>m
u-2
(u-1 u>t u>z u<t
(k>e e+0 e>r)
(e>k)
m+1
m>t
m>z
m<t
t<0>z? t?
1>g
(r>b
m+0 m>a
b+0 b>w
(a-1
b+0 b>j
j?
1>s
(j<0>s j?)
s?
(s<0 w+0 w>b s?)
a>t
a>z
t>a
b-1
b>t
b>z
t>b
z<0>t? z?
a?)
b?
1>p
(b<0 b? 0>p)
p?
(p 0>r? 0>p? 0>g)
)
g?
(g m+0 m>k 0>g?)
u?)
(k>@
10>o
(@>o)
)
Dies ist ein Primzahlengenerator, aber ich bin nicht sicher, wie es funktioniert.
Regeln
Sie müssen ein Programm / eine Funktion schreiben, die Kipple interpretiert. Dieses Programm / diese Funktion kann ein Kipple-Programm über eine Quelldatei oder direkt vom Benutzer über STDIN erhalten. Wenn STDIN nicht verfügbar ist, muss es über die Tastatureingabe abgerufen werden und die Eingabe fortgesetzt werden, bis ein bestimmtes nicht druckbares Zeichen eingegeben wird. Wenn Ihr Interpreter beispielsweise in x86-Maschinencode geschrieben ist, wird das Kipple-Programm zeichenweise von der Tastatur abgerufen, und dies wird fortgesetzt, bis esc(oder eine andere Taste, die kein druckbares Zeichen ausgibt) gedrückt wird.
Wenn ein Fehler vorliegt, z. B. ein Syntaxfehler oder ein Stapelüberlauf, muss er dies auf irgendeine Weise bestätigen, z. B. durch Rückgabe von 10 anstelle von 0 oder Fehlermeldungen, die vom Interpreter / Compiler ausgegeben werden , ABER KEINE DRUCKFEHLERMELDUNGEN .
Alle anderen regulären Regeln für Code-Golf gelten für diese Herausforderung.
Ihr Code wird anhand einiger Beispiele im Kipple- Beispielarchiv getestet
Dies ist ein Code-Golf . Der kürzeste Code in Bytes gewinnt. Viel Glück!
Beachten Sie, dass es in Kipple einen optionalen Operator gibt, der "
jedoch nicht Teil der Spezifikation und nur eine zusätzliche Funktion im offiziellen Interpreter ist. Ich habe es hier nicht erwähnt, so dass es in Ihrer Einreichung nicht unterstützt werden muss.
Wenn Sie irgendwelche Zweifel an einem Teil der Spezifikation haben, können Sie diese mit einem in Java geschriebenen offiziellen Interpreter untersuchen . Dadurch wird eine Zip-Datei mit kompiliertem Programm und Quellcode heruntergeladen. Es ist unter der GPL lizenziert.
quelle
i
wenn ich das Quellprogramm von stdin übernehme?Antworten:
C
709702 BytesDie Bytewertung wird mit Zeilenumbrüchen (die entfernt werden können) entfernt, aber zum leichteren Lesen poste ich sie hier mit Zeilenumbrüchen:
Kompilieren Sie mit
gcc -w golf.c
(-w
Stille Warnungen für Ihre geistige Gesundheit).Unterstützt alles außer der
i
Eingabe, da der Fragesteller noch nicht auf meine Anfrage geantwortet hat, wie es geht, wenn Sie den Code von stdin nehmen. Es werden keine Syntaxfehler gemeldet.quelle
./a.out < prime.k
.Ruby, 718 Bytes (derzeit nicht konkurrierend)
Ich bin sehr müde
Die Datei wird als Befehlszeilenargument geladen und die Eingabe wird über STDIN gesendet. Alternativ können Sie die Datei an STDIN weiterleiten, wenn Sie keine Eingabe in Ihr
i
Register benötigen .Aufgrund einiger Unklarheiten in Bezug auf die Spezifikation wird die aktuelle Version nichta<b>c
ordnungsgemäß verarbeitet und ist daher erst dann konkurrierend, wenn sie behoben ist.a<b>c
ist jetzt behoben. Es gibt jedoch immer noch das falsche Ergebnis zurück, wenn die Primzahlenfunktion ausgeführt wird, sodass es immer noch eine nicht konkurrierende Antwort ist.quelle
0 1 1 2 4 8 16...
Ich frage mich, ob es ein Spezifikationsfehler ista+0
Unsinn/(\((\g<1>|\s)+\)|[^()\s]+)/m
, die zum Teilen von Tokens und Token-Gruppen verwendet wird, ordnungsgemäß behandeln . ( Teste es auf regex101 ). Es ist wahrscheinlich ein Fehler im Rest meiner Analyse, aber ich weiß nicht wo.