Normalmente, os poliglotas são construídos de tal maneira que cada idioma pode ignorar partes do código que estão presentes em outros idiomas, envolvendo-os em literais de string, usando sintaxe de comentário ou outros truques semelhantes.
Seu objetivo é escrever uma poliglota em que a saída para cada idioma seja o código da poliglota que produz essa saída. Especificamente, a saída deve ser construída a partir do código poliglota apenas com exclusões e deve ser uma solução no idioma especificado.
Regras
- Somente quines apropriados são permitidos (sem leitura do código fonte, sem entrada de entrada, a saída deve ser STDOUT ou a alternativa mais próxima se STDOUT não for uma opção e os programas devem consistir em mais do que apenas literais que são impressos implicitamente).
- Como idiomas diferentes podem usar codificações diferentes, os bytes brutos são o que importa aqui. Por exemplo, se o idioma A usar UTF-8 e o idioma B usar CP437, o código (hex)
C3 88 46 47
seráÈFG
para o idioma A eÈFG
para o idioma B. - Todas as saídas devem ser distintas (novamente, comparando bytes brutos). Isso evita complicações com a tentativa de restringir versões de idiomas menores - se dois idiomas usam a mesma parte do código para fazer a mesma coisa, você não pode reivindicar os dois.
- Se você tiver dois idiomas A e B, que
XY
sejam uma saída válida em ambos, masYZ
também seja válido em B, poderá escolherXY
como saída para A eYZ
como saída para B, para poder reivindicar os dois em sua pontuação ( mas você não pode reivindicar osXY
dois idiomas por causa da regra acima).
- Se você tiver dois idiomas A e B, que
- Todas as saídas devem ser tão curtas quanto possível. Por exemplo, se seu código fosse
print('foo')#something
, para Python 3 (ignorando o fato de que a saída não está correta), o código que você precisaria produzir seriaprint('foo')
eprint('foo')#
não seria permitido. Se houver várias cadeias de comprimento igual (mínimo) que produzam a saída correta, você pode escolher qualquer uma delas. - As inscrições devem ser poliglotas em pelo menos 2 idiomas.
- Sua pontuação será dada por
(number of programming languages with distinct outputs)**3/(total byte size of polyglot)
. A pontuação mais alta vence. No caso de duas submissões atingirem a mesma pontuação, a submissão que atingir essa pontuação primeiro vencerá.
code-challenge
quine
polyglot
Mego
fonte
fonte
Respostas:
GolfScript + CJam + Fissão 2 + Geléia , 4 idiomas, 24 bytes, pontuação 2.667
Vamos começar com o hex dump:
Para GolfScript, CJam e Fission 2, interpretamos isso em alguma codificação de byte único compatível com ASCII, como ISO 8859-1 (a codificação exata não importa, porque as linguagens definem os operadores apenas para caracteres ASCII):
Onde
<DEL>
está o caractere de controle0x7f
.No Jelly, supõe-se que isso esteja na página de código do próprio Jelly, onde fica assim:
GolfScript
A
e
última linha é uma variável desconhecida e#
comenta o restante da linha, portanto, isso imprimecom um avanço de linha à direita. Esta é a versão poliglota GolfScript / CJam do quine padrão:
Experimente o poliglota. | Experimente o quine.
CJam
Aqui,
e#
comenta a última linha, de forma quase idêntica, isso imprimesem avanço de linha à direita.
Experimente o poliglota | Experimente o quine.
Fissão
A fissão vê apenas a segunda linha, que é o padrão de fissão, portanto imprime
Não posso fornecer um link online para o poliglota aqui, porque o TIO envia o arquivo para Fission como UTF-8, mas o Fission lê o byte de origem a byte, o que torna a última linha muito longa. No entanto, testei isso localmente com um arquivo codificado ISO 8859-1 (no qual a última linha tem o mesmo comprimento que a segunda), para confirmar que isso funciona.
Experimente o quine.
Geléia
O pilcrow é um alias para feeds de linha no Jelly, portanto, a fonte é equivalente a:
Todos, exceto a última linha de um programa Jelly, são "links auxiliares" (ou seja, funções) que podem ser ignorados a menos que sejam chamados, desde que sejam sintaticamente válidos. Esta é realmente a razão pela qual o
3
primeiro vem nos programas CJam e GolfScript, porque, caso contrário,"
não poderá ser analisado no Jelly.Caso contrário, como a função não é chamada, o programa é equivalente a apenas sua segunda linha, que é o padrão Jelly Quine.
Experimente o poliglota. | Experimente o quine.
fonte
> <> + Python, 2 idiomas,
5146 bytes, pontuação ~ =0,160,17Como ainda não há respostas, começarei com uma simples
Experimente para > <> e Python
Para> <> a primeira linha é um quine (# reflete ", coloca a linha inteira na pilha, pressionamos 34 (código para") e imprimimos tudo), a execução nunca sai dela, portanto ignora efetivamente o restante o código.
Para Python, a primeira linha é um comentário, enquanto a segunda é uma quine (abordagem padrão em python, usando substituição de string com a mesma string dos dois argumentos).
fonte
.
! Eu adaptei meu quine usando essa abordagem, apesar de preferir manter a string em sentido inverso (pois isso economiza bytes) e evitar o usog
(já que ela pode ser interpretada como "lendo o código-fonte")JavaScript + Python 2 + Japonês, 3 idiomas, 132 bytes, pontuação ~ = 0,205
Isso imprime
em JavaScript (apenas no Firefox),
em Python 2 e
em Japt. ( Teste online! )
Javascript
Isto é o que o JavaScript vê:
A primeira linha é no-op porque
A
não é usada de forma alguma. Os segundo conjuntos de linhaS
para a cadeiaS=%s;console.log(S,uneval(S))
, e os terceiros imprime-o depois substituindo o%s
com auneval
representação da edS
(apenasS
entre aspas). O resultado é uma solução em JavaScript.Python
Isso é basicamente o que o Python vê:
A primeira linha é praticamente no-op; a única parte importante é
A=1
o final. Isso se transformaA
em um número para que a divisão inteiraA//2
na segunda linha não gere um erro.A segunda linha é basicamente da mesma maneira, exceto que é definida
S
como a sequênciaS=%r;print S%%S
. A terceira linha é impressaS
após a substituição da%r
representação bruta deS
(apenasS
entre aspas simples). O resultado é uma solução em Python 2.Japt
Este é o código JavaScript que o interpretador Japt vê:
Como você pode ver, é basicamente o mesmo que a resposta JavaScript, com uma exceção principal: as duas últimas linhas são combinadas. Como resultado, é isso que o intérprete realmente vê:
A primeira linha é
A
definida como a coluna Japt e a segunda éS
parte da coluna JS. No Japt, no entanto, apenas a última expressão é enviada para a saída; isto éA
, então a saída é`i96d)p2`i96d)p2
.fonte
uneval
? Não funciona para mimJolf +> <>, pontuação = 2 ** 3/15 = 0,533 ....
Trabalhando em adicionar outro idioma para isso.
fonte
> <>, Python 2 e 3, 3 idiomas, 107 bytes, pontuação = 27/107 ~ = 0,252
Experimente on-line: Python 2 , Python 3 , > <>
A saída do Python 3 é exatamente a segunda linha, e a saída do Python 2 é essa solução . A saída> <> é a primeira linha.
Explicação
Este programa é baseado no quine clássico do Python 2:
Primeiro, para torná-lo compatível com o Python 2 e o Python 3, alterei a
print
instrução para uma chamada de função e adicionei um espaço extra que será útil mais tarde:Em seguida, eu precisava de uma maneira de distinguir o Python 2 do Python 3. Uma das maneiras mais simples é aproveitar o fato de que
/
é a divisão inteira no Python 2, mas a divisão flutuante no Python 3. Portanto, o código a seguir é avaliadoTrue
no Python 2, masFalse
em Python 3:Para diferenciar as saídas entre os dois idiomas, eu precisava remover seletivamente o primeiro e o último parênteses da
print
chamada (é por isso que eu precisava do espaço anterior - sem espaço, não seria umaprint
declaração válida no Python 2) . Assim, eu precisava modificar o chicote de fios da seguinte maneira:Essa expressão é
a:-a|9
avaliada0:9
no Python 2 e1:-1
no Python 3. Portanto,b
está"(_%(_,b))"
no Python 3, mas no Python 2 o primeiro e o último caracteres são descartados, saindo_%(_,b)
. E com essa modificação, o poliglota foi válido para esse desafio.Conforme sugerido pelo Teal pelican, a coluna> <>
#o<}-1:"
pode ser adicionada com bastante facilidade, graças ao fato de#
iniciar um comentário de linha única em Python. Basta anexá-lo e uma nova linha adiciona outro idioma e aumenta a pontuação em quase dez vezes.fonte
Python 2 + Retina, 2 idiomas, 55 bytes, pontuação = 2 ^ 3/55 ≈ 0,145
Eu usei em
$n
vez de¶
manter os dois ASCII válidos.Python , Retina
Python:
Retina:
fonte
> <> + Pyke + Python 2, 81 bytes, pontuação = 3 ** 3/81 ~ 0,333
Eu tentei fazer algo diferente com todos os idiomas.
> <> vê:
Esta é uma ligeira modificação do quine padrão> <> para usar uma cadeia de caracteres tripla no início. Isso permite que as aspas triplas finais do Python estejam em uma linha diferente.
Experimente online!
Pyke vê:
Eu não tinha criado uma solução em Pyke antes e, portanto, tive que pensar em uma. Usei técnicas tradicionais de quining para criar uma string e, em seguida, avaliá-la como uma entrada. Observe que, para que isso funcione sem impacto visual, os avisos deverão ser desativados. Erros com uma divisão por 0 erro na etapa de geração.
Experimente aqui! Ou apenas a parte quine.
Python vê:
Tudo. Python usa todo o código para produzir sua solução. Decidi incorporar a parte quine na docstring (embora, em última análise, economizasse bytes para remover, mas acho legal). É uma modificação da técnica de quining padrão.
Experimente online!
fonte