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, 3e 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+1e (a*b*c)%7converter um triplo de dados não ordenados para um uniforme único rolo morrer, mas, infelizmente, não são probabilisticamente independente.
