Tugas Anda adalah menulis program atau fungsi yang:
- Saat dijalankan untuk pertama kalinya, mengeluarkan kode sumbernya.
Pada eksekusi berikutnya, ia harus menampilkan apa yang dihasilkan sebelumnya, tetapi dengan satu perubahan karakter acak (didefinisikan di bawah). Itu tidak harus menjadi perubahan acak yang seragam, tetapi setiap perubahan yang mungkin harus memiliki peluang bukan nol terjadi.
Setelah eksekusi pertama, program Anda tidak lagi menjadi quine; output akan berubah (dan program bebas untuk memodifikasi sendiri juga).
Misalnya, jika quine Anda adalah ABCD
, menjalankannya berulang kali dapat mencetak:
ABCD
A!CD
j!CD
j!CjD
Spesifikasi
Perubahan karakter adalah:
- Penyisipan karakter acak,
- Penghapusan karakter acak, atau
- Penggantian karakter dengan karakter acak baru. Perhatikan bahwa karakter baru diizinkan sama dengan karakter yang digantikannya, dalam hal ini tidak ada perubahan yang akan dilakukan.
Tentu saja, menghapus atau mengganti karakter dari string kosong bukanlah perubahan yang valid.
- Meskipun ini ditandai quine , aturan yang melarang membaca kode sumber Anda tidak berlaku.
Anda dapat menggunakan set karakter apa pun asalkan mencakup karakter yang digunakan dalam kode sumber Anda.
Jawaban:
Python 3 ,
288 270 224 212 195 196 194 180 178168 byteCobalah online!
Setelah mencetak kode sumber file pada iterasi pertama, kami menambahkan baris tambahan untuk mengatur x ke kode sumber baru, daripada m.
Penjelasan:
Dengan asumsi
hash
mengembalikan nomor acak yang seragam, ada sekitar 1/6 peluang memasukkan karakter baru, 1/6 peluang mengubah karakter yang ada dan 2/6 peluang menghapus karakter. Berapa sisa 2/6 kesempatan yang Anda tanyakan? Mengapa, itu tidak melakukan apa-apa 2/6 waktu!(Berikut adalah program validasi yang diadaptasi dari jawaban mbomb007 . Coba online! )
sumber
f=__file__
akan membantu pada langkah pertama juga.Python 3 ,
205195 byteCobalah online!
Ingin mencoba versi yang tidak membaca kode sumber. Ternyata tidak seburuk yang saya kira, dan hanya 30 atau lebih byte di belakang versi yang melakukannya . Penjelasan untuk cara kerjanya sebagian besar sama dengan jawaban yang lain, tetapi ia menginisialisasi x berbeda karena tidak bisa hanya membaca kode sumber.
sumber
Python 2 ,
779801 byteMeskipun tantangan telah diedit untuk menunjukkan bahwa membaca sumber Anda diperbolehkan, saya sudah membuat solusi tanpa itu. Jadi, untuk menunjukkan bahwa itu mungkin, saya menyelesaikannya. Tidak ada pembacaan file sumber:
Cobalah online! (Perhatikan bahwa ini tidak akan mengubah sumber. Anda harus menjalankannya secara lokal agar dapat berfungsi)
Untuk menunjukkan bahwa transformasi bekerja, di sini adalah program uji (saat ini dibentuk untuk selalu memilih
100
untukr
, dan mencetak hasil untuk setiap kombinasin
danp
untuk daftar awal.)Penjelasan:
Baris pertama adalah quine klasik Anda, tetapi lebih lama untuk menjelaskan apa yang terjadi setelahnya.
Impor untuk bilangan bulat acak.
L
akan menjadi daftar tata cara kode sumber, tetapi pada awalnya merupakan bilangan bulat yang tidak digunakan di tempat lain dalam sumber untuk memungkinkan penggantian string. Buka file untuk menulis sumber baru. Pada menjalankan selanjutnya, itu akan terbuka untuk menambahkan.Hapus baris kode pertama dan ketiga. Ganti yang di
4
atas dengan daftar tata cara.Dalam potongan:
if L>5:
- Melewati baris ini pada eksekusi pertama. Nantinya,L
akan ada daftar, dan ini akan berjalan. Saya akan menjelaskan yangexec
terakhir, karena ini tidak berjalan pertama kali.n
- Angka acak 0-2. Ini menentukan modifikasi yang terjadi (0 = masukkan, 1 = ganti, 2 = hapus).p
- Posisi acak dalam daftar tempat modifikasi akan terjadi.r
- Nomor acak untuk dimasukkan atau diganti dalam daftarf.write("%03d"*3%(n,p,r))
- Tambahkan 3 tebusan ke akhir file sumber. Setiap kali dijalankan, ini akan menambahkan bilangan bulat yang menyandikan semua perubahan ke sumber awal yang telah terjadi.exec'b=[];h=%d...'%1...
- Dapatkan nomor acak (ditemukan setelah%1
dijalankan nanti), terapkan perubahan pada daftar, dan cetak.while~-h:b+=[h%%1000];h/=1000
- Buat daftar tebusan yang dihasilkan sejauh ini, yang bertanggung jawab atas yang memimpin1
, yang mencegah masalah dengan angka nol di depan.while b:r,p,n=b[-3:];b=b[:-3]
- Tetapkan tebusan untuk iterasi ini.L=[L[:p]+L[p+1:],L[:p]+[r]+L[p+n:]][n<2if L else 1]
- (0 = masukkan, 1 = ganti, 2 = hapus)print"".join(map(chr,L))
- Cetak sumber yang dimodifikasi.sumber
p
bisa menjadi panjang senar. Juga, apa perilaku dengan string kosong?Of course, deleting or replacing a character from an empty string is not a valid change
Java 10, 370 byte
Cobalah online.
Penjelasan:
Penjelasan umum:
quine -part :
s
berisi kode sumber yang tidak diformat.%s
digunakan untuk memasukkan String ini ke dalam dirinya sendiri dengans.format(...)
.%c
,%1$c
dan34
digunakan untuk memformat tanda kutip ganda.%%
digunakan untuk memformat modulo-%
).s.format(s,34,s)
menempatkan semuanya bersama-sama.Di sini program dasar Java quine.
Bagian tantangan:
String s;
adalah kode sumber yang akan kami modifikasi di tingkat kelas.int r=s.length();r*=Math.random();
digunakan untuk memilih indeks acak dari kode sumber dalam kisaran[0, length_of_modified_source_code)
.char c=127;c*=Math.random();
digunakan untuk memilih karakter ASCII acak (termasuk unsintables) dalam rentang unicode[0, 126]
.c%3
digunakan untuk memilih opsi acak 0, 1 atau 2. Opsi 0 akan menambahkan karakter acak sebelum indeksr
; opsi 1 akan mengganti karakter pada indeksr
dengan karakter acak; dan opsi 2 akan menghapus karakter di indeksr
.sumber