Quine pengendara sepeda otomatis

11

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 oobarfyang 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 terpendek menang.

IQuick 143
sumber
2
Nah itu mengecewakan: codegolf.meta.stackexchange.com/a/14104/9365
Dom Hastings
3
@HomHastings Anda sudah berbulan-bulan memposting itu.
mbomb007
2
@ IQuick143 Saya pikir> 2 karakter adalah persyaratan yang baik untuk alasan yang Anda nyatakan
dylnan
5
Apakah ini dianggap sebagai 'rotating quine'? ; p
Kevin Cruijssen
3
@ mbomb007 Menemukan bahasa yang memungkinkan ini adalah bagian dari tantangan
IQuick 143

Jawaban:

19

Befunge-98 (PyFunge) , 2600 byte

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 qdan ,
Masalah : Tidak satu pun dari simbol-simbol tersebut yang merupakan titik awal yang baik terutama karena @dan qmenghentikan program secara instan.
Solusi : Singkirkan karakter-karakter itu dalam kode sumber

Masalah : Bagaimana?
Solusi : Gunakan pperintah (put) untuk mengubah kode sumber untuk memasukkan karakter yang diperlukan yang akan mencetak isi kode sumber yang digeser satu byte dan tidak menggunakan gperintah yang curang.

Masalah : (menghela napas kapan ini akan berakhir)
Perintah put muncul 3 nilai n x yyang 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 :
Sebuah gambar bernilai 1000 kata kata mereka.  Lalu mereka membuat Piet.

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 0yang 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: Kode

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);
IQuick 143
sumber
Saya benar-benar menantikan penjelasan lengkapnya, tetapi ini sepertinya suatu pencapaian dan tentu saja layak mendapatkan hadiah!
Nathaniel
1
@Nathaniel, Penjelasan lengkapnya harap Anda menyukainya! : D
IQuick 143
1
Bagian tentang berurusan dengan pargumen yang salah adalah genius.
leo3065
@ leo3065 Terima kasih :)
IQuick 143
@ Cepat, memang saya lakukan!
Nathaniel