Produza um programa A de modo que executá-lo no idioma A produz o Programa B e executar o programa A no idioma B produz o programa C.
O programa B, quando executado no idioma B, produz o Programa A, e o programa B, no idioma A, produz o programa C.
O programa C, quando executado no idioma A ou no idioma B , imprime "Idioma errado!".
Program | Language | Result
--------|----------|----------
A | A | Program B
B | B | Program A
A | B | Program C
B | A | Program C
C | A | "Wrong language!"
C | B | "Wrong language!"
Sua resposta deve usar este modelo:
Idioma A / Idioma B, {a bytes} + {b bytes} = {total de bytes} bytes
Programa A:
a code
Programa B:
b code
Programa C:
c code
Fonte:
# Language A/Language B, <a bytes> + <b bytes> = <total bytes> bytes
Program A:
a code
Program B:
b code
Program C:
c code
- Nenhum desses programas deve receber contribuições.
- Versões diferentes do mesmo idioma contam como idiomas diferentes. (embora isso seja desencorajado porque leva a soluções chatas)
- Os idiomas A e B devem ser distintos.
- Você não deve ler seu próprio código-fonte de um arquivo. Os programas podem não estar vazios
- Aplicam-se brechas padrão.
Dicas
- C ++ e [Python / Bash / outras
#
linguagens comentadas] são boas combinações porque você pode definir macros que uma linguagem pode ignorar
Isso é código-golfe , então a menor soma do byte conta o Programa A e B vence.
code-golf
quine
code-generation
polyglot
noɥʇʎԀʎzɐɹƆ
fonte
fonte
Wrong language!
ser produzido de qualquer forma (ou seja, todas as maiúsculas, minúsculas etc.)?Respostas:
Befunge-98 (PyFunge) / > <> , 123 + 123 =
Programa A:266 250246 bytesExperimente no Befunge-98! , Experimente em> <>!
Programa B:Experimente em> <>! , Experimente-o em Befunge-98!
Programa C:Experimente no Befunge-98! Experimente em> <>!
Como funciona:
A segunda linha nos dois programas é idêntica e serve a mesma função para os dois idiomas. Quando inserido à esquerda a partir de
<<<<
, imprime a segunda linha inteira. Ao entrar à direita, imprima o programa C.Quando a primeira linha é executada no idioma errado, ela entra na seção de produção do programa C. Caso contrário, imprime a linha superior para trás com
"
a parte da frente e entra na segunda linha de produção.Primeira linha
Programa A: Programa B:Segunda linha:
Programa C
fonte
JavaScript (ES6) / Python 3, 264 + 258 = 522 bytes
Programa A:
Programa B:
Programa C:
Provavelmente jogável ...
Explicação sobre JavaScript
Programa A:
Programa B:
Programa C:
Explicação em Python
Programa A:
Programa B:
Programa C:
fonte
Python 3 + JavaScript (Rhino), 171 + 171 = 342 bytes
Programa A (gera o programa B em Python 3, programa C em JavaScript; observe a nova linha):
Programa B (gera o programa A em JavaScript, programa C em Python; observe a nova linha):
Programa C (gera "Idioma errado!" Em qualquer idioma; também possui uma nova linha à direita, que não conta na pontuação):
Observe que estou usando um dialeto incomum de JavaScript aqui. As pessoas normalmente usam implementações de navegador, mas elas têm problemas com a saída, fazendo isso de uma maneira estranha (usando
alert
). Estou usando o pacote Ubuntu,rhino
que é uma implementação JavaScript "offline" com um conjunto diferente de bibliotecas implementadas em um navegador típico (ele se destina como uma linguagem de script incorporável); isso é notável, pois fornece umaprint
declaração no mesmo estilo que, por exemplo, Python 3.Este é um "verdadeiro poliglota" no sentido de que os dois idiomas estão executando os mesmos cálculos, na mesma ordem, dando a eles o mesmo significado. Ambos têm o mesmo AST (e é bastante trivial criar uma solução poliglota Python 3 + JavaScript via redução deste programa). Não há código específico para um idioma, o que me ajuda a diminuir o comprimento. Aliás, você precisa usar o Python 3 para poder usar ponto-e-vírgula para separar instruções (se você usou novas linhas, precisará escapar das novas linhas).
O programa começa definindo cadeias
s
ed
que contêm aspas simples e aspas duplas, respectivamente. Isso possibilita a saída de cotações sem precisar mencioná-las posteriormente no código-fonte, evitando problemas com escape (o que freqüentemente parece ser um problema com quines; a principal razão pela qual eu respondo a tantos problemas de quine no Underload é que suas cadeias se aninham) .O coração do programa é a matriz
r
que contém o corpo principal dos dois programas usados pelo desafio; um dos programas (o que vem primeiro no programa A e o segundo no programa B) é quase um quine que simplesmente gera o programa original por meio da concatenação de peças juntas (tiradas principalmente deler
, com algumas literais de seqüência de caracteres), e o outro programa de impressão C. Para fazer com que o programa não seja um quine verdadeiro (o que tornaria impossível detectar que estávamos executando no idioma errado), os elementos der
são impressos em ordem inversa;r[0]
no programa A estár[1]
no programa B e vice-versa.Finalmente, tudo o que é necessário é
eval
usar o elemento correto der
. Isso é feito usando a expressão([11]+[0])[1]
que produz um valor diferente no Python 3 e no JavaScript. Os dois idiomas o analisam de maneira idêntica, mas têm idéias diferentes sobre o que a adição faz nas listas:Quando Python 3 adiciona
[11]
a[0]
, torna-se[11, 0]
(concatenando as listas), e em seguida, tomando o segundo elemento da lista ([1]
) nos dá o inteiro 0.Quando JavaScript acrescenta
[11]
que[0]
, ele é"110"
(concatenando as representações de seqüência de listas), e em seguida, tomando o segundo personagem da string ([1]
) dá-nos a corda"1"
, que JavaScript é bastante feliz em usar como um índice em uma lista.Portanto, o Python 3 executa o primeiro elemento de
r
ambos os programas (produzindo quase tudo ao executar o programa A e imprimindo o programa C ao executar o programa B); O JavaScript executa o segundo elemento e, portanto, trata os programas A e B da maneira inversa.Aliás, se você executar o programa A no Ruby, ele imprimirá o programa B, exceto sem uma nova linha à direita. Se você executar o programa B no Ruby, ele imprimirá o programa C, exceto sem uma nova linha à direita. Em outras palavras, essa solução quase funciona com um conjunto diferente de linguagens, trocando Python 3 por Ruby (a única razão pela qual não excluo a nova linha do programa B para obter uma pontuação de 341 é que a inconsistência da nova linha no programa C desqualificaria o envio).
(Eu estava trabalhando em um "verdadeiro poliglota" como esse por um motivo diferente, que eu coloquei agora como um desafio, e percebi que as técnicas poderiam ser adaptadas a esse também.)
fonte
<pre><code>...</code></pre>
para eles aparecerem."a"[0]
,"a"["0"]
E"a"[[[[[[[["0"]]]]]]]]
tudo realizar a mesma coisa.C / Python, 733 bytes + 733 bytes = 1466 bytes
Programa A:
Programa B:
Programa C:
Eu usei sua dica de usar C / C ++ com Python. Não é muito conciso, mas ainda assim qualifico, suponho.
fonte
Python 2 / Retina, 550 + 645 =
1373125412211195 bytesNão tenho muita certeza se as peças
unichr
ereplace
podem ser mais jogadas de golfe. Tentei usar o Python 3, mas muito se perdeu ao adicionar parênteses e manipulá-los. Eu tentei configurarR=unicode.replace
e usar isso, mas a saída fica confusa.Observe que o Retina possui uma nova linha à direita em sua saída por padrão, e isso não está incluído nos programas. Se alguém disser que preciso removê-lo, isso pode ser feito trivialmente. Além disso, o código Python funciona em repl.it, mas não é garantido que funcione no Ideone.com.
Observe também que as novas linhas iniciais e finais são significativas no código abaixo.
Programa A (Python 2):
638587566550 bytes (UTF-8)Python 2 , Retina
Programa B (retina):
735667655645 bytes (ISO 8859-1)Retina , Python 2
Programa C:
Python 2 , Retina
Na verdade, isso pode ser mais curto usando em
#!`W.*!
vez das duas últimas linhas, mas isso torna A e B mais longos, porque ter`
uma linha onde não havia um significa que preciso lidar com isso de maneira diferente (porque o primeiro backtick de uma linha na Retina é um delimitador de configuração).Explicação:
Programa C:
Escrevi o Programa C primeiro durante minha primeira tentativa e o mantive praticamente o mesmo. No Python, ele imprime a string e ignora o comentário. Na Retina, ele não substitui nada
print"Wrong language!"
e remove as peças ao redorWrong language!
.Para entender melhor os programas complexos, vejamos as versões simplificadas:
Programa A (simplificado):
Quando comecei do zero, usei o
PYTHON
bit como um espaço reservado para o código que deveria imprimir o Programa A. Essa versão mais simples facilitou a explicação de como o Programa B e o Programa C seriam impressos.O
print
e tudo dentro é o que imprime o Programa B, mas primeiro vamos ver como o Programa C é impresso, porque isso é simples. Após oprint"..."
é#|
. Esse truque salvou MUITAS dificuldades que experimentei na minha primeira tentativa. Isso permite que o Retina não substitua nada pela 2ª linha, que será o Programa C, exceto que há um#
na frente. As duas últimas linhas removem isso primeiro#
. Eu costumava#{2}
impedir o estágio de remover todas as ocorrências de#
. Não posso usar#1`#
como usei no Programa B, porque causa problemas para ter esse backtick na primeira linha do Programa A.O que me leva à minha próxima tarefa, imprimir o Programa B. Você pode ter notado outra diferença em relação ao código real. Não existem backticks no código real, pois os substituí por abas. Eu tive que substituir um caractere, porque qualquer backtick tornaria o código anterior uma string de configuração no Retina, fazendo com que a sintaxe fosse inválida. Eu escolhi as guias porque elas são visíveis e o ponto do código é um único dígito (
9
). O código imprime o Programa B, como mostrado na versão simplificada abaixo.Programa B:
As duas primeiras linhas não substituirão nada pelo código Python, mas por um
#
na frente e alguns caracteres ligeiramente diferentes. Esta parte é omitida para maior clareza. A próxima etapa remove isso primeiro#
. Então, eu uso um estágio Transliteration (T)#T`²-¹`_o`[^¹]
para desfazer algumas dasreplace
operações vistas no Programa A. completo. Usar esse estágio é uma maneira de produzir um pilcrow literal¶
em Retina, que de outra forma seria impossível.¹ Ele substitui·
por¶
e³
com²
. Ocorrências de¹
permanecerão as mesmas devido ao fato de serem ignoradas[^¹]
.Programa A:
Novas linhas e guias foram adicionadas para facilitar a leitura.
Isso segue a estrutura geral do seguinte quine Python:
Quando você adiciona coisas antes ou depois, também precisa colocá-las na string.
Eu queria usar uma sequência de aspas triplas para facilitar a inclusão de aspas (evitando o uso de barras invertidas).
s=U(39)*3;
é a string'''
. Também usei , em%s
vez de%r
, para evitar problemas com novas linhas ou outros caracteres sendo escapados com barras invertidas.Então agora, as substituições. A primeira substituição
.replace(U(9),U(96));
existe para substituir as guias pelos backticks que vemos no Programa B. Essa substituição é feita antes da formatação da string, porque as guias precisam permanecer como guias no Programa A. As outras substituições são simplesmente para evitar o uso de certos caracteres no segundo linha do Programa B:Essas três últimas substituições antecipam o estágio de Transliteração no Programa B, para impedir que esses caracteres sejam removidos ou transliterados quando não deveriam.
A única outra parte do código é o código do Programa B, que é essencialmente copiado caractere por caractere, exceto pelas alterações devido às substituições.
¹ Obrigado a Martin por sua dica sobre como gerar um literal
¶
no Retina. Isso tornou tudo muito mais fácil.fonte
Befunge / Python,
381 + 485259 + 345229 + 304 = 533 bytesPrograma A: Experimente no Befunge | Experimente em Python
Programa B: Experimente no Python | Experimente em Befunge
Programa C: Experimente no Befunge | Experimente em Python
Explicação
Programa C: Isso se baseia no fato de que o Befunge-93 ignora instruções não suportadas; portanto, enquanto o
p
zero inofensivamente escreve um zero em 0; 0, o restanteprint
é ignorado até a<
instrução que inverte a direção. Em seguida, da direita para a esquerda, ele+5+5
pressiona 10 (avanço de linha) na pilha, seguido pela sequência de mensagens e, em seguida, uma sequência de saída padrão é executada para gravar a sequência. No Python, está apenas imprimindo duas literais de seqüência de caracteres que são concatenadas juntas, mas a primeira (contendo o código Befunge) é cortada pela referência da matriz no final ([+5+5:]
).Programa B: A primeira linha é uma sequência Befunge bastante básica para imprimir o Programa C. A única coisa interessante é a maneira como ele gera caracteres de citação usando
50g
(ou seja, lendo o caracter da memória), que é mais eficiente do que calcular o código ASCII. A#>
(uma ponte sobre a instrução de direção) é essencialmente um nop que impede que o código seja visto pelo Python, pois#
é o caractere de comentário do Python. A interpretação Python começa na linha dois e está simplesmente imprimindo uma sequência de múltiplas linhas contendo o código fonte do Programa A.Programa A: No Python, as três primeiras linhas são novamente ignoradas porque começam com
#
, enquanto a última linha simplesmente imprime o Programa C. O código Befunge serpenteia para frente e para trás nas três primeiras linhas, construindo a fonte do Programa B na pilha Em ordem inversa. Começa com três aspas, depois uma sequência que faz uma cópia da fonte do Programa A e, finalmente, o que é essencialmente uma string codificada com a aberturaprint """
e a primeira linha do código Befunge. É apenas uma questão de escrevê-lo com uma sequência de saída padrão.Alguns pontos de discórdia:
Foi-me dito que um quine usando o
g
comando não é considerado um quine adequado no que diz respeito a esta comunidade. Não tenho certeza se essa regra também se aplicaria a esse desafio, mas, nesse caso, essa resposta também pode não ser considerada uma solução adequada.Embora eu tenha dito que o Befunge-93 ignora instruções não suportadas, isso não está tecnicamente definido na especificação, e você precisará usar a
-q
opção de linha de comando (silenciosa) no interpretador de referência para evitar avisos no Programa C. A maioria dos outros intérpretes fique bem, porém, mas alguns dos mais esquisitos podem potencialmente falhar. Observe também que o Befunge-98 reflete em instruções não suportadas; portanto, um intérprete 98 fará um loop indefinidamente.fonte
-q
bandeira é realmente "bastante" ou você quis dizer "quieta"? Mm-sim, esta bandeira é bastante útil.r
instrução eflect e 0 que foip
ut na primeira célulaPerl / JavaScript, 176 bytes + 176 bytes = 352 bytes
Não pense que posso compartilhar 52 bytes do mecanismo subjacente da recompensa, mas gostei de criar isso. Eu acho que o que eu produzi atende aos critérios ...
Programa A:
Programa B:
Programa C:
Explicação
Usa minha poliquina Perl / JavaScript como base, mas define uma variável adicional
$P
que controla qual programa gerar. Usa a verificação que+[]
é verdadeira no Perl, mas falsa no JavaScript.fonte