Espelho quine (ou minha cabeça dói)


32

Eu estava lendo Imprimir seu código ao contrário - quine reverso E pensei, isso poderia ser mais interessante se o seu código para trás também fosse executável . Portanto, esse desafio terá todas as regras e requisitos do outro, mas também deverá ser uma fonte válida, uma vez revertida (no mesmo ou em outro idioma e ainda imprimir sua fonte de trás para frente.

Todas as regras e pontuações do desafio reverso do quine se aplicam; portanto, todas as respostas a essa pergunta responderão a essa (mas não a pontuação também).

Editar:

Por solicitação, todas as regras agora são copiadas aqui.

Regras:

  • escreva um programa p que, quando executado, produz a saída p 'onde p' é p para trás ep 'quando executado produz p.
  • Não é possível usar outros arquivos (por exemplo reverse.txt)
  • O comprimento mínimo do código é de dois caracteres.
  • Seu programa não pode ser um palíndromo.

Pontuação:

  • +50 se você usar dados extraídos da Internet.
  • +25 se você ler seu próprio código-fonte.
  • +1 ponto por personagem.
  • Menor pontuação ganha.

eval(eval(eval(eval(eval(eval(eval(eval(eval(p)))))))))
precisa

Estou apenas dizendo que você seria capaz de executar a saída de executar a saída de executar a saída de [...] executar a saída de p (o mesmo que qualquer quine, exceto o quine reverso).
Andrew Larsson

@AndrewLarsson De fato, embora A prova de conceito que estou construindo p seja escrita em c ep em perl.
Hildred

Oh, isso seria legal!
precisa

11
Sim, vi isso tarde demais. Não é uma duplicata.
Johannes Kuhn

Respostas:


22

GolfScript, 46 caracteres

0{`".~#"+.-1%+\.!@@}.~##~.}@@!.\+%1-.+"#~."`{1

Bem, isso é feio, mas funciona. A saída é igual ao código invertido e também é um programa válido do GolfScript que gera o código original novamente.

OK, deixe-me tentar explicar como eu o construí. Primeiro, parti do quine {".~"}.~e modifiquei-o como nesta resposta para reverter-se. Para tornar a saída um quine executável em si, fiz uma cópia do código antes de revertê-lo e incluí um #no final do código, para que a versão revertida no final se tornasse apenas um comentário. Assim, obtemos a solução palindrômica:

{`".~#"+.-1%}.~##~.}%1-.+"#~."`{

No entanto, pelas regras, palíndromos não são permitidos, então eu precisava quebrar a simetria de alguma forma. Imaginei que a maneira mais fácil seria a de incluir um 0(o que, em si, é um Quine em GolfScript) no código e lançá-lo para 1com !depois de criar a cópia invertida. A maior parte da complexidade restante é apenas uma manipulação feia de pilhas para obter tudo na ordem certa.


Também é golfscript quando invertido ou é outro idioma?
Hildred

Sim, é o GolfScript nos dois sentidos. De fato, exceto pelo 0e 1no começo e no final, o restante do código é um palíndromo.
Ilmari Karonen

9
Uau. Ok, eu não me sinto mais esperto o suficiente para este SE :(
Cruncher

21

Perl e C 6478 1955

#!/usr/bin/perl -i//
$_=<<'rahc';eval $_; #//
print scalar reverse "#!/usr/bin/perl -i//\n\$_=<<'rahc';eval \$_; #//\n${_}rahc\n" #//
__END__
__END__ enifed#
};)"{ = ][cn\rahcn\n\"(p
};)'n\'( rahctup) 1 == 21%b ( fi
;)d(p;)]1-b[c,",d%",)d(foezis,d( ftnirpns{)b--;b;)c(foezis=b( rof
;)c(p;]9[d rahc;b tni{)(niam diov
}};)]1-b[c(rahctup )]1-b[c(fi{)b--;b;)c(nelrts=b(rof;b tni{)c*rahc(p diov
>h.gnirts< edulcni#
>h.oidts< edulcni#
;}
,0
,53,33,74,711,511,411,74,89,501,011,74,211
,101,411,801,23,54,501,74,74,01,63,59,16
,06,06,93,411,79,401,99,93,95,101,811,79
,801,23,63,59,95,23,53,74,74,01,211,411
,501,011,611,23,511,99,79,801,79,411,23,411
,101,811,101,411,511,101,23,43,53,33,74,711
,511,411,74,89,501,011,74,211,101,411,801,23
,54,501,74,74,29,011,29,63,59,16,06,06
,93,411,79,401,99,93,95,101,811,79,801,23
,29,63,59,95,23,53,74,74,29,011,63,321
,59,521,411,79,401,99,29,011,43,23,53,74
,74,01,59,59,96,87,86,59,59,01,59,59
,96,87,86,59,59,23,101,011,501,201,101,001
,53,01,521,95,14,43,321,23,16,23,39,19
,99,011,29,411,79,401,99,011,29,011,29,43
,04,211,01,521,95,14,93,011,29,93,04,23
,411,79,401,99,611,711,211,14,23,94,23,16
,16,23,05,94,73,89,23,04,23,201,501,01
,95,14,001,04,211,95,14,39,94,54,89,19
,99,44,43,44,001,73,43,44,14,001,04,201
,111,101,221,501,511,44,001,04,23,201,611,011
,501,411,211,011,511,321,14,89,54,54,95,89
,95,14,99,04,201,111,101,221,501,511,16,89
,04,23,411,111,201,01,95,14,99,04,211,95
,39,75,19,001,23,411,79,401,99,95,89,23
,611,011,501,321,14,04,011,501,79,901,23,001
,501,111,811,01,521,521,95,14,39,94,54,89
,19,99,04,411,79,401,99,611,711,211,23,14
,39,94,54,89,19,99,04,201,501,321,14,89
,54,54,95,89,95,14,99,04,011,101,801,411
,611,511,16,89,04,411,111,201,95,89,23,611
,011,501,321,14,99,24,411,79,401,99,04,211
,23,001,501,111,811,01,26,401,64,301,011,501
,411,611,511,06,23,101,001,711,801,99,011,501
,53,01,26,401,64,111,501,001,611,511,06,23
,101,001,711,801,99,011,501,53,01,95,521,01
{ = ][c
rahc

Editar:

Breve explicação: do perl, as duas linhas interessantes são a segunda e a terceira. A segunda linha possui duas instruções, a primeira das quais lê o restante do documento em uma string. O segundo avalia a corda. A terceira linha imprime tudo ao contrário. tudo o mais é ignorado. do lado c, você tem uma matriz que possui o programa como uma sequência, que é impressa como uma matriz e uma sequência, e o restante é um comentário.


11
wat. Minha cabeça explodiu. Mas conto 6536 caracteres ...
Maçaneta da porta

O que ... como ... 0_0
O Cara do Chapéu

@DoorknobofSnow Contei a versão errada. Mas aqui está uma versão mais curta.
Hildred,

Isto é incrível! Eu acho que Haskell / C pode ser outra combinação viável.
theonlygusti

@theonlygusti, se você publicá-lo e eu puder compilá-lo, vou votá-lo.
Hildred 13/04

8

Ruby 145

DATA.read.tap {| a | coloca a.reverse, a.tr ("\ x79 \ x59", "\ x59 \ x79")}
: y
__FIM__
__DNE__
Y:
}) "97x \ 95x \", "95x \ 97x \" (rt.a, esrever.a cópia | a | {pat.daer.ATAD

A idéia principal é simples: basta colocar a primeira metade do código-fonte para trás, após o __END__que pode ser lido usando o DATAruby. Em seguida, basta imprimir o verso desses dados, depois imprimir os dados e você receberá o código-fonte original

O problema é que isso se torna um palíndromo (observe que a primeira linha precisa de uma linha final), então temos que quebrar a simetria. Acabei de adicionar um símbolo :yao código, e um código que transformará esse símbolo entre minúsculas e maiúsculas entre execuções, revertendo para o estado original após duas execuções.

Teste um: eles podem ser executados

$ ruby rq2.rb > rq2t.rb
$ ruby rq2t.rb > rq2tt.rb

Teste dois: o resultado de duas execuções retornará a fonte original

$ diff rq2.rb rq2tt.rb
$

Teste três: o código não é um palíndromo (a execução intermediária é diferente)

$ diff rq2.rb rq2t.rb
3c3
< :y
---
> :Y
6c6
< Y:
---
> y:

4

> <>, 21 19 bytes

'rd3*70.r l?!;o90.<

Experimente aqui!

Usa o intérprete *> <> por conveniência, mas este é um código> <> válido.


Se o erro for permitido, isso poderá ser feito em 16 bytes:

'd3*}70.!r  !|o|

Experimente aqui!


@JoKing obrigado! Eram sete horas da manhã e eu estava cansado demais para juntar isso. Vou editá-lo dentro de algumas horas.
Discordian

4

Gol> <> , 11 bytes

":5-}H}+5:'

Um byte inteiro cortado! quase é um palíndromo, mas tecnicamente não é por causa do '+' e '-', haha!

Experimente online!

Os dois abaixo não funcionam, ou pelo menos não atendem às especificações do desafio, mas o código acima funciona.

versão um pouco mais nova, 12 bytes

"r2ssrH}+5:'

Golpeou um byte, simplesmente usando as aspas duplas e aumentando em 5! E esta nova versão se parece menos com um palíndromo.

Experimente online!

versão mais antiga, 13 bytes

"r2ssrHrss7r'

Houve um problema com o anterior que JoKing apontou, obrigado por isso, agora funciona, mas com o preço de 4 bytes extras ...

Experimente online!


1

Ajuda, WarDoq! (27 bytes)

25 bytes adicionados devido à leitura do código fonte.

<space>q

Como funciona:
<space>- um comentário que termina em caracteres não espaciais
q- código-fonte de impressão invertido (q "espaço")

Invertida:

q<space>

Como funciona:
q- imprima o código-fonte invertido (q por enquanto)
<space>- um comentário que termine com caracteres não espaciais e adicione um caractere ao início do comando q (criando "espaço" q)

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.