Contadores de detecção de linguagem poliglota pseudoquina


11

Quines são divertidos. Poliglotas são divertidos também. Existem Quines Poliglotas, mas podemos elevar ainda mais a fasquia.

Escreva um arquivo que contenha um programa válido para os idiomas α, β e γ. Quando o arquivo é executado (possivelmente após compilá-lo) como um programa de idioma α ou β, a saída do programa deve ter a mesma forma que uma submissão válida para este concurso. Se o seu arquivo for executado como um programa de idioma γ, ele emitirá um número. O valor desse número é a cadeia de execuções anteriores do programa, interpretada como um número binário.

Essa explicação pode ser um pouco difícil de entender, então aqui está um exemplo. Seja Α, and e functions funções que executam sua entrada como um idioma α, β ou γ resp. programa e retorne a saída desses programas. Seja x um envio válido para este concurso. Então a expressão a seguir, onde processamos x através da linguagem β, α, β, α, α, β e γ nesta ordem, produzirá 41, uma vez que 41 10 = 101001 2 .

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

Você não pode assumir que a penúltima execução na cadeia é uma execução na linguagem β. No caso em que o envio original for executado diretamente como um programa de idioma γ, ele deverá imprimir 0.

Seu programa deve se comportar corretamente por até dezesseis compilações na cadeia; isto é, o número mais alto que seu programa pode imprimir no final é 2 15 - 1. É claro que seu programa tem permissão para suportar cadeias de compilação mais longas.

Este é um concurso de popularidade para incentivar soluções criativas. A finalização com o maior número de votos vence.


Os três idiomas podem ser iguais (mesmo que isso reduza drasticamente os votos positivos)?
Zgarb

6
@ Zgarb Eu adoraria ver uma solução em que alguns (ou todos) os idiomas sejam iguais. Vamos ver como você consegue distinguir idiomas iguais.
FUZxxl 12/02

1
...Eu vejo. : Eu li o desafio apressadamente.
Zgarb

@Zgarb, que tal diferentes versões do mesmo idioma? magic += Number(System.env.lang_version[-1])
John Dvorak

1
1 para a utilização de letras gregas, em vez da perfuração a,b,cou 1,2,3=)
flawr

Respostas:


13

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

#;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])

Explicação do Python

Os intérpretes Python 2 e Python 3 funcionam de maneira semelhante, exceto que a v=int(1/2*2)variável obtém valores diferentes ( 0e 1), pois o Python 2 usa a divisão float e o Python 3 usa a divisão inteira.

Em cada execução, eles adicionam a expressão +0*2ou +1*2 à primeira linha (depois #;n) e à xsequência (após o último comando de gravação). O intérprete> <> usa a primeira adição e os Pythons usam a segunda para criar quines corretos.

Código após 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])

Explicação> <> (Fish)

Quando você executa o intérprete> <>, o ponteiro do código retorna dos #envoltórios em torno da primeira linha e a partir do final da primeira linha e na direção oeste começa a empurrar números para a pilha. Se um operador vier ( +ou *), ele solta os dois principais elementos da pilha e empurra o resultado de volta. Com esse método, terminamos com a representação base2 das execuções anteriores ( 13no exemplo anterior). Este é o número desejado, então o produzimos ne terminamos com ;.


Isso é muito legal.
FUZxxl
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.