나는 소스를 곱하고, 아마 (아마) 출력을 곱한다!


18

직무

작업은 일관성은 있지만 임의의 양의 정수 엑스 (엄격히 0보다 큰) 를 출력하는 프로그램을 작성하는 것입니다. 다음은 캐치입니다. 소스가 번 반복 될 때 (코드가 에 추가 / 연결됨 ) 프로그램은 확률로 를 출력 할 확률과 변경하지 않고 을 출력 합니다.11엑스1엑스

초기 소스가 XYZinteger 이라고 가정합니다 3. 그때:

  • 들면 =2 : XYZXYZ출력해야 의 확률로 12 (시간의 50 %) 및2=6의 확률로12 도 (50 %의 시간).

  • 를 들어 = : XYZXYZXYZ출력해야 의 확률로 2 (66.666 %의 시간) 및=9의 확률로13 (시간의 33.333 %)

  • 들면 N=4 : XYZXYZXYZXYZ출력해야 3 의 확률 34 (75 %의 시간) 및43=12 의 확률로14 (25 %의 시간)

등등....

규칙

  • 당신은 전체 프로그램을 구축해야합니다 . 출력은 STDOUT으로 인쇄되어야합니다.

  • 이론적으로 프로그램은 위에서 언급 한 확률로 가능한 모든 값을 출력해야 하지만 무작위 구현으로 인해 약간의 편차가 있습니다 ( 구현이 다른 분포가 아닌 경우- 바이트를 절약하기위한 정규 분포 ) .

  • 프로그램은 (다시 이론적으로) 임의의 큰 N 값으로 작동해야 하지만 정밀도로 인한 기술적 한계는 큰 N 합니다.

  • 출력은 10 진이어야합니다 (다른베이스 또는 과학적 표기법으로 출력하는 것은 금지됨). 후행 / 선행 공백 및 선행 0이 허용됩니다.

  • 초기 소스는 물론 1 바이트 이상이어야합니다. 당신은 당신의 소스의 복사본 사이에 줄 바꿈을 가정 할 수 없습니다 . 프로그램은 입력을받지 않아야합니다 (또는 사용되지 않은 빈 입력이 있어야 함).

  • 이것은 이므로 답의 점수는 (원본) 소스의 길이 (바이트)이며 점수가 낮을수록 좋습니다.

참고 :이 도전의 (훨씬) 더 열심히 버전 이 하나 .


프로그램이 소스 코드를 읽을 수 있습니까?
내 대명사는 monicareinstate입니다.

3
@someone 예, 허용됩니다.
Mr. Xcoder

답변:


16

R , 66 35 바이트

digEmAll 덕분에 -29 바이트 .

Giuseppe 덕분에 -2 바이트 .

+0->A
x=!0:F
F=F+1
sample(F*x+!x,1)

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

N = 4의 분포를 확인하십시오.

열쇠는 오른쪽 과제 ->입니다. 코드에 곱 하면 첫 번째 1 호출 sample이에 할당되고 A마지막 호출 만 인쇄됩니다.

독창적이고 복잡한 솔루션 :

R , 66 바이트

T->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?T

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

온라인으로 사용해보십시오 (3 회 반복)!

1) 관심의 주요 함수를 호출 : 두 개의 트릭이 사용하는 ?우리가 브라켓 프로그램을 종료하지 않고 호출, 2) 사용 변수 수 있도록하는 것이, T그리고 TT시작 코드, T그리고 끝 ?T.

F반복 카운터입니다. ?부울 인수를 취하는 함수로 재정의됩니다. 입력 ?TRUE(또는 T)이면 필요한 임의 샘플링을 수행합니다. 입력이 FALSE(또는 0)이면 아무 것도 수행하지 않습니다. 의 값은 TT로 정의 0되므로 ?T샘플링은 수행하지만 ?TT아무것도 수행하지 않습니다.

소스가 반복되면 다음과 같습니다.

T->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?TT->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?T

따라서 중간 통화는 ?TT아무것도 출력하지 않고 최종 통화 ?T는 임의의 결과를 출력합니다.


5
나는 내가 할 수 없었던 ->상황에서 코드 골프에 사용 된 것을 본 적이 없다고 생각 <-한다. 이거 진짜 멌있다!!
주세페

추신 : 나는이 시점에 현상금을 줄 것입니다.
주세페

2
대단해!
digEmAll


@digEmAll 감사합니다!
Robin Ryder

11

파이썬 3 , 81 79 바이트

