KOTH asymétrique: Attrapez le chat
MISE À JOUR : Les fichiers gist sont mis à jour (y compris les nouvelles submisisons) car Controller.java n'a pas détecté d'exceptions (seulement des erreurs). Il détecte désormais les erreurs et exceptions et les imprime également.
Ce défi consiste en deux threads, c'est le thread cat, le thread catcher peut être trouvé ici .
Le contrôleur peut être téléchargé ici .
Il s'agit d'un KOTH asymétrique: chaque soumission est soit un chat, soit un receveur . Il y a des jeux entre chaque paire de chacun un chat et un receveur. Les chats et les attrapeurs ont des classements séparés.
Catcher
Il y a un chat sur une grille hexagonale. Votre tâche consiste à l'attraper le plus rapidement possible. À chaque tour, vous pouvez placer un seau d'eau sur une cellule de la grille afin d'empêcher le chat d'y aller. Mais le chat n'est pas (peut-être) aussi stupide, et chaque fois que vous placez un seau, le chat se déplace vers une autre cellule de la grille. La grille étant hexagonale, le chat peut aller dans 6 directions différentes. Votre objectif est d'entourer le chat de seaux d'eau, le plus vite sera le mieux.
Chat
Vous savez que le receveur veut vous attraper en plaçant des seaux d'eau autour de vous. Bien sûr, vous essayez de vous soustraire, mais comme vous êtes un chat paresseux (comme les chats), vous faites exactement un pas à la fois. Cela signifie que vous ne pouvez pas rester au même endroit que vous, mais vous devez vous déplacer vers l'un des six endroits environnants. Chaque fois que vous voyez que le receveur a placé un nouveau seau d'eau, vous allez dans une autre cellule. Bien sûr, vous essayez d'éviter le plus longtemps possible.
la grille
La grille est hexagonale, mais comme nous n'avons pas de structures de données hexagonales, nous prenons un 11 x 11
tableau carré 2d et imitons le `` comportement '' hexagonal que le chat ne peut déplacer que dans 6 directions:
La topologie est toroïdale, ce qui signifie que si vous marchez sur une cellule «à l'extérieur» de la matrice, vous serez simplement transféré vers la cellule correspondante de l'autre côté de la matrice.
Jeu
Le chat commence à une position donnée dans la grille. Le receveur peut effectuer le premier mouvement, puis le chat et son receveur alternent les mouvements jusqu'à ce que le chat soit attrapé. Le nombre de pas est le score de ce match. Le chat essaie d'obtenir un score aussi élevé que possible, le receveur essaie d'obtenir un score aussi bas que possible. La somme moyenne de tous les jeux auxquels vous avez participé sera le score de votre soumission. Il y a deux classements distincts, un pour le chat, un pour les attrapeurs.
Manette
Le contrôleur donné est écrit en Java. En tant que receveur ou chat, vous devez chacun implémenter une classe Java (il existe déjà quelques exemples primitifs) et la placer dans le players
package (et mettre à jour la liste des chats / catchers dans la classe Controller), mais vous pouvez également écrire fonctions supplémentaires au sein de cette classe. Le contrôleur est livré avec chacun deux exemples pratiques de classes simples chats / catcher.
Le champ est un tableau 11 x 11
2D int
qui stocke les valeurs des états actuels des cellules. Si une cellule est vide, elle a de la valeur 0
, s'il y a un chat, elle a de la valeur -1
et s'il y a un seau, il y en a un 1
.
Il y a quelques fonctions données que vous pouvez utiliser: isValidMove()
/ isValidPosition()
sont pour vérifier si votre mouvement (chat) / position (receveur) est valide.
Chaque fois que c'est votre tour, votre fonction takeTurn()
est appelée. L'argument contient une copie de la grille actuelle et des méthodes telles read(i,j)
que la lecture de la cellule (i,j)
, ainsi isValidMove()/ isValidPosition()
que la vérification de la validité de votre réponse. Cela gère également le recouvrement de la topologie toroïdale, ce qui signifie que même si la grille n'est que de 11 x 11, vous pouvez toujours accéder à la cellule (-5,13).
La méthode doit renvoyer un int
tableau de deux éléments, qui représentent des mouvements possibles. Pour les chats, ce sont ceux {-1,1},{0,1},{-1,0},{1,0},{0,-1},{1,-1}
qui représentent la position relative de l'endroit où le chat veut aller, et les capteurs renvoient les coordonnées absolues de l'endroit où ils veulent placer un seau {i,j}
.
Si votre méthode produit un mouvement invalide, votre soumission sera disqualifiée. Le déplacement est considéré comme invalide, si à votre destination est déjà un seau ou le déplacement n'est pas autorisé / destination déjà occupée (comme un chat), ou s'il y a déjà un seau / chat (comme un receveur). Vous pouvez vérifier cela à l'avance avec les fonctions données.
Votre soumission devrait fonctionner assez rapidement. Si votre méthode dure plus de 200 ms pour chaque étape, elle sera également disqualifiée. (De préférence beaucoup moins ...)
Les programmes sont autorisés à stocker des informations entre les étapes.
Soumissions
- Vous pouvez faire autant de soumissions que vous le souhaitez.
- Veuillez ne pas modifier de manière significative les soumissions que vous avez déjà soumises.
- Veuillez chaque soumission dans une nouvelle réponse.
- Chaque soumission doit de préférence avoir son nom unique.
- La soumission doit comprendre le code de votre classe ainsi qu'une description qui nous indique comment fonctionne votre soumission.
- Vous pouvez écrire la ligne
<!-- language: lang-java -->
avant votre code source afin d'obtenir une coloration syntaxique automatique.
Notation
Tous les chats rivaliseront avec tous les attrapeurs le même nombre de fois. J'essaierai de mettre à jour fréquemment les scores actuels, les gagnants seront déterminés lorsque l'activité aura diminué.
Ce défi est inspiré de ce vieux jeu flash
Merci @PhiNotPi pour les tests et les commentaires constructifs.
Scores actuels (100 matchs par paire)
Name Score Rank Author
RandCatcher 191962 8 flawr
StupidFill 212688 9 flawr
Achilles 77214 6 The E
Agamemnon 74896 5 The E
CloseCatcher 54776 4 randomra
ForwordCatcher 93814 7 MegaTom
Dijkstra 47558 2 TheNumberOne
HexCatcher 48644 3 randomra
ChoiceCatcher 43834 1 randomra
RandCat 77490 9 flawr
StupidRightCat 81566 6 flawr
SpiralCat 93384 5 CoolGuy
StraightCat 80930 7 CoolGuy
FreeCat 106294 3 randomra
RabidCat 78616 8 cain
Dijkstra's Cat 115094 1 TheNumberOne
MaxCat 98400 4 Manu
ChoiceCat 113612 2 randomra
main.Controller
, d'appelergetCatchers()
et de simuler / saboter les réponses des attrapeurs via leurstakeTurn
méthodes?Réponses:
FreeCat
Choisit le mouvement qui lui donnerait le plus de chemins possibles après 3 étapes si le champ ne changeait pas.
FreeCat vs Achilles:
la source
Le chat de Dijkstra
Il a appris et applique l'algorithme maître de son maître. Notez qu'il dépend de certaines des méthodes de sa classe de receveur correspondante.
Cat vs Hexcatcher de Dijkstra (besoins mis à jour):
Comment il travaille:
Il essaie de trouver le mouvement qui minimise la rigidité de la planche par rapport à lui-même. Pour plus d'informations, consultez l'article correspondant du receveur.
Avec mise à jour:
Il évite désormais les formes géométriques étranges que les seaux d'eau forment parfois.
la source
MaxCat
J'ai essayé d'implémenter l'algorithme Minimax. Cependant, il ne fonctionne pas très bien en raison du temps limité. Edit: Il utilise maintenant le multithreading, mais (au moins sur mon ordinateur), je ne peux pas régler la profondeur plus haut. Sinon, un délai d'attente se produit. En utilisant un PC avec 6 cœurs ou plus, cette soumission serait bien meilleure :)
MaxCat vs Dijkstra:
la source
Field
public. Je suis désolé de ne pas avoir encore mis à jour les fichiers, mais nous en avons discuté plus tôt!SpiralCat
Bouge en spirale. Il
SpiralCat vs Agamemnon:
la source
turns[i]
pourturns[i%6]
éviter les limites (ce qui ne devrait PAS se produire dans cette estimation).turns[i%6]
? Je veux dire,takeTurn
ne sera pas appelé si le chat est bloqué, non?i>=6
ne devrait jamais arriver.RabidCat
RabidCat souffre d'hydrophobie, il a donc peur des seaux d'eau. Il trouve le plus proche et court dans la direction opposée.
RabidCat vs ForwordCatcher:
la source
ChoiceCat
Pour chaque nouvelle position de chat possible, nous vérifions sa qualité et choisissons la meilleure. La bonté est la fonction des deux meilleures cellules voisines qui sont plus éloignées de la position du chat que la position dont nous calculons le score. Nous n'utilisons que deux cellules car une peut être bloquée et le chat n'a besoin que d'une autre pour s'enfuir. Notre fonction préfère deux cellules plutôt bonnes qu'une grande et une mauvaise. Les positions avec des seaux ont un score de 0 et les cellules libres les plus éloignées ont un score de 1.
ChoiceCat semble mieux marquer que les chats actuels.
ChoiceCat vs ChoiceCatcher:
la source
StupidRightCat
Cela a été fait juste pour tester le contrôleur. Le chat se déplace à droite autant que possible, sinon se déplace dans une direction aléatoire.
la source
RandCat
Cela a été fait juste pour tester le contrôleur. Le chat se déplace simplement au hasard.
la source
StraightCat
Ce chat se déplace tout droit.
Au début, il choisit une direction aléatoire et continue de se déplacer dans cette direction jusqu'à ce qu'il ne puisse pas dans ce cas, il déplace la direction dans le sens des aiguilles d'une montre vers la prochaine direction valide et répète ce processus.
StraightCat vs Agamemnon:
la source