구별 할 수없는 주사위 3 개


12

명확한 큐브에서 3 개의 주사위

3 개의 주사위 롤 (1-6의 정수 값)을 정렬 된 순서로 (분별할 수 없도록) 제공 한 경우 동일한 분포를 가진 두 개의 공정한 주사위의 합으로 변환합니다 .

3 대 1에 대한 답은 모듈로 6을 모두 합한 것입니다. 최종 결과는 6 개의 숫자 각각이 (단일 다이와 마찬가지로) 똑같이 가능한 완전 평탄 분포입니다.

모듈로 6을 모두 합산하여 3 대 1로이 작업을 수행하는 것이 쉽습니다. 최종 결과는 6 개의 숫자 각각이 (단일 다이와 같이) 동일 할 가능성이있는 완전 플랫 분포입니다. 당신의 도전은 3 대 2로 동일하게하는 것입니다.

standupmath의 3 가지 구별 할 수없는 주사위 퍼즐에서 영감을 얻었습니다 . 후속 "솔루션"비디오 도 게시되었지만 어떤 방식 으로든 "우아함"에 대해 논쟁하는 것은 약간 주관적입니다. 문자를 세지 않습니다.:D

명령

3 개의 정렬 된 정수 / 숫자 (1-6)를 허용하고 출력하거나 216 개의 가능한 입력에 대해 출력이 다음과 같이 분배되도록 단일 정수 (2-12)를 리턴 하는 프로그램 또는 함수를 작성하십시오 .

 222222
 333333333333
 444444444444444444
 555555555555555555555555
 666666666666666666666666666666
 777777777777777777777777777777777777
 888888888888888888888888888888
 999999999999999999999999
 AAAAAAAAAAAAAAAAAA
 BBBBBBBBBBBB
 CCCCCC

(나는 16 진수를 사용하여 단일 문자를 유지했습니다. 십진수 출력은 좋습니다)

주사위는 구별 할 수 없기 때문에 본질적인 순서가 없으므로 정렬 된 입력이 있습니다. 모호 할 것이기 때문에 단순히 "제 3의 드롭"을 할 수 없습니다.

세부

  • 점수는 프로그램의 길이 (바이트)입니다
  • 프로그램은 어떻게 든 호출되는 함수이거나 stdin에서 읽거나 실행 가능한 스크립트 일 수 있습니다.
  • 다른 소스에서 엔트로피를 얻음으로써 "재 롤링"없음

예 (및 테스트)

모든 종류의 확률 테스트를 수행하는 대신 세 주사위 모두 216 (6³) 사례를 추출하고 함수가 각 값을 필요한만큼 여러 번 반환한다고 주장하기 쉽습니다. 동일한 매개 변수로 호출됩니다 (예 : 경우 1, 2, 33, 2, 1...는 구별 할 수없는 것으로 가정하고 (임의로)로 변환 됨 1, 2, 3).

예제 답변 (매우 무력하고 비효율적)과 테스트 스위트는 Python에서 아래에 제공됩니다. stdin / stdout을 수행하는 것은 조금 다르지만 테스트 비트가 선택한 언어로 포팅 할 수있을 정도로 명확해야합니다. 테스트 코드는 테스트 용이며 점수를 매기 지 않습니다 (언어 나 I / O 방식의 다른 사용자에게 제공하려는 경우 유용 할 수 있음).

# 6x6 lists of numbers with digits sorted
LUT = [
    [[124], [133, 166], [346], [223, 355], [256], [115, 445]],
    [[233, 266], [125], [224, 455], [134], [116, 446], [356]],
    [[126], [111, 333, 555, 225], [234], [144, 366], [456], [135]],
    [[112, 244], [235], [334, 466], [145], [226, 556], [136]],
    [[146], [122, 155], [236], [113, 344], [245], [335, 566]],
    [[246], [123], [114, 336], [345], [222, 444, 666, 255], [156]],
]

def three2two(rolls):
    look_for = int('{}{}{}'.format(*sorted(rolls)))
    for i in range(6):
        for j in range(6):
            if look_for in LUT[i][j]:
                return i + j + 2

# fair distribution of the sum of two dice multiplied by 6 (because each should be hit 6x)
expected_counts = {
    2: 6,   12: 6,
    3: 12,  11: 12,
    4: 18,  10: 18,
    5: 24,   9: 24,
    6: 30,   8: 30,
    7: 36,
}

