Este é o segundo de uma série de quebra-cabeças que vou postar toda segunda-feira no Midnight PST. O primeiro quebra-cabeça está localizado aqui .
Contexto:
Um bilionário recluso criou um game show para atrair os melhores e mais brilhantes programadores do mundo. Às segundas-feiras, à meia-noite, ele escolhe uma pessoa de um grupo de candidatos para ser o competidor da semana e oferece a eles um jogo. Você é o sortudo participante desta semana!
O jogo desta semana:
O host fornece acesso à API para uma pilha de 10.000 envelopes digitais. Esses envelopes são classificados aleatoriamente e contêm um valor em dólar entre US $ 1 e US $ 10.000 (dois envelopes não contêm o mesmo valor em dólar).
Você tem 4 comandos à sua disposição:
Read (): Leia a figura do dólar no envelope na parte superior da pilha.
Pegue (): adicione a figura do dólar no envelope à sua carteira de game show e tire o envelope da pilha.
Pass (): Retire o envelope na parte superior da pilha.
Oracle (M): retorna o valor médio dos próximos envelopes M na pilha, sem incluir o que você pode ler atualmente ().
As regras:
Se você usar Pass () em um envelope, o dinheiro dentro será perdido para sempre.
Se você usar Take () em um envelope contendo $ X, a partir desse momento, nunca poderá usar Take () em um envelope contendo <$ X. Take () em um desses envelopes adicionará US $ 0 à sua carteira.
Se você usar Oracle (M) no turn T, os envelopes T + 1 a T + M serão retornados. O Oracle () fica desativado até o turn T + M.
Escreva um algoritmo que termine o jogo com a quantidade máxima de dinheiro.
Se você estiver escrevendo seu algoritmo em Python, sinta-se à vontade para usar este controlador fornecido por @Maltysen: https://gist.github.com/livinginformation/70ae3f2a57ecba4387b5
Notas 1: "Máximo", neste caso, significa o valor médio em sua carteira após N> = 1000 execuções. Espero, apesar de gostar de provar que estou errado, que o valor mediano de um determinado algoritmo converja à medida que N aumenta para o infinito. Sinta-se à vontade para tentar maximizar a média, mas tenho a sensação de que é mais provável que a média seja descartada por um N pequeno do que a mediana.
Nota 2: como todas as soluções para a parte anterior deste quebra-cabeça são válidas aqui, a reposição delas tem pouco valor. Apenas melhorias algorítmicas de quebra-cabeças anteriores serão consideradas na parte II.
Edit: A condição do prêmio foi removida, à luz desta postagem na meta.
fonte
M
valores, onde poderá escolherM
.Respostas:
Groovy
$ 713337$ 817,829 mil$ 818227Código de inicialização:
Algoritmo
Eu comparo os valores restantes com os possíveis. Este script não é rápido (leva 1 minuto por simulações de 1000x) ... mas realiza as simulações simultaneamente.
Não tenho idéia do por que meu algoritmo funciona, mas foi apenas tentativa e erro: agrupar operações matemáticas e manipular as constantes. Executei 5000x para a pontuação atual, na tentativa de reduzir as flutuações da pontuação (é +/- $ 4000 dependendo da contagem de iterações).
Mesmo sem o oráculo no final, ele ainda deve estar (mal) superando a solução da @ orlp para o quebra-cabeça anterior.
fonte
C # - $ 803,603 agora -> $ 804,760 (com oracle)
Código de Bootstrap
Código do jogo:
O crédito pertence a Reto Koradi ( /codegolf//a/54181/30910 )
Edit: Uso básico do Oracle implementado. Se o próximo oráculo estiver acima do limite a ser usado, expanda o envelope atual para o índice do Oracle Index. Isso não acontece com frequência, mas é uma melhoria ;-)
fonte
Python - $ 74112
Somente pegue, se o valor atual for menor que o próximo valor (ou seja, você pode pegar os dois).
Python - (ainda calculando a média)
Esta resposta leva muito tempo para calcular. Atinge cerca de 670.000 $ . Lembro-me de cada envelope que vi. Toda vez que tenho que tomar uma decisão, eu gero duas listas de envelopes restantes que eu poderia adicionar à minha carteira se eu pegar o envelope atual ou deixá-lo, respectivamente.
Não otimizei o código.
E o init_game começa assim:
fonte
C # - $ 780.176
Verifique se o próximo valor está dentro dos 5% mais baixos de todos os valores restantes. Fique mais relaxado quando chegarmos ao fim.
E a minha classe de jogo, muito feia, nem sequer valida se o Oracle é permitido, mas como eu só uso o Oracle (1), isso não deve ser um problema.
fonte
Java, $ 804.991
A pontuação é de 1001 rodadas. Provavelmente está muito perto de se ligar entre essa resposta e a de Stephan Schinkel .
Isso se baseia na minha resposta no desafio anterior, na medida em que usa o mesmo cálculo baseado em entropia para estimar os retornos. A principal diferença é que agora ele simplesmente pega envelopes em pares (1 e 2, depois 3 e 4, etc.) e analisa as possíveis combinações de take-take, take-pass, pass-take, etc. Também calcula a pontuação exata estimada quando o número de envelopes válidos é realmente pequeno.
O "invólucro" que escrevi não é realmente um invólucro verdadeiro, apenas fornece envelopes em pares, em vez de chamar um
Oracle(1)
função a cada rodadas.No geral, eu diria que, apesar do aumento da complexidade, esse bot realmente não é melhor que o anterior.
Jogador
Controlador
Endereço de Bitcoin: 1BVBs9ZEP8YY4EpV868nxi2R23YfL7hdMq
fonte
Python 3 - $ 615570
Na verdade, não usa o oráculo ... Eh :)
Constrói uma lista de todos os envelopes anteriores e verifica se o envelope atual é menor que o número de envelopes anteriores em 10 incrementos de envelope.
fonte
Python, 87.424
Aqui está um algoritmo simples e fácil, os sete sortudos.
Basicamente, o que faz é converter read () em uma string e verificar se há sete nela. Se houver, é preciso o envelope. Caso contrário, passa.
A média é de cerca de 81.000, eu não tenho acompanhado.
fonte