Whitespace e Perl, 992 975 caratteri
Buonasera signore e signori.
Per cominciare, ecco la mia presentazione codificata in base64, che ritengo sia il modo migliore per comunicare un ampio programma di spazi bianchi. (Non vuoi davvero usare una codifica che lasci qualsiasi spazio bianco così com'è, quindi non ha senso selezionare qualcosa di più "leggibile".)
c2F5PDwgeDI7c2F5PDwwLDAgIApzYXk8PCB4MjtzYXk8PDAsMCAgCgoJCQogICAJCSAgCSAgCSAJ
CSAgCSAgCQkgCSAJIAkJCQkJICAJCSAJCQkgCQkJCQkgCSAJIAkJIAkgCSAgIAkJCQkJICAgCQkg
IAkgCQkgCSAJCSAJICAgIAkJCQkgCSAgCSAJCSAJICAgIAkgCQkgICAJICAgICAgCQkJIAkJCQkJ
IAkJCSAJCQkJICAgICAJCQkgCSAgICAgIAkJCQkJICAgICAgCQkgICAJCSAgICAJCQkJCQkJCSAg
CSAJIAkgICAJCQkgICAJCQkJCSAgCQkJCSAJICAgIAkgCQkJCQkgCSAgICAgCSAgCSAJICAgICAg
CSAgICAJICAgICAJCSAgIAkJCSAJIAkJCQkJCSAJCSAJIAkgICAgICAgCQkgIAkgICAgICAgICAg
IAkJICAgCSAJCQkgCSAgICAgCQkJCQkJIAkgICAgCQkJCSAJCQkJICAJCQkgICAJCQkgCSAgCSAg
IAkJCQkgIAkJIAkJCSAgIAkJCSAJCQkgCQkJICAJCSAJICAJIAkJCSAJIAkgCQkgICAgIAkgCSAJ
ICAJICAJIAkJICAgICAJIAkgICAgCQkJCSAgCSAJCSAJIAkJIAkgIAkgCSAJCSAJCSAJCSAJCQkg
CQkJICAgIAkJCSAgCSAgCQogICAJICAgICAJCQkJCSAJCSAJIAkgCSAJICAJCQkgICAJICAgCSAg
ICAJCSAJICAgICAgICAgCSAgIAkJCQkgCQkgICAgCQkgCSAJICAJCQkgCQkJCSAJCQkgICAJICAg
IAkgCSAJCQkgIAkJCQkgCSAJCSAJIAkgCQkJCSAJICAJIAkJIAkgICAJCiAKICAKICAgIAogCSAg
CQoKICAJCiAKICAgIAkJCQkgCSAKCSAJCQkKICAgICAJCQkJIAkgCgkgCSAgCiAgIAkJCgkgIAoK
CQkJCiAKCgoJIAkKICAgCSAgIAkgIAoKIAkKIAkgIAkKCiAJIAogICAJIAoKIAkKCiAJIAoKIAkK
CQogCSAgIAkgCgogCQoKCgoKICAgCiAgIAogCiAKIAkKCiAJCgogICAgCiAKIAoJIAogCiAgICAJ
IAoJIAkJIAoJICAgCSAKCSAJIAogCSAgCgogIAogCiAgICAJCQoJIAkJICAJCSAJCQkKCSAgCiAg
CQkJICAgCgkgCQkgICAJICAgICAKCSAgIAkKICAgICAJCQoJIAkgIAogICAJCQoJICAKCgkJCiAK
CgoJCjAK
Ecco un estratto che evidenzia tutte le parti visibili della fonte. ⇥
è usato per indicare una scheda e ↲
per indicare una nuova riga.
say<< x2;say<<0,0 ↲
say<< x2;say<<0,0 ↲
↲
⇥⇥↲
⇥⇥ ⇥ [... etcetera ... skipping rest of a really long line ...]↲
⇥⇥⇥ ⇥⇥[... etcetera ... shorter but still quite a long line ...]↲
↲
↲
↲
⇥ ⇥↲
[... etcetera ... whole lotta whitespace in here ...]
⇥⇥↲
↲
↲
↲
⇥↲
0↲
Perl è stata la scelta naturale per la seconda lingua in questa sfida, essendo una delle migliori lingue di uso generale per scrivere quines compatte. Il mio più breve Perl quine è di 19 byte:
say<< x2
say<< x2
- e puoi vedere come è stato il seme per la metà Perl della doppia quina. Il mio miglior quine di Whitespace, in confronto, è lungo 541 byte. (Sebbene esistano quelli più brevi - 445 byte è il migliore che abbia mai visto.)
Dal punto di vista dell'interprete Perl, la prima riga del file sorgente del doppio quine contiene le due istruzioni che compongono l'intero programma come i contenuti rimanenti sono due stringhe tra virgolette. La prima stringa è la riga ripetuta di Perl ed è delimitata dalla terza riga vuota. La seconda stringa è interamente bianca e viene eseguita dalla quarta riga dell'origine fino al 0
delimitatore nella parte inferiore del file.
Se prese come un programma di spazi bianchi, le prime quattro righe contengono tre istruzioni che sono in gran parte inutili. (Il loro effetto è quello di spingere due valori zero nello stack e quindi scartare il secondo.) Sono inclusi solo per superare in sicurezza le nuove linee richieste dal programma Perl - il vero programma inizia dopo. Piuttosto che citare ulteriormente la fonte illeggibile, ecco una parafrasi delle istruzioni che compongono il programma Whitespace, in un formato simile ad un assembly:
# Representation of "say<< ;say<<0,0 \n" in base 122 as ASCII chars.
PERLCODE = 44892457841068708924520433691075560592081
# Represention of the whitespace program, following the "push PERLCODE"
# instruction, in base 3 (see comments on wsout).
WSCODE = 9823454421986355730445143846606456399449033186160554878002671428613111806443504867738858766142050504887335990409088441824104338753030405625930185
# Set up the stack and the heap. The first three instructions are not
# particularly useful; they're just there to skip past the newlines in
# the Perl code. (Though the initial zero on the stack does get used
# at the very end.)
push 0
push 0
jneg wsout
push WSCODE
push PERLCODE
dup
dup
push 0
copy 1
# Output the first four lines of the file.
perl: dup
mod 122
putchar
div 122
dup
jnzero perl
pop
jzero perl
push 68 # represents "jneg wsout"
call wsout
# Output the rest of the file.
copy 1
call pushout
push 2
call wsout
call pushout
call wsout
putnum
push 2
call wsout
exit
# pushout: Output a Whitespace push instruction, using the number on
# the top of the stack as the instruction's argument. (Recursion is
# used to output the bits MSB-first.)
pushout:
push 0
dup
call wsout
call wsout
bits: dup
jzero bitend
dup
mod 2
swap
div 2
call bits
bitend: call wsout
ret
# wsout: Output a sequence of whitespace characters as represented by
# the number on the top of the stack. The number is read in base 3,
# LSB-first, with 0 = SPC, 1 = TAB, 2 = NL. Calling wsout with a value
# of zero will output a single space.
wsout:
dup
mod 3
mul -23 # some ugly math that transforms
mod -24 # (0, 1, 2) into (32, 9, 10)
add 32
putchar
div 3
dup
jnzero wsout
pop
ret
I numeri giganti nella parte superiore sono ciò che gli utenti di Whitespace devono usare al posto delle stringhe reali. Non preoccuparti di provare a eseguirlo su un interprete di Whitespace che non ha il giusto supporto bignum.
Infine, ecco di nuovo il programma, ma questa volta con escape in stile C, poiché è stato specificamente richiesto:
say<< x2;say<<0,0 \nsay<< x2;say<<0,0 \n\n\t\t\n \t\t \t \t \t\t \t \t\t \t \t \t\t\t\t\t \t\t \t\t\t \t\t\t\t\t \t \t \t\t \t \t \t\t\t\t\t \t\t \t \t\t \t \t\t \t \t\t\t\t \t \t \t\t \t \t \t\t \t \t\t\t \t\t\t\t\t \t\t\t \t\t\t\t \t\t\t \t \t\t\t\t\t \t\t \t\t \t\t\t\t\t\t\t\t \t \t \t \t\t\t \t\t\t\t\t \t\t\t\t \t \t \t\t\t\t\t \t \t \t \t \t \t \t\t \t\t\t \t \t\t\t\t\t\t \t\t \t \t \t\t \t \t\t \t \t\t\t \t \t\t\t\t\t\t \t \t\t\t\t \t\t\t\t \t\t\t \t\t\t \t \t \t\t\t\t \t\t \t\t\t \t\t\t \t\t\t \t\t\t \t\t \t \t \t\t\t \t \t \t\t \t \t \t \t \t \t\t \t \t \t\t\t\t \t \t\t \t \t\t \t \t \t \t\t \t\t \t\t \t\t\t \t\t\t \t\t\t \t \t\n \t \t\t\t\t\t \t\t \t \t \t \t \t\t\t \t \t \t\t \t \t \t\t\t\t \t\t \t\t \t \t \t\t\t \t\t\t\t \t\t\t \t \t \t \t\t\t \t\t\t\t \t \t\t \t \t \t\t\t\t \t \t \t\t \t \t\n \n \n \n \t \t\n\n \t\n \n \t\t\t\t \t \n\t \t\t\t\n \t\t\t\t \t \n\t \t \n \t\t\n\t \n\n\t\t\t\n \n\n\n\t \t\n \t \t \n\n \t\n \t \t\n\n \t \n \t \n\n \t\n\n \t \n\n \t\n\t\n \t \t \n\n \t\n\n\n\n\n \n \n \n \n \t\n\n \t\n\n \n \n \n\t \n \n \t \n\t \t\t \n\t \t \n\t \t \n \t \n\n \n \n \t\t\n\t \t\t \t\t \t\t\t\n\t \n \t\t\t \n\t \t\t \t \n\t \t\n \t\t\n\t \t \n \t\t\n\t \n\n\t\t\n \n\n\n\t\n0\n