「Hello!」を出力するプログラムを出力するプログラムを出力するプログラム


8

チャレンジ

次のような最短のプログラムPを記述します。

  • Pは任意の正の整数nを入力として受け取り、プログラム文字列P 1を出力します。
  • P 1(入力なし)を実行すると、プログラム文字列P 2が出力されます。

  • P 2(入力なし)を実行すると、プログラム文字列P 3が出力されます。

  • ...

  • P n(入力なし)を実行すると、正確に "Hello!"が出力されます。(引用符なし)。

概略的に:

                P(n)→P 1 →P 2 →...→P n →こんにちは!

基準

  • I / Oはstdin / stdout経由です。
  • プログラムの長さはバイト単位で測定されます。
  • プログラムは、ASCII印刷可能文字のみで構成されています。
  • プログラムP、P 1、...、P n間で重複があってはなりません。

編集:プログラムP、P 1、...、P nはソースコードであることを意味し、「プログラムの実行」とは、出力を生成する処理(つまり、解釈、コンパイル、実行など)を指します。



@dmckee-関係がある場合、その関係は非常に遠いようです。概略的に、クインの動作はP-> Pのようになり、リンクされたプログラムの動作はP-> Q-> Pのようになります。しかし、ここでの動作はP(n)-> ...--> Hello!ここで、Pは出力のいずれにも似ている必要はありません。
— resは

1
これは批判ではありません。この問題を好む人が他の問題も好むかもしれないというメモです。
— dmckee ---元モデレーターの子猫2012

@dmckee-良い点、ありがとう。
— resは

回答:


10

Golfscript 39 14

~'Hello!'{`}@*

例:

n = 4であり、プログラムがPであると仮定すると、これらはステップです。

  1. パラメータ4でPを実行します。出力は"\"\\\"\\\\\\\"Hello!\\\\\\\"\\\"\""(P 1)

  2. P 1出力の実行"\"\\\"Hello!\\\"\""(P 2)

  3. P 2出力の実行"\"Hello!\""(P 3)

  4. P 3出力の実行"Hello!"(P 4)

  5. P 4出力を実行しますHello!。私を信用していない場合は、このリンクをたどってください ☺。


1
私はあなたのP1、P2、P3、P4が必要に応じて動作しているのを見つけますが、標準入力からの入力では、PはP1を出力しません-代わりに、\'\\\'\\\\\\\'Hello!\\\\\\\'\\\'\'LinuxとWin 7(echo 4 | ...コマンドプロンプトで使用)。問題が何であるか考えていますか?
— resは

@resあなたは正しいです。これは、私が作成したGolfscriptテストWebサイトの欠点です。私は3文字を追加することでなんとか修正しましたが、その間にずっと短いバージョンを見つけて投稿を編集しました。
— クリスティアンルパスク

@res古いアプローチの正しいバージョンは次の~''\(,{)2\?('\\'*}/]"'"*:z"'Hello!"z-1%"'"
— とおり

14バイトで、印象的!...そして素敵なウェブサイト (その標準入力をして、プログラムを先行することによってシミュレートすることができるようで;"..."、どこ...入力はEgが、されています。;"4"上記欠落している引用符の問題を明らかにしているだろう、単純にして、プログラムの前のに対し、"4"しません。)...
— resは

@resどうもありがとう!あなたはリードについて完全に正しい;です。最初のプログラムを書いたとき、メタサイトでそれを書いたのは私でしたが、私は途中でこれについて忘れていました:meta.codegolf.stackexchange.com/a/521/3527
— Cristian Lupascu

4

JavaScript、58文字

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

どのように機能しますか?
— thepirat000 14年

@ thepirat000引数_が0の場合、「Hello!」を出力します。それ以外の場合は、関数定義を出力し、_マイナス1で呼び出します
— コピー

コードを
— 引き延ばすの

4

パール(45 36)

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

perl -M5.010を使用して実行しますsay。

For n=1、outputs say q(Hello!)
For n=2、outputs say q(say q(Hello!))
For n=3、outputs say q(say q(say q(Hello!)))
など。


2

Python3、66

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

2

Common Lisp、68文字

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

単純ではない唯一のもの:evalは1文字短いため、必要以上に1レベルのプログラムを生成して評価しprintます。


2

Common Lisp:65

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

このバージョンは、既存のCL-answerよりも小さくなっています。Lispがstackoverflowで鳴く場合、81バイトを使用する必要があります:

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

私はパーティーに遅れるのを知っています、そしてこれがまだ最適化されることができると確信しています。

デモ(注意、一部のオンラインREPLが正しく機能しない):

* #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!"
* 

ご了承ください:

  • SBCL 1.2.11.debianを使用してテスト済み

  • 私は真剣に行うべきではないことをしているので、たくさんの警告があります。ありがたいことに、すべての警告はセミコロンで出力されるため、いずれにしてもコメントとして扱われます。

  • 重複は、1つが戻り値と1つの実際の出力であるためです。戻り値もカウントされる場合は、58バイトに単純化されます。#1=(SETF N(READ)(CADDR'#1#)(1- N)W(IF(= N 0)"Hello!"'#1#))

  • 私はまだパーティーに遅れていることを知っています


1

Python 2.7、57

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


1

Bash、47または12(golfbashを使用する場合)

コード:

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

golfbashコード:

R;n e Hello!

以前のコード(49):

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

使用する:

プログラムPを作成

$ echo '<paste code here>' > P

$ chmod +x P

例

P1を作成:

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

P2を作成:

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

P3を作成:

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

P4を作成:

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

P4を実行します。

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

たとえば、golfscriptのように、golfbashと呼ばれる新しい汎用言語を作成するとします。この言語には、次のような便利なコマンドがあります。

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.

それから私はこれを書くことができます:

R;n e Hello!

これは合法だと思いませんか?


1
それは失礼です。-1は何ですか?
— philcolbourn 2014年

+1。反対票は、特にこの課題に向けられていると思われるあなたの発明した言語に対するものだったと思います。meta.codegolf.stackexchange.com/questions/871/…を
— Cees Timmerman

結構ですが、私はbashでもそれを行いました。
— philcolbourn、2015年

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!"

私があなたのプログラムを実行するとき、それは標準入力から何かを入力したり、標準出力に何も出力しないように見えます。
— resは

0

J-31文字

JはPascalスタイルの文字列を使用することに注意してください。 'It''s too easy!'

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

説明:

  • ".1!:1]1 -stdinから1行読み取り、それを数値に変換します。
  • <:2^ -2をこの数のべき乗して、デクリメントします。
  • ''''#~ -一重引用符のコピーを多く含む文字列を作成します。
  • 'Hello!'(],,)-これらの引用符をの前後に追加しますHello!。

使用法:

   '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

Python 2.7:75

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

初めてのゴルフ、私が正しくやっているかどうかわかりません; p


2
の定義がh後続のプログラムでも知られているとは思わないのですか?(これをREPLか何かで実行する必要があるでしょうか?)
— マーティンエンダー

0

Clojure、36バイト

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

シンボル

'something

評価する

something

5つの単一引用符でシンボルを作成し、引用符がなくなるまで結果を実行します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.