Baguettes mutées avec des points KoTH

13

Règles de base (différentes des miennes)

Récit

C'est l'année 4579, les humains ont maintenant 2 mains avec 1001 doigts chacune. Les baguettes sont devenues basées sur des points. Et @Dennis a plus de représentants que @Martin ... Les cercles rouges dessinés à la main sont maintenant sous-votés ... Jon Skeet a atteint 2 billions de représentants sur chaque site SE ... Ouais, effrayant je sais

Chopsticks est un jeu de main qui a été résolu. Donc, pour contourner cela, je l'ai créé muté. J'ai augmenté le nombre de doigts.

Règles du jeu

La façon dont cela se joue

Tout le monde commence avec 2 mains. Chaque main a 1001 doigts. Chaque main commence avec 1 (un) doigt sur chaque main. Pendant votre tour, vous pouvez "toucher" la main des autres joueurs. Pour vous frapper, choisissez 1 de vos mains pour frapper et 1 de leurs mains pour frapper. La main qui a été frappée a maintenant la quantité de doigts qui était la leur au début ET la quantité de doigts que vous aviez sur la main avec laquelle vous avez frappé.

EX

P1: 1,1 P2: 1,1. P1[0]frappe P2[1]. Maintenant, les doigts le sont P1:1,1 P2:1,2. Maintenant P2[1]frappe p1[0]. Les doigts sont maintenant P1: 3,1P2 1,2.

Si une main atteint 1001 doigts ou plus, cette main est sortie. Le joueur qui a reçu une main (pour son tour) peut alors "se séparer". Le fractionnement consiste à prendre la main qui est dedans et à diviser par deux le nombre de doigts (arrondir) et à donner ces doigts à l'autre main pour la remettre en place.

EX

P1: 1000,2P2 7,7. P2[0]frappe P1[0]. Le score est P1: 0,2P2 1,1. P1[1]se divise pour son tour et le score est P1: 1,1et P2 7,7.

Le jeu se termine lorsqu'un joueur a les deux mains. Les points sont marqués par le nombre de doigts du gagnant. Plus de points = mieux. Le perdant ne gagne aucun point.

Il existe d'autres règles qui sont utilisées, mais ce sont celles utilisées ici.

Tout le monde joue tout le monde (tournoi à la ronde)

Fin du jeu

Faites le total de vos points à chaque tour que vous gagnez. Ensuite, augmentez la moyenne des points de tout le monde. Divisez votre total par la moyenne des points et obtenez votre score final. La plupart des points gagnent.

Règles réelles

Failles standard

S'il vous plaît ne pas essayer de résoudre le jeu. Je dois en fait pouvoir l'exécuter: P

Assurez-vous que le bot peut fonctionner rapidement. Avec la longueur des tours, cela prendra un certain temps

Toutes les bibliothèques nécessaires à votre programme doivent se trouver dans la bibliothèque python par défaut. Indiquez également ceux dont vous avez besoin d'importer. Les importations seront juste l'importation de base (pour les mathématiques que je fais: import math)

Les réponses doivent fonctionner dans Python 3.x

Gestionnaire

Votre bot sera son propre fichier Python 3 avec une playfonction.

playsera passé deux listes de deux numéros chacun. Ce nombre indique le nombre de doigts sur chaque main. La première liste est votre propre main.

Si vous choisissez de frapper la main de l'autre joueur, renvoyez une liste de deux bits. Le premier bit est l'indice de la main que vous utilisez pour frapper ( 0pour le premier, 1pour le dernier), et le deuxième bit est l'indice de la main que vous frappez sur l'adversaire.

Si vous choisissez de vous séparer, renvoyez toute autre valeur véridique.

Tada!

Le contrôleur peut être trouvé ici . Enregistrez chaque bot dans son propre fichier et répertoriez le nom de fichier de chaque bot (sans .py) dans botnames.

Note finale:

Vous et l'autre bot irez à tour de rôle en premier. Si le jeu ne se termine pas en 100 000 (cent mille) tours, le jeu sera terminé et aucun des bots ne gagnera.

Le contrôleur n'est pas protégé contre les mouvements qui prennent une éternité, mais les frais généraux inutiles seront fortement désapprouvés.

Christophe
la source
Sandbox
Christopher
Les «règles KOTH standard» pourraient-elles être un lien? Et peut-être aussi des "failles standard".
trichoplax
My handler is very simple, your bot must do it's logic then adjust the the finger scores as needed, remember!Quoi, donc c'est nous qui faisons les calculs pour le KoTH?
HyperNeutrino
@HyperNeutrino opps fixant.
Christopher
4
Dennis a plus de représentants que Martin maintenant . Oh mon dieu, d'où viennent ces 996 doigts supplémentaires?!
caird coinheringaahing

Réponses:

6

CodingAndAlgorithms

Cette réponse utilise en fait du codage et des algorithmes, contrairement aux autres jusqu'à présent! référence: imgur (bat également toutes les réponses postées avant cela)

def play(A, B):
    if sum(A) == 1:
        return [A.index(1), B.index(max(B))]
    elif max(A) + max(B) > 1000:
        return [A.index(max(A)), B.index(max(B))]
    elif 0 in A:
        return 1
    elif 0 in B:
        return [A.index(min(A)), 1-B.index(0)]
    else:
        return [A.index(min(A)), B.index(min(B))]
betseg
la source
J'ai eu cette référence XD
Christopher
Cela vient de gagner. Il n'a jamais perdu.
Christopher
Toutes nos félicitations! Je suppose que je vais devoir me contenter de la deuxième place. Votre codage et vos algorithmes étaient plus forts que les miens
Value Ink
3

