Hasilkan Program dalam Ukuran yang meningkat

21

Dalam tantangan ini, Anda akan menulis sebuah program yang menghasilkan program yang merupakan ganda dari panjang program aslinya. Program ini dikeluarkan harus keluaran program baru program ganda yang panjang.

Contohnya

Jika program saya adalah a:

< a
> aa

< aa
> aaaa

< aaaa
> aaaaaaaa

Aturan

  • Tidak ada built-in quine
  • Program asli harus minimal satu byte
  • Urutannya secara teoritis harus bekerja tanpa batas
  • Program Anda tidak diperbolehkan membaca dari apa pun (file, stdio)

Skor Anda adalah ukuran dari program asli.

Downgoat
sumber
Bagaimana dengan mengakses file dengan membaca sendiri / mengakses tempat kode itu terkandung?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ itu tidak diizinkan karena itu akan melanggar aturan saya percaya.
Downgoat
2
@ Doᴡɴɢᴏᴀᴛ aturan quine direkomendasikan oleh tag wiki tetapi tidak berlaku secara otomatis
Martin Ender
2
Terkait Terkait Terkait
Martin Ender

Jawaban:

12

CJam, 10 byte

{"_~"+_}_~

Uji di sini.

Penjelasan

{"_~" e# Generalised quine framework, leaves the block and the string "_~"
      e# on the stack. 
+     e# Prepend the block to the string.
_     e# Duplicate the resulting array.
}_~
Martin Ender
sumber
GolfScript belum mati! Ilmari memiliki jawaban untuk pertanyaan serupa yang melakukan ini tepat 10 byte.
Justin
8

JavaScript, 62 61 37 byte


Terima kasih kepada @ Doᴡɴɢᴏᴀᴛ untuk bantuannya!


Asli [37 byte]:

f=_=>'f='+'_'.repeat((10+f).length)+f

Anak [74 byte]:

f=______________________________________=>'f='+'_'.repeat((10+f).length)+f

Cucu [148 byte]:

f=________________________________________________________________________________________________________________=>'f='+'_'.repeat((10+f).length)+f


Alternatif (dengan mencetak ke konsol, dan sebagai program lengkap):

Asli [61 byte]:

f=_=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()

Anak [122 byte]:

f=______________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()

Cucu [244 byte]:

f=________________________________________________________________________________________________________________________________________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()



Bagaimana itu bekerja!

1.   f=_=>   Tentukan fungsi f asconsole.log(...)

2.   ;f()   Jalankan fungsi f.

3.   (dalam fungsi f)  

  • console.log(...)   Cetak yang berikut ini:

    • f=   teks literal "f ="
    • ${'_'.repeat((0+f).length+5)   "_" diulangi untuk panjang f, diubah ke akun untuk karakter yang tidak termasuk dalam stringifikasi f
    • +f}   Pengetatan fungsi f
    • ;f()   teks literal "; f ()"

Catatan

  • console.logdiperlukan alih-alih alertkarena alerttampaknya tidak berfungsi dengan baik dengan string yang sangat panjang (setidaknya pada konfigurasi mesin / browser saya)
  • Itu _dimasukkan ke dalam nama parameter (tidak terpakai) dari fungsi f, untuk memastikan bahwa mereka termasuk dalam stringifikasi f.
  • Peningkatan utama (selain menyingkirkan console.log) dari solusi pertama di atas yang kedua: menambahkan 10fungsi alih-alih 0melemparkannya ke string membuatnya satu byte lebih lama, menghilangkan kebutuhan untuk menambah 1 panjang setelahnya, menghemat satu byte.
Jrich
sumber
0+fjuga harus bekerja untuk melemparkan fungsi ke string
Downgoat
48 byte:(f=_=>`(f=${'_'.repeat((0+f).length+5)+f})()`)()
Downgoat
@ Doᴡɴɢᴏᴀᴛ Lupa bahwa mengembalikan hasil biasanya dapat diterima. Akan diperbarui.
Jrich
@ Doᴡɴɢᴏᴀᴛ Sebenarnya, karena menulis jawaban sebagai fungsi diterima secara umum, apakah solusinya bahkan harus memanggil fungsi?
Jrich
tentu, Anda bisa melakukannya
Downgoat
6

Minkolang 0,15 , 19 14 byte

"66*2-rIDdr$O.

Asli , anak , cucu .

Penjelasan

"66*2-      $O.    Standard quine formulation

      r            Reverse stack
       I           Push length of stack
        D          Pop n and duplicate top of stack n times
         d         Duplicate top of stack
          r        Reverse stack

