ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Cobalah online!
Ini membuat ini adalah hellfest.
Bagaimana ini bekerja:
Program ini adalah sekelompok pernyataan put yang merakit Program B di sekitar itu sendiri yang kemudian mencetak setengah dari byte sumber bergeser dua kali.
Program ini sebenarnya 2 salinan dari program 1300 byte, ini memastikan bahwa seluruh program 1300 byte selalu dijalankan secara keseluruhan.
Penjelasan yang lebih baik:
Setiap quine Befunge-98 perlu mengandung simbol-simbol seperti itu @
dan q
dan ,
Masalah : Tidak satu pun dari simbol-simbol tersebut yang merupakan titik awal yang baik terutama karena @
dan q
menghentikan program secara instan.
Solusi : Singkirkan karakter-karakter itu dalam kode sumber
Masalah : Bagaimana?
Solusi : Gunakan p
perintah (put) untuk mengubah kode sumber untuk memasukkan karakter yang diperlukan yang akan mencetak isi kode sumber yang digeser satu byte dan tidak menggunakan g
perintah yang curang.
Masalah : (menghela napas kapan ini akan berakhir)
Perintah put muncul 3 nilai n x y
yang menentukan karakter, x-coord, y-coord namun ketika inisialisasi nilai-nilai ini dibagi dua, ia dapat menulis karakter buruk dalam kode sumber awal sehingga tidak berguna untuk quining.
Solusi : (yang terakhir saya janjikan)
Gunakan 2 salinan kode sumber, yang terakhir menjadi "yang benar" ini secara tidak sengaja memperbaiki masalah lain yaitu pernyataan put (perintah p + inisialisasi konstan) yang terbelah dua akan tidak dieksekusi, ini diperbaiki dengan memiliki 2 salinan dari setiap pernyataan. Hal terakhir yang perlu dilakukan adalah bagaimana kita membuat seluruh kode sumber menjadi setengah?
Jawaban :
Ini adalah bukti visual mengapa dua salinan string byte bergeser == Dua salinan string byte digeser. Itu berarti kita dapat mengambil setengah dari kode, byte menggesernya, lalu mencetaknya dua kali (ATAU mengambil setengah dari kode, byte menggesernya, mencetak, ulangi [Itulah yang sebenarnya terjadi])
Bagaimana ini diterapkan : Asumsikan 0123456789abcdef adalah sumbernya
Befunge Pseudocode:
0123456789abcv;;"123456789abcdef" < go this way <--
>PS'0, repeat 2x ^
PS berarti Print Stack (bukan instruksi nyata). Kami mendorong setengah dari kode sumber secara terbalik ke tumpukan menggunakan ""
kemudian kami mencetak tumpukan dan kemudian kami mengambil ( '
perintah) karakter pertama 0
yang kami bergerak di depan '
dan mencetaknya terakhir yang menyebabkan byte byte, kemudian kami ulangi siklus sekali lagi untuk mencetak salinan kedua. Salah satu teknis untuk menangani adalah simbol di dalam sumber, ini dapat menyebabkan masalah jika kita menulisnya ketika mengeksekusi kode sumber, saya mengelak dengan menambahkan lebih banyak pernyataan put yang mengurusnya secara eksternal.
Ini membuat kode terlihat seperti ini:
Penjelasan :
Sorotan Hijau: Kode yang menangani penambahan karakter ke sumber
Gray Letters (probs poor visibility sorry): Kode yang ditambahkan oleh kode hijau
Sorotan Merah: Kode yang memindahkan karakter pertama dari bagian kedua kode sumber ke area Biru .
Sorotan Biru: Lihat Sorotan Merah
Oranye Sorotan: Kode yang memastikan kita mengakhiri setelah kita menulis salinan bergeser 2 byte dengan menempatkan perintah @
(terminasi) ke dalam Area Kuning.
Panah diharapkan semoga memperjelas bagaimana aliran kode.
Inilah bagian terakhir yang sulit:
Dari mana kode sumber bayi berasal?
Jawaban singkat: C # Sihir
Jawaban panjang: 100+ cuplikan kode Befunge dibuat dengan tangan yang dikompilasi oleh kode C #. Saya secara manual menulis sekitar 100 inisialisasi konstan (sepotong kode befunge yang mendorong nomor tertentu untuk ditumpuk) dengan tangan dan kemudian menggunakan program C # kustom untuk mengkompilasinya ke dalam output Befunge 1.300 byte, yang kemudian saya salin disisipkan dua kali dan membuat final program.
Apakah kamu masih disini? Terima kasih sudah membaca! (atau setidaknya bergulir sampai akhir)
Saya berharap lelucon buruk saya menyenangkan dan tidak mengganggu.
Catatan: Tidak ada pernyataan put dalam kode ini membuat perintah ag yang akan curang.
EDIT: Saya telah memverifikasi kode menggunakan kode Javascript berikut di TIO menggunakan alat pengembang
setInterval(()=>{document.getElementById("code").value =
document.getElementById("output").value;
document.getElementById("run").click();}, 2000);