Quine-hardened quine

14

Tugas Anda adalah membuat program yang mencetak sumbernya sendiri.

"Hei, kita sudah memiliki tantangan ini, dan bervariasinya, mengapa kamu membuat yang lain?" Anda mungkin bertanya, tetapi yang ini akan menjadi salah satu yang paling sulit (semoga saja, tetap saja).

Quine Anda harus "mutasi-hardened", yang berarti quine, bahkan ketika salah satu karakternya digandakan, harus menampilkan kode sumber dari program asli.

Misalnya, jika Anda memiliki quine (contoh berikut tidak ditulis dalam bahasa apa pun, itu hanya pseudocode):

abcd

Semua program ini harus menghasilkan abcd:

aabcd
abbcd
abccd
abcdd

(Dalam setiap program-program tersebut, a, b, cdan dmasing-masing digandakan di tempat, yang berarti karakter digandakan ditempatkan langsung setelah karakter asli.)

Aturan:

  • Aturan quine standar berlaku.
  • Karakter multi-byte dihitung sebagai satu karakter, dan karakter tidak "terpecah" menjadi byte masing-masing ketika digandakan.

Ini adalah , jadi kode terpendek dalam byte menang!

clismique
sumber
Apakah ini masuk hitungan? 0dan 00di CJam kedua output 0.
geokavel
Tidak, 0ini bukan quine yang tepat.
Dennis
2
Saya pikir ini akan jauh lebih menarik sebagai kode bowling
Tn. Xcoder
Apakah masalah mutasi kode terpecahkan secara umum? kecuali mutasi terjadi pada karakter di dalam string yang dikutip, biasanya akan merusak program.
Hasen
Bukankah judulnya agak menyesatkan? "Mutasi" menyarankan untuk mengubah karakter, tidak mengulanginya
Luis Mendo

Jawaban:

18

> <> , 56 byte

^
.
+
8
f
0
o
a
o
~
:
?
~
:
?
:
-
*
4
8
:
^
^
}
*
3
d
'

Cobalah online! atau verifikasi semua mutasi .

Cara kerja program asli (kedaluwarsa)

Penerjemah dimulai dalam sel (0, 0) . ^mengatur arah ke atas , sehingga penunjuk instruksi (IP) membungkus ke sel (0, 20) .

'mengaktifkan mode string: sampai yang berikutnya 'ditemui, semua karakter di bawah IP didorong pada stack. Hal yang sama 'ditemukan lagi setelah membungkus, jadi kami mendorong

d3*}^^:84*=?~oao0f.^

IP mendarat di (0, 19) , masih naik. Menjalankan d3*}dorongan 13 = 0xd , lalu 3 , mengalikan kedua nilai ( 39 / kutipan tunggal ), kemudian memutar tumpukan ke kanan. Ini meninggalkan tumpukan sebagai berikut.

'd3*}^^:84*=?~oao0f.^

Dua instruksi selanjutnya ( ^) tidak melakukan apa-apa pada saat ini.

:84*=menduplikasi bagian atas tumpukan, mendorong 8 dan 4 , mengalikannya ( 32 / spasi ), kemudian menguji karakter yang digandakan untuk kesetaraan dengan ruang . Untuk program yang tidak diubah, ini akan selalu menekan 0 .

?melewatkan instruksi berikutnya jika bagian atas tumpukan salah. Untuk program asli, selalu begitu, jadi ~selalu dilewati.

oaomuncul dan cetak bagian atas tumpukan, tekan 10 / linefeed , kemudian muncul dan cetak linefeed .

Akhirnya 0f.melompat ke sel (0, 15) (paling bawah ^), mulai dari awal dengan karakter berikutnya di stack.

Setelah tumpukan kosong, seluruh kode sumber telah dicetak. :akan gagal dan program keluar.

Cara kerja program yang dimutasi (ketinggalan jaman)

Menggandakan karakter non-linefeed hanya akan memperluas program secara horizontal. Karena program dijalankan secara vertikal, instruksi tambahan ini tidak akan pernah dijalankan.

Menduplikasi setiap linefeed sebelum bottomost ^akan menggeser sel (0, 14) dan (0, 15) menjadi (0, 15) dan (0, 16) . 0f.sekarang akan melompat ke sel sebelum ujung ^, yang juga merupakan ^, sehingga program tidak terpengaruh oleh perubahan itu.

Akhirnya, karakter linefeed yang digandakan juga akan mengubah string. Garis pendek yang diisi dengan spasi, sehingga 32 / ruang akan disisipkan pada posisi linefeed ini. 84*=akan mendorong 1 untuk ruang, jadi ?jangan lewati instruksi berikutnya. Dalam hal ini, ~muncul dan buang ruang , jadi yang berikut ini oakan mencetak karakter di atas ruang sebagai gantinya.

Dennis
sumber
Anda dapat menduplikasi baris baru dan tetap bekerja.
Dennis
3
Oh, saya tidak membaca posting dengan benar: P (Sialan Dennis, kenapa kamu begitu baik)
clismique
4
Retak.
jimmy23013
@ jimmy23013 Harus diperbaiki.
Dennis