Bao nhiêu lần bạn sẽ phải chơi golf


12

Đối với thử thách này, bạn phải tạo một chương trình lấy số nguyên xvà xuất nguồn của nó xnhiều lần.

Quy tắc

  • Đây là codegolf, mục đích là để đánh gôn chương trình của bạn để có ít byte nhất

  • Nếu bạn gửi một hàm, hàm phải lấy xlàm tham số và trả về hoặc in toàn bộ mã của bạn xnhiều lần cho STDOUT. Cơ thể chức năng cũng không được để trống

  • Nếu bạn gửi lambda, bạn không cần phải gán nó cho một biến

  • Hạn chế kẽ hở tiêu chuẩn áp dụng.

  • Chương trình trống bị cấm

  • Chương trình của bạn chỉ phải hoạt động khi xtoàn bộ số nguyên lớn hơn hoặc bằng 0

  • Chương trình của bạn cũng có thể không trực tiếp đọc bất kỳ phần nào trong mã nguồn của nó


Câu hỏi đầu tiên rất hay
Hói Bantha

xthể 0, hoặc chúng ta có thể hạn chế nó vào số nguyên dương?
mbomb007

Là đọc nguồn của chức năng của chúng tôi được phép?
Xù xì

@ mbomb007, tôi đã thực hiện chỉnh sửa để làm rõ các quy tắc, xcó thể bất kỳ số nguyên nào lớn hơn hoặc bằng 0
Dignissimus - Spammy

@Shaggy, tôi nghĩ đó là một lỗ hổng tiêu chuẩn, có vẻ như không phải vậy. Tôi đã chỉnh sửa câu hỏi để nêu rõ rằng một chương trình có thể không đọc bất kỳ phần nào trong phần mã nguồn của nó
Dignissimus - Spammy

Câu trả lời:


8

Python 2 , 50 byte

Lưu ý dấu phẩy và dòng mới.

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

Hãy thử trực tuyến!


@ mbomb007 Giả sử có một dòng mới ở cuối mã. Vấn đề được giải quyết.
MD XF

OP nói rằng x có thể bằng 0, trong trường hợp không nên in gì, vì vậy câu trả lời này là sai.
mbomb007

@NickA Không, nó in một dòng mới, đó là sai.
mbomb007

0 dường như không in một dòng mới cho tôi, như đã được kiểm tra bằng cách sử dụng sys.stdout.write("2")sau nó.
Ørjan Johansen

5

Japt , 14 byte

"iQ ²pU"iQ ²pU

Hãy thử trực tuyến!

Giải trình

"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 hoạt động đặc biệt tốt cho việc này!

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

Hãy thử trực tuyến!


4

Toán học, 40 33 byte

Cảm ơn lanlock4 vì đã tiết kiệm 7 byte!

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

