Ceci est le deuxième d'une série de puzzles que je publierai tous les lundis à minuit PST. Le premier puzzle se trouve ici .
Le contexte:
Un milliardaire reclus a créé un jeu télévisé pour attirer les meilleurs programmeurs du monde. Le lundi à minuit, il choisit une personne parmi un groupe de candidats pour être le candidat de la semaine et leur propose un jeu. Vous êtes l'heureux candidat de cette semaine!
Jeu de cette semaine:
L'hôte vous offre un accès API à une pile de 10 000 enveloppes numériques. Ces enveloppes sont triées au hasard et contiennent en leur sein une valeur en dollars, entre 1 $ et 10 000 $ (il n’existe pas deux enveloppes ayant la même valeur en dollars).
Vous avez 4 commandes à votre disposition:
Lire (): lire le chiffre en dollars dans l'enveloppe en haut de la pile.
Take (): Ajoutez le chiffre en dollars dans l'enveloppe à votre portefeuille de jeu télévisé et sortez l'enveloppe de la pile.
Pass (): Retirez l'enveloppe sur le dessus de la pile.
Oracle (M): renvoie la valeur moyenne des prochaines enveloppes M dans la pile, sans inclure celle que vous pouvez actuellement lire ().
Les règles:
Si vous utilisez Pass () sur une enveloppe, l'argent à l'intérieur est perdu pour toujours.
Si vous utilisez Take () sur une enveloppe contenant $ X, à partir de ce moment, vous ne pourrez jamais utiliser Take () sur une enveloppe contenant <$ X. Prenez () sur l'une de ces enveloppes ajoutera 0 $ à votre portefeuille.
Si vous utilisez Oracle (M) au tour T, les enveloppes T + 1 à la moyenne de T + M seront retournées. Oracle () est désactivé jusqu'au tour T + M.
Écrivez un algorithme qui termine le jeu avec le montant maximal d'argent.
Si vous écrivez votre algorithme en Python, n'hésitez pas à utiliser ce contrôleur fourni par @Maltysen: https://gist.github.com/livinginformation/70ae3f2a57ecba4387b5
Notes 1: "Maximal" dans ce cas signifie la valeur médiane de votre portefeuille après N> = 1000 exécutions. Je m'attends, bien que j'aimerais qu'on me prouve à tort, que la valeur médiane d'un algorithme donné convergera lorsque N augmentera à l'infini. N'hésitez pas à essayer de maximiser la moyenne à la place, mais j'ai le sentiment que la moyenne est plus susceptible d'être rejetée par un petit N que la médiane.
Remarque 2: comme toutes les solutions à la partie précédente de ce puzzle sont valables ici, les republier a peu de valeur. Seules les améliorations algorithmiques des puzzles précédents seront prises en compte pour la partie II.
Edit: La condition de prix a été supprimée, à la lumière de ce post sur meta.
la source
M
valeurs suivantes , où vous pouvez choisirM
.Réponses:
Groovy
713337$ 817829$ 818227 $Code d'amorçage:
Algorithme
Je compare les valeurs restantes avec des valeurs possibles. Ce script n'est pas rapide (prend 1 minute par 1000x simulations) ... mais il effectuera les simulations simultanément.
Je ne sais pas pourquoi mon algorithme fonctionne, mais ce n'était que des essais et des erreurs: regrouper les opérations mathématiques et manipuler les constantes. Je l'ai exécuté 5000x pour le score actuel, dans le but de réduire les fluctuations du score (c'est +/- 4000 $ selon le nombre d'itérations).
Même sans l'oracle à la fin, il devrait toujours battre (à peine) la solution de @ orlp pour le puzzle précédent.
la source
C # - 803,603 $ maintenant -> 804,760 $ (avec oracle)
Code d'amorçage
Code de jeu:
Le crédit appartient à Reto Koradi ( /codegolf//a/54181/30910 )
Edit: Utilisation basique d'Oracle implémentée. Si l'oracle suivant est au-dessus du seuil à utiliser, développez l'enveloppe actuelle jusqu'à l'index de l'index Oracle. Cela ne frappe pas souvent mais C'EST une amélioration ;-)
la source
Python - 74112 $
Ne prenez que si la valeur actuelle est inférieure à la valeur suivante (c'est-à-dire que vous pouvez prendre les deux).
Python - (calculant toujours la moyenne)
Cette réponse est TRÈS LONGUE à calculer. Il atteint environ 670 000 $ . Je me souviens de chaque enveloppe que j'ai vue. Chaque fois que je dois prendre une décision, je génère deux listes d'enveloppes restantes que je pourrais potentiellement ajouter à mon portefeuille si je prends l'enveloppe actuelle ou la laisse respectivement.
Je n'ai pas optimisé le code.
Et init_game commence comme ceci:
la source
C # - 780,176 $
Vérifiez si la valeur suivante se situe dans les 5% inférieurs de toutes les valeurs restantes. Soyez plus détendu à la fin.
Et ma classe de jeu, très moche, ne classe même pas si l'oracle est autorisé, mais comme j'utilise uniquement Oracle (1), cela ne devrait pas être un problème.
la source
Java, 804 991 $
Le score est de 1001 tours. Il est probablement trop proche d'appeler entre cette réponse et celle de Stephan Schinkel .
Ceci est basé sur ma réponse dans le défi précédent, en ce qu'il utilise le même calcul basé sur l'entropie pour estimer les gains. La principale différence est qu'il prend maintenant simplement les enveloppes par paires (1 & 2, puis 3 & 4, etc.) et examine les combinaisons possibles de prise-prise, prise-passe, passe-prise, etc. Il calcule également la score estimé exact lorsque le nombre d'enveloppes valides est vraiment faible.
Le "wrapper" que j'ai écrit n'est pas vraiment un vrai wrapper, il donne juste des enveloppes par paires au lieu d'appeler une
Oracle(1)
fonction tous les deux tours.Dans l'ensemble, je dirais que, malgré la complexité accrue, ce bot n'est vraiment pas meilleur que le précédent.
Joueur
Manette
Adresse Bitcoin: 1BVBs9ZEP8YY4EpV868nxi2R23YfL7hdMq
la source
Python 3 - 615570 $
N'utilise pas vraiment l'oracle ... Eh :)
Construit une liste de toutes les enveloppes précédentes et vérifie si l'enveloppe actuelle est inférieure au nombre d'enveloppes précédentes en 10 incréments d'enveloppe.
la source
Python, 87 424
Voici un algorithme simple et simple, les sept chanceux.
Fondamentalement, il convertit read () en chaîne et vérifie s'il y en a sept. S'il y en a, il prend l'enveloppe. Sinon, ça passe.
Il est en moyenne de 81 000, je n'ai pas suivi.
la source