Escreva uma terceira ordem quine

17

Este desafio é uma extensão do ' Golf a mutual quine '.

Usando três idiomas de sua escolha, crie um programa Ouroboros de terceira ordem .

Ou seja, na linguagem A, escreva um programa pA que emita o programa pB na linguagem B. O programa pB deve emitir o programa pC na linguagem C, que, por sua vez, emite o programa original pA na linguagem A.

Não há dois idiomas em A, B e C que possam ser iguais ou subconjuntos ou superconjuntos. Nenhum de pA, pB ou pC pode ser idêntico.

Por exemplo, um programa Haskell gera um programa Perl que gera um programa java que gera o programa Haskell original seria válido.

Por outro lado, um programa C # 4 que gera um programa C # 3 que gera um programa C # 2 é inválido. Mesmo uma combinação Perl -> Ruby -> Bash seria inválida se, digamos, o programa Perl e o programa Ruby fossem idênticos.

Isso é código de golfe, então o programa mais curto pA vence.

Peter Olson
fonte

Respostas:

21

Python -> Perl -> Ruby, 48 caracteres

Adaptação da minha resposta anterior . Corrida

s='print q<puts %%q{s=%r;print s%%s}>';print s%s

com Python gera esse snippet Perl

print q<puts %q{s='print q<puts %%q{s=%r;print s%%s}>';print s%s}>

que gera o seguinte código Ruby

puts %q{s='print q<puts %%q{s=%r;print s%%s}>';print s%s}

que imprime o snippet original do Python:

diff -s <(ruby <(perl <(python thirdorderquine.py))) thirdorderquine.py 
Files /dev/fd/63 and thirdorderquine.py are identical
Ventero
fonte
13

Perl -> PHP -> HTML + JavaScript, 105 caracteres

Queria tornar a cadeia de linguagens de algum modo significativa, então imaginei que escreveria um script PHP que gera uma página HTML contendo JavaScript. Para o terceiro idioma, escolhi o Perl, só porque gosto do Perl. :)

Alguns podem considerar essas quatro linguagens, mas eu realmente não considero o HTML separado do JavaScript aqui - é uma linguagem de marcação, não uma linguagem de programação. Enfim, aqui estão as três versões:

Perl (105 caracteres):

printf+(q(<script>alert(unescape("<?=urlencode(<<<E%sprintf+(q(%s),$/)x2,$/%sE%s)?>"))</script>),$/)x2,$/

PHP (165 caracteres):

<script>alert(unescape("<?=urlencode(<<<E
printf+(q(<script>alert(unescape("<?=urlencode(<<<E%sprintf+(q(%s),$/)x2,$/%sE%s)?>"))</script>),$/)x2,$/
E
)?>"))</script>

HTML + JavaScript (235 caracteres):

<script>alert(unescape("printf%2B%28q%28%3Cscript%3Ealert%28unescape%28%22%3C%3F%3Durlencode%28%3C%3C%3CE%25sprintf%2B%28q%28%25s%29%2C%24%2F%29x2%2C%24%2F%25sE%25s%29%3F%3E%22%29%29%3C%2Fscript%3E%29%2C%24%2F%29x2%2C%24%2F"))</script>

(Sal. Sim, eu sei que eu poderia ter dado o passo do PHP quase noop, por exemplo, apenas gerando código HTML + JS no Perl e anexando <?php-o, mas isso parecia muito trapaça. Nesta solução, o código é realmente processado em PHP em vez de apenas ser copiado literalmente.)

Ilmari Karonen
fonte
3

Carga insuficiente → sed → Perl, 23 bytes

Provavelmente, isso pode diminuir ainda mais com melhores opções de idiomas. Indiscutivelmente não-competitivo porque a regra "programas sed podem ter uma linha vazia como argumento" pós-concurso.

O programa Underload:

((iprint+q)Sa(:^)*aS):^

gera o programa sed:

iprint+q(((iprint+q)Sa(:^)*aS):^)

que gera o programa Perl:

print + q (((print + q) Sa (: ^) * aS): ^)


(nota: existem duas novas linhas finais aqui), que geram o programa Underload original novamente:

((iprint+q)Sa(:^)*aS):^

O principal objetivo aqui é encontrar idiomas nos quais as strings são aninhadas (ou seja, você pode apenas citar uma string colocando-a em delimitadores, em vez de ter que escapar dela); Underload possui (), Perl possui q()e, no sed, uma string continua até o espaço em branco (que é implicitamente aninhado se não houver espaço em branco no programa). Provavelmente existe um idioma esolang ou de golfe por aí com uma instrução "imprima o restante da linha atual, não seguida de novas linhas", o que seria ideal aqui, mas não passei tanto tempo procurando por uma; você pode salvar 8 bytes menos o comprimento da instrução nesse caso. (A geléia quase funciona, mas sua instrução não cita a si mesma. Além disso, adia o desafio.)

Você pode reduzir isso para 22 bytes assim:

((csay + q) Sa (: ^) * aS): ^

(com uma nova linha à direita, como um arquivo de texto comum, em vez do zero que você normalmente obtém no golfe). No entanto, isso requer um intérprete de Underload que seja bom em tratar a nova linha como não operacional. O Try It Online !, mas acho que pós o desafio.


fonte