Hàm thuần túy lấy một đối số nguyên không âm. ToString[#0]là cách Mathicala tiêu chuẩn để truy cập định nghĩa của hàm thuần hiện tại; StringRepeat[..., #1]nối các bản sao (đầu vào) của chuỗi đó lại với nhau. Ví dụ,

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

sản lượng:

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

Bạn có thể gửi một ví dụ sử dụng? Chạy, ví dụ , StringJoin @@ Table[ToString[#0], #1] & [2]cho tôi một lỗi.
Julian Wolf

Có thật không? Cuộc gọi chính xác đó làm việc cho tôi. Tôi đang sử dụng Mathicala 11 ....
Greg Martin

Hmm, tôi vẫn đang sử dụng 10 (v10.0.1.0) có thể là nó. Để tham khảo, đây là lỗi mà tôi nhận được:Table::itform: Argument 2 at position 2 does not have the correct form for an iterator.
Julian Wolf

Tôi đã khám phá ra rằng Table[x,5]sẽ trở lại {x,x,x,x,x}trong Mathematica 10.2 và hơn thế nữa, nhưng trong Mathicala 10.1, nó lại đưa ra một lỗi như vậy (nó mong đợi Table[x,{5}]).
Greg Martin

Tôi nghĩ bạn có thể thay thế StringJoin @@ Tablebằng StringRepeat.
Không phải là một cái cây


3

dc , 31 byte

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

Hãy thử trực tuyến!

Giải trình:

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

Giải pháp này hoạt động nếu x=0. Có một dòng mới duy nhất.

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

Dùng thử trực tuyến


Python 2, 60 byte (không hợp lệ)

Điều này giả định rằng x>=1, nhưng OP làm rõ rằng xcó thể bằng không. Có một dòng mới duy nhất.

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

Dùng thử trực tuyến


2

Dưới tải , 12 byte

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

Hãy thử trực tuyến!

Gửi chức năng, vì Underload không có cách nào khác để nhận đầu vào. (Liên kết TIO hiển thị số 4 được cung cấp làm đầu vào và thêm mã để in kết quả đầu ra).

Đây chỉ là một hàm tạo quine phổ quát (a(:^)*):^, cộng với ~^("tạo một số lượng bản sao bằng với đối số").



1

Thạch , 10 byte

“;⁾vṾẋɠ”vṾ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

“;⁾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
Cái này có vẻ ngon, nhưng mẹ tôi luôn nói với tôi rằng đừng bỏ những thứ nhìn lạ vào miệng.
Mateen Ulhaq

1

GNU Make , 49 byte

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

Make sẽ tham gia các bản sao bằng một khoảng trắng duy nhất, vì vậy tôi phải bao gồm ký tự khoảng trắng bổ sung ở cuối và loại bỏ nó stripở giữa để tuân theo yêu cầu một cách trung thực.


Có vẻ như nó đọc mã nguồn, theo mặc định và bị cấm rõ ràng.
Ørjan Johansen

@ RjanJohansen Không, nó không đọc nguồn, nó đọc một giá trị biến. Đó chính xác là nguyên tắc giống như trong các câu trả lời khác, ví dụ như JS hoặc Python.
eush77

@ RjanJohansen Ồ, tôi hiểu rồi. $0trong các hàm Make không giống như trong shell. Đó là tên của biến mà hàm được gọi là. Xem gnu.org/savannah-checkouts/gnu/make/manual/html_node/ Kẻ
eush77

Thở dài như một khu vực màu xám. BTW, những người Python không làm điều này.
Ørjan Johansen

@ RjanJohansen Tôi muốn nói rằng câu trả lời này gần với Python hơn là của JS. Tất cả callđang làm là thay thế $0$1với các tham số thực tế - đó là phép nội suy chuỗi đơn giản, giống như của Python %.
eush77

1

Bình thường, 17 byte

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

Hãy thử trực tuyến!

Mở rộng tầm thường cho jN*2]"jN*2]quine khá nổi tiếng , nhưng có lẽ có thể được đánh golf xuống


1

Betaload , 203 byte

Dòng mới được thêm vào cho rõ ràng:

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

Tôi đã tự đưa ra hạn chế rằng nó phải đọc từ STDIN chứ không phải từ đầu ngăn xếp như câu trả lời Underload thông thường. Tôi cũng đã sử dụng đầu vào thập phân thích hợp, chiếm phần lớn mã.

Giải trình:

Tôi gói chương trình trong một gói quine: (a(:^)*):^. Điều này có nghĩa là tất cả mã bên trong trình bao bọc quine sẽ có mã nguồn của chương trình ở cuối ngăn xếp.

Để chuyển đổi các chữ số thành một chữ số Church bình thường, tôi sử dụng kỹ thuật thay thế từng chữ số bằng mã để nhân với 10 và thêm chữ số đó:

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

Có rất nhiều sự lặp lại ở đây, vì vậy, hãy gói nó thành một chương trình con sẽ lấy một số Church từ đầu ngăn xếp và sử dụng nó để xây dựng "chuỗi chữ số:"

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

Tôi đặt nó vào một môi trường mới để có thể truy cập nhanh chóng:

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

Bây giờ tôi có thể tạo mã thay thế cho R. Rsử dụng các phần tử trên cùng của ngăn xếp để tạo bảng tra cứu để thay thế một chuỗi từ STDIN bằng mã Betaload. Nó hoạt động như thế này:

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

Tuy nhiên, chúng ta có thể sử dụng chương trình con mà chúng ta vừa thực hiện để tạo các đoạn mã:

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

Khi Rđược chạy, nó sẽ biến đổi đầu vào thành một chuỗi các chương trình con xây dựng một số Giáo hội. Khi chương trình con này được thực thi, nó tạo ra số Church đó trên phần tử tiếp theo trên ngăn xếp (0, được đặt xuống trước đó). Điều này có nghĩa là, sau đó R^, giá trị hàng đầu trên ngăn xếp sẽ là chữ số Church. Sau đó chúng tôi^ thêm một lần nữa để áp dụng số Church cho phần tử cuối cùng trong ngăn xếp (mã nguồn của chương trình) để có câu trả lời.

Sự thật thú vị: Tôi đã có MD cho bài nộp này trong vài tháng. Tôi đã giữ nó sau khi hiểu nhầm một câu hỏi (mà dường như tôi không thể tìm thấy nữa). Tôi đã phải đào nó từ Thùng rác của mình để đăng nó ở đây.



1

Python 2 , 41 byte

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

Hãy thử trực tuyến!

Có phải một đầu ra hacky sử dụng inputthay vì print, vì printcó một lỗi kỳ lạ liên quan đến việc in một dòng mới khi nó không được cho là ... . Thoát với lỗi EOF.

Giải trình:

_="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'

\47là lối thoát bát phân cho một trích dẫn ( '). Nó được giải thích bên trong dấu ngoặc kép ( "), nhưng không nằm trong dấu ngoặc đơn.


0

Javascript ES6, 27 37 byte

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

Biên tập

+10 byte nếu f=cũng nên được hiển thị


f=

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

f(2);


@Downvoter tại sao?
Weedoze

@Kaiido Tôi không biết .. Tôi có nên giữ f=?
Weedoze

Mã của bạn đang tự đọc bằng cách gọi hàm toStringtrên.
aebabis

@acbabis Gọi f.toString()hoặc fgiống nhau nhưng nó sẽ không hiển thị tên chức năng
Weedoze

Tôi tin rằng @acbabis có nghĩa là nó vi phạm điểm cuối cùng của thử thách "Chương trình của bạn cũng có thể không trực tiếp đọc bất kỳ phần nào trong mã nguồn của nó" - sử dụng cách fđó là nói đến nguồn của chính nó.
sky3000

0

CJam , 20 12 byte

8 byte được lưu nhờ Martin Ender

{"_~"+ri*}_~

Hãy thử trực tuyến!

Biểu hiện

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

Hãy thử trực tuyến!

Không phải golfy, như b64 quines có xu hướng.


0

Đi , 256 254 byte

Điều này làm tôi đau đớn.

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

Hãy thử trực tuyến!


0

Kính hiển vi II, 22 byte:

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

Microscript II, 20 byte (nhưng không hợp lệ về mặt kỹ thuật vì nó truy cập mã nguồn của một khối mã):

{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 byte

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çý×?

Sửa đổi mặc định 0"D34çý"D34çýbằng cách thêm ×?.

Hãy thử trực tuyến.

Giải trình:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.