คุณจะต้องตีกอล์ฟกี่ครั้ง?


12

สำหรับความท้าทายนี้คุณต้องสร้างโปรแกรมที่ใช้จำนวนเต็มxและส่งออกแหล่งที่มาxหลายครั้ง

กฎระเบียบ

  • นี่คือ codegolf จุดมุ่งหมายคือการตีกอล์ฟโปรแกรมของคุณให้มีจำนวนไบต์น้อยที่สุด

  • หากคุณส่งฟังก์ชั่นฟังก์ชั่นจะต้องใช้xเป็นพารามิเตอร์และส่งคืนหรือพิมพ์โค้ดทั้งหมดของคุณxหลายครั้งไปยัง STDOUT ฟังก์ชั่นร่างกายจะต้องไม่ว่างเปล่า

  • หากคุณส่งแลมบ์ดาคุณไม่จำเป็นต้องกำหนดให้กับตัวแปร

  • มีข้อ จำกัดช่องโหว่มาตรฐาน

  • โปรแกรมที่ว่างเปล่าเป็นสิ่งต้องห้าม

  • โปรแกรมของคุณจะต้องทำงานเมื่อxเป็นจำนวนเต็มทั้งหมดที่มากกว่าหรือเท่ากับ 0

  • โปรแกรมของคุณอาจไม่อ่านส่วนใด ๆ ของซอร์สโค้ดโดยตรง


คำถามแรกที่ดี
Bald Bantha

สามารถxเป็น0หรือเราสามารถ จำกัด มันจำนวนเต็มบวก?
mbomb007

การอ่านแหล่งที่มาของฟังก์ชั่นของเราอนุญาตหรือไม่
Shaggy

@ mbomb007 ฉันได้ทำการแก้ไขกฎแล้วxอาจเป็นจำนวนเต็มทั้งหมดที่มากกว่าหรือเท่ากับ 0
Dignissimus - Spammy

@Shaggy ฉันคิดว่านั่นเป็นช่องโหว่มาตรฐานดูเหมือนว่าจะไม่ใช่ ฉันได้แก้ไขคำถามเพื่อให้ชัดเจนว่าโปรแกรมอาจไม่อ่านส่วนใดส่วนหนึ่งของซอร์สโค้ด
Dignissimus - Spammy

คำตอบ:


8

Python 2 , 50 ไบต์

บันทึกเครื่องหมายจุลภาคต่อท้ายและขึ้นบรรทัดใหม่

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

ลองออนไลน์!


@ mbomb007 สมมติว่ามีบรรทัดใหม่ที่ท้ายรหัส แก้ไขปัญหา.
MD XF

OP กล่าวว่า x อาจเป็นศูนย์ซึ่งในกรณีนี้ไม่ควรพิมพ์อะไรดังนั้นคำตอบนี้ผิด
mbomb007

@NickA ไม่มันพิมพ์บรรทัดใหม่ซึ่งผิด
mbomb007

0 ดูเหมือนจะไม่พิมพ์บรรทัดใหม่ให้ฉันตามที่ทดสอบโดยใช้sys.stdout.write("2")หลังจากใช้
Ørjan Johansen


4

RProgN 2 , 8 ไบต์

