Dado três lançamentos de dados (valores inteiros de 1 a 6) em ordem classificada (de modo a serem indistinguíveis), converta-os na soma de dois dados justos com uma distribuição idêntica.
A resposta de três para um é somar todos eles, módulo 6. O resultado final é uma distribuição perfeitamente plana, onde cada um dos seis números é igualmente provável (como um único dado).
É fácil fazer isso para três para um, somando todos eles no módulo 6. O resultado final é uma distribuição perfeitamente plana, onde cada um dos seis números é igualmente provável (como um único dado). Seu desafio é fazer o mesmo por três a dois.
Inspirado no quebra-cabeça dos três dados indistinguíveis do standupmath . Um vídeo de "solução" de acompanhamento também foi publicado, mas discutir sobre "elegância" de uma maneira ou de outra é um pouco subjetivo. Contar caracteres não é.:D
Instruções
Escrever um programa ou função que aceita três ordenadas inteiros / dígitos, 1-6, e saídas ou retorna uma única inteiros, 2-12, de tal modo que, para os 216 possíveis entradas, as saídas são distribuídos como:
222222
333333333333
444444444444444444
555555555555555555555555
666666666666666666666666666666
777777777777777777777777777777777777
888888888888888888888888888888
999999999999999999999999
AAAAAAAAAAAAAAAAAA
BBBBBBBBBBBB
CCCCCC
(Eu usei hex para manter caracteres únicos; a saída decimal é boa)
Como os dados são indistinguíveis, não há ordem intrínseca para eles, daí a entrada classificada. Você não pode simplesmente "largar o terceiro", porque isso seria ambíguo.
Detalhes
- Score é o comprimento do programa em bytes
- O programa pode ser uma função chamada de alguma forma, ou script executável que lê de stdin, ou o que for conveniente.
- Sem "re-rolagem" obtendo entropia de outra fonte
Exemplo (e teste)
Em vez de fazer qualquer tipo de teste probabilístico, é fácil percorrer os 216 (6³) casos dos três dados e afirmar que sua função retorna cada valor quantas vezes for necessário. Ele será chamado com parâmetros idênticos (por exemplo, os casos 1, 2, 3
e 3, 2, 1
, ... são supostamente indistinguíveis e são (arbitrariamente) convertidos em 1, 2, 3
).
Um exemplo de resposta (extremamente bruta e ineficiente) e um conjunto de testes são fornecidos abaixo em Python. Espero que os bits de teste sejam claros o suficiente para serem portados para o idioma de sua escolha, embora fazer stdin / stdout seja um pouco diferente. O código de teste é apenas para teste e não é pontuado (embora se você quiser fornecê-lo para outros usuários do seu idioma ou método de E / S, isso pode ser útil).
# 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
(a+b+c)%6+1
e (a*b*c)%7
converter um triplo de dados não ordenados para um uniforme único rolo morrer, mas, infelizmente, não são probabilisticamente independente.