Buat quine yang saling menjalin

17

Tugas Anda adalah membuat program yang, ketika dijalankan, mengembalikan dirinya sebagai output (ini dikenal sebagai quine). Namun, quine ini harus, ketika disalin nkali, mengembalikan quine, tetapi dengan masing-masing karakter digandakan di nwaktu tempat , di mana nadalah bilangan bulat positif.

Jika program asli Anda adalah Derp:

Derp -> Derp (must return itself as output to be a quine)

DerpDerp -> DDeerrpp
(the "Derp" is copied twice, so each character in the output has to be copied twice)

DerpDerpDerp -> DDDeeerrrppp
etc. etc.

Ingatlah bahwa Anda diizinkan untuk memiliki spasi putih di program "basis" Anda, tetapi mereka dihitung ketika "menjalin". Katakan program Anda

Derp 
{newline}

(Baris baru menandakan jalur baru, dan ada ruang tambahan setelah Derp). Ketika digandakan menjadi

Derp 
Derp 
{newline}

Anda harus mengeluarkan

DDeerrpp  
{newline}
{newline}

Perlu diingat bahwa ada 2ruang ekstra setelah DDeerrpp.

Aturan dan Spesifikasi:

  • Program Anda harus mengandung setidaknya dua karakter yang berbeda (yang menyiratkan bahwa kode Anda harus sepanjang minimal 2 byte).
  • Aturan quine standar berlaku.

Ini adalah , jadi kode terpendek dalam byte menang!

clismique
sumber
1
"Aturan standar berlaku" - apakah itu berarti tidak membaca kode sumber?
FlipTack
@FlipTack Artinya - baca tautan untuk informasi lebih lanjut.
clismique

Jawaban:

12

Fission , 6 byte

'!+OR"

Cobalah online! Coba dua salinan! Coba tiga!

Penjelasan

Ini hanya quine standar Fission . Itu terjadi untuk tantangan ini, karena Fission memiliki titik masuk eksplisit ke dalam program. Secara khusus, dengan menduplikasi program, kami menambahkan yang lain Ryang menambahkan atom lain (instruksi pointer). Karena kode sumber adalah toroidal, kode efektif yang dijalankan tidak berubah sebaliknya - untuk setiap atom, kode tersebut masih terlihat sama secara lokal. Namun, atom dieksekusi dalam langkah kunci, sehingga hal-hal yang mereka cetak disisipkan dan kami mendapatkan salinan tambahan dari setiap karakter dalam output.

Demi kelengkapan, saya hanya akan menegaskan kembali bagaimana program itu sendiri bekerja. Terlepas dari apakah kami mengulangi program atau tidak (misalnya '!+OR"'!+OR"'!+OR"), setiap atom melihat kode berikut:

R"'!+OR"'!+O

The "mode cetak matikan tali, sehingga program dimulai dengan mencetak '!+ORlangsung ke stdout, yang semua Quine kecuali kutipan. Kemudian '!setel massa atom ke kode karakter !, +tambahkan, yang memberi ", dan Ocetak sekaligus menghancurkan atom. Program kemudian berakhir, karena tidak ada atom yang tersisa.

Martin Ender
sumber
11

Python 2.7, 377 310 304 194 191 byte!

Ini golf pertama saya, jadi saya tidak berharap itu terlalu bagus. Tapi saya pikir konsep dalam solusi yang saya buat agak lucu, jadi saya tetap mempostingnya.

def f():
 import threading as T,inspect as i;global t,a,i
 try:t.cancel()
 except:a=0
 a+=1;t=T.Timer(1,d);t.start()
def d():print''.join(c*a for c in i.getsource(f)+i.getsource(d)+"f()")
f()

Memang, ini adalah quine; Anda bisa mencobanya di sini . Itu menyalahgunakan modul memeriksa cukup sulit.

Jika kami mencoba menjalankannya dengan kode sumber x2 yang sama, kami mendapatkan output yang tepat juga; Anda dapat mencobanya di sini . x3, x4, dll. semua berfungsi seperti yang diharapkan.

Tidak digabungkan dengan penjelasan:

def f():                                   # Defines a central function f
    import threading as T,inspect as i     # Imports threading and inspect
    global t,a,i                           # Global vars
    try:
        t.cancel()                         # Tries to cancel Timer from previous code
    except:
        a = 0                              # Reached when code is 1st copy; initializes a.
    a += 1                                 # a++; this is the number of copies thus far.
    t = T.Timer(1,d)               # Creates, then starts a timer to call function
    t.start()                              # d in 1 second.

def d():                                   # Prints out the source code; the quine part.
    print''.join(c*a for c in i.getsource(f)+i.getsource(d)+"f()")

f()                                        # Calls f()!
Calconym
sumber
Bukankah ini quine kecurangan, karena membaca kode sumber dari fungsinya sendiri menggunakan inspect? (lihat posting meta yang relevan ). Di PPCG, kami memiliki definisi spesifik tentang apa yang membuat quine valid, dan 'membaca sumber' biasanya dianggap curang.
FlipTack
@FlipTack Saya tidak yakin memeriksa fungsi sama dengan membaca kode sumber. Quines dalam JavaScript dan bahasa berbasis stack melakukan ini sepanjang waktu.
Dennis
Baik :). Saya telah menambahkan highlight sintaks untuk posting Anda. Ide bagus menggunakan threading!
FlipTack
import threading,inspect as idapatimport threading as T,inspect as i
nedla2004
@ Lipup Ups, terima kasih.
Calconym
3

