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 les exceptions et les imprime également.
Ce défi consiste en deux threads, c'est le thread catcher, le thread cat 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 de pouvoir s'y rendre. 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 191674 8 flawr
StupidFill 214246 9 flawr
Achilles 76820 6 The E
Agamemnon 74844 5 The E
CloseCatcher 54920 4 randomra
ForwordCatcher 94246 7 MegaTom
Dijkstra 46500 2 TheNumberOne
HexCatcher 48832 3 randomra
ChoiceCatcher 43828 1 randomra
RandCat 77928 7 flawr
StupidRightCat 81794 6 flawr
SpiralCat 93868 5 CoolGuy
StraightCat 82452 9 CoolGuy
FreeCat 106304 3 randomra
RabidCat 77770 8 cain
Dijkstra's Cat 114670 1 TheNumberOne
MaxCat 97768 4 Manu
ChoiceCat 113356 2 randomra
PRINT_STEPS = true
des paramètres plus détaillés dans le fichierMyFrame.java
). Ensuite, j'ai enregistré cela avec LICEcap et l' ai édité avec GIMP . Si vous avez d'autres questions, n'hésitez pas!Réponses:
Achille
Achille n'est pas trop brillant mais il est impitoyablement efficace. D'abord, il empêche le chat d'utiliser l'enveloppe autour de la planche, puis il divise la planche en deux. Ensuite, il continue de diviser la partie de la planche dans laquelle le chat est en deux jusqu'à ce que le chat soit piégé.
Démonstration RandCat vs Achilles
la source
Agamemnon
Agamemnon divise la zone du chat en deux avec une ligne verticale jusqu'à ce que le chat n'ait qu'une bande de largeur 2 pour se déplacer, à quel point il piège le chat.
Agamemnon vs RandCat:
Ce receveur fait toujours mieux qu'Achille et je pense qu'il est suffisamment différent pour justifier une nouvelle réponse.
la source
HexCatcher
Si le receveur peut mettre le chat à l'intérieur d'un grand hexagone avec 3 unités de côtés où les coins de l'hexagone sont déjà occupés par des seaux, le receveur peut garder le chat dans cette zone et l'attraper. L'hexagone ressemble à ceci:
C'est ce que HexCatcher essaie de réaliser. Il tuile mentalement le champ avec ces gros hexagones de manière à ce que chaque cellule d'angle fasse partie de 3 gros hexagones.
S'il y a une chance de garder le chat dans la zone actuelle en connectant deux coins à côté du chat, le bot le fera. (Par exemple, dans l'image si le chat est à 7,5, nous choisissons 7,6 même si seules les cellules 6,6 et 8,5 sont encore occupées.)
Si le précédent n'est pas une option, nous choisissons de jouer un coin qui fait partie de la zone où se trouve le chat. Si tous ces coins sont déjà choisis (comme dans l'image), nous choisissons une cellule à côté du chat.
Plusieurs petites améliorations sont possibles, telles que la meilleure gestion de l'enroulement (le carrelage se casse là-bas) ou l'exécution optimale des derniers mouvements de couple. Je pourrais en faire certaines. Si ce n'est pas permis, je vais juste l'ajouter (hors compétition) pour les intéressés.
DijkstrasCat vs HexCatcher:
la source
CloseCatcher
Choisit l'une des positions où le chat pourrait passer à l'étape suivante. Il choisit celui qui donnerait le plus de chemins possibles après 3 étapes au chat s'il se déplaçait là et que le champ ne changeait pas.
Le code est presque identique à mon entrée Cat, FreeCat , qui choisit la direction de manière très similaire.
SpiralCat vs CloseCatcher:
la source
Dijkstra
Il n'aime pas beaucoup les chats (:
v{ >
FreeCat vs Dijkstra
(besoins mis à jour):Comment il essaie d'attraper le chat:
Il analyse tous les carrés du tableau et essaie de trouver le carré qui minimise l'ouverture du tableau et maximise l'étendue du tableau; par rapport au chat. L'ouverture et la rigidité d'une planche sont calculées à l'aide d'une modification de son célèbre algorithme .
Ouverture:
L'ouverture d'un tableau par rapport à une position est le nombre de positions accessibles depuis cette position.
Stringiness:
La rigidité d'une planche par rapport à une position est la somme des distances entre les positions accessibles et la position.
Avec la dernière mise à jour:
Maintenant, il est bien meilleur pour attraper
FreeCat et son propre chattous les chats.Malheureusement, il est également bien pire pour attraper les chats fous et non coopératifs. Il pourrait être amélioré en détectant si le chat est l'un des fous et en agissant ensuite comme CloseCatcher.Bug réparé.
la source
error: cannot infer type arguments for PriorityQueue<>
sur cette lignePriorityQueue<int[]> open = new PriorityQueue<>(new Comparator<int[]>() {
.int[]
entre les deux diamants vides aprèsPriorityQueue
.ForwordCatcher
Place un seau devant le chat, ou si cela est pris, place derrière.
RabidCat vs ForwordCatcher:
la source
ChoiceCatcher
Utilise le même mécanisme de notation que mon entrée ChoiceCat . Il y a une petite modification qui aide à choisir les cellules pertinentes lors des premières étapes car ChoiceCat ne se soucie pas des premiers compartiments car il ne les considère pas comme une menace.
ChoiceCatcher semble marquer considérablement mieux que les capteurs actuels.
ChoiceCat vs ChoiceCatcher:
la source
RandCatcher
Cela a été fait juste pour tester le contrôleur et place juste au hasard les seaux (très inefficacement).
la source
StupidFillCatcher
Cela a été fait juste pour tester le contrôleur. Il remplit juste colonne par colonne jusqu'à ce que le chat soit attrapé.
la source