Chương trình tạo ra một chương trình tạo ra một chương trình có thể tạo ra Hello Hello!


8

Thử thách

Viết chương trình P ngắn nhất sao cho

  • P lấy bất kỳ số nguyên dương n nào làm đầu vào và xuất ra chuỗi chương trình P 1
  • thực thi P 1 (không có đầu vào) tạo ra chuỗi chương trình P 2 ,

  • thực thi P 2 (không có đầu vào) tạo ra chuỗi chương trình P 3 ,

  • ...

  • thực thi P n (không có đầu vào) đầu ra chính xác "Xin chào!" (không có dấu ngoặc kép).

Sơ đồ:

                P (n) → P 1 → P 2 → ... → P n → Xin chào!

Tiêu chí

  • I / O là thông qua stdin / stdout.
  • Độ dài chương trình được đo bằng byte.
  • Các chương trình chỉ bao gồm các ký tự có thể in ASCII.
  • Không được trùng lặp giữa các chương trình P, P 1 , ..., P n .

EDIT: Các chương trình P, P 1 , ..., P n có nghĩa là mã nguồn và "thực thi chương trình" đề cập đến bất kỳ quá trình xử lý nào tạo ra đầu ra (nghĩa là giải thích, biên dịch và thực thi, v.v.).



@dmckee - Mối quan hệ, nếu có, dường như rất xa vời. Về mặt sơ đồ, hành vi của một quine giống như P -> P và hành vi của các chương trình được liên kết giống như P -> Q -> P ; nhưng ở đây hành vi giống như P (n) -> ...--> Xin chào! , trong đó P không bắt buộc phải giống với bất kỳ đầu ra nào.
res

1
Đó không phải là một lời chỉ trích, độ phân giải, chỉ là một lưu ý rằng những người thích vấn đề này cũng có thể thích người khác.
dmckee --- ex-moderator mèo con

@dmckee - Điểm tốt, cảm ơn.
res

Câu trả lời:


10

Golfscript 39 14

