롤링 퀸 주사위


19

자체적으로 출력되는 프로그램을 작성하십시오.

그러나 소스 코드가 n 번 반복되면 (소스 코드 의 사본을 n-1 번 끝까지 연결하는 것을 의미) 원래 소스 코드를 출력 할 확률은 1 / n이어야하고 1 / n 출력 확률을 가져야합니다. 소스 코드가 두 번 반복되고, 소스 코드를 출력 할 1 / n 확률이 3 번 반복되고, ..., 및 소스 코드를 n 번 출력 할 1 / n 확률을 갖는다.

예를 들어, 프로그램이 인 경우 foobar항상 정확히 출력해야합니다 foobar. 실행할 경우, foobarfoobarfoobarfoobar다음이 출력의 각 1/4 기회가 있어야한다 foobar, foobarfoobar, foobarfoobarfoobarfoobarfoobarfoobarfoobar.

  • 가능한 각 출력의 분포는 같아야합니다
  • 표준 I / O 방법 적용 및 표준 허점 금지, 표준 퀴니 규칙 적용 (자체 소스에 액세스 할 수 없음 등)
  • 이것은 코드 골프이므로 바이트 단위의 최단 답변

의사 랜덤은 충분합니까?
wastl

1
@wastl Yep, 괜찮습니다
JMigst

2
정의가 약간 벗어났습니다. 1 회 반복하면 (즉, foobarfoobar) 인쇄됩니다foobar
Veskah

1
@Veskah foobarfoobarfoobar한 번이 아니라 두 번 반복됩니다.
Nit

@Nit 소스부터 시작합니다. 다시 사용하면 한 번만 반복했지만 두 개의 인스턴스가 있습니다.
Veskah

답변:



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

@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

Alice , 35 바이트

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

온라인으로 사용해보십시오!

설명

"

2D 언어의 많은 quine에서와 같이, 이것은 "자신을 감싸고 자체를 제외한 첫 번째 전체 줄을 밀어 넣는 것으로 시작 "합니다.

d3a*h-&;

소스 코드의 복사본을 하나 이상 추가하면 문자열 리터럴 끝에 암시 적 공백이 생깁니다. 이것을 실제로 quine으로 만들기 위해 스택을 31 자로 자릅니다.

addd

줄 바꿈을 누른 다음 스택 높이를 세 번 누릅니다. 스택 높이로 푸시 된 값은 32 (두 번째 줄의 공간), 33 (두 번째 줄의 공간 !) 및 34 (초기 ")입니다.

d

이번에는 원래 소스 코드의 길이 (35)로 스택 높이를 다시 누릅니다.

1

1에서 카운터를 초기화하십시오. 소스 코드가 반복되는 횟수를 계산합니다.

2h&}

제자리에서 우회전 (즉, 좌회전)하십시오. 소스 코드를 추가로 반복 할 h때마다이 열과 동일한 열에 기여 }하므로 카운터가 증가합니다. IP }가로 돌아 오면 오른쪽으로 다시 돌아가 같은 방향으로 계속 진행하십시오.

Uh

0에서 n-1 사이의 균일 한 난수를 취한 다음 1을 더하여 원래 소스를 출력하는 횟수를 얻습니다.

*t&w

이전에 푸시 한 스택 높이 (코드 길이)를 곱한 다음 리턴 주소에서 1을 뺀 값을 푸시하여 다음을 여러 번 반복하십시오.

.o

스택의 상단을 손상시키지 않고 출력합니다.

dt,

하단 스택 항목을 상단으로 이동하십시오.

k@

루프가 완료된 후 반복하고 종료하십시오.



1

, 58 바이트

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

온라인으로 사용해보십시오! 디버 보시 파이어가 현재 질식했기 때문에 자세한 버전이 없습니다 "´". 골프 의 숯 퀴인을 기본으로 당신에게 좋은 퀴니를 제공합니다! . 설명:

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

리터럴 문자열 θ⎚×⊕‽L⊞Oυω⁺⪫⁺´≔θ´´θ을에 할당하십시오 θ.

마지막 출력 만 적용되도록 이전 출력을 지우십시오.

×⊕‽L⊞Oυω

빈 문자열을 사전 정의 된 배열로 푸시합니다. 이렇게하면 배열 길이가 지금까지 처리 된 반복 횟수와 동일하므로 길이를 취하고 암시 적 배타적 범위의 난수를 취한 다음 1을 추가하고 다음 문자열을 여러 번 반복하십시오.

⁺⪫⁺´≔θ´´θ

리터럴 문자열 앞에 추가 로를 θ다음 삽입 리터럴 ´의 각 문자 사이에, 다음의 다른 사본을 접미사 θ.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.