Vous êtes un globe de boue. Naturellement, étant visqueux, vous voulez suinter le plus de surface possible. Mais il y a 3 autres slimes qui veulent faire exactement la même chose. Qui sera le slime supérieur?
La description
Tous les slimes seront rassemblés dans une arène. Les juges (c'est-à-dire le programme de contrôle) passeront en revue une liste exhaustive de toutes les combinaisons possibles de 4 slimes, les placeront aux coins d'une table et observeront pour voir quel slime suinte sur la plus grande surface.
Vos slimes peuvent effectuer l'une des 3 actions à chaque tour: étaler, sauter ou fusionner. Une description plus détaillée de leur signification sera fournie dans la section Résultats .
Board / Arena
L'arène sera un plateau carré (actuellement 8x8, mais cela pourrait changer à l'avenir). Voici un exemple d'arène d'un jeu en cours:
11111222
11111444
11.22444
.1222.4.
333.3244
33333.44
333...44
333....4
Slime est représenté par les nombres 1 à 4 (joueurs 1 à 4), et l'espace vide est représenté par un point ( .
). Initialement, le plateau commence comme tout espace vide à l'exception d'une seule unité de slime du joueur 1 dans le coin supérieur gauche, du joueur 2 en haut à droite, du joueur 3 en bas à gauche et du joueur 4 en bas à droite.
Les coordonnées sont représentées par un index de ligne et de colonne basé sur 0, pour plus de lisibilité dans le code. Par exemple, les coordonnées (3, 6) représentent le 7e carré de la 4e ligne (dans l'exemple ci-dessus, a 4
). (Cela facilite l'accès aux carrés:. board[coords.x][coords.y]
) Voici une illustration visuelle:
(0, 0) (0, 1) (0, 2)
(1, 0) (1, 1) (1, 2)
(2, 0) (2, 1) (2, 2)
Contribution
L'entrée de votre programme sera le joueur que vous êtes (1, 2, 3 ou 4), une virgule ( ,
), puis le contenu du plateau / de l'arène (avec les nouvelles lignes remplacées par des virgules). Par exemple, si vous étiez le joueur 3 dans le scénario ci-dessus, votre entrée serait:
3,11111222,11111444,11.22444,.1222.4.,333.3244,33333.44,333...44,333....4
Production
Votre programme doit produire 4 entiers. Les deux premiers sont respectivement l'index de ligne et de colonne du slime que vous souhaitez déplacer, et les deux suivants sont l'index de ligne et de colonne de l'endroit où vous souhaitez les déplacer.
Vous avez trois choix à chaque tour: étaler, sauter ou fusionner.
Propager
Pour se propager, les coordonnées cibles doivent être exactement à un carré de la boue déplacée, et le carré aux coordonnées cibles doit être un espace vide. Lors de l'étalement, un nouveau slime est créé aux coordonnées cibles et l'ancien slime n'est pas supprimé. Une fois le nouveau slime créé, tous les slimes ennemis dans les 8 cases autour de ce nouveau slime sont convertis en joueur qui s'est déplacé.
Par exemple, avec le plateau de la figure 1, si le joueur 1 devait sortir
0 1 1 2
, le résultat serait le plateau de la figure 2.1. 2. 11.22 11.12 1..22 1.112 ..22. ..11. ..... .....
Sauter
Pour sauter, les coordonnées cibles doivent être exactement à deux carrés du slime déplacé, et le carré aux coordonnées cibles doit être un espace vide. Lors du jupming, un nouveau slime est créé aux coordonnées cibles et l'ancien slime est supprimé. Une fois le nouveau slime créé, tous les slimes ennemis dans les 8 cases autour de ce nouveau slime sont convertis en joueur qui s'est déplacé.
Par exemple, avec le plateau de la figure 1, si le joueur 1 devait sortir
0 1 2 3
, le résultat serait le plateau de la figure 2.1. 2. 11..2 1...2 1...2 1...1 ....2 ...11 ...22 ...11
Fusionner
Pour fusionner, les coordonnées cibles doivent être exactement à une case du slime déplacé, et le carré aux coordonnées cibles doit être le slime du même joueur. Lors de la fusion, l'ancien slime est supprimé. Ensuite, tous les espaces vides dans les 8 cases autour de la boue cible sont convertis en joueur qui s'est déplacé (sans compter l'ancienne boue déplacée).
Par exemple, avec le plateau de la figure 1, si le joueur 1 devait sortir
0 1 1 2
, le résultat serait le plateau de la figure 2.1. 2. 11..2 1.112 1.1.2 11112 ....2 .1112 ..222 ..222
Vous pouvez également passer, en sortant simplement des coordonnées invalides (ex. 0 0 0 0
).
Règles et contraintes
Les règles supplémentaires sont les suivantes:
- Vous pouvez lire et écrire des fichiers dans votre propre dossier afin de conserver les données (les soumissions seront stockées dans
players/YourBotName/yourBotName.language
), mais vous ne pouvez pas modifier ou accéder à autre chose en dehors de celui-ci. L'accès à Internet est interdit. - Votre soumission peut ne pas être codée spécifiquement pour aider ou blesser une autre soumission. (Vous pouvez avoir plusieurs soumissions, mais elles ne doivent en aucun cas interagir spécifiquement les unes avec les autres.)
- Votre soumission ne doit pas prendre plus de 0,1 seconde par tour. Si votre soumission prend parfois 0,105 seconde, ce n'est pas grave, mais cela peut ne pas prendre systématiquement beaucoup plus de temps que ce délai. (Il s'agit principalement d'un test de santé mentale pour éviter que les tests ne prennent trop de temps.)
- Votre soumission ne doit pas être un double exact (c'est-à-dire utiliser exactement la même logique) d'une autre, même si elle est dans une langue différente.
- Votre soumission doit être sérieuse. Ceci est basé sur l'opinion, mais si votre soumission n'essaye clairement pas de résoudre le défi (ex. Si vous passez chaque tour), elle sera disqualifiée.
Si votre soumission enfreint l'une de ces règles ou ne respecte pas les spécifications, elle sera disqualifiée, supprimée de playerlist.txt
et le jeu redémarrera depuis le début. Si votre soumission est disqualifiée, je laisserai un commentaire sur votre message expliquant pourquoi. Sinon, votre soumission sera ajoutée au classement. (Si vous ne voyez pas votre soumission dans le classement, que vous n'avez pas de commentaire explicatif sur votre message et que vous avez posté votre soumission avant l'heure "Dernière mise à jour" ci-dessous, dites-le-moi! Je l'ai peut-être négligée par inadvertance.)
Dans votre entrée, veuillez inclure:
- Un nom.
- Une commande shell pour exécuter votre programme (par exemple,
java MyBot.java
,ruby MyBot.rb
,python3 MyBot.py
, etc.).- Notez que l'entrée (votre lecteur et votre carte) sera ajoutée à cela comme argument de ligne de commande.
- Les programmes seront testés sur Ubuntu 14.04, alors assurez-vous que votre code peut y être exécuté (librement).
- Un numéro de version, si votre code fonctionne différemment sur différentes versions de votre langue.
- Le code de votre bot.
- Des instructions sur la façon de compiler le code, si nécessaire.
Code / test du contrôleur, exemple de bot
Le code du contrôleur est écrit en C ++ et peut être trouvé sur Github . Vous trouverez des instructions supplémentaires sur la façon d'exécuter et de tester votre code.
simplebot.rb
, un bot très simple qui propage ou saute un slime aléatoire à un endroit aléatoire à chaque tour, est également publié sur Github .
Score et classement
Lorsque toutes les cases du plateau sont remplies, la partie se termine et les scores sont calculés. Le score final d'un joueur est le nombre de cases qui contiennent leur vase à la fin de la partie. Si 2000 tours se sont écoulés (500 pour chaque joueur) et que la partie n'est toujours pas terminée, la partie se terminera quand même et les scores seront rapportés comme si la partie était terminée.
À la fin du tournoi, les scores de tous les matchs seront calculés en moyenne pour calculer le score final de chaque joueur, qui sera affiché dans le classement. Il n'y a pas de date limite de soumission; Je continuerai de mettre à jour le classement régulièrement à mesure que de nouvelles soumissions arrivent.
4 soumissions sont requises jusqu'à ce qu'un véritable classement apparaisse.
+--------------------------+-----------+--------------------+
| Name | Avg Score | Last Updated (UTC) |
+--------------------------+-----------+--------------------+
| GreedySlime | 47.000 | Jul 22 10:27 PM |
| Jumper | 12.000 | Jul 22 10:27 PM |
| ShallowBlue | 5.000 | Jul 22 10:27 PM |
| Lichen | 0.000 | Jul 22 10:27 PM |
+--------------------------+-----------+--------------------+
Dernière mise à jour: 22 juillet 22h27 (UTC).
la source
Réponses:
GreedySlime
Effectue simplement le mouvement qui produit le plus grand gain net d'unités de boue.
Notez que ceci est écrit en Python 2.x .
Exemple d'exécution (en utilisant l'exemple donné dans la description du défi et en supposant que le code est enregistré dans un fichier appelé
slime.py
):la source
Bleu peu profond
Shallow blue essaie de comprendre ce qui pourrait arriver à l'avenir en effectuant une recherche
exhaustive dans lesarbres des mouvements possibles, malheureusement, il ne va pas plus loin que son prochain tour. Il gifle ensuite un score à demi-cul sur chaque plateau possible après son prochain tour, calcule un score pour chaque branche individuelle avec une formule tout aussi ridicule et: le tour est joué!EDIT: Le code d'origine a été exécuté trop lentement, je l'ai donc modifié pour qu'il ne prenne qu'un échantillon aléatoire de tous les mouvements possibles. Il essaiera presque tous les coups quand il y a peu de coups possibles et un pourcentage plus petit quand il y a plus de coups possibles.
la source
Sauteur
Aime sauter, encore plus vers le milieu.
Passera si aucune boue ne peut sauter.
C ++ , devrait compiler simplement avec
g++ jumper.cpp -o jumper
J'ai volé votre vérification de déménagement désolée. J'ai aussi abandonné les bonnes pratiques de codage juste après avoir commencé, alors ne regardez pas. Cependant, il semble fonctionner sur n'importe quelle taille de carte.
la source
DeathSlime :
Description : Tente de chasser l'ennemi le plus faible et de le détruire. Répéter.
Comment exécuter : ruby DeathSlime.rb
Version Ruby : 2.1.2
la source
Lichen
Il s'agit d'un bot écrit en R. Il doit être déclenché à l'aide de
Rscript Lichen.R
.L'algorithme prévu est qu'il essaie de couvrir une zone rectangulaire (en remplissant le blanc à l'aide
spread
). Lorsque le rectangle est terminé, ilmerges
les deux boues à l'un de ses coins (celui le plus éloigné du coin de la planche) pour agrandir la zone "habitable", puis remplir ce rectangle nouvellement défini, etc. Il n'utilise pasjump
.Si un ennemi se trouve dans la zone habitable et qu'il y a également un espace vide dans la zone, il remplit l'espace vide à côté de lui. Si la boue qui doit être fusionnée lors de l'expansion de la zone habitable est entourée d'ennemis, alors une boue va juste
spread
au lieu de celle-ci fusionner.la source
0 0 0 0
quand il n'y a plus de vase à bord.CornerSlime
Ce slime a une notion de coins, ou du moins quand je l'ai écrit pour la première fois en C #, je ne suis plus vraiment sûr.
Écrit en C ++, probablement compilera très bien avec gcc et pratiquement aucun argument; j'espère que je n'ai rien utilisé de spécifique à MSVC par accident.
Testé exclusivement contre lui-même sur un serveur modifié (pas de nouveau compilateur C ++ sophistiqué où je suis) donc je n'ai aucune idée de comment il fonctionnera, espérons qu'il ne sera pas disqualifié pour être trop lent. Il n'y a actuellement aucun hasard dans ce bot, mais je peux en ajouter plus tard.
C'est C # porté en C ++ (en raison de problèmes de vitesse) par quelqu'un qui ne connaît pas vraiment le C ++, et c'est horrible. Il commence par construire un tableau de cellules, qu'il remplit ensuite de toutes sortes d'informations inutiles sur les cellules qui l'entourent (nombre de mes cellules, nombre de mes slimes, ce genre de choses). Il utilise ensuite ces informations pour décider s'il doit examiner de plus près les informations qu'il a utilisées pour créer ces informations, puis utilise éventuellement ces informations pour produire une sortie significative.
la source