{`{.*¶}{

QuPro ของ RProgN2 ทำงานได้ดีเป็นพิเศษสำหรับเรื่องนี้!

{     } # 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.

ลองออนไลน์!


4

Mathematica, 40 33 ไบต์

ขอบคุณ lanlock4 สำหรับการบันทึก 7 ไบต์!

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

ฟังก์ชันบริสุทธิ์รับอาร์กิวเมนต์จำนวนเต็มแบบไม่ลบ ToString[#0]เป็นวิธี Mathematica มาตรฐานในการเข้าถึงนิยามบริสุทธิ์ของฟังก์ชั่นปัจจุบัน; StringRepeat[..., #1]เชื่อม (สำเนา) สำเนาของสตริงนั้นเข้าด้วยกัน ตัวอย่างเช่น,

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

อัตราผลตอบแทน:

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

คุณสามารถโพสต์ตัวอย่างการใช้งานได้หรือไม่ วิ่ง, เช่น , StringJoin @@ Table[ToString[#0], #1] & [2]ให้ฉันข้อผิดพลาด
Julian Wolf

จริงๆ? การโทรที่แน่นอนนั้นเหมาะกับฉัน ฉันใช้ Mathematica 11 ....
Greg Martin

อืมฉันยังคงใช้ 10 (v10.0.1.0) - อาจเป็นได้ สำหรับการอ้างอิงนี่เป็นข้อผิดพลาดที่ฉันได้รับ:Table::itform: Argument 2 at position 2 does not have the correct form for an iterator.
Julian Wolf

Aha - ฉันค้นพบว่าTable[x,5]จะกลับมา{x,x,x,x,x}ใน Mathematica 10.2 ขึ้นไป แต่ใน Mathematica 10.1 มันให้ข้อผิดพลาด (คาดว่าTable[x,{5}])
Greg Martin

ฉันคิดว่าคุณสามารถแทนที่ด้วยStringJoin @@ Table StringRepeat
ไม่ใช่ต้นไม้



3

Python 2, 70 ไบต์

x=0การแก้ปัญหานี้ถ้าทำงาน มีการขึ้นบรรทัดใหม่ที่ต่อท้ายเดียว

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

ลองออนไลน์


Python 2, 60 ไบต์ (ไม่ถูกต้อง)

สิ่งนี้จะถือว่าx>=1แต่ OP ชี้แจงว่าxอาจเป็นศูนย์ มีการขึ้นบรรทัดใหม่ที่ต่อท้ายเดียว

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

ลองออนไลน์


2

อันเดอร์โหลด , 12 ไบต์

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

ลองออนไลน์!

การส่งฟังก์ชั่นเนื่องจาก Underload ไม่มีวิธีอื่นในการป้อนข้อมูล (ลิงก์ TIO แสดงหมายเลข 4 ที่กำหนดเป็นอินพุตและเพิ่มรหัสเพื่อพิมพ์ผลลัพธ์ที่ได้)

นี่เป็นเพียงตัวสร้างควินสากล(a(:^)*):^บวก~^("ทำสำเนาจำนวนเท่ากับอาร์กิวเมนต์")



1

เยลลี่ 10 ไบต์

“;⁾vṾẋɠ”vṾ

ลองออนไลน์!

มันทำงานอย่างไร

“;⁾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
มันดูอร่อย แต่แม่ของฉันบอกฉันเสมอว่าอย่าใส่สิ่งที่ดูแปลก ๆ ในปากของฉัน
Mateen Ulhaq

1

GNU Make , 49 ไบต์

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

Make จะเข้าร่วมสำเนาด้วยการเว้นวรรคเดียวดังนั้นฉันต้องรวมอักขระช่องว่างเพิ่มเติมไว้ท้ายแล้วลบออกด้วยการเว้นวรรคstripเพื่อทำตามข้อกำหนดอย่างซื่อสัตย์


ดูเหมือนว่าจะอ่านซอร์สโค้ดซึ่งมีทั้งโดยค่าเริ่มต้นและถูกห้ามอย่างชัดเจน
Ørjan Johansen

@ ØrjanJohansenไม่มันไม่อ่านซอร์สมันอ่านค่าตัวแปร มันเป็นหลักการเดียวกันกับคำตอบอื่น ๆ ยกตัวอย่างเช่น JS หรือ Python
eush77

@ ØrjanJohansenโอ้ฉันเข้าใจแล้ว $0ในฟังก์ชั่นทำให้ไม่เหมือนกับในเชลล์ มันเป็นชื่อของตัวแปรที่เรียกว่าฟังก์ชั่น ดูgnu.org/savannah-checkouts/gnu/make/manual/html_node/…
eush77

ถอนหายใจบริเวณที่เป็นสีเทา BTW คน Python ไม่ทำเช่นนี้
Ørjan Johansen

@ ØrjanJohansenฉันจะบอกว่าคำตอบนี้ใกล้กับ Python มากกว่าคำตอบของ JS ทั้งหมดcallจะทำคือทำหน้าที่แทน$0และ$1มีพารามิเตอร์ที่เกิดขึ้นจริง - %มันแก้ไขสตริงที่เรียบง่ายเช่นเดียวกับงูใหญ่
eush77


1

Betaload , 203 ไบต์

เพิ่มบรรทัดใหม่เพื่อความชัดเจน:

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

ฉันให้ข้อ จำกัด ที่ตัวเองต้องอ่านจาก STDIN มากกว่าจากด้านบนของสแต็กเหมือนกับคำตอบ Underload ฉันยังใช้การป้อนทศนิยมที่เหมาะสมซึ่งทำขึ้นส่วนใหญ่ของรหัส

คำอธิบาย:

ฉันห่อโปรแกรมขึ้นมาในควินกระดาษห่อ: และ(a(:^)* ):^ซึ่งหมายความว่ารหัสทั้งหมดที่อยู่ในชุดคลุม quine จะมีรหัสต้นฉบับของโปรแกรมที่ด้านล่างของสแต็ก

เพื่อที่จะแปลงตัวเลขให้เป็นเลขคริสตจักรปกติฉันใช้เทคนิคการแทนที่แต่ละหลักด้วยรหัสเพื่อคูณด้วย 10 และเพิ่มตัวเลขนั้น:

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

มีการทำซ้ำหลายครั้งที่นี่ดังนั้นให้จัดทำมันลงในโปรแกรมย่อยที่จะนำตัวเลขของศาสนจักรจากด้านบนสุดของสแต็คและใช้มันเพื่อสร้าง "หลักสตริง:"

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

ฉันใส่สิ่งนี้ลงในสภาพแวดล้อมใหม่เพื่อให้สามารถเข้าถึงได้อย่างรวดเร็ว:

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

Rตอนนี้ฉันสามารถสร้างรหัสทดแทน Rใช้องค์ประกอบด้านบนของสแต็กเพื่อสร้างตารางการค้นหาเพื่อแทนที่สตริงจาก STDIN ด้วยรหัส Betaload มันทำงานได้เช่นนี้:

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

อย่างไรก็ตามเราสามารถใช้โปรแกรมย่อยที่เราสร้างขึ้นเพื่อสร้างส่วนรหัส:

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

เมื่อRถูกเรียกใช้มันจะแปลงอินพุตเป็นชุดโปรแกรมย่อยที่สร้างตัวเลขของศาสนจักร เมื่อโปรแกรมย่อยนี้ถูกดำเนินการมันจะสร้างตัวเลขของศาสนจักรในองค์ประกอบถัดไปของสแต็ก (0 ซึ่งวางลงก่อนหน้านี้) ซึ่งหมายความว่าหลังจากR^นั้นค่าสูงสุดบนสแต็กจะเป็นตัวเลขของศาสนจักร จากนั้นเรา^อีกครั้งเพื่อใช้ตัวเลขของศาสนจักรกับองค์ประกอบสุดท้ายในสแต็ค (ซอร์สโค้ดของโปรแกรม) เพื่อรับคำตอบ

สนุกจริง: ฉันมี MD สำหรับการส่งนี้มาหลายเดือนแล้ว ฉันเก็บไว้หลังจากเข้าใจผิดคำถาม (ซึ่งฉันไม่สามารถหาได้อีกต่อไป) ฉันต้องขุดมันขึ้นมาจากถังรีไซเคิลเพื่อโพสต์ที่นี่



1

Python 2 , 41 ไบต์

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

ลองออนไลน์!

ไม่เอาท์พุท hacky ครับใช้inputแทนprintเนื่องจากprintมีข้อผิดพลาดแปลกที่เกี่ยวข้องกับการพิมพ์ขึ้นบรรทัดใหม่เมื่อมันไม่ควรจะ ... ออกด้วยข้อผิดพลาด EOF

คำอธิบาย:

_="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 ไบต์

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

\47เป็นทางหนีแปดสำหรับการอ้างอิงเดียว ( ') มันถูกตีความภายในเครื่องหมายคำพูดคู่ ( ") แต่ไม่ใช่ภายในเครื่องหมายคำพูดเดี่ยว


0

Javascript ES6, 27 37 bytes

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

แก้ไข

+10 ไบต์ถ้าf=ควรจะแสดงเช่นกัน


f=

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

f(2);


@Downvoter ทำไม
Weedoze

@Kaiido ฉันไม่รู้ .. ฉันควรจะรักษาf=หรือไม่
Weedoze

รหัสของคุณกำลังอ่านตัวเองโดยการเรียกtoStringใช้ฟังก์ชัน
aebabis

@acbabis การโทรf.toString()หรือfเหมือนเดิม แต่จะไม่แสดงชื่อฟังก์ชั่น
Weedoze

ฉันเชื่อว่า @acbabis หมายถึงว่ามันเป็นการละเมิดจุดสุดท้ายของความท้าทาย "โปรแกรมของคุณอาจไม่อ่านส่วนใด ๆ ของซอร์สโค้ดโดยตรง" - การใช้fวิธีนี้เป็นการอ้างอิงถึงแหล่งที่มาของมันเอง
skyline3000

0

CJam , 20 12 ไบต์

บันทึก 8 ไบต์ด้วย Martin Ender

{"_~"+ri*}_~

ลองออนไลน์!

Exaplanation

{       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 ไบต์

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

ลองออนไลน์!

ไม่เล่นกอล์ฟได้เลยเนื่องจาก b64 quines มักจะเป็น


0

Go , 257 254 ไบต์

นี่ทำให้ฉันเจ็บปวด

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

ลองออนไลน์!


0

Microscript II, 22 ไบต์:

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

Microscript II, 20 ไบต์ (แต่ไม่ถูกต้องทางเทคนิคเนื่องจากเข้าถึงรหัสที่มาของบล็อกรหัส):

{s""+`"~sN*"s`+}~sN*

0

C, 144 116 ไบต์

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

05AB1E , 17 ไบต์

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

การปรับเปลี่ยนของการเริ่มต้น โดยการเพิ่ม0"D34çý"D34çý×?

ลองออนไลน์

คำอธิบาย:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.