d = [1, 2, 3, 4, 5, 6]
for i in d:
    for j in d:
        for k in d:
            ijk = sorted([i, j, k])
            result = three2two(ijk)
            expected_counts[result] -= 1

for key in expected_counts:
    assert expected_counts[key] == 0

2
나는 질문을 여러 번 읽었고 그것이 무엇을 요구하는지에 대한 사소한 생각이 없다.
feersum

1
이 도전 과제가 명확하지 않은 문제 외에도 코드 골프 도전 과제는 기본값을 무시할만한 충분한 이유가없는 한 문자가 아닌 바이트 단위로 점수를 매겨 야합니다.
Mego

나는 그것을 얻는 것 같아요. 문제는 몇 가지 제약 조건으로 3 개의 주사위 롤에서 2 개의 주사위 롤로 매핑하도록 요청하는 것입니다.
Leaky Nun

2
당신은 만들지 않을 함께 두 개의 주사위, 두 개의 롤을 시뮬레이션하기 위해 세 개의 롤을 사용하고 있습니다.
Nick T

2
모두 (a+b+c)%6+1(a*b*c)%7균일 한 단일 다이 롤에 정렬되지 않은 주사위의 트리플 변환,하지만 불행히도 확률 적으로 독립되지 않습니다.
xnor

답변:


5

젤리 , 22 20 바이트

6ṗ3Ṣ€ṢðQ€L€Ụịḷi’:6d6‘S

온라인으로 사용해보십시오! 또는 216 개의 결과를 모두 시뮬레이션합니다 .

배경

우리는 각각의 정렬되지 않은 주사위 롤 (각각의 다중성으로 나열 됨)을 다음과 같은 방식으로 정렬 된 주사위 롤 쌍에 매핑합니다.

[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3] -> [1,1]
[1,2,4],[1,2,4],[1,2,4],[1,2,4],[1,2,4],[1,2,4] -> [1,2]
[1,2,5],[1,2,5],[1,2,5],[1,2,5],[1,2,5],[1,2,5] -> [1,3]
[1,2,6],[1,2,6],[1,2,6],[1,2,6],[1,2,6],[1,2,6] -> [1,4]
[1,3,4],[1,3,4],[1,3,4],[1,3,4],[1,3,4],[1,3,4] -> [1,5]
[1,3,5],[1,3,5],[1,3,5],[1,3,5],[1,3,5],[1,3,5] -> [1,6]
[1,3,6],[1,3,6],[1,3,6],[1,3,6],[1,3,6],[1,3,6] -> [2,1]
[1,4,5],[1,4,5],[1,4,5],[1,4,5],[1,4,5],[1,4,5] -> [2,2]
[1,4,6],[1,4,6],[1,4,6],[1,4,6],[1,4,6],[1,4,6] -> [2,3]
[1,5,6],[1,5,6],[1,5,6],[1,5,6],[1,5,6],[1,5,6] -> [2,4]
[2,3,4],[2,3,4],[2,3,4],[2,3,4],[2,3,4],[2,3,4] -> [2,5]
[2,3,5],[2,3,5],[2,3,5],[2,3,5],[2,3,5],[2,3,5] -> [2,6]
[2,3,6],[2,3,6],[2,3,6],[2,3,6],[2,3,6],[2,3,6] -> [3,1]
[2,4,5],[2,4,5],[2,4,5],[2,4,5],[2,4,5],[2,4,5] -> [3,2]
[2,4,6],[2,4,6],[2,4,6],[2,4,6],[2,4,6],[2,4,6] -> [3,3]
[2,5,6],[2,5,6],[2,5,6],[2,5,6],[2,5,6],[2,5,6] -> [3,4]
[3,4,5],[3,4,5],[3,4,5],[3,4,5],[3,4,5],[3,4,5] -> [3,5]
[3,4,6],[3,4,6],[3,4,6],[3,4,6],[3,4,6],[3,4,6] -> [3,6]
[3,5,6],[3,5,6],[3,5,6],[3,5,6],[3,5,6],[3,5,6] -> [4,1]
[4,5,6],[4,5,6],[4,5,6],[4,5,6],[4,5,6],[4,5,6] -> [4,2]
[1,2,2],[1,2,2],[1,2,2],[1,3,3],[1,3,3],[1,3,3] -> [4,3]
[1,4,4],[1,4,4],[1,4,4],[1,5,5],[1,5,5],[1,5,5] -> [4,4]
[1,6,6],[1,6,6],[1,6,6],[2,3,3],[2,3,3],[2,3,3] -> [4,5]
[2,4,4],[2,4,4],[2,4,4],[2,5,5],[2,5,5],[2,5,5] -> [4,6]
[2,6,6],[2,6,6],[2,6,6],[3,4,4],[3,4,4],[3,4,4] -> [5,1]
[3,5,5],[3,5,5],[3,5,5],[3,6,6],[3,6,6],[3,6,6] -> [5,2]
[4,5,5],[4,5,5],[4,5,5],[4,6,6],[4,6,6],[4,6,6] -> [5,3]
[5,6,6],[5,6,6],[5,6,6],[1,1,2],[1,1,2],[1,1,2] -> [5,4]
[1,1,3],[1,1,3],[1,1,3],[1,1,4],[1,1,4],[1,1,4] -> [5,5]
[1,1,5],[1,1,5],[1,1,5],[1,1,6],[1,1,6],[1,1,6] -> [5,6]
[2,2,3],[2,2,3],[2,2,3],[2,2,4],[2,2,4],[2,2,4] -> [6,1]
[2,2,5],[2,2,5],[2,2,5],[2,2,6],[2,2,6],[2,2,6] -> [6,2]
[3,3,4],[3,3,4],[3,3,4],[3,3,5],[3,3,5],[3,3,5] -> [6,3]
[3,3,6],[3,3,6],[3,3,6],[4,4,5],[4,4,5],[4,4,5] -> [6,4]
[4,4,6],[4,4,6],[4,4,6],[5,5,6],[5,5,6],[5,5,6] -> [6,5]
[1,1,1],[2,2,2],[3,3,3],[4,4,4],[5,5,5],[6,6,6] -> [6,6]

