Palillos mutados con puntos KoTH

13

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,1P2 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,2P2 7,7. P2[0]éxitos P1[0]. La puntuación es P1: 0,2P2 1,1. P1[1]se divide por su turno y el puntaje es P1: 1,1y 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

Lagunas estándar

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 playfunción.

playSe 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 ( 0para 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.

Christopher
fuente
Sandbox
Christopher
¿Podrían las "reglas KOTH estándar" ser un enlace? Y tal vez también "lagunas estándar".
trichoplax
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?
HyperNeutrino
@HyperNeutrino opps fijación.
Christopher
44
Dennis tiene más representantes que Martin ahora . Dios mío, ¿de dónde vienen estos 996 dedos extra?
caird coinheringaahing

Respuestas:

6

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)

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
fuente
Tengo esa referencia XD
Christopher
Esto acaba de ganar. Nunca se pierde.
Christopher
¡Felicidades! Creo que tendré que conformarme con el segundo lugar. Su codificación y algoritmos fueron más fuertes que los míos
Value Ink
3

PrecauciónBot

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'

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.

Tinta de valor
fuente
Extraoficialmente esto está ganando
Christopher
¡Frio! Veremos cómo van las cosas desde aquí porque no me sorprenderé cuando alguien desarrolle una mejor estrategia. Acabo de aplicar lo que entendí como estrategia de Chopstick de vainilla (ser cobarde y dividir a menudo para evitar ser asesinado) de la manera que mejor se acomode a las nuevas reglas (ser cobarde y golpear bajo para evitar que te maten, desde que te separaste / fusionaste mientras tener ambas manos es ilegal) jajaja
Value Ink
3

Igualada

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

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.

LyricLy
fuente
De acuerdo con estas reglas mutadas, AFAIK solo puede dividirse si tiene una mano fuera.
Value Ink el
Oh sí, lo arreglaré.
Letra
"Si el ecualizador no tiene manos ..." bueno, quiero decir que si no tiene manos, ¿ya perdió? Pero eso es solo una trampa, toma mi +1 para compensar
Value Ink
3

Agresor

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

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.

Hiperneutrino
fuente
2

RandomBot

import random

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

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

Hiperneutrino
fuente
Estaba arreglando eso
Christopher
@Christopher Lo siento, no vi tu comentario. --- Una vez que lo arregles, eliminaré esto .--- Simplemente eliminaré esto porque es estúpido xD
HyperNeutrino
@ Christopher Nota: he editado esto en una presentación válida. Agregaré otra solución también; dime si el controlador no funciona correctamente :)
HyperNeutrino
Es bueno probarlos
Christopher
@Christopher ¿El controlador funciona correctamente?
HyperNeutrino
2

Error

Sí, ese es el nombre del 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))]

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.

Magenta
fuente
1

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.

def play(s, o):
     return [s.index(min(s)),o.index(min(o))]if all(s)else 1
Jordán
fuente
Buena primera respuesta! Elegiste una gran pregunta: P (sin sesgo)
Christopher
Gracias :) Estaba bastante nervioso porque no estaba seguro de si estaba permitido o no modificar el código de otra persona como lo hice. Supongo que es mientras lo hagas obvio. ¡E iba a tratar de hacer una que simplemente jugara la mano más grande contra los oponentes más grandes, pero HyperNeutrino me ganó exactamente esa! jaja
Jordania
Si. En este código de ajuste SE se usa a menudo: P
Christopher
Buena respuesta! Una cosa de la que me preocuparía (no puedo probarlo en este momento) es que no sé cómo responderá el controlador si intentas golpear una mano vacía, o cómo eso influye en las reglas.
Value Ink el
1
Esto es muy similar a Equalizer pero Equalizer lo comprobará para asegurarse de que no golpee la mano vacía del oponente si está presente. @LyricLy
HyperNeutrino