1-up quine rata-rata Anda


34

A 1-up Quine adalah program yang sangat mirip dengan Quine a. Satu perbedaan utama adalah bahwa alih-alih mencetak sendiri satu kali, ketika n salinan program digabungkan, hasilnya mencetak program asli n + 1 kali.

Contoh

Jika program Anda adalah Abc123:

Abc123  ->  Abc123Abc123
Abc123Abc123  ->  Abc123Abc123Abc123
Abc123Abc123Abc123  -> Abc123Abc123Abc123Abc123

Tantangan

Tantangan Anda adalah membuat quine 1-up terpendek yang valid dalam bahasa apa pun. Aturan quine yang biasa berlaku, jadi Anda tidak boleh:

  • Kirim program kosong.
  • Langsung atau tidak langsung, baca 1 kode sumber.
  • Gunakan quining built-in.

Ini adalah kode-golf, jadi kode terpendek dalam byte menang.

1 Ini tidak termasuk menggunakan string atau blok kode hard-coded sebagai bagian dari program Anda.


2
Apakah boleh jika ndibatasi oleh beberapa batasan tipe data (ukuran integer maksimum, dll)?
Luis Mendo

2
@LuisMendo Saya pikir tidak apa-apa, selama Anda dapat mendukung jumlah pengulangan yang masuk akal (100, mungkin).
ETHproduksi

Apakah membaca panjang kode sumber menggunakan metode quin builtin oke?
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Rasanya agak mirip dengan mendapatkan kode sumber itu sendiri kepada saya, karena Anda masih mendapatkan informasi tentang kode sumber. Jadi tidak.
ETHproduk

Jawaban:


13

GolfScript, 12 byte

