99 (pronunciato "novantanove") è un nuovissimo linguaggio di programmazione esoterico (da non confondere con 99 , notare il corsivo). Il tuo compito in questa sfida è scrivere un interprete per 99 che sia il più breve possibile. Vince l'invio con il minor numero di byte . Tiebreaker va alla presentazione pubblicata per prima.
Poiché questa domanda è un po 'più approfondita del solito, e sono ansioso di vedere buone risposte, assegnerò una ricompensa di 250 rep alla mia risposta preferita (non necessariamente il vincitore).
99 Spec
99 è un linguaggio imperativo . Ogni riga in un programma 99 è una singola istruzione e durante l'esecuzione, il puntatore dell'istruzione inizia nella riga superiore e attraversa ciascuna delle righe successive in ordine, eseguendole lungo il percorso. Il programma termina quando è stata eseguita l'ultima riga. Le istruzioni Goto possono reindirizzare il percorso del puntatore dell'istruzione.
Newline, spazio e 9
sono gli unici tre personaggi che contano in un programma 99 . Tutti gli altri personaggi sono completamente ignorati. Inoltre, gli spazi finali su ciascuna riga vengono ignorati e più spazi in una riga vengono letti come uno spazio. ("Newline" si riferisce a qualsiasi codifica di interruzione di riga comune . Non importa quale utilizzi l'interprete.)
Quindi questo programma:
9 BLAH 99 9a9bb9c9
9 this line and the next have 6 trailing spaces 9
È identico a questo programma:
9 99 9999
9 9
variabili
Le variabili in 99 hanno tutte nomi che sono 9
uniti da uno o più ( 9+
in regex). Ad esempio, 9
, 99
e 9999999999
sono tutte variabili distinte. Naturalmente ce ne sono infiniti (salvo limiti di memoria).
Il valore di ogni variabile è un numero intero di precisione arbitraria con segno. Per impostazione predefinita, ogni variabile è assegnata alla propria rappresentazione numerica. Quindi, a meno che non sia stato riassegnato, il valore della variabile 9
è il numero 9, e il valore della variabile 99
è il numero 99 e così via. Si potrebbe pensare che tratti le variabili come numeri semplici fino a quando non vengono assegnate esplicitamente.
Userò V
per fare riferimento a un nome di variabile arbitraria di seguito.
Ogni istanza di V
potrebbe essere sostituito con 9
, 99
, 999
, 9999
, etc.
dichiarazioni
Esistono cinque diversi tipi di istruzione in 99 . Ogni riga in un programma 99 contiene esattamente un'istruzione.
La sintassi qui descritta presuppone che tutti i caratteri estranei siano stati rimossi, tutti gli spazi finali siano stati rimossi e tutte le sequenze di spazi multipli siano state sostituite con spazi singoli.
1. Nessuna operazione
Una riga vuota non è operativa . Non fa nulla (oltre a incrementare il puntatore dell'istruzione).
2. Uscita
V
Una singola variabile V
su una riga stampa quella variabile su stdout.
Se V
ha un numero dispari di 9
's ( 9
, 999
, ecc), allora il valore intero V
diviso per 9 verrà stampata (in decimale).
Se V
ha un numero pari di 9
's ( 99
, 9999
ecc), allora l'ASCII carattere con il codice V
diviso per 9, mod 128 sarà stampata. (Cioè (V / 9) % 128
, un valore compreso tra 0 e 127.)
Esempio : il programma
9
9999
stamperebbe 1W
. La prima riga 1
viene W
stampata perché 9/9 è 1. La seconda riga viene stampata perché 9999/9 è 1111 e 1111 mod 128 è 87 e 87 è il codice carattere per W
.
Si noti che le interruzioni di riga non vengono stampate tra i token di output. \n
deve essere esplicitamente stampato per un'interruzione di riga.
3. Input
V
Una singola variabile V
su una linea con uno spazio iniziale prende l'input dallo stdin e lo memorizza in quella variabile.
Se V
ha un numero dispari di 9
allora l'utente può digitare qualsiasi numero intero con V
segno e sarà impostato su 9 volte quel valore.
Se V
ha un numero pari di 9
, l'utente può digitare qualsiasi carattere ASCII e V
sarà impostato a 9 volte il suo codice carattere.
Esempio : dato -57
e A
come input, questo programma
9
9
99
99
sarebbe uscita -57A
. Internamente, la variabile 9
avrebbe il valore -513 e 99
il valore 585.
Il tuo interprete può presumere che gli input siano sempre sintatticamente validi.
4. Cessione
Questa affermazione può essere arbitrariamente lunga. Sono due o più variabili su una linea, separate da spazi:
V1 V2 V3 V4 V5 ...
Questo assegna alla somma di tutti quelli con indici pari, meno la somma di quelli con indici dispari (escluso ). Le assegnazioni sono per valore, non per riferimento.V1
V
V
V1
Potrebbe essere tradotto nella maggior parte delle lingue come .V1 = V2 - V3 + V4 - V5 + ...
Quindi, se ci sono solo due variabili, è normale assegnazione:
V1 V2
→ V1 = V2
Se ce ne sono tre, allora è sottrazione:
V1 V2 V3
→ V1 = V2 - V3
E il segno +
/ -
continua a passare avanti e indietro con ogni variabile aggiuntiva:
V1 V2 V3 V4
→ V1 = V2 - V3 + V4
Esempio : questo programma genererebbe 1110123
:
999 Prints triple-nine divided by nine (111).
999 9 9 Assigns triple-nine to zero (nine minus nine).
999 Prints triple-nine divided by nine (0)
9 999 9 Assigns single-nine to negative nine (zero minus nine).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (1).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (2).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (3).
5. Vai a (salta se tutti zero)
Questa affermazione può anche essere arbitrariamente lunga. Sono due o più variabili su una linea, separate da spazi, con uno spazio iniziale :
V1 V2 V3 V4 V5 ...
Se alcuni dei valori oltre sono diversi da zero, allora questo si comporta proprio come un no-op. Il puntatore dell'istruzione viene spostato nella riga successiva come al solito.V1
Se tutti i valori oltre a zero sono zero, il puntatore dell'istruzione viene spostato sul numero di riga . Le linee sono indicizzate a zero, quindi se è zero, il puntatore si sposta sulla riga superiore. Il programma termina (normalmente, senza errori) se è negativo o è maggiore dell'indice più alto possibile (numero di righe meno uno).V1
V1
V1
V1
Nota che qui non è stato diviso per 9. E poiché è impossibile che una variabile sia un valore che non sia un multiplo di 9, è possibile saltare solo ai numeri di riga multipli di 9.V1
Esempi:
Questo programma stampa 1
per sempre:
9 Prints single-nine divided by nine (always 1).
99 9 9 Assigns double-nine to zero.
99 99 Jumps to line zero (top line) if double-nine is zero.
Questo programma
99999999 Print G.
999 99 Set triple-nine to ninety-nine.
9999999999 9999999999 9999999999 99 99 9 9 999 999 Set 10-nine to zero.
99999999999 9999999999 Set 11-nine to zero.
999 Print triple-nine's value divided by nine. (This is the ninth line.)
99999999 Print G.
999 999 9 Subtract nine from triple-nine.
99999 999 Jump to line 5-nines if triple-nine is zero (ends program).
9 99999999999 9999999999 Jump to line nine if 10-nine and 11-nine are zero (always jumps).
produrrà i numeri da 11 a 1, in ordine decrescente, circondati da G
:
G11G10G9G8G7G6G5G4G3G2G1G
dettagli aggiuntivi
L'interprete ideale verrà eseguito dalla riga di comando con il nome del file di programma 99 come argomento. L'I / O verrà eseguito anche al volo nella riga di comando.
È possibile, tuttavia, scrivere semplicemente una funzione di interprete che accetta il programma come stringa e un elenco di token di input (ad es ["-57", "A"]
.). La funzione dovrebbe stampare o restituire la stringa di output.
Modi leggermente diversi di eseguire l'interprete e gestire l'I / O vanno bene se queste opzioni sono impossibili nella tua lingua.
Bonus: scrivi qualcosa di interessante in 99 e lo inserirò volentieri in questo post come esempio.
- Ecco un Pastebin di un accurato programma "99 Bottiglie di birra" dalla risposta di Mac .
Spero ti sia piaciuta la mia 99a sfida! : D