Pilote d'essai • Discussion sur le défi • Soumettre un aventurier
Plusieurs aventuriers rivaux attaquent les ruines pour trouver des trésors, mais ils ne peuvent en transporter que beaucoup à la fois et ont leurs limites d'endurance. Ils veulent obtenir le trésor le plus précieux et sortir avant de devenir trop fatigués pour continuer. Ils essaient de devenir aussi riches que possible de leurs manigances de pillage.
Gameplay
Chaque aventurier commence dans la première salle du donjon avec 1000 points d'endurance et 50 kg d'espace dans son sac à dos.
Le jeu fonctionne au tour par tour, tous les joueurs résolvant leurs tours simultanément. À chaque tour, vous pouvez effectuer l'une des actions suivantes:
- Passez à la pièce suivante.
- Passez à la pièce précédente.
- Offrez de l'endurance pour prendre un trésor.
- Lâchez un trésor.
Se déplacer entre les pièces nécessite 10 points d'endurance, plus 1 pour chaque 5 kg actuellement dans votre sac à dos, arrondi. Par exemple, un aventurier portant 3 kg de trésors a besoin de 11 points d'endurance pour se déplacer et un porteur de 47 kg a besoin de 20 points d'endurance pour se déplacer.
Lâcher un trésor nécessite 1 endurance quel que soit le trésor lâché.
À la sortie des ruines, le joueur ne prendra plus de tours.
Si un joueur ne peut effectuer aucune de ces actions (en raison du manque d'endurance ou de l'absence de trésors), son aventurier meurt d'épuisement, déversant son trésor détenu dans la pièce actuellement occupée. De même, si un joueur tente de faire une action invalide, son aventurier sera tué par un piège à la place, entraînant le même déversement de trésors.
Enchère
L'enchère minimum pour un trésor est de 1 endurance par 1 kg que le trésor pèse. Vous pouvez également offrir des points d'endurance supplémentaires pour être plus susceptible d'obtenir le trésor. L'endurance qui a été mise est consommée quel que soit le résultat.
Dans le cas où plusieurs joueurs ont misé pour prendre le même trésor, le joueur qui a misé le plus haut obtient le trésor. Si plusieurs joueurs ont fait l'enchère la plus élevée, aucun d'eux ne recevra le trésor.
Condition de victoire
Le joueur avec la plus grande valeur totale de trésors est le gagnant. Dans le cas peu probable d'une égalité, les égalités vont au plus petit poids total, puis au plus petit nombre de trésors, puis à la valeur du trésor le plus précieux, au deuxième plus précieux, au troisième ... jusqu'à ce que l'égalité soit brisée. Dans le cas presque impossible où il y a encore égalité à ce stade, le pilote d'essai dit "vissez" et le vainqueur est ainsi déterminé arbitrairement.
Dans le cadre du tournoi, les joueurs seront classés avec la première place recevant 10 points, la deuxième place avec 9 points, la troisième place avec 8 points, etc ..., avec les joueurs morts et les aventuriers sans trésors marquant 0 point.
À propos des ruines
- Chaque pièce contient initialement entre ettrésors. (Oùest le numéro de la chambre)
- Il y a arbitrairement de nombreuses pièces, limitées uniquement par l'endurance des aventuriers et leur volonté d'explorer.
- Chaque trésor aura une valeur monétaire (en $) et un poids (en kg).
- Les trésors ont tendance à être plus précieux et abondants lorsque vous vous enfoncez plus profondément dans les ruines.
- Les formules spécifiques pour générer des trésors sont les suivantes: (en utilisant la notation pour les lancers de dés)
- Le poids est généré en premier en utilisant la formule (minimum 1)
- La valeur du trésor est alors générée via (où est le numéro de la pièce et est le poids)
Informations visibles pour les joueurs
À chaque tour, les joueurs obtiennent les informations suivantes:
- Le numéro de la pièce dans laquelle ils se trouvent actuellement. Il est indexé sur 1, donc conceptuellement, la sortie est à la "pièce 0"
- Une liste des trésors actuellement dans la salle
- Une liste d'autres joueurs qui sont également actuellement dans la salle.
- Votre inventaire actuel de trésors
- Votre niveau d'endurance actuel
Codage
Le pilote de test peut être trouvé ici .
Vous devez implémenter une sous-classe de cette Adventurer
classe:
class Adventurer:
def __init__(self, name, random):
self.name = name
self.random = random
def get_action(self, state):
raise NotImplementedError()
def enter_ruins(self):
pass
Il vous suffit de remplacer la get_action
méthode. enter_ruins
est exécuté avant le début d'un jeu et est votre chance de préparer tout ce que vous souhaitez préparer pour le jeu. Vous n'avez pas besoin de passer outre __init__
et vous ne devriez vraiment pas . En cas de __init__
plantage, vous serez disqualifié.
get_action
reçoit un seul argument qui est un namedtuple
avec les champs suivants (dans cet ordre, si vous préférez la déstructuration):
room
: le numéro de la pièce dans laquelle vous vous trouvez actuellementtreasures
: la liste des trésors de la salleplayers
: la liste des autres joueurs dans la salle. Vous n'obtenez que le nom du joueur de cette façon, donc vous ne savez pas quel bot les contrôle ou leur inventaire / endurance.inventory
: la liste des trésors dans votre sac à dosstamina
: votre niveau d'endurance actuel
Cet objet fournit en outre deux propriétés utilitaires:
carry_weight
: le poids total de tous les trésors que vous porteztotal_value
: la valeur totale de tous les trésors que vous portez
Les listes treasures
et inventory
contiennent des namedtuple
s avec ces attributs:
name
: le nom du trésor (à des fins esthétiques)value
: la valeur monétaire du trésor en $.weight
: le poids du trésor en kg
get_action
doit renvoyer l'une des valeurs / modèles suivants:
'next'
ou'previous'
pour passer aux salles suivantes / précédentes'take', <treasure index>, <bid>
(oui, en tant que tuple, bien que n'importe quelle séquence fonctionne également techniquement) pour miser sur le trésor à l'index donné dans la liste des trésors de la salle. Les deux arguments doivent être des entiers. Les flotteurs seront arrondis.'drop', <inventory index>
pour laisser tomber le trésor transporté trouvé à l'indice donné. L'index doit (naturellement) être un entier.
Autres restrictions
- Vous ne pouvez utiliser l'instance aléatoire qui vous a été fournie lors de l'initialisation pour pseudo-aléatoire.
- Tout ce qui pourrait introduire un non-déterminisme comportemental n'est pas autorisé. L'intention ici est de faire en sorte que les bots se comportent de manière identique lorsqu'ils reçoivent la même graine pour aider à tester de nouveaux bots (et potentiellement des bogues dans le pilote de test). Seul le rayonnement cosmique devrait provoquer une déviation / non-déterminisme.
- Gardez à l'esprit que les codes de hachage sont aléatoires en Python 3, donc l'utilisation
hash
pour toute prise de décision n'est pas autorisée.dict
les s sont corrects même lors de l'utilisation de l'ordre d'itération pour les décisions car l'ordre est garanti cohérent depuis Python 3.6.
- Vous ne pouvez pas contourner le pilote de test à l'aide de
ctypes
hacks ou deinspect
stack vaudou (ou toute autre méthode). Il y a des choses effrayantes que vous pouvez faire avec ces modules. S'il vous plait, ne le faites pas.- Chaque bot est raisonnablement bien mis en bac à sable via des copies défensives et l'immuabilité naturelle de
namedtuple
s, mais il y a des failles / exploits non détectables. - D'autres fonctionnalités de
inspect
etctypes
peuvent être utilisées tant qu'aucune n'est utilisée pour contourner la fonctionnalité du contrôleur. - Toute méthode pour récupérer des instances des autres robots dans votre jeu actuel n'est pas autorisée.
- Chaque bot est raisonnablement bien mis en bac à sable via des copies défensives et l'immuabilité naturelle de
- Les bots doivent fonctionner en solo et ne peuvent en aucun cas se coordonner avec d'autres bots à quelque fin que ce soit. Cela comprend la création de deux bots avec des objectifs différents tels que l'un se sacrifie pour le succès de l'autre. Une fois qu'il y a plus de 10 concurrents, vous ne serez pas réellement assuré d'avoir les deux bots dans le même jeu et les noms des aventuriers ne donnent aucune indication sur la classe de bot, donc ces types de stratégies sont de toute façon limités.
- Il n'y a actuellement aucune restriction stricte sur le temps d'exécution, mais je me réserve le droit de le limiter à l'avenir si les tournois commencent trop longtemps. Soyez raisonnable et essayez de garder le traitement des virages sous 100 ms , car je ne prévois pas avoir besoin de le limiter en dessous de ce seuil. (Les tournois se dérouleront dans environ 2 heures si tous les robots prennent environ 100 ms par tour.)
- Votre classe de bot doit être nommée de manière unique parmi toutes les soumissions.
- Vous ne vous souvenez peut-être de rien entre les jeux. (Cependant, vous pouvez vous souvenir des choses entre les tours )
- Ne modifiez pas sys.modules. Tout ce qui est en dehors des variables d'instance doit être traité comme une constante.
- Vous ne pouvez pas modifier le code d'un bot par programme, y compris le vôtre.
- Cela comprend la suppression et la restauration de votre code. C'est pour simplifier le débogage et les tournois.
- Tout code provoquant le plantage du contrôleur sera immédiatement disqualifié. Bien que la plupart des exceptions soient interceptées, certaines peuvent passer à travers et les erreurs de segmentation sont inaccessibles. (Oui, vous pouvez vous séparer en Python grâce à
ctypes
)
Soumissions
Afin de faciliter le grattage des réponses, indiquez le nom de votre bot en haut de la réponse par un #Header1
et assurez-vous que votre réponse comprend au moins un bloc de code (seul le premier de votre réponse sera utilisé). Vous n'avez pas besoin d'inclure d'importations ou de docstrings, car ils seront ajoutés automatiquement par le grattoir.
Je serai plus enclin à voter pour des réponses avec des explications détaillées et compréhensibles. D'autres se comporteront probablement de la même manière.
En gros, votre réponse doit être formatée comme ceci:
# Name of Bot
Optional blurb
#imports go here
class BotName(Adventurer):
#implementation
Explanation of bot algorithm, credits, etc...
(rendu comme)
Nom du Bot
Texte de présentation en option
#imports go here class BotName(Adventurer): #implementation
Explication de l'algorithme du bot, des crédits, etc ...
Exécution locale du pilote de test
Vous aurez besoin de Python 3.7+ et je vous recommande également d'installer tabulate
via pip. Le grattage de cette page pour les soumissions nécessite en outre lxml
et requests
. Vous devez également utiliser un terminal prenant en charge les sorties de couleur ANSI pour de meilleurs résultats. Des informations sur la façon de configurer cela dans Windows 10 peuvent être trouvées ici .
Ajoutez votre bot à un fichier dans un sous-répertoire du même répertoire que ruins.py
( ruins_bots
par défaut) et assurez-vous de l'ajouter from __main__ import Adventurer
en haut du module. Ceci est ajouté aux modules lorsque le scraper télécharge votre soumission, et bien qu'il soit définitivement hacky, c'est le moyen le plus simple de vous assurer que votre bot a correctement accès Adventurer
.
Tous les bots de ce répertoire seront chargés dynamiquement lors de l'exécution, donc aucune autre modification n'est nécessaire.
Tournoi
Le vainqueur final sera déterminé dans une série de jeux avec jusqu'à 10 bots dans chaque jeu. S'il y a plus de 10 soumissions au total, les 10 meilleurs bots seront déterminés en les partitionnant systématiquement en groupes de 10 jusqu'à ce que chaque bot ait joué (exactement) 20 parties. Les 10 meilleurs bots seront sélectionnés dans ce groupe avec des scores réinitialisés et joueront des jeux jusqu'à ce que le bot de première place ait atteint une avance de 50 points sur le bot de deuxième place ou jusqu'à ce que 500 jeux aient été joués.
Jusqu'à ce qu'il y ait au moins 10 soumissions, les emplacements vides seront remplis de "ivrognes" qui errent au hasard à travers les ruines et prennent (et parfois déposent) des trésors aléatoires jusqu'à ce qu'ils soient à court d'endurance et doivent se précipiter vers la sortie.
Les tournois seront renouvelés chaque semaine s'il y a de nouvelles soumissions. Il s'agit d'un défi ouvert KOTH sans date de fin définie.
Classement
À partir du 4 mai 2019 à 16 h 25 MDT: (2019-05-04 4:25 -6: 00)
Seed: K48XMESC
Bot Class | Score | Mean Score
--------------+---------+--------------
BountyHunter | 898 | 7.301
Scoundrel | 847 | 6.886
Accountant | 773 | 6.285
Ponderer | 730 | 5.935
Artyventurer | 707 | 5.748
PlanAhead | 698 | 5.675
Sprinter | 683 | 5.553
Accomodator | 661 | 5.374
Memorizer | 459 | 3.732
Backwards | 296 | 2.407
Mise à jour - 15 avril: quelques mises à jour / clarifications de règles
Mise à jour - 17 avril: interdiction de quelques cas marginaux notables d'actions néfastes telles que la modification du code d'autres bots.
Mise à jour - 4 mai: prime accordée à Sleafar pour avoir absolument détruit Backwards. Toutes nos félicitations!
la source
pip
installé et activéPATH
(ce qui est par défaut pour les installations plus récentes AFAIK), vous pouvez exécuterpip install modulename
à partir de Windows dans l'invite de commande. Pour d'autres circonstances (que je ne connais pas), allez dans pip , recherchez le module nécessaire et choisissez une option.Réponses:
Comptable
Le comptable est une personne très opposée au risque. Il aime être sûr que ce qu'il fait est vraiment la meilleure option dans la situation donnée. Ainsi, il se fixe un objectif et ne recueille un trésor que si ses calculs montrent que cela le place sur la bonne voie vers cet objectif. Cependant, il est très bureaucratique et n'aime pas laisser tomber des articles qu'il avait déjà décidé qu'il voulait; jusqu'à présent, toute tentative de lui apprendre à le faire a conduit le comptable à déposer un article, puis à le reprendre immédiatement après.
Peut-être à poursuivre.
la source
Accomodateur
Basé vaguement sur mon autre bot LightWeight. Là où le bot LightWeight était simple, ce bot est beaucoup plus complexe afin de s'adapter aux interactions avec d'autres bots: à la fois bénins et délibérément perturbateurs.
Ce bot sprintera d'abord vers une pièce assignée au hasard, puis tentera d'enchérir pour le meilleur trésor de rapport valeur / poids, s'il y a d'autres joueurs dans la salle, supposez qu'ils enchériront également à la place pour le deuxième meilleur trésor. Si cette enchère échoue, alors au tour suivant, enchérissez pour le prochain meilleur trésor.
Une fois que l'enchère a réussi, répétez l'enchère pour le meilleur / second meilleur jusqu'à ce qu'il n'y ait plus de trésors dans la salle, puis allez plus loin dans la ruine
Pour chaque pièce, entrez dans la ruine, répétez les enchères pour le meilleur / deuxième meilleur jusqu'à ce qu'il n'y ait plus de trésors dans la pièce, puis approfondissez la ruine ou si nous détectons que nous ne pouvons pas aller plus loin, passez à l'état `` Quitter '' et commencez à laisser tomber le pire trésor jusqu'à ce que nous pouvons garantir que nous pouvons sortir de la ruine en vie.
Lorsque nous sortirons, nous vérifierons si nous pouvons ajouter un trésor de 1 kg et le faire vivre, si c'est le cas, nous tenterons d'enchérir sur un trésor de 1 kg, sinon nous nous dirigerons vers la pièce précédente.
Ses performances sont assez variables ... mais sera normalement l'un des trois premiers bots.
la source
Sprinter
Semblable au plongeur, Sprinter va en profondeur et ramasse les meilleurs articles sur le chemin du retour.
Sprinter va en profondeur puis calcule un score pour chaque trésor et ramasse tout ce qui dépasse un certain seuil. Ce seuil dépend de la pièce dans laquelle il se trouve actuellement car cela coûte plus cher de prendre des objets dans des pièces plus profondes dans les ruines.
J'ai encore 2 optimisations concernant "la lutte pour le trésor" qui sont prévues pour les prochains jours.
17.04 .: Scoundrel est devenu trop intelligent, Sprinter a décidé de le pousser dans un piège au départ, je voulais tuer tout bot qui essayait d'invoquer Sprinter mais le testeur ne gère malheureusement pas les exceptions qui se produisent lors de l'init. Le prochain correctif pour Scoundrel est donc assez facile ...
la source
Planifier à l'avance
J'ai utilisé les meilleurs / les pires calculs de la réponse d' Artemis Fowl , mais la logique de choix est entièrement de ma propre conception et a depuis été modifiée pour inclure quelques facteurs supplémentaires, tels que les trésors vus dans les salles précédentes (afin de minimiser la collecte d'un trésor, seulement pour revenir en arrière, le laisser tomber et ramasser autre chose).
Le robot s'aventure aussi profondément qu'il le juge raisonnablement sûr (ce calcul équivaut à plonger à une profondeur spécifique, mais a la flexibilité de gérer d'autres valeurs d'endurance initiales), recueille des artefacts (priorisant les coûts élevés et le faible poids), puis commence à battre en retraite une fois qu'il détermine qu'il ne peut plus porter.
À la sortie, il ramassera tous les trésors supplémentaires qu'il verra déterminer qu'il peut toujours transporter en toute sécurité jusqu'à la sortie. Il laissera même tomber les artefacts déjà détenus si le nouveau est meilleur marché et n'entraînera pas l'épuisement. S'il a de la place dans son sac à dos, il ramassera le nouveau trésor avant de laisser tomber celui de qualité inférieure, minimisant les combats avec d'autres robots.
la source
__init__
fonction est déjà implémentée, vous n'avez pas besoin de la remplacer.Artyventurer
Beats the Drunkards d'environ 1000 $! Impossible de penser à un nom créatif, mais vous êtes tous ici:
Parfois, la plupart du code ici ne fait jamais rien (du moins lorsque je le teste contre Drunkards), le programme essaie juste de trouver le meilleur coup, y compris le traitement des situations dans lesquelles il essaie de ne pas se mettre. Certains ne peuvent jamais fonctionner, c'est juste là, donc je peux jouer avec les chiffres, qui peuvent probablement encore être améliorés.
Explication
if state.inventory ... worsti = None
Trouvez le «pire» article de l'inventaire, c'est-à-dire celui qui présente le rapport valeur / poids le plus faible. Il stocke
worsti
, qui contient son index, sa valeur et son poids, en tant que tuple, ouNone
s'il n'y a pas d'articles dans l'inventaire.if self.drop ... return 'drop', worsti[0]
Si je lui ai dit d'abandonner ce tour au dernier tour (voir ci-dessous), et qu'il le peut, laissez tomber le «pire» élément calculé ci-dessus.
extra = ... * state.room
Calculez combien d'endurance il lui resterait si je lui disais de retourner directement maintenant.
if extra > CONTINUE_IN:\ return 'next'
Si c'est plus que CONTINUE_IN, revenez
'next'
.if extra < 0 and worsti:\ return 'drop', worsti[0]
S'il est inférieur à
0
, supprimez le pire élément.if extra < state.room:\ return 'previous'
S'il est inférieur au nombre de chambres (ne peut plus transporter de trésor), revenez en arrière.
if state.treasures: ... bestt = None
Trouvez le meilleur trésor à prendre, semblable au pire article de l'inventaire ci-dessus. Conservez-le
bestt
.if extra > 0 and bestt: ... return 'take', bestt[0], bid
Avec les chiffres actuels, cela s'exécute chaque fois que nous sommes arrivés jusqu'ici et qu'il y a des trésors disponibles. S'il est sûr de prendre le «meilleur» trésor, il le fait. Son offre est le minimum, ou un de plus si quelqu'un est présent.
if bestt and worsti: ... return 'take', bestt[0], bid
Avec les nombres actuels, ce bloc de code ne s'exécutera jamais, car le bloc de code précédent a une condition plus large. Cela s'exécute si nous sommes arrivés jusqu'ici et qu'il y a des trésors dans mon inventaire et dans la chambre. Si le «meilleur» trésor de la pièce a plus de valeur que le «pire» trésor de mon inventaire, et qu'il serait prudent de les échanger au cours des deux tours suivants, il le fait.
return 'previous'
Si rien de tout cela ne se produit, revenez en arrière.
Mise à jour 16/04/19:
Mesures anti-scélérats. Cela deviendra une guerre d'enchères :(
Nouvelle mise à jour 16/04/19:
Inversé précédent, au lieu de cela, il commute au hasard tous les autres éléments lors de la recherche du meilleur, par exemple.
[1, 2, 3, 4, 5, 6] → [2, 1, 3, 4, 6, 5]
. Cela devrait être plus difficile à copier :).Mise à jour 17/04/19:
Revenu précédent, il efface plutôt son propre code source . Il fait cela dans
__init__
lequel sera toujours avantScoundrel.enter_ruins
, et empêchera donc Scoundrel de le charger. Il remplace son code lors deget_action
son premier appel, afin qu'il soit prêt pour la prochaine fois. CORRIGÉ, Scoundrel meurt maintenant à son arrivée.Nouvelle mise à jour 17/04/19:
Revenu précédent, il remplace à la place son
sys.modules
entrée par le module mathématique, de sorte que lorsque Scoundrel tente de le charger, il charge le module mathématique à la place. :)De plus, je viens juste de réaliser que l'endurance du mouvement était de 10 + poids / 5 , j'ai donc essayé de résoudre ce problème.
Nouvelle mise à jour 17/04/19:
Inclut désormais l'ail des deux mises à jour précédentes.
Mise à jour 18/04/19:
Jouant avec des chiffres et des calculs, obtient maintenant 2000 $ - 3000 $.
Nouvelle mise à jour 18/04/19:
Suppression de l'ail effacé des fichiers car il a été interdit, ajout d'un nouvel ail qui garantit qu'il
'draco'
n'est pas responsable de son fonctionnement, s'il l'est, il revient justeprevious
à son premier tour. Les résultats ont pris une plongée mystérieuse à 1200 $ - 1800 $, que j'examine.la source
Le scélérat
Le Scoundrel travaille principalement pour interférer avec les autres concurrents. Actuellement, il interfère avec Sprinter, Artyventurer et Accountant (cette liste s'allongera avec le temps à condition qu'elle soit dans le meilleur intérêt du Scoundrel). Il le fait en imitant les autres robots, puis en surenchérissant, en sous-coupant ou en se battant pour des reliques. En tant que tel, il est peu probable que cette entrée domine jamais le classement et opère plutôt comme une force de détérioration. La révision en cours au moment de cette publication le place à la 2e place avec un score moyen d'environ 7.
Scoundrel déjoue les tentatives des autres bots de se modifier pour se défendre contre le Scoundrel en exécutant directement le code des autres participants comme une copie de clone indiscernable. Les problèmes d'importations entraînant la duplication des entrants ont été résolus en créant les clones via Reflection (les guerres d'édition impliquant des détails fins de la détermination mathématique ne sont pas souhaitables du point de vue de l'échange de pile, mais aboutiraient au même résultat). Les défis KOTH ont également permis cela.
Scoundrel remplace les Teamsters afin de garder les Teamsters pour avoir été intéressants. Après cette modification, les Teamsters ne devraient plus être grattés par le contrôleur.
Mise à jour 17/04/2019: nouvelles contre-mesures.
Les Teamsters (rendus illégaux)
Mais n'hésitez pas à courir localement où il n'y a pas plus de 8 autres concurrents!
Cette entrée (bien que maintenant explicitement invalide) est, en fait, deux bots, et le contrôleur se fera un plaisir de les gratter tous les deux et de les ajouter à la liste des candidats (car hourra Python?)
La phase 1:
1. S'il n'y a pas de trésor pesant moins de 3 sur un étage, il descend
2. Comme il est à peu près assuré d'être le dernier aventurier à revenir à la surface, tout ce qu'il a à faire est de trouver quelqu'un.
Phase 2:
Le nom des trésors a été utile pour aider la logique à ne pas se charger sur les ordures du 25e étage et à partir tôt car il n'y avait aucun moyen de communiquer entre les deux robots (et TeamsterA se retrouverait toujours dans une pièce avec quelqu'un d'autre avant TeamsterB était revenu).
La prochaine conclusion logique: créer une armée
En théorie, cela pourrait être utilisé pour sonder les profondeurs et acquérir des trésors aussi profonds que la salle 98, cependant, car cela nécessiterait plus de 2 bots, la logique comprenant ces bots deviendrait de plus en plus complexe, et comme je suis certain que c'est une soumission illégale pour violation d'une règle non écrite, donc je ne vais pas m'embêter.
A
Attend effectivement à 30,B
attend à 50 ...n
plonge à 98, ramasse un trésor, se déplace à 97, le dépose (puis meurt), len-1
ramasse et se déplace à 96 ... leC
dépose (meurt), leB
ramasse en haut et passe à 30, le laisse tomber (meurt), leA
ramasse et revient à la sortie.J'estime que cela prendrait 11 bots.
Cependant, cela ne vaut la peine que si vous pouvez récupérer environ 4 trésors de cette profondeur afin de rivaliser avec des entrées comme PlanAhead ou Artyventure, en raison de l'échelle entre les coûts d'endurance à déplacer et la valeur moyenne des trésors.
Exemples de résultats
Score rarement moins de 4000 $, parfois des emblèmes de 6000 $.
la source
En arrière
Parce qu'il fonctionne à l'envers
Pourquoi est-il appelé Backwards?
Parce que j'ai pris le comptable et essayé de lui faire exécuter sa logique de telle sorte qu'il plongerait profondément, puis ramasser son butin préféré à la sortie (à l'arrière du comptable).
En fin de compte, il recueille encore une grande partie de ses prix en cours de route (les ramassant avant les chercheurs traditionnels en collecte, fonctionnant à l'envers pour tout le monde), mais il est beaucoup plus sélectif quant à ceux qu'il prend, bien qu'il reste ramasse des choses sur son chemin de retour.
Le résultat final est que l'endurance est conservée en cours de route tout en priorisant les trésors de grande valeur, puis en profitant d'un virage en profondeur et de sélections faciles sur le chemin du retour. Backwards est connu pour collecter des trésors aussi loin que la salle 41 (et pendant le développement entrerait, puis quitterait immédiatement la salle 42).
la source
Chasseur de primes
La méthode simple est la meilleure. Saisissez des trésors précieux et légers tout en allant le plus loin possible. Récupérez des trésors moins précieux au retour.
la source
Poids léger
Un bot simple qui fonctionne encore assez bien.
Après s'être aventuré dans les ruines (actuellement 21 chambres), il récupérera le meilleur trésor de la pièce qui ne fait que 1 kg (d'où le nom du bot) et qui a plus de valeur que le trésor le moins précieux de l'inventaire. Si l'inventaire est plein, laissez tomber le trésor le moins précieux. Si aucune autre action n'est sélectionnée, déplacez-vous dans les ruines. Si nous sommes à la limite de notre endurance pour pouvoir sortir vivants alors dirigez-vous vers la sortie
la source
dumping
laenter_ruins
méthode. Cela se souviendra en fait entre les jeux et ne fonctionnera pas sur le jeu 2. Techniquement non autorisé, mais j'ai ajouté la règle tout à l'heure (je l'ai oubliée auparavant mais c'était mon intention), donc je vais perdre du temps. : PMemorizer
Je peux soumettre des bots à mon propre KotH, non?
Ce robot plonge dans la salle 30 et se souvient de tous les trésors qu'il a vus. À ce moment-là, il commence son voyage vers l'entrée, essayant de prendre de bons trésors dont il se souvenait avoir vu dans les salles précédentes.
J'espérais que ça ferait mieux. Les améliorations possibles peuvent provenir d'une meilleure planification et d'une plus grande dynamique dans quelle pièce il arrête de plonger et d'être plus disposé à explorer les options de sauvegarde.
Mise à jour: récupère désormais 1 kg de trésors d'une valeur de 60 $ ou plus en chemin.
la source
[Turn 072] Ryu Ridley (Memorizer) collapsed in the doorway to room #1 and died of exhaustion
Méditer
Je pense qu'il est assez similaire à Memorizer en ce qu'il utilise la connaissance des pièces visitées pour choisir les pièces et les trésors à collecter sur le chemin du retour à la sortie, mais il a été dérivé indépendamment.
Ce bot sprinte jusqu'à une pièce profonde aléatoire prenant un record des trésors trouvés le long du chemin. Une fois dans la salle cible, il réfléchira ensuite à la sélection idéale de trésors à ramener à la sortie. À chaque tour, il réfléchira nouveau pour déterminer la meilleure sélection de trésors à prendre.
Actuellement, il existe un algorithme simple (puissance inverse du numéro de la pièce) qui donne le nombre supposé de trésors pris (ou aura été pris lors de la visite de ce bot) pour chaque pièce et donc ces trésors sont ignorés lors de la réflexion sur les trésors / chambres à prendre. J'ai des idées pour d'autres algorithmes plus avancés pour modéliser les trésors qui restent. Mais je devrai voir si l'avantage en vaut la peine.
la source
Hoarder
Le thésauriseur reste dans une pièce jusqu'à ce qu'il ait pris tous les trésors de la pièce (ou calcule qu'il n'a pas assez d'endurance pour continuer à prendre / bouger). Lorsque tous les trésors ont disparu, si le bot peut continuer à avancer en toute sécurité, il le fera et continuera le processus de prise de tout le trésor.
la source
Backwards
la stratégie deSprinter
«s» , «etMemorizer
» fonctionne; parce qu'ils savent quelles sont les valeurs relatives de chaque trésor qu'ils voient.Plongeur
(Je ne peux pas tester pour le moment, alors faites-moi savoir si cela est cassé.)
Le meilleur trésor est plus profond dans les ruines, alors plongez profondément, puis prenez ce que nous pouvons en sortant.
la source
diving
défini?Jacob the Orphan (Diver) was sliced in half by a swinging blade trap.
Je ne sais pas ce que vous avez fait de mal, mais cela signifie «retour invalide» AFAIK.