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- ze 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 iprima dell'esecuzione del programma. L'interprete chiederà di memorizzare i valori iprima dell'esecuzione. Al termine dell'esecuzione, qualsiasi cosa nello stack di output oviene 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>StackIndentifieroStackIndentifier<Operand
L'operatore Push porta l'operando a sinistra e lo inserisce nello stack specificato. Ad esempio, 12>aspingerà il valore 12 nello stack a. a>bfarà apparire il valore più alto dallo stack ae lo spingerà nello stack b. Popping uno stack vuoto restituisce sempre 0. a<bequivale a b>a. a<b>cmostra il massimo valore da be spinge verso entrambi ce 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+2spingerà 3 su di esso. Se aè vuoto, a+2spingerà 2 su di esso. Se i valori più alti dello stack ae bsono 1 e 2, quindi a+bfarà apparire il valore 2 dallo stack be 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+acomporterà il acontenimento 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 astack 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 ostack 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.
ise prendo il programma sorgente da stdin?