Berapa kali Anda harus bermain golf quine?

12

Untuk tantangan ini, Anda harus membuat program yang mengambil integer xdan mengeluarkan sumbernya xberkali-kali.

Aturan

  • Ini codegolf, tujuannya adalah untuk golf program Anda untuk memiliki jumlah byte paling sedikit

  • Jika Anda mengirimkan fungsi, fungsi tersebut harus xsebagai parameter dan mengembalikan atau mencetak keseluruhan kode Anda xberkali-kali ke STDOUT. Badan fungsi juga tidak boleh kosong

  • Jika Anda mengirim lambda, Anda tidak perlu menugaskannya ke variabel

  • Batasan celah standar berlaku.

  • Program kosong dilarang

  • Program Anda hanya bekerja ketika xseluruh bilangan bulat lebih besar dari atau sama dengan 0

  • Program Anda mungkin juga tidak langsung membaca bagian mana pun dari kode sumbernya

Dignissimus - Spammy
sumber
Pertanyaan pertama yang bagus
Bald Bantha
Bisa xmenjadi 0, atau bisa kita membatasi untuk bilangan bulat positif?
mbomb007
Apakah membaca sumber fungsi kami diizinkan?
Shaggy
@ mbomb007, saya telah mengedit untuk menjelaskan aturan, xmungkin seluruh bilangan bulat lebih besar dari atau sama dengan 0
Dignissimus - Spammy
@ Shaggy, saya pikir itu adalah celah standar, sepertinya tidak. Saya telah mengedit pertanyaan untuk menyatakan dengan jelas bahwa suatu program tidak boleh membaca bagian mana pun dari bagian kode sumbernya
Dignissimus - Spammy

Jawaban:

8

Python 2 , 50 byte

Perhatikan tanda koma dan baris baru.

s='s=%r;print s%%s*input(),\n';print s%s*input(),

Cobalah online!

benar-benar manusiawi
sumber
@ mbomb007 Asumsikan ada baris baru di akhir kode. Masalah terpecahkan.
MD XF
OP mengatakan bahwa x dapat menjadi nol, dalam hal ini tidak ada yang harus dicetak, jadi jawaban ini salah.
mbomb007
@NickA Tidak, ini mencetak baris baru, yang salah.
mbomb007
0 sepertinya tidak mencetak baris baru kepada saya, seperti diuji dengan menggunakan sys.stdout.write("2")setelahnya.
Ørjan Johansen
5

Japt , 14 byte

"iQ ²pU"iQ ²pU

Cobalah online!

Penjelasan

"iQ ²pU"iQ ²pU
"iQ ²pU"       # Take this string
        iQ     # Prepend a quote
           ²   # Double the string (= source code)
            pU # Duplicate input times
Luke
sumber
4

RProgN 2 , 8 byte