이것은 모든 결과를 평등하게 만듭니다.

작동 원리

6ṗ3Ṣ€ṢðĠ€Ụịḷi’:6d6‘S  Main link. Argument: D (three dice rolls, sorted)

6ṗ3                     Generate lists of length 3 over [1, 2, 3, 4, 5, 6].
   Ṣ€                   Sort each triplet.
     Ṣ                  Sort the list of triplets.
      ð                 Begin a new, dyadic chain.
                        Arguments: A (list of triplets), D
       Ġ€               Group each; group the indices of each triplet by the
                        the corresponding values.
                        For a triplet [a, b, c], this yields:
                          [[1], [2], [3]] if a < b < c
                          [[1], [2, 3]]   if a < b = c
                          [[1, 2], [3]]   if a = b < c
                          [[1, 2, 3]]     if a = b = c
           Ụ            Grade up; sort the indices of A by those 2D lists.
            ịḷ          Retrieve the elements of A at those indices.
                        This sorts A as in the previous section.
              i         Find the (1-based) index of D.
               ’        Decrement to get the 0-based index.
                :6      Divide the index by 6, rounding down.
                  d6    Divmod; return quotient and remainder of division by 6.
                    ‘   Increment to map [0, ..., 5] to [1, ..., 6].
                     S  Sum the results.


1

Pyth, 41 27 바이트

JSSM^S6 3+2sPtj+216xo/JNJQ6

10 개의 무작위 테스트 케이스

유효성 확인.

변환 표 :

2: [111, 222, 333, 444, 555, 666]
3: [112, 113, 223, 224]
4: [114, 115, 225, 226, 355, 366]
5: [116, 122, 125, 233, 244, 445, 446]
6: [126, 133, 144, 146, 255, 266, 455, 466]
7: [134, 155, 156, 166, 246, 334, 335, 556, 566]
8: [123, 135, 234, 256, 336, 344]
9: [124, 136, 235, 345]
10: [145, 236, 346]
11: [245, 356]
12: [456]

이전 41 바이트 솔루션 :

나는 이것을 골프로해야한다 ...

JSM^S6 3+2f/@co,/JNNJ.u+NY*R6t+S5_S6 6TQ0

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

변환 표 :

2 : [111, 222, 333, 444, 555, 666]

3 : [112, 113, 114, 115]

4 : [116, 122, 133, 144, 155, 166]

5 : [223, 224, 225, 226, 233, 244, 255, 266]

6 : [334, 335, 336, 344, 355, 366, 445, 446, 455, 466]

7 : [556, 566, 123, 124, 125, 126, 134]

8 : [135, 136, 145, 146, 156]

9 : [234, 235, 236, 245]

10 : [246, 256, 345]

11 : [346, 356]

12 : [456]

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