Uma poliquina é tanto quine quanto poliglota. 1 Você deve escrever um quine válido em pelo menos dois idiomas diferentes. Isso é código de golfe, então a resposta mais curta (em bytes) vence.
1 Eu inventei isso. Ou melhor, Geobits fez . Aparentemente, ele também não foi o primeiro .
Regras para Quines
Somente quines verdadeiros são aceitos. Ou seja, você precisa imprimir todo o código fonte literalmente para STDOUT, sem :
- lendo seu código fonte, direta ou indiretamente.
- confiando em um ambiente REPL que simplesmente avalia e imprime todas as expressões que você alimenta.
- confiando em recursos de idioma que apenas imprimem a fonte em certos casos.
- usando mensagens de erro ou STDERR para escrever a totalidade ou parte da solução. (Você pode escrever coisas para STDERR ou produzir avisos / erros não fatais, desde que STDOUT seja uma solução válida e as mensagens de erro não façam parte dela.)
Além disso, seu código deve conter uma string literal.
Regras para poliglotas
Os dois idiomas usados devem ser distintamente diferentes. Em particular:
- Eles não devem ter versões diferentes da mesma linguagem (por exemplo, Python 2 vs. Python 3).
- Eles não devem ter dialetos diferentes do mesmo idioma (por exemplo, Pascal vs. Delphi).
- Um idioma pode não ser um subconjunto do outro (por exemplo, C vs. C ++).
Respostas:
CJam / GolfScript, 34 bytes
A contagem de bytes contém um avanço de linha à direita, pois o programa não seria uma solução sem ele.
Enquanto CJam e GolfScript são muito semelhantes em alguns aspectos, existem muitas diferenças. Para fazer disso uma poliquina "honesta", decidi confiar nas diferenças o máximo possível. Exceto pela sintaxe de bloco e string (que os idiomas compartilham com tantos outros), nenhuma parte do código alcança exatamente o mesmo nos dois idiomas.
O intérprete online do GolfScript tem um erro; este programa funciona apenas com o intérprete oficial.
Exemplo de execução
Como funciona (CJam)
Como funciona (GolfScript)
CJam / GolfScript, 12 bytes
Solução barata que evita as diferenças dos idiomas o máximo possível.
Experimente online:
Como funciona (CJam)
Como funciona (GolfScript)
fonte
C # / Java, 746 bytes
Eu uso a propriedade que caracteres em Java podem ser gravados como seqüências unicode idênticas. Se tivermos
A
instruções para o compilador C # eB
instruções para Java, podemos usar o seguinte fragmento de código:Será "reconhecido" da seguinte maneira com C #:
E da seguinte maneira pelo Java:
Por causa da
\u000A
quebra de linha,\u002F
é/
e\u002A
está*
em Java.Portanto, a poliglota-quina final é:
No entanto, o tamanho é muito grande devido à verbosidade dos idiomas.
Compilação disponível em ideone.com: C # , Java .
fonte
Python 3 e JavaScript, 134 bytes
Aqui está minha tentativa (final?):
Provavelmente, pode ser jogado um pouco mais, especialmente se alguém souber uma maneira melhor de obter aspas simples em JavaScript.
Em resumo, o programa fica assim:
A
eval()
função avaliará expressões nos dois idiomas. Portanto, a cadeia longa é executada:Isso divide a cadeia longa por espaços e avalia a substring indexada por
2%-4
. O JavaScript executará a terceira substring (2 % -4 == 2
) e o Python a segunda (2 % -4 == -2
), porque seus operadores de módulo se comportam de maneira diferente para negativos.O restante da string é ignorado nos dois idiomas. O JavaScript para no
//
, enquanto o Python o vê como divisão inteira e no#
.Portanto, o JavaScript imprime o código-fonte no console aqui:
E Python aqui:
Ambos fazem uso da parte final da string, que é um modelo do programa:
fonte
a='print(a[78:]%a)1q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(82))1a=%r;eval(a.split(1)[0|0=="0"])';eval(a.split(1)[0|0=="0"])
. Testado em JavaScript, mas não em python ... mas deve funcionar.a.split(1)
.q=unescape("%27")
Ruby / Perl / PHP, 52
Copiado literalmente do Perl quine de Christopher Durr .
Isso é abuso de regras. Definitivamente, Ruby e Perl não são a mesma linguagem, nem o Perl é um subconjunto de Ruby (a maioria dos arquivos Perl vinculados não funciona em Ruby, por exemplo). Mas Ruby foi projetado para ser parecido com o Perl, se você quiser, e isso acontece muito no golfe.
fonte
-R
e não precisa das tags de script. php.net/manual/en/features.commandline.options.phpBash / GolfScript, 73
Há um espaço à direita em cada uma das 3 primeiras linhas.
Bash / GolfScript, 78
fonte
PHP / Perl - 171
Correr com:
O
php
código está realmente em execução (não apenas imprimindo em si).fonte
Bash / Ruby,
10482Versão antiga:
Bash / Ruby, 128 sem comportamento indefinido
fonte
<<a
no Ruby funciona exatamente como o Bash, mas retorna uma string. Eu não escrevi um programa Ruby antes. Acabei de encontrar uma linguagem aleatória com esse recurso.<<word
retorna uma string fechada por uma linha com uma únicaword
.reticular / befunge-98, 28 bytes [não-competitivo]
Tente reticular! Tente antes do 98!
Qualquer coisa entre
;
s em befunge é ignorada e!
pula para o segmento entre;
s para reticular. Assim, reticular vê:Befunge vê:
fonte
Ruby / Mathematica, 225 bytes
Aqui está minha própria poliquina muito imbatível (que serve como exemplo e prova de conceito):
A primeira parte é baseada nesta ruby quine e é basicamente:
A atribuição de string é exatamente a mesma no Mathematica. O
puts s%s
é interpretado como um produto de 4 símbolos:puts
, a cordas
,%
(o último resultado REPL ouOut[0]
se é a primeira expressão a avaliar) e outros
. Naturalmente, isso é completamente sem sentido, mas o Mathematica não se importa e;
suprime nenhuma saída, então isso é processado silenciosamente. Em seguida,#
torna o restante da linha um comentário para Ruby enquanto o Mathematica continua.Quanto ao código do Mathematica, a maior parte dele, é simular o processamento de strings no formato Ruby sem usar literais de strings.
FromCharacterCode@{37,112}
é%p
eFromCharacterCode@{37,112}
é%%
. O primeiro é substituído pela própria string (ondeInputForm
adiciona as aspas) e o último por um único%
. O resultado éPrint
ed. O problema final é como lidar com isso#
na frente. Este é o símbolo do Mathematica para o primeiro argumento de uma função pura (anônima). Então, o que fazemos é transformar tudo isso em uma função pura, acrescentando&
e chamando a função imediatamente com argumento1
. Anexar a1
a uma chamada de função "multiplica" o resultado com1
, que o Mathematica novamente engole, independentemente do tipo de coisa retornada pela função.fonte
> <> e CJam, 165 bytes
Para CJam, o programa inicia com uma literal de seqüência de caracteres de várias linhas. Isso é ignorado e
`
, em seguida, ele usa o quine padrão para imprimir o código do quine, além de um comentário à direita.Para> <>, o primeiro
"
inicia uma literal de seqüência de caracteres que percorre toda a primeira linha, empurrando todos os caracteres para a pilha. Depois disso, os espaços finais (criados devido ao preenchimento da entrada) são excluídos e a pilha é revertida. Todos os caracteres da pilha (ou seja, a primeira linha inteira) são impressos e, em seguida, passam para a segunda linha.A segunda linha faz essencialmente a mesma coisa, exceto que está na direção oposta, portanto você não precisa inverter a pilha. (Eu faço assim mesmo, porque tenho que excluir os espaços finais.)
Finalmente, ele passa para a terceira linha. A única grande diferença é que você deve pular o bloco CJam, que é feito usando
.
A aspas simples captura a linha inteira (novamente, para trás) e, em seguida, é emitida.fonte
C / PHP,
266304300282241203 + 10 bytes10 bytes porque a compilação em C requer o sinalizador do compilador GCC
-Dfunction=
.Como funciona (em PHP):
<?php
como HTML.//
não é um comentário em HTML, por isso é simplesmente impresso.main
é declarada como uma função com uma variávela
.printf
imprime um retorno de carro (para substituir o já impresso//
) e, em seguida, o código fonte, usando um método padrão de quining C / PHP.#if 0
é ignorado pelo PHP.main($a)
inicializa uma variável vaziaa
. (Anteriormente usadoerror_reporting(0)
para ignorar erros causados por chamadasmain()
)#endif
também é ignorado pelo PHP.Como funciona (em C):
//<?php
é um comentário de linha única, por isso é ignorado.function
palavra-chave é ignorada devido ao argumento do compilador da linha de comandos-Dfunction=
.$
. (Isso salvou o dia.)printf
imprime um retorno de carro (inútil neste caso) e, em seguida, o código-fonte, usando um método padrão de quining C / PHP.#if 0
ignora tudo até oendif
, para que o PHP possa chamarmain
.#endif
termina o bloco "ignore-me".fonte
Wumpus / > <> / Befunge-98 28 bytes
Experimente em Wumpus! , Experimente em> <>! , Experimente-o em Befunge-98!
Como funciona:
Código Wumpus:
> <> Código:
Código Befunge-98:
fonte
05AB1E / 2sable, 14 bytes, não concorrente
Experimente online! (05AB1E)
Experimente online! (2sable)
2sable é derivado de 05AB1E e é semelhante, mas possui grandes diferenças.
Nova linha à direita.
fonte
C / TCL, 337 bytes
fonte
C / Vim 4.0, 1636 bytes
Contém caracteres de controle.
Seu Vim precisa ter o seguinte conjunto:
fonte
C / Lisp, 555 bytes
Primeira linha intencionalmente em branco.
fonte
Perl / Javascript (SpiderMonkey), 106 bytes
Experimente o Perl online!
Experimente o JavaScript online!
Explicação
Os dados do quine são armazenados nos
$_
dois idiomas e depoiseval
editados, o que é praticamente o procedimento padrão no Perl. Eu escolhi o SpiderMonkey no TIO, pois ele tem umaprint
função, mas isso pode ser facilmente transportado para o navegador por + 20 bytes (adicioneeval("print=alert");
ao início de$_
definição s).O Perl vê os dados armazenados
$_
e oseval
faz como de costume. Desde que+[]
é verdade em Perl,'
é armazenado$q
através do stringwise-XOR deh
eO
. O truque final está na chamada paraprint
onde a primeira parte do JavaScript usa+
, que no Perl trata todos os itens como números e soma0
, então usamos o||
operador para retornar o que realmente queremos(q($_),"=$q$_$q;",q(eval($_)))
que seja equivalente"\$_=$q$_$q;eval(\$_)"
.Em JavaScript,
+[]
retornos0
, então nós chamamosunescape("%27")
a loja'
em$q
(infelizmente,atob
existem doesm't em SpirderMonkey ...). Na chamada paraprint
, uma vez que+
é o operador de concatenação no JavaScript, o primeiro bloco cria a saída desejada e a segunda parte após a||
ignoração.Obrigado ao comentário de Patrick Roberts para o
unescape
truque!Perl / JavaScript (navegador), 108 bytes
Experimente o Perl online!
Explicação
Nós armazenamos os dados do quine
$_
nos dois idiomas e, em seguidaeval
, eles, o que é praticamente um procedimento padrão no Perl.O Perl vê os dados armazenados
$_
e oseval
faz como de costume. Oeval
interior$_
é executado e falha ao analisar, mas, como éeval
, não gera erros.printf
é então chamado, com uma única cadeia de caracteres entre aspasq()
, com`
como delimter, pois apenas o uso`
resultaria em comandos sendo executados no shell; em seguida, para o primeiro uso de$q
, uma vez que+[]
é verdade no Perl,'
é armazenado$q
via stringwise-XOR deh
eO
.Em JavaScript, o
eval
bloco dentro$_
configura uma funçãoq
, quereturn
é seu argumento como aString
e aliasconsole.log
paraprintf
, uma vez queconsole.log
formata uma string comoprintf
em Perl. Quandoprintf
é chamado de+[]
retorno0
, chamamosatob
para decodificar'
e armazenar$q
.fonte
Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1031 bytes
Verifique online!
Com base nas minhas atualizações para esta resposta , pensei em tentar otimizar o código que imprime uma permutação diferente, mas acabei adicionando o Bash, que adicionava mais bytes de qualquer maneira. Embora isso seja mais otimizado do que minha primeira tentativa (salva em mais de 300 bytes), tenho certeza de que ainda pode ser jogado mais.
Alternativa Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1040 bytes
Verifique online!
Um pouco mais perto da minha abordagem original, mas a repetição de argumentos
printf
ainda é insana. Em vez disso, usar argumentos posicionais faz com que isso funcione apenas no Chrome e é complicado começar a trabalhar no PHP também porque o$s
in%1$s
é interpolado, mas pode economizar muitos bytes, talvez usando uma combinação das duas abordagens ...fonte
C / dc, 152 bytes
Aproveitando os comentários, sim!
fonte
Perl 5 / Ruby / PHP / JavaScript (Navegador), 153 bytes
Experimente o Perl online!
Experimente o Ruby online!
Experimente o PHP online!
fonte