Visage impassible
introduction
Leo aime jouer au poker, mais son travail chez Tech Inc. est trop exigeant pour qu'il apprenne à bien jouer. Leo, étant un informaticien, n'est pas découragé. Il décide de prendre plus de temps qu'il n'aurait fallu pour simplement apprendre le poker et l'utiliser pour écrire un robot de poker pour l'aider à mieux jouer. Mais maintenant, Leo a un problème: afin de comprendre comment jouer un peu mieux, Leo doit observer plusieurs jeux de plusieurs "personnes", mais les "personnes" ont besoin de styles de jeu différents pour améliorer la qualité et la réalité du jeu.
Le défi
Leo se souvient qu'il existe en fait un site Web dédié aux défis de programmation et sollicite votre aide! Votre travail consiste à écrire un programme qui joue à "Pokerface" une version modifiée du poker à 5 cartes. Le programme prendra l'entrée comme une main de 5 cartes dans le format que vous souhaitez, après quoi le programme sortira:
- Exactement (sensible à la casse) "vrai" "1" ou "t" si le joueur souhaite échanger des cartes, toute autre sortie non vide sinon.
- Si vrai, liste des index des cartes et / ou des noms de cartes que le joueur souhaite échanger.
- Un nombre unique entre 0 et 3, qui spécifie combien de cartes supplémentaires le joueur veut.
- Imprimez la main que le joueur souhaite utiliser.
(Voir le formatage ci-dessous)
Règles de Pokerface
- Le pokerface étant un jeu d'aventure basé sur du texte, les cartes doivent être présentées de manière cohérente. Les cartes sont représentées par deux codes de caractères, le premier caractère est la couleur et le second est le nom de la carte.
- Cartes:
- 2-9 = 2-9
- 10 = T
- Jack = J
- Reine = Q
- Roi = K
- Ace = A
- Costume:
- Pique = S
- Clubs = C
- Coeurs = H
- Diamant = D
- Cartes:
Donc l'as de pique serait SA, le 10 de cœur est HT, le 4e de diamant est D4, etc.
- Un seul tour de Pokerface se compose de quatre étapes:
- Le paquet est remélangé et une main de cinq cartes est distribuée à chaque joueur.
- Chaque joueur a la possibilité d'échanger autant de cartes qu'il le souhaite.
- Chaque joueur a la chance de gagner jusqu'à trois cartes supplémentaires.
- Chaque joueur doit révéler sa meilleure main.
- La meilleure main gagne et gagne un point à ce joueur. En cas d'égalité, les deux joueurs obtiennent un point.
- Dans une seule partie, dix tours sont joués et le joueur avec le plus de points gagne et gagne un seul "point de victoire". En cas d'égalité, les deux joueurs gagnent un point de victoire.
- Leo n'a pas vraiment beaucoup d'argent, donc votre bot peut supposer que c'est un monde parfait sans pari.
Mains
- Les mains font exactement 5 cartes (entrée initiale et sortie finale).
- Les mains sont classées conformément aux règles décrites ici .
Entrée sortie
- Leo ne connaît que Java, votre programme doit donc être exécutable via l' API Process (ligne de commande) et utiliser respectivement STDIN et STDOUT pour l'entrée et la sortie.
- Pour chaque étape d'entrée et de sortie détaillée ci-dessus, l'entrée et la sortie doivent chacune exister sur une seule ligne.
- Il doit y avoir au moins une nouvelle ligne de fin après la sortie finale. (Cela est dû à la façon dont l'entrée est lue depuis STDIN)
- Aucune entrée / sortie étrangère n'est autorisée, à l'exception des espaces de fin et de début. L'analyseur ne comprend tout simplement pas des choses comme
final_hand=...
oudraw 0
. - Lors du dessin, la sortie est un entier unique, lorsque l'échange de sortie est une liste d'entiers et / ou de cartes définis ci-dessous, et lorsque la main d'origine est distribuée, la sortie est une liste de cartes définies ci-dessous.
- Tous les nombres d'entrée / sortie doivent être des entiers positifs dans la base 10.
- Vous pouvez définir le format de saisie de la carte (voir format de publication ci-dessous).
- True est défini comme exactement "true", "1" ou "t" et false est toute autre valeur non vide.
- Pendant l'étape d'échange:
- Les index des cartes doivent être sortis avec au moins un espace entre eux (par exemple
3 4 0
) - Les noms de carte doivent être sortis avec au moins un espace entre eux (par exemple
H4 S8
) - Les noms et les index des cartes peuvent être mélangés dans la sortie (par exemple
0 H7 3 D3
) - Les espaces de fin et de début sont autorisés.
- L'entrée résultant de la sortie du lecteur ci-dessus sera formatée comme spécifié par le
bot.jlsc
fichier, dans le même ordre que celui demandé
- Les index des cartes doivent être sortis avec au moins un espace entre eux (par exemple
- Le nombre de cartes qu'un joueur veut ajouter à sa main peut avoir des espaces de début et de fin.
- Les mains doivent être sorties avec au moins un espace entre elles (par exemple
H4 D5 CA
), les espaces de fin et les espaces de tête sont autorisés. - Les aiguilles n'ont pas besoin d'être sorties dans le bon ordre (par exemple,
H4 D4 C4 DA SA
et lesH4 DA D4 SA C4
deux représentent 4, 4, 4, Ace, Ace, qui est une maison pleine). - Si vous souhaitez construire une stratégie en analysant les mains des adversaires, vous pouvez stocker des données dans un
<botname>/data
répertoire.- Une fois que les robots concurrents ont affiché leurs mains, ils seront écrits dans chaque répertoire de données de robots, dans hands.txt, chaque main sur une nouvelle ligne (séparée par \ n). Le fichier sera encodé en US_ASCII.
- Une fois que votre robot a demandé de nouvelles cartes ou des cartes d'échange, les cartes seront entrées en fonction du format que vous spécifiez dans le
bot.jlsc
fichier.
Format du message
- Chaque message doit inclure deux choses:
- Le code source de votre bot ou un lien vers un référentiel public.
- Un fichier zip contenant:
- La version compilée / exécutable de votre bot (si le fichier est un fichier .exe ou autre non décompilable, veuillez simplement inclure des instructions de compilation dans votre article).
- Un
bot.jlsc
fichier, voir ci-dessous (note latérale: l'extension .jlsc est juste à cause d'un de mes projets secondaires, un format de configuration. Le fichier ci-dessous correspond à la syntaxe appropriée, alors ne vous inquiétez pas).
- Le fichier .zip doit être nommé de la même manière que votre bot.
- Si vous n'avez pas accès à Windows ou à un autre utilitaire de fermeture à glissière, ou si vous ne pouvez pas créer un .zip pour une raison quelconque, incluez simplement le texte du fichier bot.jlsc dans votre message
Fichier bot.jlsc:
name= "Botty"
link= "example.com"
cmd= "java -jar Botty.jar"
input_hand= "${0} ${1} ${2} ${3} ${4}"
input_1= "${0}"
input_2= "${0} ${1}"
input_3= "${0} ${1} ${2}"
input_4= "${0} ${1} ${2} ${3}"
Où:
- "cmd" est la commande de ligne de commande Windows pour exécuter votre bot. Notez que votre bot sera dans le répertoire
<botname>
, ajustez donc la commande en conséquence. - "nom" est le nom de votre bot.
- "lien" est le lien vers votre réponse, vous devrez le modifier après la publication.
- "input_hand" est la façon dont vous souhaitez que le deal d'origine soit formaté ($ {#} représentant les cartes 0-4).
- "input_1" est la façon dont vous souhaitez que l'entrée d'une carte supplémentaire soit formatée.
- "input_2" est la façon dont vous souhaitez que l'entrée de deux cartes supplémentaires soit formatée.
- "input_3" est la façon dont vous souhaitez que l'entrée de trois cartes supplémentaires soit formatée.
- "input_4" est la façon dont vous souhaitez que l'entrée de quatre cartes supplémentaires soit formatée.
Détails
- Ces failles sont interdites (voir «pièges courants»)
- Vous ne pouvez pas écrire un bot qui produira toujours la meilleure main possible, à chaque fois, dans le jeu de règles. (c.-à-d. pas de robots à force brute de longue durée, rien ne devrait être aussi «bon» que LeoBot)
- Votre bot devrait fonctionner en ~ 100 ms ou moins (indulgente sur ce point, max ~ 1 seconde)
- Toute sortie du bot après sa main choisie sera ignorée.
- Les failles standard ne sont pas autorisées.
- Oui, je sais que Linux est meilleur, mais j'ai un PC Windows, alors assurez-vous que la version compilée / exécutable de votre programme peut être exécutée à partir de la ligne de commande Windows.
- J'ai déjà installé python et java sur mon ordinateur, mais je suis prêt à mettre à jour vers de nouvelles versions et à installer d'autres environnements, veuillez donc spécifier le type d'environnement requis par votre programme.
- Vous ne pouvez pas écrire un bot qui fait la même chose qu'un autre bot dans tous les cas. Les robots anti-spam sont autorisés, mais découragés.
- Votre bot ne peut utiliser que les cartes qu'il possède. Les cartes perdues par échange ou non distribuées au départ ne sont pas valides dans la dernière main.
- L'entrée et la sortie ne peuvent contenir que des caractères ASCII.
Tournois
- Les tournois se dérouleront quand j'aurai le temps (mon emploi du temps est presque aussi chargé que celui de Leo, donc cela peut être un peu rare. Désolé pour le dérangement.).
- Les bots seront opposés les uns aux autres dans des jeux à 4 personnes, et il y aura un jeu pour chaque sous-ensemble possible de bots (c'est-à-dire beaucoup de jeux).
- Ce processus sera répété cinq fois.
- En raison de la façon dont le gestionnaire du tournoi crée les groupes de bots, jusqu'à trois bots de remplissage seront ajoutés pour rendre le nombre de bots divisible par 4. Ces bots retourneront simplement la main à laquelle ils ont été initialement distribués.
- Après chaque manche et chaque match, les scores des bots seront calculés en fonction du nombre de matchs gagnés.
- Plusieurs bots peuvent partager une position (égalité pour les premiers gagnés par les premiers publiés).
- Après la fin d'un tournoi, les scores seront ajoutés en bas de ce post.
Notation
Règles normales de KoTH. Le ou les bots qui remportent le plus de matchs remportent le défi.
LeoBot
Le robot de Leo est assez intelligent. Il n'échange aucune carte, c'est trop difficile, mais il demande le nombre maximum de cartes supplémentaires, il détermine la meilleure main possible qu'il peut faire et joue cette main. La logique principale de leobot est ci-dessous.
package com.gmail.socraticphoenix.pokerface.leobot;
import com.gmail.socraticphoenix.pokerface.lib.card.Card;
import com.gmail.socraticphoenix.pokerface.lib.card.Deck;
import com.gmail.socraticphoenix.pokerface.lib.rule.HandRegistry;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class LeoBot {
public static void main(String[] args) {
List<Card> hand = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
hand.addAll(Card.parseHand(scanner.nextLine()));
System.out.println(false);
System.out.println(3);
hand.addAll(Card.parseHand(scanner.nextLine()));
List<List<Card>> possibleHands = LeoBot.getSubsets(hand, 5);
System.out.println(Deck.toString(possibleHands.stream().sorted((a, b) -> HandRegistry.determineWinner(b, a).comparable()).findFirst().get()));
}
private static <T> void getSubsets(List<T> superSet, int k, int idx, List<T> current, List<List<T>> solution) {
if (current.size() == k) {
solution.add(new ArrayList<>(current));
return;
}
if (idx == superSet.size()) return;
T x = superSet.get(idx);
if (!current.contains(x)) {
current.add(x);
}
getSubsets(superSet, k, idx + 1, current, solution);
current.remove(x);
getSubsets(superSet, k, idx + 1, current, solution);
}
public static <T> List<List<T>> getSubsets(List<T> superSet, int k) {
List<List<T>> res = new ArrayList<>();
getSubsets(superSet, k, 0, new ArrayList<T>(), res);
return res;
}
}
Notez que si LeoBot remporte régulièrement les tournois et qu'il y a une bonne quantité d'inscriptions, je cesserai de l'inclure dans la course.
Liens importants
Avertissement
Leo et Tech Inc. sont des éléments d'histoire et toute ressemblance avec des entreprises ou des personnes réelles est purement involontaire. (Cependant, lorsque la `` situation '' de Leo ajoute ou soustrait des conditions à la question, celles-ci font en fait partie de la question ...)
"f"q+
remplit les conditions minimales. S'il y a 10 personnes en compétition, cela bat probablement toutes les entrées non muettes (l'entrée non muette a probablement> 75 caractères, 5 * 10 (score du bot stupide, dernier) = 50 <75 (score du très petit bot intelligent (venant en premier))). Ainsi, vous devriez probablement supprimer le codegolf de ce défi