반복 주사위 롤링


12

입력 n이 주어지면 단면 다이 (범위의 얼굴 포함)로 3 <= n <= 25시작하여 다음 단계를 수행하십시오 .n[1, n]

  1. 현재 측면 n주사위를 굴린 결과를 다음과 같은 형식으로 인쇄하십시오 (결과는 kdn: X어디에 X있으며 k주사위의 개수입니다).
  2. 경우 X이상인 n/2재생에 주사위의 수 배 다이를 추가한다. 그렇지 않으면, 주사위를 제거하십시오.
  3. 주사위 개수가 0또는 과 같으면 n중지하십시오. 그렇지 않으면 1 단계로 이동하십시오.

예제 실행 (괄호 안의 출력은 설명 용이며 필요하지 않음) :

6면 :

1d6: 4 (avg: 3.0, add)
2d6: 6 (avg: 6.0, add)
3d6: 9 (avg: 9.0, add)
4d6: 16 (avg: 12.0, add)
5d6: 13 (avg: 15.0, remove)
4d6: 9 (avg: 12.0, remove)
3d6: 5 (avg: 9.0, remove)
2d6: 7 (avg: 6.0, add)
3d6: 11 (avg: 9.0, add)
4d6: 14 (avg: 12.0, add)
5d6: 17 (avg: 15.0, add)

9면 :

1d9: 7 (avg: 4.5, add)
2d9: 14 (avg: 9.0, add)
3d9: 18 (avg: 13.5, add)
4d9: 18 (avg: 18.0, add)
5d9: 28 (avg: 22.5, add)
6d9: 26 (avg: 27.0, remove)
5d9: 28 (avg: 22.5, add)
6d9: 34 (avg: 27.0, add)
7d9: 33 (avg: 31.5, add)
8d9: 30 (avg: 36.0, remove)
7d9: 29 (avg: 31.5, remove)
6d9: 35 (avg: 27.0, add)
7d9: 32 (avg: 31.5, add)
8d9: 42 (avg: 36.0, add)

규칙

  • kdn: X각 롤을 구분하는 줄 바꿈 을 사용하여 출력 형식이 정확히 있어야합니다
  • 실제로 여러 주사위를 굴리는 것을 시뮬레이션해야합니다. 단순히 [1, n]여러 개의 주사위를 굴리는 것을 정확하게 시뮬레이션하지 않기 때문에 현재 재생중인 주사위의 수를 곱한 범위 내에서 임의의 정수를 반환하는 것은 허용되지 않습니다.
  • 표준 허점은 금지되어 있습니다
  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.

리더 보드

이 게시물의 하단에있는 스택 스 니펫은 답변 a) 언어별로 가장 짧은 솔루션 목록으로, b) 전체 리더 보드로 답변에서 리더 보드를 생성합니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

## Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

## Ruby, <s>104</s> <s>101</s> 96 bytes

헤더에 여러 개의 숫자를 포함 시키려면 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

## Perl, 43 + 2 (-p flag) = 45 bytes

언어 이름을 링크로 만들면 스 니펫에 표시됩니다.

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


혼란 스럽습니다. 대답 예, 제발?
Hipe99

예제가 간결하므로 예제 답변 .
Hipe99

편집 내용이 명확 해졌습니다. 감사!
Hipe99

16
당신은 확실히 당신의 연산에 대해? 기존 d6의 평균 롤은 3.5입니다.
피터 테일러

11
당신의 예제의 모든 평균은 잘못된 것
edc65

답변:



3

Mathematica, 95 89 80 자

