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 9sono 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 9uniti da uno o più ( 9+in regex). Ad esempio, 9, 99e 9999999999sono 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ò Vper fare riferimento a un nome di variabile arbitraria di seguito.
Ogni istanza di Vpotrebbe 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 Vsu una riga stampa quella variabile su stdout.
Se Vha un numero dispari di 9's ( 9, 999, ecc), allora il valore intero Vdiviso per 9 verrà stampata (in decimale).
Se Vha un numero pari di 9's ( 99, 9999ecc), allora l'ASCII carattere con il codice Vdiviso 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 1viene Wstampata 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. \ndeve essere esplicitamente stampato per un'interruzione di riga.
3. Input
V
Una singola variabile Vsu una linea con uno spazio iniziale prende l'input dallo stdin e lo memorizza in quella variabile.
Se Vha un numero dispari di 9allora l'utente può digitare qualsiasi numero intero con Vsegno e sarà impostato su 9 volte quel valore.
Se Vha un numero pari di 9, l'utente può digitare qualsiasi carattere ASCII e Vsarà impostato a 9 volte il suo codice carattere.
Esempio : dato -57e Acome input, questo programma
9
9
99
99
sarebbe uscita -57A. Internamente, la variabile 9avrebbe il valore -513 e 99il 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.V1VVV1
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 V1V1V1
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 1per 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