ローリングクインダイス


19

自分自身を出力するプログラムを作成します。

ただし、ソースコードがn回繰り返される場合(ソースコードのコピーを末尾にn-1回連結することを意味します)、元のソースコードを出力する1 / nの確率、出力する1 / nの確率が必要ですソースコードは2回繰り返され、ソースコードを出力する1 / n確率は3回繰り返され、...、およびソースコードを出力する1 / n確率はn回繰り返されます。

たとえば、プログラムがの場合、foobar常に正確に出力する必要がありますfoobar。あなたが実行した場合しかし、foobarfoobarfoobarfoobar、そこに出力の各¼のチャンスである必要がありfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobar

  • 各可能な出力の分布は等しくなければなりません
  • 適用される標準のI / Oメソッドと禁止される標準の抜け穴に加えて、標準のクインルールが適用されます(独自のソースにアクセスできないなど)
  • これはコードゴルフなので、バイト単位の最短回答が勝ちます

擬似ランダムで十分ですか?
wastl

1
大丈夫だ@wastlうん、
JMigst

2
あなたの定義は少しずれています。1回(つまりfoobarfoobar)繰り返した場合、印刷されるだけですfoobar
ヴェスカ

1
@Veskah foobarfoobarfoobar1回ではなく2回繰り返されます。
Nit、

@Nitソースから始めます。再度使用する場合は、1回だけ繰り返しましたが、2つのインスタンスがあります。
ヴェスカー

回答:



9

ゼリー24 22バイト

“Ṿ;ẋŻɼLX¤¤µ”Ṿ;ẋŻɼLX¤¤µ

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

x4をお試しください!

“Ṿ;ẋŻɼLX¤¤µ”Ṿ;ẋŻɼLX¤¤µ
“Ṿ;ẋŻɼLX¤¤µ”              String literal: Ṿ;ẋŻɼLX¤¤µ
            Ṿ             Uneval. Return “Ṿ;ẋŻɼLX¤¤µ” (with quotes)
             ;            Append the initial string. Yields the source code. 
                ɼ         Apply the preceding link to the register and store the 
                          result in the register.
               Ż          Prepend 0. 
                          Each time Żɼ is used when the source code is repeated
                          the register's length increases by one. 
                          We can't use ‘ because it closes string literals.
                 L        Length. Returns the number of times the source code has
                          been repeated up till now.
                  X       Random element. If ɼ results in n, X returns a random 
                          integer between 1 and n.
                   ¤      Combines ŻɼLX as a nilad. 
              ẋ           Repeat the source code a random number of times between
                          1 and n.
                    ¤     Close everything from the initial string literal as a
                          nilad. 
                     µ    Start a new monadic chain. The register gets updated
                          once for time the code is repeated but only the final
                          repetition will result in output.

5

05AB1E、32バイト

"34çìDJ¼32ôн¾L×Ω"34çìDJ¼32ôн¾L×Ω

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

説明

"34çìDJ¼32ôн¾L×Ω"                   # push this string
                 34ç                # push a "-character
                    ì               # prepend it to the string
                     DJ             # duplicate and join the copy to the string
                       ¼            # increment the counter
                        32ô         # split the string into pieces of size 32
                           н        # take the first one
                            ¾L×     # repeat it for each in [1 ... counter]
                               Ω    # pick one at random

機会があれば説明を追加してもらえますか?
シャギー

@Shaggy:私に思い出させてくれてありがとう:)
Emigna

2

Gol> <>、21バイト

:QoaonC|P\Sx*F2ssS"
0

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

説明:

:Q     |     If the top of stack is 0, skip to next |
             Top of stack is implicitly 0
        P    Increment top of stack
         \   Redirect pointer down]
0:QoaonC|P\Sx*F2ssS"  Increment for each copy of the source code
0:QoaonC|P\Sx*F2ssS"


         \   Redirect back to the right
          Sx*  Multiply the number of copies of the source code by a random number between 0 and 1
             F      Repeat that many times
              2ss   Push a double quote
                 S" Print the source code minus the quote, newline and 0
 :Q       If top of stack is not 0
   oaonC  Print the quote, a newline and a 0 to complete the source code and continue the loop
        \Sx*   Error on the * for some reason

1

アリス、35バイト

"d3a*h-&;adddd12h&}Uh*t&w.odt,k@
 !

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

説明

"

2D言語の多くのクインのように、これは、"それ自体に回り込んで、"それ以外の最初の行全体をプッシュすることから始まります。

d3a*h-&;

ソースコードの追加のコピーを1つ以上追加すると、文字列リテラルの末尾に暗黙的なスペースが配置されます。これを実際にクインにするために、スタックを31文字で切り捨てます。

addd

改行を押してから、スタックの高さを3回押します。スタックの高さとしてプッシュされる値は、32(2行目のスペース)、33(2行目のスペース!)、および34(初期")です。

d

スタックの高さを、今度は元のソースコードの長さ(35)としてもう一度押します。

1

カウンターを1に初期化します。これにより、ソースコードが繰り返される回数がカウントされます。

2h&}

所定の位置で右に3回曲がります(左に曲がります)。ソースコードの追加の各繰り返しは、hこれと同じ列にを提供し}、カウンタをインクリメントします。IPがに戻ったら、}再び右に曲がって同じ方向に進みます。

Uh

0からn-1までの一様な乱数を取得し、1を追加して元のソースを出力する回数を取得します。

*t&w

以前にプッシュされたスタックの高さ(コード長)を乗算し、戻りアドレスを1回マイナス1回プッシュすることにより、以下を繰り返します。

.o

スタックの最上部を破壊せずに出力します。

dt,

一番下のスタックエントリを一番上に移動します。

k@

繰り返し、ループの終了後に終了します。



1

チャコール、58バイト

≔´θ´⎚´×´⊕´‽´L´⊞´O´υ´ω´⁺´⪫´⁺´´´≔´θ´´´´´θθ⎚×⊕‽L⊞Oυω⁺⪫⁺´≔θ´´θ

オンラインでお試しください!冗長化機能は現在停止しているため、冗長バージョンはありません"´"。主にゴルフのチャコール・クインに基づいて、あなたにとって素晴らしいクインです!。説明:

≔´θ´⎚´×´⊕´‽´L´⊞´O´υ´ω´⁺´⪫´⁺´´´≔´θ´´´´´θθ

にリテラル文字列θ⎚×⊕‽L⊞Oυω⁺⪫⁺´≔θ´´θを割り当てますθ

最後の出力のみが有効になるように、以前の出力をクリアします。

×⊕‽L⊞Oυω

空の文字列を事前定義された配列にプッシュします。これにより、配列の長さはこれまでに処理された繰り返しの数と等しくなるため、その長さを取得し、暗黙的な排他的範囲の乱数を取得し、1を追加して、次の文字列を何度も繰り返します。

⁺⪫⁺´≔θ´´θ

にリテラル文字列を追加してからθ´各文字の間にリテラルsを挿入し、の別のコピーに接尾辞を付けますθ

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