fundo
Eu tenho uma coleção de "meias para dias úteis", que são sete pares de meias marcadas pelos dias da semana. Quando lavo minhas meias, elas terminam em uma pilha e devo organizá-las nos pares corretos antes de colocá-las no armário. Minha estratégia é puxar uma meia aleatória da pilha de cada vez e colocá-la em uma gaveta. Sempre que há um par de meias na gaveta, amarro-as e coloco-as no armário. Sua tarefa é simular esse processo aleatório e retornar o número de empates necessários para encontrar o primeiro par correspondente.
Entrada
Sua entrada é um número inteiro N ≥ 1 . Ele representa o "número de dias em uma semana": há N pares de meias na pilha e cada par tem um rótulo distinto. Se necessário, você também pode usar uma semente PRNG como entrada.
Resultado
Sua saída é o número de meias que tenho que desenhar antes que o primeiro par correspondente seja encontrado. Por exemplo, se as duas primeiras meias já formarem um par correspondente, a saída será 2
.
Obviamente, a saída é aleatória e depende da ordem do desenho. Assumimos que todas as ordens de desenho são igualmente prováveis , de modo que cada vez que uma meia é desenhada, a escolha é uniforme e independente de todas as outras opções.
Exemplo
Vamos N = 3 , para que tenhamos 6 meias no total, rotuladas como AABBCC . Uma possível execução do "protocolo de desenho de meias" é a seguinte:
| Pile | Drawer | Pairs
Begin | AABBCC | - | -
Draw B | AABCC | B | -
Draw C | AABC | BC | -
Draw B | AAC | C | BB
Draw A | AC | AC | BB
Draw A | C | C | AA BB
Draw C | - | - | AA BB CC
O primeiro par correspondente foi encontrado depois de desenhar o segundo B , que foi a terceira meia a ser desenhada, portanto a saída correta é 3
.
Regras e pontuação
Você pode escrever um programa completo ou uma função. A menor contagem de bytes vence e as brechas padrão não são permitidas. A entrada e a saída podem estar em qualquer formato razoável, incluindo unário (sequência de 1
s).
Você pode supor que o RNG interno do seu idioma seja perfeito. Você não precisa simular o protocolo de desenho de meias, desde que suas saídas tenham a distribuição de probabilidade correta.
"Casos de teste"
Aqui estão as probabilidades aproximadas de todas as saídas para a entrada N = 7 :
Output 2 3 4 5 6 7 8
Probability 0.077 0.154 0.210 0.224 0.186 0.112 0.037
Para testar sua solução, você pode executá-la por, digamos, 40.000 vezes e ver se a distribuição de saída está razoavelmente próxima disso.
Draw all socks. End up with an odd number.
Respostas:
Gelatina , 8 bytes
Experimente online! ou verifique a distribuição para N = 7 .
fundo
Seja n o número de pares; existem 2n meias individuais.
Para o primeiro sorteio, existem 2n meias e 0 delas resultariam em um par correspondente. Portanto, a probabilidade de sucesso é 0 / 2n = 0 .
Como o primeiro sorteio não teve sucesso, existem 2n - 1 meias na pilha e 1 delas resultaria em um par correspondente. Portanto, a probabilidade de sucesso é 1 / (2n - 1) .
Se o segundo sorteio não foi bem sucedido, existem 2n - 2 meias na pilha e 2 delas resultariam em um par correspondente. Portanto, a probabilidade de sucesso é 2 / (2n - 2) .
Em geral, se os primeiros k draws não deram certo , há 2n - k meias na pilha e 2 delas resultariam em um par correspondente. Portanto, a probabilidade de sucesso é k / (2n - k) .
Finalmente, se nenhum dos primeiros n empates foi bem-sucedido, existem 2n - k meias na pilha e todas elas resultariam em um par correspondente. Portanto, a probabilidade de sucesso é n / (2n - n) = 1 .
Como funciona
fonte
Gelatina, 8 bytes
Experimente online!
Para verificar, aqui está uma versão que exibe a saída desejada e o resultado da operação "lista aleatória" (para ver em que ordem as meias foram desenhadas).
fonte
Python, 66 bytes
Dennis pensou em uma maneira inteligente de reorganizar as coisas, economizando 5 bytes.
fonte
MATL ,
1615 bytesExperimente online! Ou observe a distribuição empírica para 1000 amostras no N caso = 7 (leva um tempo).
Isso gera diretamente a variável aleatória que representa o resultado, com base em sua distribuição de probabilidade. Seja N o número de pares de meias e p ( k ) denote a probabilidade de que o k -ésimo empate seja bem-sucedido, condicionado ao fato de que o k -ésimo empate não foi bem-sucedido. Então (veja também aqui ):
Portanto, o código itera para um máximo de N +1. No k- ésimo sorteio, é gerada uma variável aleatória igual a 1 com probabilidade ( k -1) / (2 * N - k ) ou 0 em caso contrário. Sempre que a variável aleatória é igual a 1 (o sorteio foi bem-sucedido), o processo é interrompido e a corrente k é emitida.
fonte
MATL ,
1413 bytesExperimente online! Ou observe a distribuição empírica de 4000 amostras no caso N = 7 (demora um pouco).
fonte
JavaScript,
7773 bytesExplicação
fonte
f=(n)=>
porn=>
(ou dois, se desejar manter a tarefa, alguns a mantêm , alguns a removem ).CJam, 17 bytes
Teste aqui.
fonte
Python 3,
142105104 bytesAgradecemos a Eʀɪᴋ ᴛʜᴇ Gᴏʟғᴇʀ por salvar um byte!
Minha primeira resposta:
Minha nova resposta:
Ambos saída com um
NameError
ons
.fonte
R, 49
Tenho certeza de que deve haver uma maneira melhor de fazer isso no R! Eu tentei fazer algo mais inteligente, mas não funcionou.
Edit: Melhorado por @bouncyball, pois não precisa ser uma função.
fonte
function(N)
? usandoN=scan();
iria salvar 2 bytesPython 2, 101 bytes
fonte
VBA, 61 bytes
- modela a probabilidade de mudança de correspondência de meia, dada a falha anterior na correspondência. No ponto da avaliação, K é "meias na mão", então o número do sorteio é mais um.
fonte
Pitão, 14 bytes
Explicação:
fonte