Sobre a série
Primeiro, você pode tratar isso como qualquer outro desafio de código de golfe e respondê-lo sem se preocupar com a série. No entanto, existe uma tabela de classificação em todos os desafios. Você pode encontrar a tabela de classificação junto com mais informações sobre a série no primeiro post .
Embora eu tenha várias idéias alinhadas para a série, os desafios futuros ainda não estão definidos. Se você tiver alguma sugestão, informe-me na postagem da sandbox relevante .
Buraco 3: Partições Inteiras
Hora de aumentar um pouco a dificuldade.
Uma partição de um número inteiro positivo n
é definida como um conjunto múltiplo de números inteiros positivos que somam n
. Como exemplo n = 5
, se existirem as seguintes partições:
{1,1,1,1,1}
{2,1,1,1}
{2,2,1}
{3,1,1}
{3,2}
{4,1}
{5}
Note-se que estes são multisets, portanto, não há fim para eles, {3,1,1}
, {1,3,1}
e {1,1,3}
são todos considerados idênticos.
Sua tarefa é, dada n
, gerar uma partição aleatória de n
. Aqui estão as regras detalhadas:
A distribuição das partições produzidas deve ser uniforme . Ou seja, no exemplo acima, cada partição deve ser retornada com probabilidade 1/7.
Obviamente, devido às limitações técnicas dos PRNGs, a uniformidade perfeita será impossível. Com o objetivo de avaliar a uniformidade de seu envio, as seguintes operações serão consideradas como produzindo distribuições perfeitamente uniformes:
- Obtenção de um número de um PRNG (acima de qualquer intervalo), que está documentado para ser (aproximadamente) uniforme.
- Mapear uma distribuição uniforme sobre um conjunto maior de números para um conjunto menor via módulo ou multiplicação (ou alguma outra operação que distribua valores uniformemente). O conjunto maior deve conter pelo menos 1024 vezes o maior número possível de valores que o conjunto menor.
Como as partições são multisets, você pode devolvê-las em qualquer ordem, e essa ordem não precisa ser consistente. No entanto, para fins da distribuição aleatória, a ordem é ignorada. Ou seja, no exemplo acima
{3,1,1}
,{1,3,1}
e{1,1,3}
juntos devem ter uma probabilidade de 1/7 de serem retornados.- Seu algoritmo deve ter um tempo de execução determinístico. Em particular, você não pode gerar multisets aleatórios e rejeitá-los se não somarem
n
. - A complexidade de tempo do seu algoritmo deve ser polinomial
n
. Em particular, você não pode simplesmente gerar todas as partições e selecionar uma aleatória (já que o número de partições aumenta exponencialmenten
). Você pode supor que o PRNG que você está usando pode retornar valores uniformemente distribuídos em O (1) por valor. - Você não deve usar nenhuma função interna que resolva esta tarefa.
Você pode escrever um programa completo ou uma função e obter entrada via STDIN ou alternativa mais próxima, argumento de linha de comando ou argumento de função e produzir saída via valor de retorno ou imprimindo em STDOUT (ou alternativa mais próxima).
Você pode assumir que n ≤ 65
(de modo que o número de partições seja menor que 2 21 ). A saída pode estar em qualquer lista conveniente ou inequívoca ou formato de string.
Se você enviar uma função, considere também fornecer um pequeno programa de teste que chame a função várias vezes e imprima os resultados. Tudo bem se os parâmetros tiverem que ser ajustados no código. Isso é apenas para que as pessoas possam verificar se a solução é pelo menos aproximadamente uniforme.
Isso é código de golfe, então a submissão mais curta (em bytes) vence. E, é claro, o menor envio por usuário também entrará na tabela geral de líderes da série.
Entre os melhores
O primeiro post da série gera uma tabela de classificação.
Para garantir que suas respostas sejam exibidas, inicie todas as respostas com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(O idioma não é mostrado no momento, mas o snippet exige e o analisa, e eu posso adicionar um cabeçalho por idioma no futuro.)