Yang dilakukan oleh bit di antara rs adalah menduplikasi periode akhir cukup kali untuk memenuhi kriteria penggandaan. .adalah karakter "stop program", sehingga banyak periode pada akhirnya tidak melakukan apa-apa kecuali berada di sana.

El'endia Starman
sumber
3

CJam, 12 byte

{"_~"1$1$}_~

Saat dijalankan, ini akan dicetak

{"_~"1$1$}_~{"_~"1$1$}_~

yang, pada gilirannya, akan dicetak

{"_~"1$1$}_~{"_~"1$1$}_~{"_~"1$1$}_~{"_~"1$1$}_~

dan seterusnya.

Cobalah online!

Dennis
sumber
2

Python 3, 51 byte

x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)

Ini termasuk baris baru yang tertinggal.

Output yang mana:

x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)
x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)
Zweedeend
sumber
2

GolfScript, 11 byte

{: ".~"]}.~

Cobalah online!

Cara kerja kode sumber

{: ".~"]}.~

{       }    Define and push a code block.
         .~  Push a copy and execute it.
 :           Save the code block in the space character.
             Every subsequent space will now execute the code block.
   ".~"      Push that string.
       ]     Wrap the entire stack in an array.

Jika kode sumber di atas dijalankan sekali, tumpukan akan berakhir sebagai

["" {: ".~"]} ".~"]

di mana string kosong di awal sesuai dengan keadaan awal stack (input kosong).

Dua salinan kode sumber akan meninggalkan status akhir

[["" {: ".~"]} ".~"] {: ".~"]} ".~"]

dan seterusnya.

Apa yang terjadi selanjutnya

Setelah mengeksekusi kode sumber, penerjemah melakukan hal berikut:

  1. Itu membungkus seluruh tumpukan dalam sebuah array, dan mendorong array itu pada stack.

    Untuk satu salinan kode sumber, tumpukan sekarang berisi

    ["" {: ".~"]} ".~"] [["" {: ".~"]} ".~"]]
    
  2. Itu dijalankan putsdengan maksud mencetak tumpukan dibungkus, diikuti oleh linefeed.

    putsdidefinisikan sebagai {print n print}, jadi ia melakukan hal berikut.

    1. printmencetak salinan tumpukan yang terbungkus tanpa memeriksanya (yaitu, tanpa mengubahnya menjadi representasi dawai). Ini mengirimkan

      {: ".~"]}.~
      

      untuk STDOUT dan mengeluarkan salinan tumpukan dari atas tumpukan.

      Tumpukan sekarang berisi

      ["" {: ".~"]} ".~"]
      
    2. mengeksekusi blok kode yang kita definisikan sebelumnya.

      :dimulai dengan menyimpan ["" {: ".~"]} ".~"]karakter spasi, lalu ".~"mendorong dirinya sendiri dan ]membungkus tumpukan dalam array.

    3. n mendorong string yang terdiri dari satu linefeedfeed.

      Tumpukan sekarang berisi

      [["" {: ".~"]} ".~"] ".~"] "\n"
      
    4. dieksekusi sekali lagi. Namun, itu didefinisikan ulang ketika kami menyebutnya pertama kali dan sekarang berisi array, bukan blok kode.

      Bahkan, itu mendorong ["" {: ".~"]} ".~"], meninggalkan tumpukan

      [["" {: ".~"]} ".~"] ".~"] "\n" ["" {: ".~"]} ".~"]
      
    5. Akhirnya, printcetak item tumpukan paling atas tanpa memeriksanya, mengirim

      {: ".~"]}.~
      

      untuk STDOUT.

Dennis
sumber
1

𝔼𝕊𝕄𝕚𝕟, 26 karakter / 36 byte

⟮ô`\u27ee⦃ᶈ0}\u27ef
`ď2)⟯

Try it here (Firefox only).

Perhatikan bahwa ada baris baru yang tertinggal.

Penjelasan

Standar quine: ⟮ⒸⅩ222+ᶈ0

Modifikasi:

  • Gunakan ôfungsi untuk menampilkan quines semua hasil, bukan hasil terakhir (seperti yang dilakukan menggunakan output implisit)
  • Gunakan \u27ee⦃ᶈ0}\u27ef\ndan tutup blok salin untuk mencegah konflik dengan blok salin nanti.
  • Gunakan ď2untuk mengulangi string dua kali.
Mama Fun Roll
sumber