馬を何回ゴルフする必要がありますか?


12

この課題のために、整数を取り、xそのソースをx何度も出力するプログラムを作成する必要があります。

ルール

  • これはcodegolfです。目的は、プログラムをゴルフで最小バイト数にすることです。

  • 関数を送信する場合、関数はxパラメーターとして受け取り、コード全体をx何度もSTDOUTに返すか印刷する必要があります。関数本体も空であってはなりません

  • ラムダを送信する場合、変数に割り当てる必要はありません

  • 標準的な抜け穴の制限が適用されます。

  • 空のプログラムは禁止されています

  • あなたのプログラムxは、整数が0以上である場合にのみ機能する必要があります

  • また、プログラムはソースコードの一部を直接読み取ることはできません。


素敵な最初の質問
ハゲバンタ

にすることxができますか0、正の整数に制限できますか?
mbomb007

関数のソースの読み取りは許可されていますか?
シャギー

@ mbomb007、ルールを明確にするための編集を行いました。xおそらく0以上の整数全体
Dignissimus-Spammy

@Shaggy、それは標準の抜け穴だと思った、そうではないようだ。プログラムがソースコードの一部を読み取らない場合があることを明確に述べるために、質問を編集しました。
スパム行為- Dignissimus

回答:


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")after を使用してテストされたように、改行を印刷しないようです。
Ørjanヨハンセン


4

RProgN 2、8バイト

{`{.*¶}{

RProgN2 Loop quineはこれに特に適しています!

{     } # 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バイト

7バイトを節約してくれたlanlock4に感謝します!

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]するとエラーが発生します。
ジュリアンウルフ

本当に?その正確な呼び出しは私のために動作します。私は.... Mathematicaの11を使用しています
グレッグ・マーティンを

うーん、私はまだ10(v10.0.1.0)を使用しています。参考までに、私が得るエラーは次のとおりです。Table::itform: Argument 2 at position 2 does not have the correct form for an iterator.
Julian Wolf

Aha — Mathematica 10.2以降でそれTable[x,5]が返さ{x,x,x,x,x}れることを発見しましたが、Mathematica 10.1ではこのようなエラーが発生します(期待していますTable[x,{5}])。
グレッグマーティン

私はあなたが交換することができると思いますStringJoin @@ TableStringRepeat
木ではない



3

Python 2、70バイト

このソリューションは、次の場合に機能しx=0ます。末尾に改行が1つあります。

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

オンラインで試す


Python 2、60バイト(無効)

これはを前提としてx>=1いますが、OP xはゼロになる可能性があることを明確にしました。末尾に改行が1つあります。

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

オンラインで試す


2

アンダーロード、12バイト

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

オンラインでお試しください!

Underloadには入力を取得する他の方法がないため、関数の送信。(TIOリンクは、入力として指定された数値4を示し、結果の出力を印刷するコードを追加します)。

これは単なる汎用のquineコンストラクター(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
これは美味しそうに見えますが、私のママはいつも私の口に奇妙なものを入れないように言っていました。
マーティーンウルハク

1

GNU Make、49バイト

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

Makeはコピーを1つのスペースで結合します。したがってstrip、要件に忠実に従うために、最後に追加のスペース文字を含めて、間にスペースを入れて削除する必要があります。


これは、デフォルトで明示的に禁止されているソースコードを読み取るように見えます。
Ørjanヨハンセン

@ØrjanJohansenいいえ、ソースを読み取りません。変数値を読み取ります。他の答えとまったく同じ原理です。例えば、JSやPythonを取り上げます。
eush77

@ØrjanJohansenああ、なるほど。$0Make関数の機能は、シェルの機能と同じではありません。関数が呼び出される変数の名前です。gnu.org/savannah-checkouts/gnu/make/manual/html_node/を
eush77

そのような灰色の領域をため息。ところで、Pythonのものはこれをしません。
Ørjanヨハンセン

@ØrjanJohansenこの答えは、JSよりもPythonにずっと近いと思います。すべてがcall代用されてやっている$0$1、実際のパラメータで-それだけでPythonのように、単純な文字列補間です%
eush77


1

Betaload、203バイト

明確にするために追加された改行:

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

通常、Underloadの回答のようにスタックの最上部からではなく、STDINから読み取る必要があるという制限を自分に与えました。また、コードのほとんどを構成する適切な10進入力も使用しました。

説明:

プログラムをquine-wrapperでラップ(a(:^)*):^ます。これは、クインラッパー内のすべてのコードがスタックの一番下にプログラムのソースコードを持つことを意味します。

数字を通常の教会の数字に変換するには、各数字をコードに置き換えて10倍してその数字を追加する手法を使用します。

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

ここには多くの繰り返しがあるので、それをサブプログラムにパッケージ化し、スタックの一番上から教会の数字を取得し、それを使用して「数字列」を作成します。

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

すぐにアクセスできるように、これを新しい環境に配置しました。

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

これで、の置換コードを作成できますRRスタックの最上位要素を使用してルックアップテーブルを形成し、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 _

オンラインでお試しください!

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単一引用符(')の8進エスケープです。二重引用符(")内で解釈されますが、単一引用符内では解釈されません。


0

JavascriptをES6、27の 37バイト

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

編集

+10バイトf=も表示する必要がある場合


f=

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

f(2);


@Downvoterなぜ?
ウィードーズ

@Kaiidoわかりませんf=
ウィードーズ

toString関数を暗黙的に呼び出すことにより、コードはそれ自体を読み取ります。
-aebabis

@acbabis Calling f.toString()or fは同じですが、関数名は表示されません
Weedoze

@acbabisの意味するところは、「あなたのプログラムはソースコードの一部を直接読み取れない」という課題の最後の点に違反しているということだと思いますf
skyline3000

0

CJam20 12バイト

Martin Enderのおかげで8バイト節約

{"_~"+ri*}_~

オンラインでお試しください!

解説

{       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

Go257254バイト

これは私を苦しめます。

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

Python 3、69バイト

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


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.