Es Navidad en julio, entonces, ¿qué mejor manera de celebrar que un intercambio virtual de regalos de elefante blanco?
Para este desafío de King of the Hill, debes crear un bot que juegue en una simulación de intercambio de White Elephant , tratando de obtener el regalo más valioso posible.
Reglas del juego
- El juego se jugará en muchas rondas, cada una compuesta por un número variable de turnos.
- Configuración de ronda : Habrá tantos regalos como jugadores en el juego, cada uno valorado aleatoriamente de manera uniforme en el rango [0 ... 1), con este valor desconocido hasta que el presente se "abra". Los jugadores se colocarán en un orden aleatorio en una cola. El primer jugador aparecerá desde el frente de la cola.
- Cuando es el turno de un jugador, pueden abrir un presente o robar el presente de otro jugador, pasando el turno al jugador cuyo presente fue robado.
- Cada regalo puede ser robado hasta 3 veces.
- No puedes robarle al jugador que acaba de robarte.
- Cada jugador solo puede tener un presente a la vez.
- Después de abrir un regalo, el juego avanza al siguiente jugador que aparece desde el frente de la cola. Este será el siguiente jugador en orden de turno que aún no ha tenido un turno.
- Fin de ronda : cuando todos los regalos se han abierto, la ronda finaliza y el valor del presente que tiene cada jugador se agrega a la puntuación de ese jugador. Comienza una nueva ronda, con cada jugador ahora sin ningún regalo y el orden del jugador barajado.
- Fin del juego : el juego finalizará cuando al menos un jugador haya obtenido
100500 puntos, y la victoria se otorgará al jugador con el mayor valor total de regalos.
Codificación
Todas las presentaciones deben ser compatibles con Python 3.7. Debe escribir una clase que herede directamente de WhiteElephantBot
. Por ejemplo:
class FooBot(WhiteElephantBot):
# Your implementation here
Puede proporcionar un __init__
método (que toma un argumento name
) en su clase de bot, que debe llamar super().__init__(name)
. Su clase debe tener un take_turn
método que espere los siguientes argumentos en este orden:
players
: La lista de nombres de jugadores, en orden de turno, de todos los jugadores que aún no tienen regalos.presents
: Un diccionario que asigna nombres de jugadores a 2-tuplas que contienen el valor actual que tiene ese jugador y la cantidad de veces que ese regalo ha sido robado. Esto solo incluirá a otros jugadores que actualmente tienen regalos.just_stole
: Si la última acción tomada fue un robo, este será el nombre del jugador que acaba de robar. Si no, lo seráNone
.
Cada argumento será inmutable o un objeto nuevo, de modo que mutar cualquiera de ellos no tendrá un efecto en el juego. Puede guardar una copia de cualquiera de los argumentos si así lo desea.
Un valor de ejemplo para presents
:
{
'Alice': (0.35, 0),
'Bob': (0.81, 2),
'Charlie': (0.57, 1)
}
Su take_turn
método debe devolver el nombre del jugador que desea robar o None
abrir un regalo. Si genera una excepción, devuelve algo que no sea un str
o None
, o el nombre de un jugador del que no puedes robar, abrirás un regalo por defecto.
Se llamará a su constructor al comienzo de cada ronda, por lo que no podrá recordar el estado de una ronda a otra.
Al heredar de WhiteElephantBot
, tendrás acceso a un steal_targets
método que tomará los dict de los regalos just_stole
y devolverá una lista de nombres de jugadores a los que puedes robar.
Cualquier módulo que necesite su script debe importarse en la parte superior de su entrada.
Conductor de prueba
El controlador de prueba se puede encontrar aquí . No necesita incluir from white_elephant import WhiteElephantBot
en su respuesta publicada, sin embargo, un módulo local deberá hacerlo.
Competidores de línea de base
- Aleatorio : elige al azar si abrir un nuevo regalo o robar, con el objetivo de robo elegido de manera uniforme al azar.
- Codicioso : roba el regalo más valioso que se puede robar. Si no se pueden robar regalos, abra un regalo.
- Niza : siempre abre un nuevo regalo. Nunca roba
Reglas Adicionales
- Es su responsabilidad capturar todas las excepciones. Si su clase no logra atrapar una excepción, será descalificada. Además, no atrape KeyboardInterrupts.
- No use archivos u otros métodos para evitar la imposibilidad de guardar el estado entre juegos. No puede, por ejemplo, guardar un estado de red neuronal en un archivo a mitad de ejecución.
- Su bot debe ser autónomo dentro del código de clase y las constantes relacionadas.
- Solo puede usar importaciones de biblioteca estándar.
- No hay requisitos estrictos de rendimiento. Sea razonable y prudente. Si el rendimiento se convierte en un problema, me reservo el derecho de agregar límites de tiempo.
Una entrada por persona.Si envía más de una entrada, es posible que sus bots no funcionen juntos. Voy a permitir múltiples entradas por persona por ahora, aunque puedo volver a modificarlo más adelante si se convierte en un problema.- Esta es una competencia abierta sin fecha de finalización distinta. Se volverá a ejecutar cada vez que pueda cuando haya habido cambios significativos.
EDITAR1: Se cambió el puntaje ganador de 100 a 500 para que las clasificaciones sean más consistentes. El controlador de prueba tiene una nueva corrección de errores y también refleja los cambios en la puntuación de victorias.
EDIT2: Nota aclaratoria sobre las importaciones requeridas.
Tabla de clasificación (a partir del 8 de agosto de 2018)
- SampleBot (500.093)
- LastMinuteBot (486.163)
- RobinHood (463.160)
- OddTodd (448.825)
- GreedyBot (438.520)
- SecondPlaceBot (430.598)
- UmbralBot (390.480)
- Jugador (313.362)
- NiceBot (275.536)
- RandomBot (256.172)
- Buen samaritano (136.298)
fuente
Respuestas:
LastMinuteBot
(Con muchas gracias a @Mnemonic por el esqueleto del código, ya que apenas conozco Python).
Aproveche el hecho de que los regalos no pueden ser robados más de tres veces, robe el tercero si encuentra un regalo de alto valor y la mayoría de los regalos se han abierto.
fuente
Todd extraño
Roba el mejor regalo que puede, pero no quiere ser la segunda persona en robar un regalo, porque si se lo roban no puede recuperarlo.
fuente
==
lugar de a=
en su lista.SecondPlaceBot
Todos lucharán por el regalo más valioso. El siguiente mejor regalo es casi tan bueno, pero es mucho menos probable que sea robado.
fuente
UmbralBot
Realmente no nos importa obtener el mejor regalo, solo algo lo suficientemente bueno . Mientras haya algo que valga la pena robar, lo haremos.
fuente
SampleBot
Ejecuta 2000 simulaciones con cada jugador actuando con avidez y elige la mejor acción.
fuente
Robin Hood
Robar a los ricos que no ganaron su presente
fuente
Buen samaritano
Dar a las personas desafortunadas otra oportunidad de buena fortuna
fuente
Jugador
El jugador es adicto, trata de ser el último jugador, luego apuesta por un nuevo regalo para vencer a todos los demás jugadores.
fuente
Top3Bot
Este bot no intenta obtener el mejor regalo posible, pero intenta obtener un regalo que se valore> = (n-3) / n, donde n es el número de regalos. En la mayoría de los casos, habrá regalos valorados tanto, y Top3Bot intentará hacerse con uno de estos, pero a él realmente no le importa cuál de ellos recibe.
fuente
__init__
falta de suself
argumento