{`{.*¶}{

Quine RProgN2 Loop bekerja sangat baik untuk ini!

{     } # A function literal
       {# Without a matching }, this loops back to the second instruction, which essentially runs the function. This is a bug, but it works to make the "Looping Quine".
 `{.    # Append the literal {, stringifying the function.
    *   # Multiply the stringified function by the input.
     ¶  # Terminate the program.

Cobalah online!

ATaco
sumber
4

Mathematica, 40 33 byte

Terima kasih kepada lanlock4 untuk menghemat 7 byte!

StringRepeat[ToString[#0], #1] & 

Fungsi murni mengambil argumen integer nonnegatif. ToString[#0]adalah cara Mathematica standar untuk mengakses definisi fungsi murni saat ini; StringRepeat[..., #1]menyatukan (input) salinan string itu bersama-sama. Sebagai contoh,

StringRepeat[ToString[#0], #1] & [2]

hasil:

StringRepeat[ToString[#0], #1] & StringRepeat[ToString[#0], #1] & 
Greg Martin
sumber
Bisakah Anda memposting contoh penggunaan? Berjalan, misalnya , StringJoin @@ Table[ToString[#0], #1] & [2]memberi saya kesalahan.
Julian Wolf
Betulkah? Panggilan persis itu bekerja untuk saya. Saya menggunakan Mathematica 11 ....
Greg Martin
Hmm, saya masih menggunakan 10 (v10.0.1.0) —mungkin itu saja. Untuk referensi, inilah kesalahan yang saya dapatkan:Table::itform: Argument 2 at position 2 does not have the correct form for an iterator.
Julian Wolf
Aha — saya menemukan bahwa Table[x,5]akan kembali {x,x,x,x,x}dalam Mathematica 10.2 dan seterusnya, tetapi dalam Mathematica 10.1 ia memberikan kesalahan seperti itu (diharapkan Table[x,{5}]).
Greg Martin
Saya pikir Anda bisa menggantinya StringJoin @@ Tabledengan StringRepeat.
Bukan pohon
3

dc , 31 byte

[[1-rd91Pn93P[dx]Pdx]s.rd0<.]dx

Cobalah online!

Penjelasan:

[[1-rd91Pn93P[dx]Pdx]s.rd0<.]dx
[     91Pn93P[dx]P          ]dx  # Same old regular quine
 [1-rd            dx]s.rd0<.     # Loop until the counter is zero
eush77
sumber
3

Python 2, 70 byte

Solusi ini berfungsi jika x=0. Ada satu baris baru yang tertinggal.

s='s=%r;exec"print%%r;"%%(s%%s)*input()';exec"print%r;"%(s%s)*input()

Cobalah online


Python 2, 60 byte (tidak valid)

Ini mengasumsikan itu x>=1, tetapi OP mengklarifikasi bahwa itu xbisa nol. Ada satu baris baru yang tertinggal.

s='s=%r;print(s%%s*input())[:-1]\n';print(s%s*input())[:-1]

Cobalah online

mbomb007
sumber
2

Underload , 12 byte

(a(:^)*~^):^

Cobalah online!

Pengajuan fungsi, karena Underload tidak memiliki cara lain untuk mengambil input. (TIO menunjukkan angka 4 yang diberikan sebagai input, dan menambahkan kode untuk mencetak hasil yang dihasilkan).

Ini hanya konstruktor quine universal (a(:^)*):^, plus ~^("buat jumlah salinan sama dengan argumen").


sumber
1

Jelly , 10 byte

“;⁾vṾẋɠ”vṾ

Cobalah online!

Bagaimana itu bekerja

“;⁾vṾẋɠ”vṾ  Main link. No arguments.

“;⁾vṾẋɠ”    Set the argument and the return value to the string ';⁾vṾẋɠ'.
         Ṿ  Uneval; yield '“;⁾vṾẋɠ”'.
        v   Eval ';⁾vṾẋɠ' with argument '“;⁾vṾẋɠ”'.
  ⁾vṾ           Yield 'vṾ'.
 ;              Concatenate '“;⁾vṾẋɠ”' and 'vṾ', yielding the source code.
      ɠ         Read an integer from STDIN.
     ẋ          Repeat the source code that many times.
Dennis
sumber
4
Ini terlihat lezat, tapi ibuku selalu mengatakan padaku untuk tidak memasukkan benda-benda aneh ke mulutku.
Mateen Ulhaq
1

GNU Make , 49 byte

$(foreach ,$(shell seq $1),$(strip $(value $0))) 

Make akan bergabung dengan salinan dengan satu spasi, jadi saya harus memasukkan karakter spasi tambahan di akhir dan menghapusnya dengan stripdi antaranya untuk mengikuti persyaratan dengan setia.

eush77
sumber
Itu sepertinya membaca kode sumber, yang keduanya secara default dan secara eksplisit dilarang.
Ørjan Johansen
@ ØrjanJohansen Tidak, tidak membaca sumbernya, ia membaca nilai variabel. Prinsipnya persis sama dengan jawaban lain, misalnya JS atau Python.
eush77
@ ØrjanJohansen Oh, begitu. $0di Make functions tidak sama dengan di shells. Itu nama variabel yang disebut fungsi. Lihat gnu.org/savannah-checkouts/gnu/make/manual/html_node/…
eush77
Desah area abu-abu seperti itu. BTW, yang Python tidak melakukan ini.
Ørjan Johansen
@ ØrjanJohansen Saya akan mengatakan bahwa jawaban ini jauh lebih dekat ke Python daripada ke JS. Semua callyang dilakukan adalah mengganti $0dan $1dengan parameter aktual - itu adalah interpolasi string sederhana, seperti Python %.
eush77
1

Pyth, 17 byte

j*]jN*2]"j*]jN*2]

Cobalah online!

Ekstensi sepele ke jN*2]"jN*2]quine yang cukup terkenal , tetapi mungkin bisa diturunkan

tepuk
sumber
1

Betaload , 203 byte

Baris baru ditambahkan untuk kejelasan:

(a(:^)*(!()):#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>(0)(!()){:^}(1)(){:^}(2)(:*){:^}(
3)(::**){:^}(4)(:*:*){:^}(5)(::*:**){:^}(6)(:*::**){:^}(7)(::*::***){:^}(8)(:*:*:*){:^}(9)(
::**::**){:^}R^^S):^

Saya memberi diri saya batasan yang harus dibaca dari STDIN daripada dari atas tumpukan seperti jawaban Underload biasanya. Saya juga menggunakan input desimal yang tepat, yang merupakan sebagian besar kode.

Penjelasan:

Saya membungkus program dalam quine-wrapper: (a(:^)*and ):^. Ini berarti semua kode di dalam pembungkus quine akan memiliki kode sumber program di bagian bawah tumpukan.

Untuk mengubah angka menjadi angka Gereja yang normal, saya menggunakan teknik mengganti setiap digit dengan kode untuk dikalikan dengan 10 dan menambahkan angka itu:

0 -> (::*:**:*)*
1 -> (::*:**:*)*(:)~*(*)*
2 -> (::*:**:*)*(::)~*(**)*
3 -> (::*:**:*)*(:::)~*(***)*

Ada banyak pengulangan di sini, jadi mari kita mengemasnya menjadi subprogram yang akan mengambil angka Gereja dari atas tumpukan dan menggunakannya untuk membangun "string angka:"

:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*

Saya memasukkan ini ke lingkungan baru sehingga dapat diakses dengan cepat:

#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>

Sekarang saya dapat membuat kode pengganti untuk R. Rmenggunakan elemen atas tumpukan untuk membentuk tabel pencarian untuk mengganti string dari STDIN dengan kode Betaload. Ini berfungsi seperti ini:

()
(0)(code for 0)
(1)(code for 1)
(2)(code for 2)
...
R

Namun, kita dapat menggunakan subprogram yang baru saja kita buat untuk menghasilkan segmen kode:

(0)(!()){:^}
(1)(){:^}
(2)(:*){:^}
(3)(::**){:^}
...

Ketika Rdijalankan, itu akan mengubah input menjadi serangkaian subprogram yang membangun angka Gereja. Ketika subprogram ini dieksekusi, ia menciptakan angka Gereja pada elemen berikutnya pada stack (0, yang diletakkan sebelumnya) Ini berarti bahwa, setelah R^, nilai teratas di tumpukan adalah angka Gereja. Kami kemudian ^sekali lagi menerapkan angka Gereja pada elemen terakhir dalam tumpukan (kode sumber program) untuk mendapatkan jawabannya.

Fakta menyenangkan: Saya sudah memiliki MD untuk pengiriman ini selama beberapa bulan. Saya menyimpannya setelah salah paham pertanyaan (yang sepertinya tidak bisa saya temukan lagi). Saya harus menggalinya dari Recycle Bin untuk mempostingnya di sini.

Buah Esolanging
sumber
1

05AB1E , 23 byte

"34çìDJ¹.D»"34çìDJ¹.D»

Cobalah online!

kalsowerus
sumber
1

Python 2 , 41 byte

_="input('_=%r;exec _'%_*input())";exec _

Cobalah online!

Apakah output agak Hacky menggunakan inputbukan print, karena printmemiliki bug aneh yang melibatkan mencetak baris baru ketika tidak seharusnya ... . Keluar dengan kesalahan EOF.

Penjelasan:

_="input('_=%r;exec _'%_*input())"; # Set _ to a string
exec _                              # Execute that string
input(                        )     # "print"
      '_=%r;exec _'%_               # The source code with _ formatted in
                     *input()       # Actual input many times
Jo King
sumber
0

Pyth, 13 byte

*jN*2]"*jN*2]

Suite uji

Quine Pyth standar ditambah dua *untuk pengulangan.

isaacg
sumber
0

Perl, 48 byte

print"$_\47"x(2*pop)for'print"$_\47"x(2*pop)for'

\47adalah pelarian oktal untuk satu kutipan ( '). Ini ditafsirkan di dalam tanda kutip ganda ( "), tetapi tidak di dalam tanda kutip tunggal.

Grimmy
sumber
0

Javascript ES6, 27 37 byte

_=>alert(`${f.name}=${f}`.repeat(_))

Edit

+10 byte jika f=harus juga ditampilkan


f=

_=>alert(`${f.name}=${f}`.repeat(_))

f(2);

Weedoze
sumber
@Downvoter mengapa?
Weedoze
@ Kaiido saya tidak tahu .. Haruskah saya menyimpannya f=?
Weedoze
Kode Anda membaca sendiri dengan secara implisit memanggil toStringfungsi.
aebabis
@acbabis Memanggil f.toString()atau fsama tetapi tidak akan menampilkan nama fungsi
Weedoze
Saya percaya apa yang dimaksud @acbabis adalah melanggar poin terakhir dari tantangan "Program Anda mungkin juga tidak secara langsung membaca bagian mana pun dari kode sumbernya" - menggunakan fcara itu merujuk ke sumbernya sendiri.
skyline3000
0

CJam , 20 12 byte

8 byte disimpan berkat Martin Ender

{"_~"+ri*}_~

Cobalah online!

Penjelmaan

{       e# Begin a block literal:
 "_~"+  e#  Add whatever's on the stack to the beginning of the array ['_', '~'].
 ri*    e#  Repeat the resulting array a number of times equal to the input.
}       e# Close the block. Push it on the stack.
_~      e# Copy it and run it.
Kucing Bisnis
sumber
0

PHP, 194 byte

<?php $a="PD9waHAgJGE9IiMiOyRpPSRhcmd2WzFdO3doaWxlKCRpLS0pZWNobyBzdHJfcmVwbGFjZShjaHIoMzUpLCRhLGJhc2U2NF9kZWNvZGUoJGEpKTs=";$i=$argv[1];while($i--)echo str_replace(chr(35),$a,base64_decode($a));

Cobalah online!

Sama sekali tidak golf, seperti b64 quines cenderung.

Skidsdev
sumber
0

Pergi , 257 254 byte

Ini menyakitkan saya.

package main;import(."fmt";."strings";."strconv";."os");func main(){s:="package main;import(.\"fmt\";.\"strings\";.\"strconv\";.\"os\");func main(){s:=%q;n,_:=Atoi(Args[1]);Print(Repeat(Sprintf(s,s),n))}";n,_:=Atoi(Args[1]);Print(Repeat(Sprintf(s,s),n))}

Cobalah online!

benar-benar manusiawi
sumber
0

Microscript II, 22 byte:

"v{lqp}sN*h"v{lqp}sN*h

Microscript II, 20 byte (tetapi secara teknis tidak valid karena mengakses kode sumber dari blok kode):

{s""+`"~sN*"s`+}~sN*
SuperJedi224
sumber
0

C, 144 116 byte

i;main(a){for(i=getchar()-48;i--;)printf(a="i;main(a){for(i=getchar()-48;i--;)printf(a=%c%s%c,34,a,34);}",34,a,34);}
MD XF
sumber
0

Python 3, 69 Bytes

s='s=%r\nx=int(input())\nprint(s%%s*x)\n'
x=int(input())
print(s%s*x)
MrGeek
sumber
0

05AB1E , 17 byte

0"D34çý×?"D34çý×?

Modifikasi default 0"D34çý"D34çýdengan menambahkan ×?.

Cobalah online.

Penjelasan:

0                   # Push 0 to the stack
                    #  STACK: [0]
 "D34çý×?"          # Push the string 'D34çý×?' to the stack
                    #  STACK: [0, 'D34çý×?']
          D         # Duplicate this string
                    #  STACK: [0, 'D34çý×?', 'D34çý×?']
           34ç      # Push '"' to the stack
                    #  STACK: [0, 'D34çý×?', 'D34çý×?', '"']
              ý     # Join the stack by this '"' delimiter
                    #  STACK: ['0"D34çý×?"D34çý×?']
               ×    # Repeat the string the (implicit) input amount of times
                    #  input = 2 → STACK: ['0"D34çý×?"D34çý×?0"D34çý×?"D34çý×?']
                ?   # Output to STDOUT without trailing newline
Kevin Cruijssen
sumber