Buat Quine.
Tampak mudah bukan? Nah quine ini harus menampilkan dirinya sendiri ditambah karakter pertamanya, yang kemudian menampilkan dirinya sendiri ditambah karakter keduanya, dan seterusnya.
Dengan cara ini quine dalam beberapa generasi akan menghasilkan dua salinan.
Contoh: Memungkinkan kode Anda x
. Menjalankannya harus menampilkan x + x[:1]
. Menjalankan program yang dihasilkan harus menampilkan x + x[:2]
dan seterusnya ...
Jika kode Anda foobar
, jalankan ini harus menampilkan foobarf
. Menjalankan ini seharusnya menghasilkan foobarfo
. Dan seterusnya dan seterusnya mengikuti pola ini:
foobar
foobarf
foobarfo
foobarfoo
foobarfoob
foobarfooba
foobarfoobar
foobarfoobarf
Program Anda harus lebih dari 2 Bytes dan harus menampilkan hanya SATU karakter tambahan dari kode sendiri setiap iterasi.
Jawaban:
Zsh ,
110108100 byteCobalah online!
Jadi itu mungkin.
Penjelasan
sumber
R, 289 byte
berikan penghargaan pada quine ini untuk inspirasi. Hanya berfungsi jika dijalankan di lingkungan R yang sama dengan quine sebelumnya dijalankan.
sumber
cat
menambahkan baris baru.main
atau struktur wajib lainnya seperti itu di R. Selain itu, pertanyaannya tidak secara eksplisit meminta program lengkap, sehingga fungsi atau serupa akan dilakukan.Alice , 29 byte
Cobalah online!
Karakter yang tidak patut dicetak adalah 0x18.
Penjelasan
Masalah dengan
"
quine Fungeoid berbasis biasa adalah bahwa jika kita mengulangi seluruh kode sumber, maka kita juga mendapatkan tambahan"
dan string tidak lagi mencakup seluruh kode sumber. Saya menganggap itu sebabnya jawaban yang ada menggunakan pendekatan cheat-yg
sebagai gantinya.Jawaban ini memang menggunakan
"
pendekatan berbasis, tetapi alih-alih memasukkan"
dalam sumber, kami menulisnya ke dalam program saat runtime. Dengan begitu, hanya akan ada satu"
terlepas dari seberapa sering program diulang (karena kami hanya menulisnya ke satu koordinat tertentu, terlepas dari ukuran program).Gagasan umum adalah bahwa kita membuat representasi dari seluruh kode sumber pada stack, tetapi hanya siklus melalui 29 karakter pertama (yaitu panjang program) dengan panjang loop ditentukan oleh ukuran kode. Oleh karena itu, kita sebenarnya dapat menambahkan karakter arbitrer (kecuali linefeeds) setelah
@
dan hasilnya akan selalu menjadi pengulangan siklus program inti, satu karakter lebih lama dari sumbernya.sumber
Perl 5 , 83 byte (termasuk baris terakhir)
Cobalah online!
__DATA__
Token ol yang baik memudahkan untuk menambahkan string arbitrer ke sembarang program Perl, yang dapat diakses oleh program utama melalui<DATA>
pegangan file (dan benar-benar menggunakan__END__
, yang melakukan hal yang sama untuk kompatibilitas mundur, alih-alih__DATA__
menyimpan dua byte tambahan) .Perhatikan bahwa program ini tidak membaca kode sumbernya sendiri, tetapi hanya data input tambahan yang ditambahkan ke sumbernya setelah
__END__
token. Efeknya,__END__
token dan semuanya setelahnya berfungsi seperti string literal yang diakhiri pada akhir input.Juga perhatikan bahwa, untuk memenuhi spesifikasi dengan tepat, program ini harus diakhiri dengan baris baru. Jika tidak, baris baru akan secara otomatis ditambahkan setelah baris kedua
__END__
, tetapi kemudian output iterasi pertama tidak akan persis sama dengan kode plus byte pertama lagi.sumber
Befunge-98 , 30 byte
Cobalah online!
Saya coba menggunakan Befunge-98 yang menggunakan quine yang diakhiri dengan spasi yang juga menghitung berapa banyak karakter yang telah dihasilkan. Namun apakah menggunakan
g
perintah.sumber
PHP, 146 byte
Itu harus dijalankan menggunakan
-r
di baris perintah.sumber
php -r 'command'
.Pesona Rise , 61 byte
Cobalah online!
Menggunakan pendekatan yang mirip dengan jawaban Alice: secara reflektif menulis
"
perintah string ke dalam kode sehingga Hanya Ada Satu. Sisa ada banyak manipulasi string dan stack untuk memulihkan program asli, berapa banyak byte tambahan yang diperlukan, dan mencetak bakhil yang diperlukan.The
}͍
urut berputar di memori representasi string sekitar sehingga803X4+kw
muncul pada awal bukan di akhir, karena posisi"
dan tidak ada cara yang lebih mudah menangani operasi ini tanpa harus menghitung banyak angka canggung .Walaupun program aslinya berukuran 61 byte , panjang stringnya hanya 50, yang mudah dikonstruksikan
5X
dan itu hanya kebetulan bahwa ini tidak perlu padded setelah memuat semua fungsionalitas yang diperlukan (mis. Program panjang 49 akan lebih mudah untuk mengkodekan50
dengan satu byte padding daripada mengkodekan literal49
, sementara51
akan dikodekan sebagai5X3+
atau 53, harus memperhitungkan byte ekstra sendiri).sumber