CautionBot

def play(s,o):
 if max(s)+max(o)>1000 and (all(s) or max(s)+min(o)<1001):
  return [s.index(max(s)),o.index(max(o))]
 else:
  return [s.index(min(s)),o.index(min(filter(bool,o)))]if all(s) else 'split'

CautionBot ne veut pas causer trop de problèmes, il frappe donc la plus petite des mains de l'adversaire avec sa plus petite main s'il a les deux mains, et sinon se divise. Cependant, CautionBot n'est pas un imbécile, donc s'il peut retirer la main d'un adversaire sans perdre immédiatement le prochain tour, il le fera au lieu de son mouvement normal.

Encre de valeur
la source
Officieusement, cela gagne
Christopher
Cool! Nous verrons comment les choses se déroulent à partir d'ici car je ne serai pas surpris quand quelqu'un développera une meilleure stratégie. Je viens d'appliquer ce que j'ai compris être une stratégie de baguettes vanille (être un lâche et se séparer souvent pour éviter d'être tué) d'une manière qui s'adapte le mieux aux nouvelles règles (être un lâche et frapper bas pour éviter d'être tué, depuis le fractionnement / la fusion pendant que vous avoir les deux mains est illégal) lol
Value Ink
3

Égaliseur

def play(s, o):
    if not all(s):
        return 1
    else:
        return [s.index(max(s)), o.index(min(filter(bool, o)))]

S'il manque une main à l'égaliseur, il se divisera. Sinon, il frappe la plus petite main de son adversaire avec sa propre plus grande main.

LyricLy
la source
Selon ces règles mutées, AFAIK, vous ne pouvez vous séparer que si une main est sortie.
Value Ink
Oh ouais, je vais arranger ça.
LyricLy
"Si l'égaliseur n'a pas de mains ..." eh bien, s'il n'a pas de mains, il a déjà perdu? Mais c'est juste une piqûre, prenez mon +1 pour compenser
Value Ink
3

Agresseur

def play(s, o):
    return [s.index(max(s)),o.index(max(o))]if all(s)else 1

Un autre bot de départ, Aggressor frappera la plus grande des mains de l'adversaire avec la plus grande de ses propres mains si ses deux mains ne sont pas vides; sinon, il se divise.

HyperNeutrino
la source
2

RandomBot

import random

def play(s, o):
    return [random.randint(0,1)for i in'  ']if all(s)else 1

Juste pour commencer, voici un bot qui fait un coup aléatoire si ses mains ne sont pas vides; sinon, se divise.

Golfé parce que pourquoi pas: 3

HyperNeutrino
la source
Je corrigeais ça
Christopher
@Christopher Désolé, vous n'avez pas vu votre commentaire. --- Une fois que vous le corrigerez, je le supprimerai .--- Je le supprimerai simplement parce que c'est stupide xD
HyperNeutrino
@Christopher Remarque: J'ai modifié cela en une soumission valide. J'ajouterai également une autre solution; dites-moi si le contrôleur ne fonctionne pas correctement :)
HyperNeutrino
Nice les essayer
Christopher
@Christopher Le contrôleur fonctionne-t-il correctement?
HyperNeutrino
2

Erreur

Oui, c'est le nom du bot.

def play(s, o):
    if max(s)+max(o)>1000:
        return [s.index(max(s)),o.index(max(o))]
    if 0 in s:return ''
    return [s.index(max(s)),o.index(min(o))]

J'y suis arrivé en testant avec les autres bots. Cependant, il est toujours l'avant-dernier dans mes simulations. Alors je vais finir par faire un autre bot.

Edit: Je n'arrive pas à écrire un bot qui bat CautionBot, et mes tests supplémentaires semblent indiquer que c'est le deuxième meilleur, pas le deuxième pire.

Magenta
la source
1

Marathonien

J'ai modifié le code d'Aggressor fourni par "HyperNeutrino" pour frapper simplement la plus petite des deux mains de l'adversaire avec la plus petite de ses mains. C'est une stratégie très stupide bien sûr mais je ne peux pas refuser d'être en haut d'un graphique! (Même si ce graphique serait des pertes)

Je ne sais pas si ce code s'exécutera sans erreur car je n'ai pas pu le tester en raison de mon travail. Cependant, il devrait fonctionner parfaitement.

def play(s, o):
     return [s.index(min(s)),o.index(min(o))]if all(s)else 1
Jordan
la source
Belle première réponse! Vous avez choisi une excellente question: P (pas de parti pris)
Christopher
Merci :) J'étais assez nerveux parce que je ne savais pas si modifier le code de quelqu'un d'autre comme moi était autorisé ou non. Je suppose que c'est aussi long que vous le rendez évident. Et j'allais essayer d'en faire une qui jouerait juste la plus grosse main contre les adversaires les plus gros mais HyperNeutrino m'a battu à celle-là exactement! haha
Jordan
Ouais. Sur ce SE, le code de peaufinage est souvent utilisé: P
Christopher
Cool réponse! Une chose dont je m'inquiéterais (je ne peux pas le tester pour le moment) est que je ne sais pas comment le contrôleur répondra si vous essayez de frapper une main vide, ni comment cela prend en compte les règles.
Value Ink
1
C'est très similaire à l'égaliseur, mais l'égaliseur vérifiera qu'il ne touche pas la main vide de l'adversaire s'il est présent. @LyricLy
HyperNeutrino