CJam, ( 58 56 54 48 46 x 2) * 48% = 44,16
{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~
yang mencetak
{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~
Karakter non-spasi di setiap baris tetap sama di antara kedua quine yang sama.
Tetapi sekarang bagian yang sangat manis:
{`"_~"+{_,94\m2/S*a_+\*{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~N/23f/Wf%N*}_`'"#)!*}_~
adalah quine! :)
Uji di sini.
Bagaimana itu bekerja
Saya sarankan Anda membaca penjelasan pada kiriman saya yang lain terlebih dahulu, karena menjelaskan dasar-dasar quining di CJam secara umum.
Yang ini agak rumit. Untuk quine timbal balik, seperti dalam kasus lain, saya memodifikasi representasi string dari blok dengan menambahkan spasi sebelum atau setelah setiap baris, dan menukar 0 dengan 2, sehingga program yang dihasilkan menempatkan spasi di ujung yang berlawanan.
Perhatikan bahwa spasi sama sekali tidak memengaruhi quesi bersama. Yang pertama, mereka berada di blok, yang tidak benar-benar digunakan, dan yang kedua mereka berada di seluruh kode.
Untuk mendapatkan quine reguler ketika menggabungkan keduanya, kita perlu menemukan cara untuk menghindari melakukan semua modifikasi itu. Perhatikan bahwa struktur spasi dan kode berarti bahwa dengan menggabungkan keduanya, kami memasukkan keseluruhan satu quine ke yang lainnya. Jadi, jika kita menempatkan seluruh kode modifikasi dalam satu blok, kita dapat menjalankan blok itu tergantung pada isi sebenarnya.
Jadi sekarang saya punya blok ini ... untuk quines mutual, hanya berisi kode yang sebenarnya ingin saya jalankan. Untuk gabungan quine, ini juga berisi seluruh quine lagi, dalam posisi acak, yang tidak masuk akal ... tetapi karena ini adalah sebuah blok, itu tidak berjalan secara otomatis. Jadi kita dapat menentukan apakah akan memodifikasi string berdasarkan pada isi blok itu. Itu untuk apa _`'"#)!
. Ini menduplikasi blok, mengonversinya menjadi string, mencari karakter "
(yang, dalam quines mutual, hanya muncul di luar blok) - pencarian kembali -1
jika karakter tidak ditemukan dan bilangan bulat positif sebaliknya -, menambah hasilnya dan meniadakannya secara logis. Jadi jika "
ditemukan ini menghasilkan, 0
jika tidak maka akan menghasilkan 1
. Sekarang kita lakukan saja*
, yang mengeksekusi blok sekali, jika hasilnya 1 dan tidak sama sekali sebaliknya.
Akhirnya, ini adalah cara kerja kode modifikasi:
_,94\m2/S*a_+\*N/23f/Wf%N*
_, "Duplicate the quine string and get its length.";
94\m "Subtract from 94.";
2/ "Divide by two.";
S* "Create a string with that many spaces. This will be
an empty string for the first mutual quine, and contain
23 spaces for the second mutual quine.";
a_+ "Create an array that contains this string twice.";
\* "Join the two copies together with the quine string.";
N/ "Split into lines.";
23f/ "Split each line into halves (23 bytes each).";
Wf% "Reverse the two halves of each line.";
N* "Join with a newline.";
Mengklaim Bounty, (12 x 10) * 48% = 57,6
Ternyata kode ini dapat dibagi lebih banyak baris dengan sangat mudah dengan beberapa modifikasi. Kami menambahkan 2 karakter, untuk mendapatkan 48 berturut-turut, yang kemudian dapat dengan mudah kita bagi dengan 8, sehingga kita memiliki 8 baris dengan 6 karakter kode dan 6 spasi. Untuk melakukan itu kita juga perlu mengubah beberapa angka, dan mengatur ulang satu atau dua operator, sehingga tidak terpecah di kedua saluran. Itu memberi kita versi yang berfungsi dengan ukuran 12 x 8 ... satu dari persyaratan. Jadi kami hanya menambahkan dua baris yang tidak melakukan apa-apa (tekan 1, pop 1, push 1, pop 1), jadi dapatkan 12 x 10 :
{`"_~"
+{129X
$,m2/S
*a_+\*
N/6f/1
;1;1;1
;1;1;1
;Wf%N*
}_`'"#
)!*}_~
Seperti yang sebelumnya ini menghasilkan
{`"_~"
+{129X
$,m2/S
*a_+\*
N/6f/1
;1;1;1
;1;1;1
;Wf%N*
}_`'"#
)!*}_~
(Catatan: tidak perlu untuk tetap berganti-ganti kiri dan kanan pada garis tengah, hanya posisi baris pertama dan terakhir yang penting. Kiri dan kanan dapat dipilih secara sewenang-wenang untuk semua jalur lainnya.)
Dan melalui kebetulan murni, quine lengkap juga masih berfungsi:
{`"_~"{`"_~"
+{129X+{129X
$,m2/S$,m2/S
*a_+\**a_+\*
N/6f/1N/6f/1
;1;1;1;1;1;1
;1;1;1;1;1;1
;Wf%N*;Wf%N*
}_`'"#}_`'"#
)!*}_~)!*}_~
(Saya katakan kebetulan, karena bagian yang mengurus tidak mengeksekusi kode batin sekarang anehnya diselingi dengan quine yang lain, tetapi masih terjadi dengan baik.)
Yang sedang berkata, saya bisa saja menambahkan 44 baris 1;
ke kiriman asli saya untuk memenuhi persyaratan karunia, tetapi 12 x 10
terlihat jauh lebih rapi. ;)
Sunting: Haha, ketika saya mengatakan "kebetulan murni" saya tidak bisa lebih tepat. Saya melihat bagaimana quine terakhir sekarang benar-benar berfungsi, dan ini benar-benar menggelikan. Ada tiga blok bersarang (sebenarnya 4, tetapi yang paling dalam tidak relevan). Satu-satunya bagian penting dari terdalam dari 3 blok itu adalah bahwa ia berisi "
(dan bukan yang ia lakukan dalam penyerahan asli, tetapi '"
yang digunakan pada akhirnya untuk memeriksa karakter yang sama). Jadi struktur dasar quine adalah:
{`"_~"{`"_~"+{___'"___}_`'"#)!*}_~)!*}_~
Mari kita membedah itu:
{`"_~" }_~ "The standard CJam quine.";
{`"_~"+ }_~ "Another CJam quine. Provided it doesn't do
anything in the rest of that block, this
will leave this inner block as a string on
the stack.";
) "Slice the last character off the string.";
! "Negate... this yields 0.";
* "Repeat the string zero times.";
Jadi ini memang melakukan sihir lucu, tetapi karena blok bagian dalam meninggalkan string tunggal di tumpukan, )!*
kebetulan mengubahnya menjadi string kosong. Satu-satunya syarat adalah bahwa hal-hal di blok dalam setelah +
tidak melakukan hal lain ke stack, jadi mari kita lihat itu:
{___'"___} "Push a block which happens to contain
quotes.";
_`'"#)!* "This is from the original code and just
removes the block if it does contain
quotes.";