三个无法区分的骰子


12

三个骰子在一个清晰的立方体

给定三个骰子掷骰(1-6的整数值)(以便无法区分),将它们转换为两个具有相同分布的公平骰子的总和

三对一的答案是将它们全部取模6。最终结果是一个完美的平坦分布,六个数字中的每个数字均具有相同的可能性(就像一个骰子一样)。

通过将它们全部取模为6,可以很容易地做到三对一。最终结果是一个完全平坦的分布,六个数字中的每个数字均具有相同的可能性(就像一个骰子一样)。您的挑战是三对二做同样的事情。

受到Standupmath的“三个难以区分的骰子之谜”的启发。还发布了后续的“解决方案”视频,但是争论一种或另一种方式的“优雅”有点主观。计数字符不是。:D

使用说明

编写一个程序或函数,该程序或函数接受三个排序的整数/数字1-6,并输出或返回单个整数2-12,这样,对于216种可能的输入,输出的分布为:

 222222
 333333333333
 444444444444444444
 555555555555555555555555
 666666666666666666666666666666
 777777777777777777777777777777777777
 888888888888888888888888888888
 999999999999999999999999
 AAAAAAAAAAAAAAAAAA
 BBBBBBBBBBBB
 CCCCCC

(我使用十六进制来保留单个字符;十进制输出是可以的)

因为骰子是无法区分的,所以它们没有内在的顺序,因此没有排序的输入。您不能简单地“丢掉第三个”,因为那样会模棱两可。

细节

  • 分数是程序的长度(以字节为单位)
  • 该程序可以是一个以某种方式调用的函数,也可以是从stdin读取的可执行脚本,也可以是任何方便的方法。
  • 不会通过从其他来源获取熵来“重新滚动”

示例(和测试)

无需进行任何形式的概率测试,就很容易探究所有三个骰子的216(6³)个情况,并断言您的函数将每个值返回应有的次数。它将使用相同的参数进行调用(例如,假定case 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 '16

1
除了不清楚这一挑战的问题外,代码高尔夫挑战还应该按字节计分而不是按字符计分,除非您有充分的理由改写该默认值。
Mego

我想我明白了。问题是要求我们将三个骰子掷骰映射到两个骰子掷骰,并有一些限制。
Leaky Nun

2
您不是两个骰子来实现,而是使用三个掷骰子来模拟两个掷骰子。
尼克T

2
无论(a+b+c)%6+1(a*b*c)%7转化三无序骰子到一个统一的单一芯片卷,可惜都没有独立的概率。
xnor

Answers:


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]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.