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
, c
dan d
masing-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 kode-golf , jadi kode terpendek dalam byte menang!
sumber
0
dan00
di CJam kedua output0
.0
ini bukan quine yang tepat.Jawaban:
> <> , 56 byte
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 mendorongIP 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.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.oao
muncul 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 inio
akan mencetak karakter di atas ruang sebagai gantinya.sumber