Cermin quine (atau kepala saya sakit)


32

Saya membaca Cetak kode Anda mundur - quine terbalik Dan saya pikir, ini bisa lebih menarik jika kode mundur Anda juga dapat dieksekusi . Jadi tantangan ini akan memiliki semua aturan dan persyaratan yang lain, tetapi juga harus menjadi sumber yang valid setelah dibalik (dalam bahasa yang sama atau yang lain dan masih mencetak sumbernya mundur).

Semua aturan dan pemberian skor dari tantangan quine terbalik berlaku, jadi semua jawaban untuk pertanyaan ini akan menjawabnya (tetapi tidak mencetak skor juga.)

Edit:

Atas permintaan, semua aturan sekarang disalin di sini.

Aturan:

  • tulis p program yang ketika dieksekusi menghasilkan output p 'di mana p' adalah p mundur dan p 'saat dieksekusi menghasilkan p.
  • Tidak menggunakan file lain (mis. reverse.txt)
  • Panjang kode minimum adalah dua karakter.
  • Program Anda tidak bisa menjadi palindrome.

Mencetak:

  • +50 jika Anda menggunakan data tarikan dari Internet.
  • +25 jika Anda membaca kode sumber Anda sendiri.
  • +1 poin per karakter.
  • Skor terendah menang.

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

Saya hanya mengatakan bahwa Anda akan dapat menjalankan output dari mengeksekusi output dari mengeksekusi output [...] mengeksekusi output p (sama seperti quine apa pun kecuali untuk quine mundur).
Andrew Larsson

@AndrewLarsson Memang meskipun bukti konsep saya membangun p akan ditulis dalam c dan p 'dalam perl.
Hildred

Oh, itu pasti keren!
Andrew Larsson

1
Ya, sudah terlambat. Bukan duplikat.
Johannes Kuhn

Jawaban:


22

GolfScript, 46 karakter

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

Yah, ini jelek, tapi berhasil. Output sama dengan kode terbalik, dan juga program GolfScript yang valid yang menampilkan kode asli lagi.

OK, coba saya jelaskan bagaimana saya membuatnya. Pertama, saya mulai dari quine {".~"}.~, dan memodifikasinya seperti pada jawaban ini untuk membalikkan dirinya sendiri. Untuk membuat output quine yang dapat dieksekusi dengan sendirinya, saya membuat salinan kode sebelum membalikkannya, dan termasuk a# di akhir kode, sehingga versi terbalik di akhir menjadi hanya komentar. Dengan demikian, kita mendapatkan quine palindrom:

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

Namun, menurut aturan, palindrom tidak diperbolehkan, jadi saya perlu memecah simetri itu. Saya pikir cara termudah adalah memasukkan 0(yang, dalam dirinya sendiri, adalah quine dalam GolfScript) dalam kode dan membalikkannya 1dengan !setelah membuat salinan terbalik. Sebagian besar kompleksitas yang tersisa hanyalah manipulasi tumpukan jelek untuk mendapatkan semuanya dalam urutan yang benar.


Apakah ini juga skrip golf saat dibalik atau apakah itu bahasa lain?
Hildred

Ya, itu adalah GolfScript. Memang, kecuali untuk 0dan 1di awal dan akhir, sisa kode adalah palindrome.
Ilmari Karonen

9
Wow. Oke, saya tidak merasa cukup pintar untuk SE ini lagi :(
Cruncher

21

Perl dan 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

Edit:

Penjelasan singkat: dari perl dua baris yang menarik adalah yang kedua dan yang ketiga. Baris kedua memiliki dua pernyataan, yang pertama membaca sisa dokumen menjadi string. Yang kedua menghindari string. Baris ketiga mencetak semuanya mundur. segala sesuatu diabaikan. dari sisi c Anda memiliki array yang memiliki program sebagai string, yang dicetak sebagai array dan string, dan sisanya adalah komentar.


1
wat. : O Kepalaku meledak. Tapi saya menghitung 6536 karakter dalam ...
Gagang Pintu

What ... how ... 0_0
The Guy with The Hat

@DoorknobofSekarang saya menghitung versi yang salah. Tapi ini versi yang lebih pendek.
hildred

Ini luar biasa! Saya pikir Haskell / C mungkin kombinasi lain yang layak.
theonlygusti

@ theonlygusti, jika Anda mempostingnya dan saya dapat mengkompilasinya, saya akan menaikkannya.
Hildred

8

Ruby 145

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

Gagasan utamanya sederhana: cukup masukkan paruh pertama kode sumber setelah __END__yang dapat dibaca menggunakan DATAdari ruby. Kemudian cetak kebalikan dari data ini, lalu cetak data, dan Anda mendapatkan kembali kode sumber aslinya

Masalahnya adalah, ini menjadi palindrom (perhatikan bahwa baris pertama membutuhkan endline), jadi kita harus memecahkan simetri. Saya baru saja menambahkan simbol :yke kode, dan beberapa kode yang akan mengubah simbol ini antara huruf kecil dan huruf besar di antara run, dengan demikian kembali ke keadaan semula setelah dua run.

Tes satu: mereka dapat dieksekusi

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

Tes dua: hasil dua kali berjalan akan mengembalikan sumber aslinya

$ diff rq2.rb rq2tt.rb
$

Tes tiga: kodenya bukan palindrome (jalan tengah berbeda)

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

4

> <>, 21 19 byte

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

Coba di sini!

Menggunakan penerjemah *> <> untuk kenyamanan, tetapi ini valid> <> kode.


Jika kesalahan keluar diizinkan, maka itu dapat dilakukan dalam 16 byte:

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

Coba di sini!


@JoKing, terima kasih! Saat itu jam 7 pagi dan saya terlalu lelah untuk menyatukannya. Saya akan mengeditnya, dalam beberapa jam.
Discordian

4

Gol> <> , 11 byte

":5-}H}+5:'

Seluruh byte dipotong! hampir seperti palindrome, tetapi secara teknis bukan karena tanda '+' dan '-', haha!

Cobalah online!

Dua di bawah ini tidak berfungsi, atau setidaknya mereka tidak memenuhi spesifikasi tantangan, tetapi kode di atas tidak.

versi yang sedikit lebih muda, 12 byte

"r2ssrH}+5:'

Golf dari byte, hanya dengan menggunakan kutipan ganda dan menambahnya dengan 5! Dan versi baru ini kurang terlihat seperti palindrom.

Cobalah online!

versi yang lebih lama, 13 byte

"r2ssrHrss7r'

Ada masalah dengan yang sebelumnya yang ditunjukkan oleh JoKing, terima kasih untuk itu, sekarang berfungsi, tetapi dengan harga 4 byte tambahan ...

Cobalah online!


1

Tolong, WarDoq! (27 byte)

25 byte ditambahkan karena membaca kode sumber.

<space>q

Cara kerjanya:
<space>- komentar yang diakhiri dengan karakter non-spasi
q- kode sumber cetak terbalik (q "spasi")

Terbalik:

q<space>

Cara kerjanya:
q- cetak kode sumber terbalik (q untuk sekarang)
<space>- komentar yang berakhir pada karakter non-spasi, dan menambahkan karakter ke awal perintah q (membuat "spasi" q)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.