Contatori di rilevamento del linguaggio poliglotta pseudo-quine


11

Quines sono divertenti. Anche i poliglotti sono divertenti. Esistono i Polyglot Quines, ma possiamo alzare ulteriormente il livello.

Scrivi un file che contiene un programma valido per le lingue α, β e γ. Quando il file viene eseguito (possibilmente dopo averlo compilato) come programma α o β in lingua, l'output del programma deve avere la stessa forma di un invio valido a questo concorso. Se il tuo file viene eseguito come un programma lingua γ, deve generare un numero. Il valore di questo numero è la catena di esecuzioni precedenti del programma interpretata come un numero binario.

Questa spiegazione potrebbe essere un po 'difficile da capire, quindi ecco un esempio. Sia Α, Β e Γ funzioni che eseguono il loro input come lingua α, β o γ resp. programma e restituisce l'output di questi programmi. Lascia che x sia un valido contributo a questo concorso. Quindi la seguente espressione, in cui elaboriamo x attraverso il linguaggio β, α, β, α, α, β e γ, produrrà 41, poiché 41 10 = 101001 2 .

Γ (Β (Α (Α (Β (Α (Β ( x )))))))

Non puoi presumere che la penultima esecuzione nella catena sia un'esecuzione nel linguaggio β. Nel caso in cui l'invio originale sia eseguito direttamente come un programma lingua γ, stampa 0.

Il tuo programma deve comportarsi correttamente per un massimo di sedici raccolte nella catena; cioè, il numero più alto che il tuo programma potrebbe stampare alla fine è 2 15 - 1. Naturalmente, il tuo programma può supportare catene di compilazione più lunghe.

Questo è un concorso di popolarità per incoraggiare soluzioni creative. La presentazione con il conteggio dei voti più alti vince.


Le tre lingue possono essere uguali (anche se ridurrebbe drasticamente i voti positivi)?
Zgarb,

6
@Zgarb Mi piacerebbe vedere una soluzione in cui alcune (o tutte) le lingue siano uguali. Vediamo come riesci a distinguere lingue uguali.
FUZxxl,

1
...Vedo. : DI ha letto la sfida troppo in fretta.
Zgarb,

@Zgarb che ne pensi delle diverse versioni della stessa lingua? magic += Number(System.env.lang_version[-1])
John Dvorak,

1
+1 per l'utilizzo di lettere greche anziché noiose a,b,co 1,2,3=)
flawr

Risposte:


13

Python 2, Python 3,> <> (Pesce)

#;n0
import sys
x='\\\'\nn#;n0import sysx=v=int(1/2*2)sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])n'
v=int(1/2*2)
sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])

Spiegazione Python

Gli interpreti Python 2 e Python 3 funzionano in modo simile, tranne per il fatto che la v=int(1/2*2)variabile ottiene valori diversi ( 0e 1) poiché Python 2 usa la divisione float e Python 3 usa la divisione intera.

Ad ogni esecuzione aggiungono l'espressione +0*2o +1*2 alla prima riga (dopo #;n) e alla xstringa (dopo l'ultimo comando di scrittura). L'interprete> <> usa la prima aggiunta e i Python usano la seconda per creare quine corrette.

Codice dopo B(A(B(B(x)))):

#;n+1*2+0*2+1*2+1*20
import sys
x='\\\'\nn#;n0import sysx=v=int(1/2*2)sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])+1*2+0*2+1*2+1*2n'
v=int(1/2*2)
sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])

> <> (Pesce) spiegazione

Quando si esegue l'interprete> <>, il puntatore del codice rimbalza indietro dagli #avvolgimenti attorno alla prima riga e partendo dalla fine della prima riga e la direzione Ovest inizia a spingere i numeri sullo stack. Se un operatore arriva ( +o *) estrae i primi due elementi dalla pila e respinge il risultato. Con questo metodo finiamo con la rappresentazione base2 delle esecuzioni precedenti ( 13nell'esempio precedente). Questo è il numero desiderato, quindi lo emettiamo con ne terminiamo con ;.


È molto carino
FUZxxl,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.