introduzione
Kipple è un linguaggio di programmazione esoterico basato su stack inventato da Rune Berg nel marzo 2003.
Kipple ha 27 stack, 4 operatori e una struttura di controllo.
Stacks
Le pile sono chiamati a
- z
e contengono interi con segno a 32 bit. C'è anche uno stack speciale @
, per rendere più conveniente la produzione di numeri. Quando viene inserito un numero, vengono invece spinti @
i valori ASCII delle cifre di quel numero. (Ad esempio, se si preme 12 su @
, spingerà invece 49 e poi 50 su @
.)
L'input viene inserito nello stack di input i
prima dell'esecuzione del programma. L'interprete chiederà di memorizzare i valori i
prima dell'esecuzione. Al termine dell'esecuzione, qualsiasi cosa nello stack di output o
viene visualizzata in output come carattere ASCII. Poiché questo è l'unico meccanismo IO di Kipple, è impossibile interagire con un programma Kipple.
operatori
Un operando è un identificatore di stack o un numero intero a 32 bit con segno.
Push: >
o<
Sintassi: Operand>StackIndentifier
oStackIndentifier<Operand
L'operatore Push porta l'operando a sinistra e lo inserisce nello stack specificato. Ad esempio, 12>a
spingerà il valore 12 nello stack a
. a>b
farà apparire il valore più alto dallo stack a
e lo spingerà nello stack b
. Popping uno stack vuoto restituisce sempre 0. a<b
equivale a b>a
. a<b>c
mostra il massimo valore da b
e spinge verso entrambi c
e a
.
Inserisci: +
Sintassi: StackIndentifier+Operand
L'operatore Aggiungi inserisce la somma dell'elemento più in alto nella pila e l'operando nella pila. Se l'operando è uno stack, il valore viene estratto da esso. Ad esempio, se il valore più alto dello stack a
è 1, quindi a+2
spingerà 3 su di esso. Se a
è vuoto, a+2
spingerà 2 su di esso. Se i valori più alti dello stack a
e b
sono 1 e 2, quindi a+b
farà apparire il valore 2 dallo stack b
e spingerà 3 nello stack a
.
Sottrarre: -
Sintassi: StackIndentifier-Operand
L'operatore Sottrai funziona esattamente come l'operatore Aggiungi, tranne per il fatto che sottrae invece di aggiungere.
Chiaro: ?
Sintassi: StackIndentifier?
L'operatore Clear svuota lo stack se il suo oggetto più in alto è 0.
L'interprete ignorerà tutto ciò che non si trova accanto a un operatore, in modo che il seguente programma avrebbe funzionato: a+2 this will be ignored c<i
. Tuttavia, il modo corretto di aggiungere commenti è usando il #
personaggio. Qualsiasi cosa tra #
un carattere di fine riga e viene rimosso prima dell'esecuzione. Il carattere ASCII n. 10 è definito come fine linea in Kipple.
Gli operandi possono essere condivisi da due operatori, ad esempio a>b c>b c?
possono essere scritti come a>b<c?
.
Il programma 1>a<2 a+a
comporterà il a
contenimento dei valori [1 4]
(dal basso verso l'alto) e non [1 3]
. Allo stesso modo per l' -
operatore.
La struttura di controllo
C'è solo una struttura di controllo in Kipple: il loop.
Sintassi: (StackIndentifier code )
Finché lo stack specificato non è vuoto, il codice tra parentesi corrispondenti verrà ripetuto. I loop possono contenere altri loop. Ad esempio, (a a>b)
tutti i valori dello stack verranno spostati nello a
stack b
, anche se l'ordine verrà invertito . Un modo funzionalmente identico, ma più elegante per farlo è (a>b)
.
Esempi
100>@ (@>o)
Questo produrrà 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
Questo stamperà "Hello World!"
. Quando lo o
stack viene emesso, inizia a far apparire i caratteri dall'alto verso il basso.
#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)
)
Questo è un generatore di numeri primi, ma non sono sicuro di come funzioni.
Regole
Devi scrivere un programma / una funzione che interpreta Kipple. Questo programma / funzione può ottenere un programma Kipple tramite un file sorgente o ottenerlo tramite STDIN direttamente dall'utente. Se STDIN non è disponibile, deve ottenerlo dall'input da tastiera e continuare a ricevere l'input fino a quando non viene inserito uno specifico carattere non stampabile. Ad esempio, se l'interprete è scritto in codice macchina x86, otterrebbe il programma Kipple carattere per carattere dalla tastiera e continuerebbe a farlo fino a quando esc(o qualsiasi altro tasto che non emette un carattere stampabile) viene premuto.
Se si verifica un errore, ad esempio un errore di sintassi o un overflow dello stack, è necessario riconoscerlo in qualche modo, ad esempio restituendo 10 anziché 0 o messaggi di errore prodotti dall'interprete / compilatore, MA NON STAMPARE MESSAGGI DI ERRORE .
Per questa sfida si applicano altre regole regolari per il golf del codice.
Il tuo codice verrà testato con alcuni degli esempi nell'archivio degli esempi di Kipple
Questo è un codice-golf . Vincerà il codice più breve in byte. In bocca al lupo!
Nota che esiste un operatore opzionale in Kipple, "
ma non fa parte delle specifiche e è solo una funzione aggiuntiva nell'interprete ufficiale. Non l'ho menzionato qui, quindi non deve essere supportato nella tua richiesta.
In caso di dubbi su qualsiasi parte della specifica, è possibile esaminarla con un interprete ufficiale scritto in Java . Questo scaricherà un file zip contenente il programma compilato e il codice sorgente. È concesso in licenza ai sensi della GPL.
i
se prendo il programma sorgente da stdin?