For[k=1,0<k<#,If[Print[k,d,#,": ",x=Tr[{1,#}~RandomInteger~k]];x<k/2#,k--,k++]]&

언 골프

For[
  k = 1,
  0 < k < #,
  If[
    Print[k, d, #, ": ", x = Tr[{1, #}~RandomInteger~k]];
    x < k/2 #,
    k--,
    k++
  ]
] &

1
@ MartinBüttner 제안 해 주셔서 감사합니다. Echo불행히도처럼 일련의 입력을 취할 수 없습니다 Print.
shrx

오, 좋은 지적입니다.
Martin Ender

3

PHP, 164 121 112 113 109 바이트

최종 버전, 약속합니다. 디도의 제안을 사용하여 향상되었습니다.

function d($x,$y){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x: $r\n";$y+=$r/$y>$x/2?:-1;$y<$x&&$y?d($x,$y):0;}

편집 : 형식화를 위해 추가 바이트가 추가되었습니다. "추가 / 하위"텍스트를 삭제 한 덕분에 삼항 연산자가 될 수있는 IF가 없습니다.

function d($x,$y){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x: $r\n";$r/$y>$x/2?$y++:$y--;if($y<$x&&$y)d($x,$y);}

출력 결과는 다음과 같습니다.

1d6: 5
2d6: 11
3d6: 8
2d6: 11
3d6: 7
2d6: 4
1d6: 5

편집 : @Manatwork 덕분에 저를 많이 구했습니다! 새롭고 즉각적인 버전 :

function d($x,$y){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x=$r\n";if($r/$y>$x/2)$y++;else$y--;if($y<$x&&$y){d($x,$y);}}

이전 항목 :

function d($x,$y){for($i=0;$i<$y;$i++)($r+=rand(1,$x));$s=$y."d$x=$r, ";if($r/$y>$x/2){$y++;$s.="add";}else{$y--;$s.="sub";}echo $s."\n";if($y<$x&&$y>0){d($x,$y);}}`

별도의 주사위를 굴려 다음을 출력합니다.

1d6=6, add
2d6=7, add
3d6=11, add
4d6=14, add
5d6=15, sub
4d6=15, add
5d6=18, add

그리고 그것은 이렇게 불립니다 : d(6, 1);

를 표시 Add하고 Sub필수 접미사? 이것은 귀하의 질문에서 분명하지 않습니다.


요구 사항은 "괄호 안의 출력은 설명을위한 것이며 필수는 아닙니다"라고 말합니다. 이 방법은 더 짧아 보인다 :function d($x,$y=1){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x, $r↵";$r/$y>$x/2?$y++:$y--;if($y<$x&&$y)d($x,$y);}
manatwork

@manatwork 감사합니다, 정말 많은 도움이되었습니다!
steenbergh

if는 여전히 3 진이되어 1 바이트를 절약 할 수 있습니다. 증가 / 감소를 리모델링하면 2 바이트를 절약 할 수 있습니다.$y-=$r/$y>$x/2?:-1
Titus

2

파이썬 3, 125

DSM 덕분에 3 바이트를 절약했습니다.

def x(d):
 import random;c=1
 while 0<c<d:r=sum(map(random.randint,[1]*c,[d]*c));print('%id%i: %i'%(c,d,r));c+=2*(r>=d*c/2)-1

아주 간단하고 주사위를 굴려 평균을 확인합니다. 아직 너무 멋진 것은 없습니다.
int로 호출해야합니다. 따라서 x(6)다음과 같이 생성됩니다.

1d6: 5
2d6: 10
3d6: 8
2d6: 7
3d6: 11
4d6: 8
3d6: 13
4d6: 19
5d6: 13
4d6: 15
5d6: 22

.


2

자바 스크립트 (ES6) 97 102 106 112 바이트

몇 바이트를 절약 해 준 @ user81655와 @Jupotter에게 감사합니다.

f=n=>{for(k=1;k%n;console.log(k+`d${n}: `+x),k+=x<k*n/2?-1:1)for(x=i=k;i--;)x+=Math.random()*n|0}

// 102 bytes:
f=n=>{for(k=1;k%n;console.log(k+`d${n}: `+x),k+=x<k*n/2?-1:1)for(x=i=0;++i<=k;)x+=1+Math.random()*n|0}

// Previous attempt, 112 bytes
f=n=>{k=1;while(k&&k!=n){for(x=i=0;i++<=k;)x+=1+~~(Math.random()*n);console.log(k+`d${n}: `+x);k+=x<k*n/2?-1:1}}

데모

이는 ES6 호환 브라우저에서만 작동합니다 (현재 Firefox 및 Edge, 실험용 JavaScript 기능이 활성화 된 Chrome 및 Opera 포함).

f=n=>{for(k=1;k%n;console.log(k+`d${n}: `+x),k+=x<k*n/2?-1:1)for(x=i=k;i--;)x+=Math.random()*n|0}

// Snippet stuff
console.log = x => {
  document.getElementById('O').innerHTML += x + `<br>`;
}

document.getElementById('F').addEventListener('submit', e => {
  document.getElementById('O').innerHTML = ``
  f(document.getElementById('I').valueAsNumber)
})
<form id=F action=# method=get>
  <label>
    Number of faces: 
    <input type=number min=3 max=25 value=9 required id=I>
  </label>
  <button>Play</button>
  
  <div>
    <output id=O></output>
  </div>
</form>


루프 while를 변경하고 대신 for반올림 하고 몇 문을 이동하여 대괄호를 제거하여 몇 바이트를 저장할 수 있습니다. 또한 익명 함수 (no ) 로 만들 수 있습니다 . 103 바이트 :|0~~()f=n=>{for(k=1;k&&k!=n;k+=x<k*n/2?-1:1)for(x=i=0;i++<=k;console.log(k+`d${n}: `+x))x+=1+Math.random()*n|0}
user81655

감사합니다. 어떤 이유로 든 귀하의 버전이 많은 외부 출력을 만들었으므로 console.log다른 for루프 로 옮겼습니다 (당신보다 1 문자 더 비쌉니다). 여전히 106으로
줄였습니다

테스트하지 않고 방금 작성 했으므로 대부분 효과가 있습니다. :)
user81655

k&&k!=n조건을 비교 하여 하나의 캐릭터를 얻을 수 있습니다k%n!=0
Jupotter

@Jupotter 감사합니다, k%n더 잘 작동합니다;)
rink.attendant.6

1

CJam, 45 바이트

ri:M;{X__{Mmr+}*[X'dM':S5$N]o_+XM*<_+(-:XM%}g

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

수학적으로 잘못된 "평균 롤"공식을 포함하여 말 그대로 사양을 구현합니다. 예상대로, CJam 아래의 원래 GolfScript 프로그램을 포팅하기 때문에 짧은 바이트의 무리를 저장 내장 명령 이름 ( mr, o그리고 g대신 rand, putsdo).

GolfScript, 51 바이트

~:&;{1..{&rand+}*[1"d"&": "4$]puts.+1&*<.+(-:1&%}do

여기 내 원래 GolfScript 항목이 있습니다. 주목할 골프 트릭 포함 개수를 이용 1편리 미리 초기화 변수로 압연하기에 주사위의 현재 수를 저장하기. (CJam 버전은 대신 X값을 1로 초기화하는를 사용 합니다.)


추신. 제목을보고 원래 AnyDice 에서이 질문에 답하고 싶었 습니다 . 그러나이 도전에 대한 끔찍한 선택 으로 밝혀졌으며 주어진 사양 대로이 사양을 구현하는 데 기술적으로 가능하다고 생각하지 않습니다.

문제는 AnyDice가 주사위 롤링 통계를 계산 하기 위해 결정 론적 프로그램을 작성 하기 위한 도메인 별 언어라는 것입니다 . 롤의 가능한 결과를 검사하고 롤을 기반으로 조건부 롤을 수행하는 것은 재귀를 통해 가능하지만 실제 임의성을 생성하는 방법은 없습니다. 따라서 AnyDice에서이 주사위 롤 시퀀스를 시뮬레이션 할 수는 있지만 프로세스가 끝날 때까지의 롤 수 또는 주어진 단계에서의 결과 분포와 같은 통계 만 출력으로 얻을 수 있습니다.

모든 말 은 AnyDice에서 얻을 수있는 가장 가까운 것입니다 .

N: 6
K: 1
function: clip X:n { result: X * (X < N) }
function: adjust X:n { result: [clip X + ((XdN)*2 >= X*N)*2-1] * (X > 0) }
loop I over {1..20} {
  output K named "dice in roll [I]"
  output KdN named "outcome of roll [I]"
  K: [adjust K]
}

이 코드는 특히 골프 코드가 아닙니다. 함수 이름 단축 및 불필요한 공백 제거와 같은 표준 버팀대 언어 골프 트릭은 대부분의 골프 잠재력을 소진시켜야합니다.

여기서 사용되는 핵심 요령 :n은 AnyDice에서 숫자 ( 함수 정의에 표시된대로)를 예상하는 함수를 호출하고 대신 다이 (즉, 확률 분포)를 전달하면 AnyDice가 가능한 모든 함수를 자동으로 평가한다는 것입니다 주사위의 가치 , 그리고 결과를 새로운 주사위로 결합합니다.

다음은 처음 세 개의 롤에 대한 출력 스크린 샷입니다 (막 대형 차트 형식).

AnyDice 스크린 샷

(참고, 각 그래프에서 "0"열은 반복으로 인해 타격 주사위의 수 중지 확률을 나타낸다고 어느 때문에, 0 또는 N은 현재 롤 전에.이 정지 상태를 표현하는 편리한 방식으로 발생을 물론 0dN을 굴리면 항상 0이됩니다.)


1

R, 103 바이트

상당히 간단한 구현입니다. 주사위 굴림은에 의해 이루어집니다 sum(sample(n,i)).

i=1;n=scan();while(i&i<=n){cat(i,'d',n,': ',s<-sum(sample(n,i)),'\n',sep='');i=ifelse(s<i*n/2,i-1,i+1)}

시운전

> i=1;n=scan();while(i&i<=n){cat(i,'d',n,': ',s<-sum(sample(n,i)),'\n',sep='');i=ifelse(s<i*n/2,i-1,i+1)}
1: 9
2: 
Read 1 item
1d9: 9
2d9: 14
3d9: 10
2d9: 14
3d9: 9
2d9: 9
3d9: 12
2d9: 7
1d9: 9
2d9: 11
3d9: 17
4d9: 18
5d9: 25
6d9: 29
7d9: 33
8d9: 43
9d9: 45
> 

1

CoffeeScript, 106 99 바이트

f=(n,k=1)->(x=k;x+=Math.random()*n|0for[k..0];console.log k+"d#{n}: "+x;k+=x<k*n/2&&-1||1)while k%n

# Previous attempt, 106 bytes
f=(n,k=1)->(x=i=0;x+=1+Math.random()*n//1while++i<=k;console.log k+"d#{n}: "+x;k+=x<k*n/2&&-1||1)while k%n

언 골프

f = (n, k = 1) ->
 (x = k
 x += 1 + Math.random() * n | 0 for [k..0]
 console.log k + "d#{n}: " + x
 k += x < k * n / 2 && -1 || 1
 ) while k % n

1

줄리아, 77 바이트

n->(N=1;while 0<N<n k=sum(rand(1:n,N));print(N,"d$n: $k
");N+=1-2(2k<N*n)end)

이것의 대부분은 설명이 필요합니다-실제 줄 바꿈은 바이트를 저장하는 데 사용하는 print것이 아니라 문자열에 사용 println됩니다. 1과 사이의 임의의 정수를 rand(1:n,N)생성합니다 .Nn


1

루비, 93 90 82 자

->n{d=s=2
puts"#{d}d#{n}: #{s=eval'+rand(n)+1'*d}"while(d+=s<d*n/2.0?-1:1)>0&&d<n}

샘플 실행 :

2.1.5 :001 > -->n{d=s=2;puts"#{d}d#{n}: #{s=eval'+rand(n)+1'*d}"while(d+=s<d*n/2.0?-1:1)>0&&d<n}[6]
1d6: 5
2d6: 10
3d6: 6
2d6: 5
1d6: 5
2d6: 8
3d6: 15
4d6: 18
5d6: 22

0

QBIC , 83 바이트 (비경쟁)

:c=a{e=0[1,q|e=e+_rq,a|]?!q$+@d|!+a$+@:|+!e$~e<c/2|q=q-1\q=q+1]c=q*a~q=a|_X]~q=0|_X

설명:

q                    Tracks the number of dice (is implicitly 1 at the start)
:                    Takes input from a CMD line parameter
[1,q|e=e+_rq,a|]     Rolls the dice separately
?!q$+@d|!+a$+@:|+!e$ Prints the roll result (requires an unfortunate amount of casting...)
~e<c/2|q=q-1\q=q+1]  Checks whether to increase or decrease
~q=a|_X]~q=0|_X      Tests the amount of dice and quits on either boundary.

0

PHP, 104 바이트

for($n=$argv[$k=1];$k&&$k<$n;print$k."d$n: $x\n",$k-=$x<$n*$k/2?:-1)for($x=$i=0;$i++<$k;)$x+=rand(1,$n);

로 실행 php -r '<code>' <N>

고장

for($n=$argv[$k=1];     // import input, init number of dice
    $k&&$k<$n;          // while 0<$k<$n
    print$k."d$n: $x\n",    // 2. print results
    $k-=$x<$n*$k/2?:-1      // 3. remove or add a die
)
    for($x=$i=0;$i++<$k;)   // 1. roll dice separately
        $x+=rand(1,$n);         // sum up results
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.