Reglas básicas (diferentes a las mías)
Historia
Es el año 4579, los humanos ahora tienen 2 manos con 1001 dedos cada una. Los palillos se han basado en puntos. Y @Dennis tiene más repeticiones que @Martin ... Los círculos rojos dibujados a mano ahora tienen un voto negativo ... Jon Skeet ha alcanzado 2 billones de repeticiones en cada sitio de SE ... Sí, lo sé.
Chopsticks es un juego de manos que se ha resuelto. Para evitar esto, lo he creado mutado. Aumenté la cantidad de dedos.
Reglas del juego
La forma en que esto se juega
Todos comienzan con 2 manos. Cada mano tiene 1001 dedos. Cada mano comienza con 1 (un) dedo hacia arriba en cada mano. Durante tu turno puedes "golpear" la mano de otros jugadores. Para golpear, elige 1 de tus manos para golpear y 1 de sus manos para golpear. La mano que fue golpeada ahora tiene la cantidad de dedos que tenía al principio Y la cantidad de dedos que tenía en la mano con la que golpeó.
EX
P1: 1,1
P2: 1,1
. P1[0]
éxitos P2[1]
. Ahora los dedos son P1:1,1
P2:1,2
. Ahora P2[1]
golpea p1[0]
. Los dedos ahora son P1: 3,1
P2 1,2
.
Si una mano llega a 1001 dedos hacia arriba o más, entonces esa mano está fuera. Entonces el jugador que obtuvo una mano (para su turno) puede "dividirse". Dividir es cuando tomas la mano que está adentro y reduces a la mitad la cantidad de dedos (redondeando hacia arriba) y le das esos dedos a la otra mano para que vuelva a entrar.
EX
P1: 1000,2
P2 7,7
. P2[0]
éxitos P1[0]
. La puntuación es P1: 0,2
P2 1,1
. P1[1]
se divide por su turno y el puntaje es P1: 1,1
y P2 7,7
.
El juego termina cuando un jugador tiene ambas manos. Los puntos se obtienen por la cantidad de dedos que tiene el ganador. Más puntos = mejor. El perdedor no gana puntos.
Hay otras reglas que se usan, pero estas son las que se usan aquí.
Todos juegan a todos (round robin)
Juego final
Suma tus puntos de cada ronda que ganes. Luego promedie los puntos de todos. Divide tu total entre los puntos promedio y obtén tu puntaje final. La mayoría de los puntos ganan.
Reglas reales
Por favor, no intentes resolver el juego. De hecho, tengo que poder ejecutarlo: P
Asegúrate de que el bot pueda correr rápido. Con la duración de las rondas a juzgar, esto llevará un tiempo
Todas las bibliotecas necesarias en su programa deben estar en la biblioteca de python predeterminada. También enumere los que necesita importar. Las importaciones serán sólo la importación básica (para las matemáticas que hago: import math
)
Las respuestas deben funcionar en Python 3.x
Manipulador
Su bot será su propio archivo Python 3 con una play
función.
play
Se pasarán dos listas de dos números cada una. Este número indica cuántos dedos hay en cada mano. La primera lista es tu propia mano.
Si eliges golpear la mano del otro jugador, entonces devuelve una lista de dos bits. El primer bit es el índice de la mano que estás usando para golpear ( 0
para el primero,1
para el último), y el segundo bit es el índice de la mano que estás golpeando al oponente.
Si elige dividir, devuelva cualquier otro valor verdadero.
Tada!
El controlador se puede encontrar aquí . Guarde cada bot en su propio archivo y enumere el nombre de archivo de cada bot (sin .py
) en botnames
.
Nota final:
Usted y el otro bot se turnarán para ir primero. Si el juego no termina en 100,000 (cien mil) rondas, el juego terminará y ninguno de los bot ganará.
El controlador no está protegido contra movimientos que duran una eternidad, pero la sobrecarga innecesaria será muy mal vista.
fuente
My handler is very simple, your bot must do it's logic then adjust the the finger scores as needed, remember!
¿Qué, entonces nosotros somos los que hacemos los cálculos para el KoTH?Respuestas:
Codificación y algoritmos
¡Esta respuesta realmente usa codificación y algoritmos, a diferencia de los otros hasta ahora! referencia: imgur (también supera todas las respuestas publicadas antes de esto)
fuente
PrecauciónBot
Precaución: Bot no quiere causar demasiados problemas, por lo que golpea la mano más pequeña del oponente con su mano más pequeña si tiene ambas manos, y de lo contrario se divide. Sin embargo, CautionBot no es tonto, por lo que si puede sacar la mano de un oponente sin perder inmediatamente el siguiente turno, lo hará en lugar de su movimiento normal.
fuente
Igualada
Si al ecualizador le falta una mano, se dividirá. De lo contrario, golpea la mano más pequeña de sus oponentes con su propia mano más grande.
fuente
Agresor
Otro bot inicial, Aggressor golpeará la mayor de las manos del oponente con la mayor de sus propias manos si ambas manos no están vacías; de lo contrario, se divide.
fuente
RandomBot
Solo para comenzar, aquí hay un bot que realiza un golpe aleatorio si sus manos no están vacías; de lo contrario, se divide.
Golf porque porque no: 3
fuente
Error
Sí, ese es el nombre del bot.
Llegué a esto probando con los otros bots. Sin embargo, es el penúltimo en mis simulaciones. Así que eventualmente haré otro bot.
Editar: Parece que no puedo escribir ningún bot que supere a CautionBot, y mis pruebas adicionales parecen indicar que este es el segundo mejor, no el segundo peor.
fuente
Maratoniano
Modifiqué el código de Aggressor provisto por "HyperNeutrino" para simplemente golpear al más pequeño de los oponentes con dos manos con la más pequeña de sus manos. Es una estrategia muy tonta, por supuesto, ¡pero no puedo rechazar estar en la cima de un gráfico! (Aunque esa tabla sería pérdidas)
No estoy seguro de si este código se ejecutará sin errores porque no pude probarlo debido a que estaba en el trabajo. Sin embargo, debería funcionar sin problemas.
fuente