Mirror quine (o mi fa male la testa)


32

Stavo leggendo Stampa il tuo codice all'indietro - reverse quine E ho pensato, questo potrebbe essere più interessante se anche il tuo codice all'indietro è eseguibile . Quindi questa sfida avrà tutte le regole e i requisiti dell'altra, ma deve anche essere fonte valida una volta invertita (nella stessa o in un'altra lingua e comunque stampare la sua fonte al contrario.

Si applicano tutte le regole e il punteggio della sfida del quinto inverso, quindi tutte le risposte a questa domanda risponderanno a quella (ma non segnano anche.)

Modificare:

Su richiesta, tutte le regole ora vengono copiate qui.

Regole:

  • scrivere un programma p che quando eseguito produce output p 'dove p' è p indietro e p 'quando eseguito produce p.
  • Non usare altri file (ad es. reverse.txt)
  • La lunghezza minima del codice è di due caratteri.
  • Il tuo programma non può essere un palindromo.

punteggio:

  • +50 se si utilizzano i dati pull da Internet.
  • +25 se leggi il tuo codice sorgente.
  • +1 punto per personaggio.
  • Il punteggio più basso vince.

eval(eval(eval(eval(eval(eval(eval(eval(eval(p)))))))))
Andrew Larsson,

Sto solo dicendo che saresti in grado di eseguire l'output dell'esecuzione dell'output dell'esecuzione dell'output dell'esecuzione dell'output di [p] (lo stesso di qualsiasi quine ad eccezione del quine all'indietro).
Andrew Larsson,

@AndrewLarsson In effetti sebbene la dimostrazione del concetto che sto costruendo p sarà scritta in c e p 'in perl.
hildred

Oh, sarebbe fantastico!
Andrew Larsson,

1
Sì, l'ho visto troppo tardi. Non un duplicato.
Johannes Kuhn,

Risposte:


22

GolfScript, 46 caratteri

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

Bene, questo è brutto, ma funziona. L'output è uguale al codice invertito ed è anche un programma GolfScript valido che restituisce nuovamente il codice originale.

OK, lasciami provare a spiegare come l'ho costruito. Innanzitutto, sono partito dal quine {".~"}.~e l'ho modificato come in questa risposta per invertire se stesso. Per rendere l'output un quine eseguibile in sé, ho creato una copia del codice prima di invertirlo e ho incluso un #alla fine del codice, in modo che la versione invertita alla fine diventasse solo un commento. Quindi, otteniamo il quind palindromico:

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

Tuttavia, secondo le regole, i palindromi non sono ammessi, quindi ho dovuto rompere in qualche modo la simmetria. Ho pensato che il modo più semplice sarebbe quello di includere un 0(che, di per sé, è un quine in GolfScript) nel codice e capovolgerlo 1con !dopo aver creato la copia invertita. La maggior parte della complessità rimanente è solo una brutta manipolazione dello stack per ottenere tutto nel giusto ordine.


È anche golfscript quando è invertito o è un'altra lingua?
hildred,

Sì, è GolfScript in entrambi i modi. In effetti, ad eccezione di 0e 1all'inizio e alla fine, il resto del codice è un palindromo.
Ilmari Karonen,

9
Wow. Okay, non mi sento più abbastanza intelligente per questo 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

Modificare:

Breve spiegazione: dal perl le due linee interessanti sono la seconda e la terza. La seconda riga ha due istruzioni, la prima delle quali legge il resto del documento in una stringa. Il secondo elimina la stringa. La terza riga stampa tutto all'indietro. ogni altra cosa viene ignorata. dal lato c hai un array che ha il programma come una stringa, che viene stampato come un array e una stringa, e il resto è un commento.


1
wat. : O La mia testa è esplosa. Ma io conto 6536 personaggi in questo ...
Maniglia della porta

Cosa ... come ... 0_0
The Guy with The Hat

@DoorknobofSnow Ho contato la versione sbagliata. Ma ecco una versione più breve.
hildred

Questo è incredibile! Penso che Haskell / C potrebbe essere un'altra combinazione possibile.
theonlygusti,

@theonlygusti, se lo pubblichi e posso compilarlo, lo voterò.
Hildred

8

Ruby 145

DATA.read.tap {| a | mette a.reverse, a.tr ("\ x79 \ x59", "\ x59 \ x79")}
: y
__FINE__
__DNE__
Y:
}) "97x \ 95x \", "95x \ 97x \" (rt.a, esrever.a stup | a | {pat.daer.ATAD

L'idea principale è semplice: basta mettere la prima metà del codice sorgente all'indietro dopo la __END__quale può essere letta usando DATAda ruby. Quindi basta stampare il retro di questi dati, quindi stampare i dati e si ottiene il codice sorgente originale

Il problema è che questo diventa un palindromo (nota che la prima linea ha bisogno di una linea di fondo), quindi dobbiamo rompere la simmetria. Ho appena aggiunto un simbolo :yal codice e un codice che trasformerà questo simbolo tra lettere minuscole e maiuscole tra le esecuzioni, ripristinando così lo stato originale dopo due esecuzioni.

Test uno: possono essere eseguiti

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

Prova due: il risultato di due esecuzioni restituirà la fonte originale

$ diff rq2.rb rq2tt.rb
$

Test tre: il codice non è un palindromo (la corsa intermedia è diversa)

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

4

> <>, 21 19 byte

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

Provalo qui!

Utilizza l'interprete *> <> per comodità, ma questo è valido> <> codice.


Se l'errore è consentito, è possibile farlo in 16 byte:

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

Provalo qui!


@JoKing grazie! Erano le 7 del mattino ed ero troppo stanco per metterlo insieme. Lo modificherò tra un paio d'ore.
Discordian

4

Gol> <> , 11 byte

":5-}H}+5:'

Un intero byte eliminato! è quasi un palindromo, ma tecnicamente non è a causa del '+' e '-', ahah!

Provalo online!

I due seguenti non funzionano, o almeno non soddisfano le specifiche della sfida, ma il codice sopra riportato funziona.

versione leggermente più giovane, 12 byte

"r2ssrH}+5:'

Golfato da un byte, semplicemente usando la doppia virgoletta e aumentandola di 5! E questa nuova versione sembra meno un palindromo.

Provalo online!

versione precedente, 13 byte

"r2ssrHrss7r'

C'è stato un problema con il precedente che JoKing ha sottolineato, grazie per quello, ora funziona, ma con il prezzo di 4 byte extra ...

Provalo online!


1

Aiuto, WarDoq! (27 byte)

25 byte aggiunti a causa della lettura del codice sorgente.

<space>q

Come funziona:
<space>- un commento che termina con un carattere non spaziale
q- stampa il codice sorgente invertito (q "spazio")

invertito:

q<space>

Come funziona:
q- stampa il codice sorgente invertito (q per ora)
<space>- un commento che termina con un carattere non spaziale e aggiungi un carattere all'inizio del comando q (facendo "spazio" q)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.