+0if[]else 1
from random import*
try:n+=1
except:n=1
print([1,n][random()*n<1])

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

@Nishioka 덕분에 -1 바이트

이것은 프로그램 소스에 직접 액세스하지 않는 Python 3 솔루션 중 하나입니다. 일반적인 인쇄 문은 닫는 괄호로 끝나기 때문에 파이썬 3에서 이것을하는 것은 파이썬 2보다 어렵습니다. Python 3에서 더 창의적인 솔루션을 보는 것이 흥미로울 것입니다.


-1 바이트 :+0 if[]else 1
Nishioka

@Nishioka 감사합니다. 업데이트되었습니다.
Joel




4

파이썬 3 , 78 76 75 바이트

게시 된 링크 와 동일한 트릭을 사용하여 여기에 파이썬이 있습니다 (x = 1).

from random import*;n=len(*open(__file__))//75;print(1+~-n*(random()<1/n))#

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

Xcoder 덕분에 Nishioka 덕분에 -1 바이트 보다 우선 순위가 높은 (n-1)공식 덕분에 -2 바이트~-n*


1
나에게 좋아 보인다! import random;n=len(*open(__file__))//76;print(1+~-n*(random.random()<1/n))#-2 바이트에서 작동합니다
Xcoder Mr.

1
나는 이런 식으로 n-1을하는 것을 본 적이 없다! 나는, 감사합니다 :) 좋아
파리 Douady


또 다른 -1 바이트이지만 약간 다른 접근 방식 : tio.run/##K6gsycjPM/7/…
Nishioka

random()<1/n;-) 때문에
Pâris Douady






2

Japt , 9 8 바이트

(°Tö)ΪT

그것을 테스트 | 두 배 | 세 겹으로
10 번 반복 한 후에 만 실행의 분포를 확인

(°Tö)ΪT
(            :Prevent the operator that follows from being implicitly applied to the first input variable, U
 °T          :Increment T (initially 0) by 1
   ö         :Random element in the range [0,T)
    )        :Closing the parentheses here instead of after the T saves a byte as there would need to be a space here to close the random method
     Î       :Sign - 0 (falsey) or 1 (truthy)
      ªT     :Logical OR with current value of T

원본, 13 11 10 9 바이트

후행 공백에 유의하십시오.

NoÎp°T ö 

그것을 테스트 | 두 배 | 세 겹으로
10 번 반복 한 후에 만 실행의 분포를 확인

NoÎp°T ö 
N             :Initially, the (empty) array of inputs
 o            :Replace the last element with
  Î           :  Its sign (always 1)
   p          :Push
    °T        :  T (initially 0) incremented
       ö      :Random element of N

2

자바 스크립트 ( JavaScript shell 71 ), 78 바이트

(async x=>x)().then(x=>f((''+f).length/78));f=x=>print(1-~x*Math.random()|0)//

Tio 링크가 없습니다. Tio의 Spidermonkey가 너무 오래되었습니다 ...

Firefox (Spidermonkey)는 주석을 함수의 일부로 간주합니다 f . 그 결과, (''+f).length것이다 b+79nB <78, 및 (N + 1)은 반복 된 소스 코드의 시간이다.

이 버그 ( 확실하지 않습니다. 확실하지 않습니다. 해석기보다는 JavaScript 사양의 버그입니다 )이 답변이 게시 된 직후 다른 사람이 BMO에 행동을 제출했습니다 : https://bugzilla.mozilla.org/ show_bug.cgi? id = 1579792 입니다. (bmo 스레드와 트윗 모두 나에 의해 게시되지 않았습니다.)


무엇입니까 (async x=>x)()? 왜 비동기입니까?
Tomáš Zato-복 직원 모니카

@ TomášZato 말 그대로 async의미가 있습니다. 따라서 x=>f(...)함수 f가 정의 된 후 콜백 이 호출 됩니다.
tsh


1

, 12 바이트

⎚I⎇‽L⊞Oυω¹Lυ

온라인으로 사용해보십시오! 연결된 질문에 대한 내 대답을 기반으로합니다. 그렇지 않으면 n확률로 출력 ¹/ₙ합니다 1. 설명:

⎚               Remove output from previous iterations
       υ        Initially empty list
        ω       Empty string
     ⊞O         Push
    L           Length
   ‽            Random integer [0..length)
  ⎇             Ternary
         ¹      If nonzero then literal 1
          Lυ    If zero then the new length
 I              Cast to string for implicit print
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.