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


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!


@ 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

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!


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] & 

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

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


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").



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.

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.


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


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.



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



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.


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);


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

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.


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!


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*

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);}

0

Python 3, 69 Bytes

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


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