7 , 2 byte
7 utilizza un set di caratteri a 3 bit, ma accetta input impacchettato in byte (e in base a meta, le lingue con set di caratteri sub-byte vengono conteggiate utilizzando byte per il file su disco ). Ecco un xxd
dump del programma:
00000000: 4cf4 L.
Quando si dà questo file all'interprete 7, verrà emesso il seguente programma:
00000000: 4fa6 7f O..
che a sua volta produrrà nuovamente il programma originale.
Quindi cosa sta succedendo qui? Non è prevista la lettura della fonte (in realtà, non credo sia possibile leggere la fonte in 7), anche se probabilmente il programma sta barando in un altro modo; Fatemi sapere cosa ne pensate. Ecco come funziona il programma. (Si noti che ogni comando 7 ha due varianti, alcune delle quali non hanno nomi e non possono apparire nel programma originale. Ci sono dodici comandi in totale, in sei coppie. Sto usando grassetto per comandi attivi, non grassetto per passivo comandi, e nei casi in cui il comando attivo non ha nome, gli sto assegnando lo stesso nome del comando passivo corrispondente e faccio affidamento sul grassetto per distinguere. Nel caso in cui entrambi siano denominati, ad esempio 7
quale sia la variante attiva di 1
, ogni comando ha il suo nome e il grassetto è solo l'evidenziazione della sintassi.)
231 7 23 Programma originale, non imballato in ottale
231 Spingi 237 sullo stack
23 Spingere 23 sulla pila
(implicito) aggiungi una copia della parte superiore dello stack al programma
2 Duplicate top of stack (attualmente 23 )
3 Output top of stack, pop pop stack element
A questo punto, l'interprete 7 vede che la parte superiore dello stack contiene comandi ( 2
e 3
) che non sono rappresentabili, quindi sfugge alla parte superiore dello stack, producendo 723
(che è). Il primo comando output seleziona il formato di output; in questo caso, è formato 7, "formatta l'output nello stesso modo del programma". Quindi i comandi ottengono un output impacchettato in byte. Quindi il programma continua:
231 7 23 23
(implicito) aggiungi una copia della parte superiore dello stack al programma
2 Duplicate top of stack (attualmente 237 )
3 Output top of stack, pop secondo stack element
7 Spingete un elemento vuoto sulla pila
A questo punto, non ci sono altro che elementi dello stack vuoti nello stack, quindi il programma viene chiuso. Abbiamo prodotto 23
prima. Se fuggiamo 237
(e dobbiamo farlo, perché contiene comandi non rappresentabili), otteniamo 7231
. Ciò ottiene direttamente l'output, producendo l'output finale del programma 237231
(formattato nello stesso modo del programma, ovvero compresso in byte). Questo è 4fa67f
. (Si può notare che 1
era del tutto inutile in termini di effetti sull'output; l'unica ragione per cui è lì è rendere diversi i due programmi.)
La corsa 237231
procede quasi esattamente allo stesso modo; la differenza è che l'inutile 1
viene eseguito subito dopo la prima stampa (e l'elemento vuoto viene implicitamente eliminato la seconda volta che viene raggiunta la fine corrente del programma). Ancora una volta, 231
finisce per emettersi, 23
finisce per presentarsi preceduto da un 7
, e otteniamo 231723
, il programma originale.
L'osservatore potrebbe notare che i due programmi, nonostante abbiano la stessa lunghezza nell'ottale "nativo" della lingua, hanno lunghezze diverse sul disco. Questo perché un programma 7 può essere riempito con un numero arbitrario di 1 bit e il formato compresso scarta il riempimento finale. Ecco come avviene la codifica:
2 3 1 7 2 3
010011001111010011(1...)
4 c f 4 padding
In altre parole, due byte 4C
F4
sono sufficienti per rappresentare il programma, quindi è tutto ciò che ho usato.