~'Hello!'{`}@*

Thí dụ:

Giả sử n = 4 và chương trình của chúng tôi là P , đây là các bước:

  1. Chạy P với tham số 4 . Đầu ra là "\"\\\"\\\\\\\"Hello!\\\\\\\"\\\"\""( P 1 )

  2. Chạy đầu ra P 1"\"\\\"Hello!\\\"\"" ( P 2 )

  3. Chạy đầu ra P 2"\"Hello!\"" ( P 3 )

  4. Chạy đầu ra P 3"Hello!" ( P 4 )

  5. Chạy đầu ra P 4Hello! . Nếu bạn không tin tưởng tôi, hãy theo liên kết này .


1
Tôi thấy P1, P2, P3, P4 của bạn hoạt động theo yêu cầu, nhưng với đầu vào từ stdin, P của bạn không xuất ra P1 - thay vào đó, nó xuất ra \'\\\'\\\\\\\'Hello!\\\\\\\'\\\'\'(nghĩa là thiếu dấu ngoặc kép bên ngoài), khi tôi chạy cả trong Linux và bên dưới Win 7 (sử dụng echo 4 | ...tại dấu nhắc lệnh). Vấn đề là gì vậy?
res

@res Bạn nói đúng; đó là một thiếu sót của trang web thử nghiệm Golfscript tôi đã thực hiện. Tôi đã cố gắng khắc phục điều đó bằng cách thêm ba ký tự, nhưng trong lúc đó tôi đã tìm thấy một phiên bản ngắn hơn nhiều và chỉnh sửa bài đăng của mình.
Cristian Lupascu

@res Phiên bản chính xác của phương pháp cũ là~''\(,{)2\?('\\'*}/]"'"*:z"'Hello!"z-1%"'"
Cristian Lupascu

Với 14 byte, ấn tượng! ... Và trang web tốt đẹp btw. (Có vẻ như stdin có thể được mô phỏng bằng cách đặt trước một chương trình bằng cách ;"...", nơi ...được đầu vào Ví dụ,. ;"4"Có thể đã tiết lộ vấn đề thiếu-quote ở trên, trong khi chỉ đơn giản là trước chương trình bằng cách "4"không.) ...
res

@res Cảm ơn rất nhiều! Bạn hoàn toàn đúng về hàng đầu ;. Khi tôi viết chương trình đầu tiên, tôi đã quên mất điều này trên đường đi, mặc dù chính tôi là người đã viết về nó trên trang meta: meta.codegolf.stackexchange.com/a/521 / 3527
Cristian Lupascu

4

JavaScript, 58 ký tự

function $(_){alert(_?$+'$('+--_+')':'Hello!')}$(prompt())

Nó làm việc như thế nào?
thepirat000

@ thepirat000 Nếu đối số _là 0, nó sẽ xuất ra "Xin chào!", nếu không, nó sẽ đưa ra định nghĩa hàm và gọi với _một trừ
sao chép

+1 để lạm dụng các quy tắc bằng cách sử dụng bộ đếm thay vì kéo dài mã ...
WallyWest

4

Perl ( 45 36)

say"say q("x($m=<>),"Hello!",")"x$m         

Chạy với perl -M5.010để sử dụng say.

Đối với n=1, đầu ra say q(Hello!)
Cho n=2, đầu ra say q(say q(Hello!))
Cho n=3, đầu ra say q(say q(say q(Hello!)))
và như vậy.


2

Python3, 66

r="print(%r)";e=eval;n=e(input())+1;e(e("(r%"*n+"'Hello!'"+")"*n))

2

Lisp thông thường, 68 ký tự

(do((n(read)(1- n))(s'(princ"Hello!")`(print',s)))((= 0 n)(eval s)))
(do ((n (read) (1- n))
     (s '(princ "Hello!") `(print ',s)))
    ((= 0 n) (eval s)))

Điều duy nhất không đơn giản: nó tạo ra một cấp độ chương trình nhiều hơn mức cần thiết và đánh giá nó, bởi vì evalnó ngắn hơn một ký tự print.


2

Lisp thường gặp: 65

#1=(SETF N(READ)(CADDR'#1#)(1- N)W(PRINT(IF(= N 0)"Hello!"'#1#)))

Phiên bản này nhỏ hơn câu trả lời CL hiện có. Trong trường hợp Lisp của bạn bị lừa với luồng stackover, thì bạn phải sử dụng cái này, 81 byte:

#1=(SETF N(READ)*PRINT-CIRCLE* T(CADDR'#1#)(1- N)W(PRINT(IF(= N 0)"Hello!"'#1#)))

Tôi biết tôi đến bữa tiệc muộn và tôi chắc chắn điều này vẫn có thể được tối ưu hóa.

Trình diễn (cẩn thận, một số REPL trực tuyến không hoạt động chính xác):

* #1=(SETF N(READ)*PRINT-CIRCLE* T(CADDR'#1#)(1- N)W(PRINT(IF(= N 0)"Hello!"'#1#)))
2
#1=(SETF N 1
         *PRINT-CIRCLE* T
         (CADDR '#1#) (1- N)
         W
           (PRINT
            (IF (= N 0)
                "Hello!"
                '#1#))) 
#1=(SETF N 1
         *PRINT-CIRCLE* T
         (CADDR '#1#) (1- N)
         W
           (PRINT
            (IF (= N 0)
                "Hello!"
                '#1#)))
* (eval *)

#1=(SETF N 0
         *PRINT-CIRCLE* T
         (CADDR '#1#) (1- N)
         W
           (PRINT
            (IF (= N 0)
                "Hello!"
                '#1#))) 
#1=(SETF N 0
         *PRINT-CIRCLE* T
         (CADDR '#1#) (1- N)
         W
           (PRINT
            (IF (= N 0)
                "Hello!"
                '#1#)))
* (eval *)
"Hello!" 
"Hello!"
* 

Lưu ý rằng:

  • Đã thử nghiệm bằng SBCL 1.2.11.debian

  • Có rất nhiều cảnh báo bởi vì tôi đang làm những việc nghiêm túc không nên làm. Rất may, tất cả các cảnh báo được in bằng dấu chấm phẩy, vì vậy chúng sẽ được coi là nhận xét.

  • Sao chép là bởi vì một là giá trị trả về và một đầu ra thực tế. Nếu giá trị trả về cũng sẽ được tính, thì nó đơn giản hóa thành 58 byte:#1=(SETF N(READ)(CADDR'#1#)(1- N)W(IF(= N 0)"Hello!"'#1#))

  • Tôi vẫn biết tôi đến bữa tiệc muộn


1

Con trăn 2.7, 57

print reduce(lambda x,y:y+`x`,input()*["print"],"Hello!")

1

Haskell, 62

main=interact$(iterate(("main=putStr"++).show)"Hello!"!!).read

1

Bash, 47 hoặc 12 (nếu tôi sử dụng golfbash)

Mã số:

read x;for((;x>=0;x--)){ O+=" echo";};$O Hello!

mã golfbash:

R;n e Hello!

Mã trước (49):

read x;E=echo;eval \"\${E[0]\"{0..$x}\"}\" Hello!

Sử dụng:

Lập chương trình P

$ echo '<paste code here>' > P

$ chmod +x P

Thí dụ

Tạo P1:

$> echo 4 | ./P > 
echo echo echo echo Hello!

Kiếm P2:

$> echo 4 | ./P | bash
echo echo echo Hello!

Tạo P3:

$ echo 4 | ./P | bash | bash
echo echo Hello!

Tạo P4:

$ echo 4 | ./P | bash | bash | bash
echo Hello!

Chạy P4:

$ echo 4 |./P | bash | bash | bash | bash
Hello!

Giả sử tôi tạo một ngôn ngữ có mục đích chung mới gọi là golfbash - giống như golfscript - có một số lệnh hữu ích như sau:

R which reads stdin and places result into variable $REPLY.
n $1 $2 which echo's $1 $REPLY times followed by $2.
e which echo's all parameters to stdout.

Sau đó tôi có thể viết điều này:

R;n e Hello!

Điều này sẽ hợp pháp, phải không?


1
Điều đó thật thô lỗ. -1 để làm gì?
philcolbourn

+1. Tôi đoán rằng downvote dành cho ngôn ngữ được phát minh của bạn dường như dành riêng cho thử thách này. Xem meta.codegolf.stackexchange.com/questions/871/ từ
Cees Timmerman

Tốt, nhưng tôi cũng đã làm nó trong bash.
philcolbourn

0

F #, 182

let say msg = sprintf "%s" msg
let gen num = 
    let rec g n a =
        match n with
        | i when i > 0 -> g (i-1) ("say \"" + a + "\"")
        | _ -> say a
    g num "Hello!"

Khi tôi chạy chương trình của bạn , nó dường như không nhập bất cứ thứ gì từ stdin, cũng như không xuất bất cứ thứ gì vào thiết bị xuất chuẩn.
res

0

J - 31 char

Hãy nhớ rằng J sử dụng các chuỗi kiểu Pascal: 'It''s too easy!'

'Hello!'(],,)''''#~<:2^".1!:1]1

Giải thích:

  • ".1!:1]1 - Đọc trong một dòng từ stdin và chuyển đổi nó thành một số.
  • <:2^ - Lấy 2 đến sức mạnh của số này và giảm dần.
  • ''''#~ - Tạo một chuỗi với nhiều bản sao của ký tự trích dẫn.
  • 'Hello!'(],,)- Nối các trích dẫn này vào mặt trước và mặt sau của Hello!.

Sử dụng:

   'Hello!'(],,)''''#~<:2^".1!:1]1   NB. let's try 3
3
'''''''Hello!'''''''
   '''''''Hello!'''''''  NB. P1
'''Hello!'''
   '''Hello!'''          NB. P2
'Hello!'
   'Hello!'              NB. and P3 prints Hello!
Hello!

0

Con trăn 2.7: 75

def h(n):
 return "Hello"if n<1 else'print %s' % `h(n-1)`
print h(input())

Lần đầu chơi golf, không chắc là tôi có làm đúng không; p


2
Không phải điều đó cho rằng định nghĩa về hcũng được biết đến trong các chương trình tiếp theo? (Vì vậy, điều này sẽ phải được chạy trong REPL hoặc một cái gì đó?)
Martin Ender

0

Clojure, 36 byte

(str(apply str(repeat 5\'))"Hello!")

Biểu tượng

'something

đánh giá

something

Xây dựng một biểu tượng với 5 dấu ngoặc đơn và chạy kết quả cho đến khi không còn dấu ngoặc kép.

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.