Um acompanhamento para este desafio
Dado um conjunto de dados mistos, produza a distribuição de frequências rolando todos eles e somando os números rolados em cada dado.
Por exemplo, considere 1d12 + 1d8
(rolar 1 dado de 12 lados e 1 dado de 8 lados). Os rolos máximo e mínimo são 20
e 2
, respectivamente, semelhantes ao rolamento 2d10
(2 dados de 10 lados). No entanto, 1d12 + 1d8
resulta em uma distribuição mais plana do que 2d10
: [1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 7, 6, 5, 4, 3, 2, 1]
versus [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
.
Regras
- As frequências devem ser listadas em ordem crescente da soma à qual a frequência corresponde.
- É permitido rotular as frequências com as somas correspondentes, mas não é obrigatório (pois as somas podem ser deduzidas da ordem necessária).
- Você não precisa manipular entradas nas quais a saída excede o intervalo representável de números inteiros para o seu idioma.
- Zeros à esquerda ou à direita não são permitidos. Somente frequências positivas devem aparecer na saída.
- Você pode receber a entrada em qualquer formato razoável (lista de dados (
[6, 8, 8]
), lista de pares de dados ([[1, 6], [2, 8]]
), etc.). - As frequências devem ser normalizadas para que o GCD das frequências seja 1 (por exemplo, em
[1, 2, 3, 2, 1]
vez de[2, 4, 6, 4, 2]
). - Todos os dados terão pelo menos uma face (então a
d1
é o mínimo). - Isso é código-golfe , então o código mais curto (em bytes) vence. As brechas padrão são proibidas, como de costume.
Casos de teste
Esses casos de teste são dados como input: output
, onde a entrada é fornecida como uma lista de pares [a, b]
representando a
b
dados de lados (isso [3, 8]
se refere 3d8
e [[1, 12], [1, 8]]
se refere a 1d12 + 1d8
).
[[2, 10]]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[[1, 1], [1, 9]]: [1, 1, 1, 1, 1, 1, 1, 1, 1]
[[1, 12], [1, 8]]: [1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 7, 6, 5, 4, 3, 2, 1]
[[2, 4], [3, 6]]: [1, 5, 15, 35, 68, 116, 177, 245, 311, 363, 392, 392, 363, 311, 245, 177, 116, 68, 35, 15, 5, 1]
[[1, 3], [2, 13]]: [1, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 37, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 1]
[[1, 4], [2, 8], [2, 20]]: [1, 5, 15, 35, 69, 121, 195, 295, 423, 579, 761, 965, 1187, 1423, 1669, 1921, 2176, 2432, 2688, 2944, 3198, 3446, 3682, 3898, 4086, 4238, 4346, 4402, 4402, 4346, 4238, 4086, 3898, 3682, 3446, 3198, 2944, 2688, 2432, 2176, 1921, 1669, 1423, 1187, 965, 761, 579, 423, 295, 195, 121, 69, 35, 15, 5, 1]
[[1, 10], [1, 12], [1, 20], [1, 50]]: [1, 4, 10, 20, 35, 56, 84, 120, 165, 220, 285, 360, 444, 536, 635, 740, 850, 964, 1081, 1200, 1319, 1436, 1550, 1660, 1765, 1864, 1956, 2040, 2115, 2180, 2235, 2280, 2316, 2344, 2365, 2380, 2390, 2396, 2399, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2399, 2396, 2390, 2380, 2365, 2344, 2316, 2280, 2235, 2180, 2115, 2040, 1956, 1864, 1765, 1660, 1550, 1436, 1319, 1200, 1081, 964, 850, 740, 635, 536, 444, 360, 285, 220, 165, 120, 84, 56, 35, 20, 10, 4, 1]
Respostas:
Geléia ,
147 bytes-3 bytes, graças ao Sr. Xcoder (uso de um intervalo implícito para evitar a liderança
R
; substituição de redução pelo produto cartesiano diádico e achatamentop/F€
, com o produto cartesiano incorporado para esse fimŒp
).Um link monádico que obtém uma lista de faces de dados e retorna a distribuição normalizada das somas crescentes.
Experimente online!
Quão?
Percorre a lista de "tamanhos" de dados (implicitamente) os coloca em sua lista de faces e, em seguida, obtém o produto cartesiano dessas listas (todos os possíveis lançamentos do conjunto de dados), depois resume esses rolos, obtém os grupos de iguais índices (por valor crescente) e mede a duração de cada grupo.
Nota: existe apenas uma maneira de rolar o mínimo (rolando um em cada um dos dados) e não estamos contando duas rolagens, portanto, não há necessidade de executar uma normalização do GCD.
fonte
÷g/$
embora (não há sempre apenas uma maneira de obter o mínimo ou máximo?)ŒpS€µLƙ
MATL , 8 bytes
A entrada é uma matriz de (possivelmente repetidos) tamanhos de matriz.
Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
Casca , 7 bytes
Entrada é uma lista de dados. Experimente online!
Explicação
fonte
Haskell , 54 bytes
Experimente online!
Haskell , 63 bytes
Experimente online!
Haskell , 68 bytes
Experimente online!
fonte
Oitava ,
88 69 5856 bytesComo mencionado na resposta de Haskell, isso usa o fato de que a distribuição de, por exemplo, dados de 3 e 5 lados é a convolução discreta dos dois vetores
[1,1,1]
e[1,1,1,1,1]
. Obrigado @LuisMendo por -11 bytes de golfe inteligente!Experimente online!
Este envio está usando uma abordagem recursiva. Mas se você usasse um loop, seria um pouco mais longo:
fonte
Haskell ,
80 7864 bytesEssa solução acabou sendo quase a mesma da @ Sherlock9 no desafio anterior, com a abordagem talvez mais natural. O @xnor possui uma solução Haskell ainda mais curta !
Explicação:
Experimente online!
Solução anterior:
Isso está usando a função de convolução discreta @AndersKaseorg . A observação aqui é que a distribuição de, por exemplo, dados de 3 e 5 lados é a convolução discreta dos dois vetores
[1,1,1]
e[1,1,1,1,1]
.Experimente online!
fonte
Wolfram Language (Mathematica) , 26 bytes
Experimente online!
Uma modificação da minha resposta ao desafio anterior . Isso apenas gera todos os resultados possíveis, os soma e registra os resultados.
Por diversão, poderíamos escrever como
Tally@*Total@*Thread@*Tuples@*Range
, mas é mais longo.Wolfram Language (Mathematica) , 41 bytes
Experimente online!
Essa é a abordagem baseada em convolução (aqui, fazemos convoluções por meio do produto de funções geradoras -
1+x+x^2+...+x^(N-1)
é a função geradora para rolar um dN - e, em seguida, tomamos a lista de coeficientes). Eu o incluo porque a primeira solução não é prática para grandes entradas.fonte
Mathematica, 44 bytes
Emite as frequências rotuladas com as somas correspondentes
Experimente online!
-5 bytes de Martin Ender
obrigado a Misha Lavrov por me informar que "rotulado" é válido
fonte
Pitão , 12 bytes
Experimente aqui!
Quão?
fonte
Gelatina , 14 bytes
Experimente online!
Entrada é uma lista de valores de matriz. Eu poderia jogar isso roubando
ĠL€
a outra resposta do Jelly, mas então eu também poderia jogar no primeiro semestre e acabar com a mesma coisa, então vou deixar como estáfonte
Python 2 ,
120119 bytesExperimente online!
Obrigado por Mego / Jonathon Allan por 1 byte.
fonte
05AB1E , 11 bytes
Experimente online!
Como funciona
Guardado 1 byte graças a Emigna !
fonte
O
vez de€˜
R , 51 bytes
Experimente online!
Pega uma lista de dados e retorna um vetor nomeado de frequências; os nomes (valores da soma dos dados) são impressos acima das frequências.
R , 59 bytes
Experimente online!
Uma
Reduce
abordagem, e não a iterativa acima.R , 62 bytes
Experimente online!
Uma abordagem de convolução. Ele fornecerá alguns avisos de que está apenas usando o primeiro elemento de
D
para a expressão,1:D
mas não afeta a saída. Se não tivéssemos que pegar toda aRe
parte da solução, seriam 58 bytes.fonte
APL (Dyalog Classic) ,
1210 bytes-2 graças a @ Adám
Experimente online!
a entrada
⎕
é uma lista de N dados⍳⍵
é uma matriz N-dimensional de vetores aninhados - todos os arremessos de matriz possíveis+/↑,
nivela as matrizes e soma os arremessos⊢∘≢⌸
conta quantos de cada soma exclusiva, listados em ordem de primeira aparição, que felizmente coincidem com a ordem crescentefonte
⊢∘≢⌸+/↑,⍳⎕
Ruby , 72 bytes
Experimente online!
Leva uma lista de dados como entrada. Sem dúvida, pode ser jogado para baixo, mas não tão ruim.
fonte
Pari / GP , 37 bytes
Experimente online!
fonte
Limpo ,
15414213610710085 + 13 = 98 bytesEntrada é uma lista de dados.
A resposta está na forma de uma lambda.
+13 bytes de
import StdEnv
, que importa o módulo necessário para que isso funcione.Experimente online!
fonte
JavaScript (ES6), 83 bytes
Recebe a entrada de cada dado como um parâmetro separado.
fonte
JavaScript (ES6),
7674 bytesToma entrada como uma lista de dados.
Casos de teste
O processamento dos dois últimos casos de teste exigiria ativar o TCO ou aumentar o limite de tamanho da pilha padrão do mecanismo JS.
Mostrar snippet de código
Formatado e comentado
NB: Esta é uma versão comentada do meu envio inicial que estava usando reduza (). É 2 bytes mais longo, mas mais fácil de ler.
fonte
Clojure, 96 bytes
A primeira entrada é uma lista do número de dados e a segunda entrada é uma lista do número de lados em cada dado.
fonte
Perl 5 , 94 bytes
Experimente online!
O formato de entrada é uma lista de dados separados por novas linhas. Assim, 1d10 + 2d8 digitaria como:
fonte
SageMath, 46 bytes
Experimente online
Esta é uma adaptação da minha solução para o outro desafio . Ele recebe qualquer número de dados como parâmetros (por exemplo,
f(4,4,6,6,6)
para2d4+3d6
) e retorna uma lista.Python 2 + NumPy , 62 bytes
Experimente online!
Como antes, incluímos esta solução na acima, pois são essencialmente equivalentes. Observe que essa função retorna uma matriz NumPy e não uma lista Python; portanto, a saída parece um pouco diferente se você a
print
usar.numpy.ones(x)
é a maneira "correta" de criar uma matriz para uso com o NumPy e, portanto, pode ser usada no lugar de[x*[1]]
, mas infelizmente é muito mais longa.fonte