Quine yang tumbuh lambat

30

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.

IQuick 143
sumber
3
Saya menduga bahwa tantangan ini tidak mungkin di sebagian besar bahasa, mengingat bahwa membaca kode sumber dilarang secara default.
Ørjan Johansen
12
@ ØrjanJohansen dan kemudian Dennis muncul
Rod
2
@Rod Yah saya tidak mengatakan semua , hanya saja banyak / sebagian besar bahasa tidak memiliki cara yang jelas untuk menambahkan fragmen kode sewenang-wenang ke akhir sedemikian rupa sehingga (1) tidak memberikan kesalahan sintaksis (2) Program dapat mendeteksi perubahan.
Ørjan Johansen
3
Karena ini adalah quine yang sangat tidak biasa, apakah celah quine yang biasa masih dianulir?
Draconis

Jawaban:

15

Zsh ,110 108 100 byte

a=`<&0`<<''<<<t;b=${a:0:50};printf $b$b${a:0:-50}
a=`<&0`<<''<<<t;b=${a:0:50};printf $b$b${a:0:-50}

Cobalah online!

Jadi itu mungkin.

Penjelasan

a=`<&0`<<''<<<t;       # Set A to everything following this line, until eof or
                       #   an empty line (which never happens before eof) encountered.
                       # A "t" is appended to prevent automatic trimming of newlines.
b=${a:0:50};           # Set B to the first line.
printf $b$b${a:0:-50}  # Print two copies of B and
                       #   A with 50 trailing characters removed.
jimmy23013
sumber
11

R, 289 byte

s<-c("s<-", "i=get0('i',ifnotfound=0)+1;p=paste0(s,substr(get0('p',ifnotfound=s),1,i),collapse='');cat(s[1]);dput(s);cat(paste0(s[2],substr(p,1,i)))#")
i=get0('i',ifnotfound=0)+1;p=paste0(s,substr(get0('p',ifnotfound=s),1,i),collapse='');cat(s[1]);dput(s);cat(paste0(s[2],substr(p,1,i)))#

berikan penghargaan pada quine ini untuk inspirasi. Hanya berfungsi jika dijalankan di lingkungan R yang sama dengan quine sebelumnya dijalankan.

Giuseppe
sumber
sebuah penjelasan akan datang ... Saya belum mengujinya 288 kali, tapi saya cukup yakin itu benar
Giuseppe
Itu bisa dibuktikan harus 289 byte karena quine menambahkan karakter baris baru di sana tapi tetap bagus Anda telah menyelesaikannya!
IQuick 143
ah, kamu benar, bodoh catmenambahkan baris baru.
Giuseppe
Tetapi apakah ini program yang lengkap? Apakah kode yang dihasilkan adalah program lengkap?
jimmy23013
@ jimmy23013 Sejauh yang saya tahu, jawaban ini dan kode yang dihasilkan adalah program lengkap. Tidak ada mainatau struktur wajib lainnya seperti itu di R. Selain itu, pertanyaannya tidak secara eksplisit meminta program lengkap, sehingga fungsi atau serupa akan dilakukan.
Steadybox
5

Alice , 29 byte

4P.a+80pa2*&wdt,kd&w74*,.ok@

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-y gsebagai 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.

4P   Push 4! = 24. This is the code point of the unprintable, which we're 
     using as a placeholder for the quote.
.a+  Duplicate it and add 10, to get 34 = '"'.
80p  Write '"' to cell (8,0), i.e. where the first unprintable is.
    Placeholder, becomes " by the time we get here, and pushes the code
     points of the entire program to the stack. However, since we're already
     a good bit into the program, the order will be messed up: the bottom
     of the stack starts at the 24 (the unprintable) followed by all 
     characters after it (including those from extraneous repetitions). Then 
     on top we have the characters that come in front of the `"`. 
     So if the initial program has structure AB, then any valid program has
     the form ABC (where C is a cyclic repetition of the initial program),
     and the stack ends up holding BCA. We don't care about C, except to
     determine how big the program is. So the first thing we need to do is
     bring B to the top, so that we've got the initial program on top of
     the stack:
a2*  Push 10*2 = 20.
&w   Run the following section 21 times, which is the length of B.

  dt,  Pull up the value at the bottom of the stack.

k    End of loop.
d&w  Run the following section D+1 times, where D is the length of ABC.

  74*  Push 28, one less than the number of characters in AB.
  ,    Pull up the 29th stack element, which is the next character to print.
  .o   Print a copy of that character.

k    End of loop.
@    Terminate the program.
Martin Ender
sumber
Solusi bagus Saya suka penjelasannya.
IQuick 143
4

Perl 5 , 83 byte (termasuk baris terakhir)

$_=q($/=$;;$_="\$_=q($_);eval
__END__
".<DATA>;print$_,/(.).{82}\z/s);eval
__END__

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.

Ilmari Karonen
sumber
2

Befunge-98 , 30 byte

0>:#;0g:840#;+*#1-#,_$a3*%0g,@

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 gperintah.

IQuick 143
sumber
Anda mungkin ingin menyebutkan di baris pertama bahwa itu tidak bersaing / curang, hanya untuk mencegah downvotes yang mungkin diterima.
kuintopia
2

PHP, 146 byte

ob_start(function($s){return($u=substr($s,0,73)).$u.substr($s,0,-72);})?>ob_start(function($s){return($u=substr($s,0,73)).$u.substr($s,0,-72);})?>

Itu harus dijalankan menggunakan -rdi baris perintah.

jimmy23013
sumber
Tampaknya tidak berfungsi ketika saya Coba online! , itu hanya quine biasa.
Ørjan Johansen
@ ØrjanJohansen Anda harus menjalankannya php -r 'command'.
jimmy23013
Gah, tidak bisa membuatnya bekerja. TIO sepertinya mengabaikan argumen -r.
Ørjan Johansen
Aha. Saya pasti telah salah mengerti sesuatu saat itu. Sekarang saya berhasil membuatnya bekerja dengan PHP sebagai pengaturan bahasa juga.
Ørjan Johansen
2

Pesona Rise , 61 byte

803X4+kw.'.q}͍}͍}͍}͍}͍}͍}͍}͍}͍::l͍5X-:}-$:l͍{-1--@

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 sehingga 803X4+kwmuncul 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 5Xdan itu hanya kebetulan bahwa ini tidak perlu padded setelah memuat semua fungsionalitas yang diperlukan (mis. Program panjang 49 akan lebih mudah untuk mengkodekan 50dengan satu byte padding daripada mengkodekan literal 49, sementara 51akan dikodekan sebagai 5X3+atau 53, harus memperhitungkan byte ekstra sendiri).

Draco18s
sumber