CJam , 19 byte

{]W=s"_~"+T):Te*}_~

Cobalah online!

Bagaimana itu bekerja

{               }_~  Define an anonymous code block (function).
                 _~  Push a copy, and execute the copy.
 ]W=                 Wrap the entire stack in an array and select its last element.
                     This discards whatever was on the stack before the original
                     code block, which is needed for subsequent iterations.
    s"_~"+           Cast the code block to string, push "_~", and concatenate.
                     This pushes the stringified source code on the stack.
          T):T       Push T (initially 0), increment it, and save the result in T.
              e*     Repeat each character in the stringified source code T times.
Dennis
sumber
Apa ... betapa ... begitu cepat ... tolong jelaskan kodenya, sehingga Anda dapat mengajari saya cara-cara CJam.
clismique
@ Qwerp-Derp Saya telah menambahkan penjelasan.
Dennis
3

RProgN , 66 byte

Ruang kosong yang signifikan menjadi kematian saya

[ "[ %q ] F 0 1 + `0 = `. { 0 m } R " ] F 0 1 + `0 = `. { 0 m } R 

Dijelaskan

[ "[ %q ] F 0 1 + `0 = `. { 0 m } R " ] F 0 1 + `0 = `. { 0 m } R   #
[                                                                   # Pop whatever is already on the stack, if anything.
  "[ %q ] F 0 1 + `0 = `. { 0 m } R "                               # This string contains basically the entire function.
                                      ] F                           # ] F duplicates the string, and then F formats it, which in this case puts the first string into the second at %q, surrounded by qoutes.
                                          0 1 + `0 =                # I needed an Incrementer, so I chose 0. 0, is conveniently, pre initilized at 0. And because RProgN is horrifying, you can remap the number functions as they're just more variables. So this increments 0 every time the group is called.
                                                     `. { 0 m } R   # Replace each character with itself repeated '0' times. Because '0' is an incrementer, each time the script is called, the amount of times the characters are repeated increase.

Ya Tuhan aku monster ...

Cobalah online!

ATaco
sumber
Meskipun ~["[%q]F01+`0=`.{0m}R"]F01+`0=`.{0m}Rsecara umum berfungsi dengan baik, ini bukan solusi yang valid, karena tidak ada cara untuk meniru ZSS.
ATaco
2

Perl 5, 107 byte

$_=q[$_=q[S];s/S/$_/;$a++;END{s/./$&x$a/eg;print if$a;$a=0}];s/S/$_/;$a++;END{s/./$&x$a/eg;print if$a;$a=0}

Tidak Disatukan:

$_ = '...INSERT_SOURCE_HERE...';      # Standard quine
s/INSERT_SOURCE_HERE/$_;
$a++;                                 # Count the number of repetitions
END {
    s/./$&x$a/eg;                     # Interweave
    print if $a;                      # Print...
    $a=0;                             # ...but only once
}

Cobalah online!

Joey Marianer
sumber
2

Python 3 , 122 121 112 byte

s='try:from atexit import*;n+=1\nexcept:n=1;register(lambda:[print(end=c*n)for c in"s=%r;exec(s);"%s])';exec(s);

Cobalah Online: satu salinan | dua salinan | tiga salinan | empat salinan, dengan verifikasi otomatis

Bagaimana itu bekerja

Ini menggunakan standar Python quine: Menyimpan kode yang ingin Anda jalankan dalam variabel (sebagai string); termasuk beberapa logika dalam string itu untuk mencetak dirinya sendiri, segala sesuatu sebelum itu, dan segala sesuatu setelahnya; kemudian jalankan string itu.

Kode yang dieksekusi melalui string s adalah sebagai berikut.

try:from atexit import*;n+=1
except:n=1;register(lambda:[print(end=c*n)for c in"s=%r;exec(s);"%s])

Baris pertama mengimpor modul atexit tanpa syarat , yang memungkinkan kita untuk mendaftar keluar penangan. Mencoba mengimpor modul yang sama beberapa kali tidak mempengaruhi script dengan cara apa pun. Kemudian ia mencoba untuk menambah variabel n , untuk melacak berapa banyak salinan kode sumber yang dieksekusi.

Baris kedua dieksekusi hanya jika yang pertama berisi kesalahan. Ini akan menjadi kasus dalam iterasi pertama, karena n masih belum ditentukan. Dalam hal ini, kita menginisialisasi n sebagai 1 dan mendaftarkan lambda yang melakukan sihir yang sebenarnya.

Handler keluar terdaftar

lambda:[print(end=c*n)for c in"s=%r;exec(s);"%s]

akan dipanggil tepat sebelum program selesai. Lambda itu sendiri menciptakan string "s=%r;exec(s);"%s- %rmenciptakan representasi string dari argumen yang tepat ( s ), yang meliputi segala sesuatu antara tanda kutip tunggal dan tanda kutip sendiri - kemudian iterates atas karakter. Untuk setiap karakter c , kami cukup mencetak n salinan c . Melewati c*nsebagai nama argumen enduntuk printsarana yang ada linefeed akan ditambahkan.

Dennis
sumber
1

CJam , 14 byte

{s"_~"+]:.+}_~

Cobalah online!

Penjelasan

{s"_~"+]:.+}_~
{s"_~"+    }_~ Basic quine operator.
       ]:.+    Append each character to corresponding element of the previous result if existed.
jimmy23013
sumber