{`'.~'+:n}.~

Cobalah online!

Penjelasan

Ini menggabungkan ide-ide dari quine GolfScript standar:

{'.~'}.~

Dan quine saya yang baru ditemukan :

":n`":n`

Gagasan utamanya adalah lagi untuk menggunakan nyang dicetak secara implisit di akhir program untuk mendapatkan salinan tambahan dari quine. Karena menugaskan variabel tidak mengubah apa pun ketika dilakukan lagi di salinan berikutnya, ini hanya akan menambah satu salinan. Berikut ini rincian kode:

{        # Standard quine framework. This pushes the block, duplicates it and runs the
         # second copy, such that it can process the first copy to create a quine.
  `      # Convert the block to its string representation.
  '.~'+  # Append the string '.~' to make a complete quine. This is simply left on the
         # stack to be printed at the end.
  :n     # Store the string in n such that one more copy is printed at the end.
}.~

12

GolfScript, 12 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 everything up to the last [ in an array.
        [     Set a new array marker.

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

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

tiga salinan keadaan terakhir dari

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

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 dua salinan kode sumber, tumpukan sekarang berisi

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

    putsdidefinisikan sebagai {print n print}, demikian juga yang berikut ini.

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

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

      (kode sumber) ke STDOUT dan muncul 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, ]membungkusnya ".~"dalam array, dan [menetapkan penanda array baru.

    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

      {: ".~"][}.~
      

      ke STDOUT, 1-upping kode sumber.


11

Javascript ES6 (REPL), 55 byte

var a=-~a;$=_=>`var a=-~a;$=${$};$();`.repeat(a+1);$();

Disimpan 2 byte berkat @ user81655!

Penjelasan

Berikut kerangka kerja standar quine:

$=_=>`$=${$};$()`;$()

Anda harus dapat melihat kerangka kerja ini di dalam kiriman. Penjelasan lebih lanjut di bawah ini.


var a=-~a;

Ini adalah penghitung, default ke 1. Pada dasarnya, ini memberitahu kita berapa banyak untuk mengulang quine dan kenaikan pada saat yang sama.

$=_=>`var a=-~a;$=${$};$();`.repeat(a+1);$();

Ini adalah bagian quine. Kami pada dasarnya mengulangi string quine dengan penghitung + 1. Panggilan fungsi selanjutnya akan menggantikan output.


Ini mungkin hanya saya, tetapi ini sepertinya tidak mencetak apa-apa. (diuji menggunakan JSFiddle, jika itu penting?)
jrich

Ah, Anda harus menggunakan konsol Firefox. (Dan muat ulang setelah setiap kali dijalankan untuk mengatur ulang a).
Mama Fun Roll

Saya rasa Anda tidak perluvar
Cyoce

Tidak, saya lakukan karena awalnya tidak terdefinisi. Menggunakan var memungkinkan kita untuk bekerja dengannya.
Mama Fun Roll

7

CJam, 14 byte

{"_~"]-2>_o}_~

Cobalah online!

Bagaimana itu bekerja

{"_~"]-2>_o}_~

{          }    Define a code block and push it on the stack.
            _~  Push and execute a copy of it.
 "_~"           Push that string.
     ]          Wrap the entire stack in an array.
      -2>       Discard all but the last two elements (block and string).
         _o     Push and print a copy of that array.

Setelah salinan terakhir dari program dieksekusi, array yang berisi blok dan string masih ada di stack, sehingga dicetak secara implisit.


4

Groovy, 83 byte

s="s=%c%s%c;f={printf(s,34,s,34,10)};f()%cf()//";f={printf(s,34,s,34,10)};f()
f()//

Ada satu baris yang disematkan dan tidak ada yang tertinggal. Ini mencetak:

s="s=%c%s%c;f={printf(s,34,s,34,10)};f()%cf()//";f={printf(s,34,s,34,10)};f()
f()//s="s=%c%s%c;f={printf(s,34,s,34,10)};f()%cf()//";f={printf(s,34,s,34,10)};f()
f()//

Fungsi ini f()mencetak satu salinan quine. Program awal menyebutnya dua kali. Baris pertama dari kode yang ditambahkan menjadi komentar dan hanya panggilan kedua untuk f()dieksekusi.


4

Ruby, 43 byte

1;s="1;s=%p;$><<s%%s*n=2-0";$><<s%s*n=2-0

Dengan sendirinya, ini mencetak dirinya sendiri 2-0atau 2waktu. Ketika digabungkan ke salinan lain dari dirinya sendiri, pernyataan cetak akhir terlihat seperti $><<s%s*n=2-01, yang berarti output itu sendiri hanya sekali ( 01menjadi oktal 1). Jadi hanya salinan akhir dari string yang dicetak dua kali, yang lain mencetak sekali.

Penugasan sebaris nhanya untuk membuat urutan operasi bekerja dengan benar; negara sebenarnya tidak diteruskan dari satu salinan ke yang berikutnya.


4

NodeJS, 63 61 60 55 byte

ini juga akan berfungsi dalam JavaScript (ES6) jika Anda menganggap beberapa pesan konsol dipisahkan oleh baris baru (tidak perlu REPL)

Disimpan 2 byte berkat @ dev-null

(f=_=>(t=_=>console.log(`(f=${f})()`)||(_=>t))(t()))()

perhatikan bahwa ada baris baru di akhir kode.


Ini yang menarik, pasti salah satu favorit saya untuk situs ini sejauh ini.

Saya cukup yakin ini tidak bisa bermain golf lebih banyak. (mungkin printfungsi SpiderMonkey ...)

Penjelasan

//FIRST ITERATION
            console.log(`(f=${f})()`)                   //logs to the console a quine of the source code using function f's toString()
                                     ||                 //causes the expression to evaluate to the second part, since console.log's return value is falsy
                                       (_=>t)           //a function that returns function t when called
       t=_=>                                            //defines function t to be the code above. When called, t will log a quine and then return a function that returns t.
      (                                      )(t())     //call t twice. (one call is done via the t() as an ignored parameter) This will print the quine twice.
 f=_=>                                                  //define f as the above code.
(                                                  )()  //call function f with no arguments. this results in a function returning t. (the result of calling t once)
                                                        //this newline is to compensate for console.log's behavior of adding a newline to its output
//SECOND ITERATION
(                                                  )    //call the function that returns t that was returned from the first iteration. This expression will result in whatever that function returns, which is t.
 f=_=>(t=_=>console.log(`(f=${f})()`)||(_=>t))(t())     //this part evaluates to a function, which is passed as a parameter to the function that returns t, that ignores its parameter.
                                                    ()  //call whatever the last expression returned, which is the function t, with no parameters. This will print the quine once.
                                                        //this call will result in a function returning t, just like from the first iteration, so we can add on more iterations at will.

Saya suka bagaimana itu juga terlihat seperti memakai kacamata hitam terlebih dahulu. (f=_=Saya mungkin sedikit terlalu lelah.
Ben Leggiero

2

Ruby, 55 byte

n||=2;s="n||=2;s=%p;$><<(s%%s)*n;n=1;";$><<(s%s)*n;n=1;

Tidak ada yang sangat menarik di sini, itu hanya quine ruby ​​normal dengan penghitung.


2

JavaScript (ES6), 164 byte

console.log((`+String.fromCharCode(96)).repeat(window.a||(a=3,5)).slice(67,-14))
console.log((`+String.fromCharCode(96)).repeat(window.a||(a=3,5)).slice(67,-14))

Berfungsi di halaman pengujian atau konsol JS apa pun di Firefox, dengan asumsi ruang antara dua pesan konsol dianggap sebagai baris baru.


Banyak alat peraga untuk melakukan ini dalam bahasa tujuan umum!
Ben Leggiero

disingkat windowmenjadi this.
Mama Fun Roll



1

Y

Tidak bersaing, 6 byte

UCn*px

Y adalah headcannon yang saya miliki untuk sementara waktu, dan ini mengilhami saya untuk menulisnya. Itu dibuat untuk tantangan di mana urutan adalah kunci, seperti ini. Kode dibagi menjadi tautan oleh karakter "simpul". Dalam hal ini, kode kita dimasukkan ke dalam dua rantai (aslinya), dengan simpulnya C.

U  C  n* px
1  N    2

Umerekam string transendental, yaitu string yang merentang tautan. Ia merekam sampai bertemu yang lain U. Jika a Utidak terpenuhi pada akhir string, ia membungkus. Juga, Utermasuk dalam string secara default. Setelah merekam string, kita melanjutkan ke node C, yang hanya memindahkan kita ke tautan selanjutnya.

nmendorong jumlah rantai. Untuk kasus dasar kami, ini 2. Untuk urutan Krantai, ada K+2rantai, karena ada Knode. *adalah repittion string. pmencetak seluruh tumpukan (dalam hal ini, satu string), dan xmengakhiri program.

Dalam sebuah teks:

UCn*px
U..... record that string
 C     next link
  n*   repeat that string twice.
    px print and terminate

UCn*pxUCn*pxUCn*px
U.....U            record string
 C                 next link
  n*               repeat that string four times (three Cs)
    px             print and terminate

Coba di sini!


Jadi apa manfaat praktis Uselain quining? (Selamat atas 7k, btw)
ETHproduksi

@ ETHproductions U dapat digunakan untuk menangkap string yang merentang tautan, juga dapat menangkap dan menghabiskan tautan yang dibongkar ke program. Dan terimakasih! : D
Conor O'Brien

1

Brachylog , 20 byte

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

Cobalah online!

Dimodifikasi dari quine ini.

⊥                       Fail,
 ∨                      or
                w       print
  "⊥∨~kgjw₃w₅"          "⊥∨~kgjw₃w₅"
                 ₃      formatted
              gj        with itself;
                 ₃w₅    print it again at the end of the program if this route succeeds.

Ketika ini digabungkan dengan dirinya sendiri, setiap rute kecuali yang terakhir gagal dan program bergerak ke yang berikutnya, mengeksekusi masing w₃- masing dan mundur melewati setiap w₅kecuali yang terakhir.

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

Cobalah online!

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

Cobalah online!

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.