Buat quine tetapi dengan twist.
Pernyataan
Quine mencetak kodenya tetapi menempatkan karakter pertamanya di akhir.
(Anda dapat melakukannya secara terbalik tetapi memasukkan catatan itu dalam jawaban Anda)
Keluaran kemudian harus menjadi program yang juga merupakan solusi.
Contoh: Asumsikan kode Anda tadi foobar
, menjalankannya akan kembali oobarf
yang akan menjadi program lain yang valid.
foobar -> oobarf
oobarf -> obarfo
obarfo -> barfoo
barfoo -> arfoob
arfoob -> rfooba
rfooba -> foobar
Aturan
- Kode Anda tidak boleh merupakan output dari beberapa generasi kode orang lain yang jelas-jelas mencuri
- Kode Anda harus lebih dari 2 karakter (jadi kode pendek tidak asyik)
- Kode Anda harus mengandung setidaknya dua karakter yang berbeda (mis:
+++
tidak valid)
Mencetak gol
Sebagai tantangan kode-golf , kode terpendek menang.
Jawaban:
Befunge-98 (PyFunge) , 2600 byte
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
@
danq
dan,
Masalah : Tidak satu pun dari simbol-simbol tersebut yang merupakan titik awal yang baik terutama karena
@
danq
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 menggunakang
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:
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 pertama0
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
bayiberasal?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
sumber
p
argumen yang salah adalah genius.