Test Driver • Discusión de desafío • Enviar aventurero
Varios aventureros rivales están atacando las ruinas en busca de tesoros, pero solo pueden transportar tanto a la vez y tienen sus límites de resistencia. Quieren obtener el tesoro más valioso y salir antes de cansarse demasiado para continuar. Están tratando de hacerse lo más ricos posible de sus travesuras de saqueo.
Jugabilidad
Cada aventurero comienza en la primera habitación de la mazmorra con 1000 puntos de resistencia y 50 kg de espacio en su mochila.
El juego funciona por turnos, con todos los jugadores resolviendo sus turnos simultáneamente. Cada turno, puedes realizar una de las siguientes acciones:
- Pasar a la siguiente habitación.
- Moverse a la sala anterior.
- Oferta de resistencia para tomar un tesoro.
- Suelta un tesoro.
Moverse entre las habitaciones requiere 10 de resistencia, más 1 por cada 5 kg actualmente en su mochila, redondeado. Por ejemplo, un aventurero que lleva 3 kg de tesoro requiere 11 resistencia para moverse y uno que lleva 47 kg requiere 20 resistencia para moverse.
La caída del tesoro requiere 1 resistencia, independientemente del tesoro que se caiga.
Al salir de las ruinas, el jugador no tomará más turnos.
Si un jugador no puede realizar ninguna de estas acciones (debido a la escasez de resistencia o la ausencia de tesoros), su aventurero muere de agotamiento, derramando su tesoro en la habitación actualmente ocupada. Del mismo modo, si un jugador intenta realizar una acción no válida, su aventurero será asesinado por una trampa, lo que provocará el mismo derrame del tesoro.
Ofertas
La oferta mínima para un tesoro es 1 resistencia por 1 kg que pesa el tesoro. También puede ofertar puntos de resistencia adicionales para tener más probabilidades de obtener el tesoro. La resistencia que se ofertó se consume sin importar cuál sea el resultado.
En el caso de que varios jugadores hayan hecho una oferta para tomar el mismo tesoro, el jugador que oferte más alto obtiene el tesoro. Si más de un jugador hizo la oferta más alta, ninguno de ellos recibirá el tesoro.
Condición de victoria
El jugador con el mayor valor total de tesoros es el ganador. En el improbable caso de un empate, los empates van al menor peso total, luego al menor número de tesoros, luego el valor del tesoro más valioso, el segundo más valioso, el tercero ... hasta que se rompa el empate. En el caso casi imposible de que todavía haya un empate en este punto, el conductor de la prueba dice "atorníllelo" y el ganador se determina arbitrariamente.
En el contexto del torneo, los jugadores serán clasificados con el primer lugar recibiendo 10 puntos, el segundo lugar con 9 puntos, el tercer lugar con 8 puntos, etc., con jugadores muertos y aventureros sin tesoros que obtengan 0 puntos.
Sobre las ruinas
- Cada habitación contiene inicialmente entre y tesoros. (Donde es el número de habitación)
- Hay arbitrariamente muchas habitaciones, limitadas solo por la resistencia de los aventureros y su disposición a explorar.
- Cada tesoro tendrá un valor monetario (en $ enteros) y un peso (en kg enteros).
- Los tesoros tienden a ser más valiosos y abundantes a medida que profundizas en las ruinas.
- Las fórmulas específicas para generar tesoros son las siguientes: (usando notación para tiradas de dados)
- El peso se genera primero usando la fórmula (mínimo de 1)
- El valor del tesoro se genera a través de (donde es el número de habitación es el peso)
Información visible para los jugadores
En cada turno, los jugadores obtienen la siguiente información:
- El número de la habitación en la que se encuentran actualmente. Esto está indexado en 1, por lo que conceptualmente la salida está en la "habitación 0"
- Una lista de tesoros actualmente en la sala.
- Una lista de otros jugadores que también están actualmente en la sala.
- Tu inventario actual de tesoros
- Tu nivel de resistencia actual
Codificación
El controlador de prueba se puede encontrar aquí .
Debe implementar una subclase de esta Adventurer
clase:
class Adventurer:
def __init__(self, name, random):
self.name = name
self.random = random
def get_action(self, state):
raise NotImplementedError()
def enter_ruins(self):
pass
Solo necesita anular el get_action
método. enter_ruins
se ejecuta antes de que comience un juego y es tu oportunidad de preparar lo que quieras tener listo para el juego. No necesita anular __init__
, y realmente no debería . Si se __init__
bloquea, será descalificado.
get_action
recibe un único argumento que es un namedtuple
con los siguientes campos (en este orden, si prefiere la desestructuración):
room
: el número de la habitación en la que estás actualmentetreasures
: la lista de tesoros en la salaplayers
: la lista de otros jugadores en la sala. Solo obtienes el nombre del jugador de esta manera, por lo que no sabes qué bot los controla o su inventario / resistencia.inventory
: la lista de tesoros en tu mochilastamina
: tu nivel de resistencia actual
Este objeto además proporciona dos propiedades de utilidad:
carry_weight
: el peso total de todos los tesoros que llevastotal_value
: el valor total de todos los tesoros que llevas
Las listas treasures
y inventory
contienen namedtuple
s con estos atributos:
name
: el nombre del tesoro (para fines cosméticos)value
: el valor monetario del tesoro en $.weight
: el peso del tesoro en kg
get_action
debería devolver uno de los siguientes valores / patrones:
'next'
o'previous'
para pasar a las habitaciones siguientes / anteriores'take', <treasure index>, <bid>
(sí, como una tupla, aunque cualquier secuencia técnicamente funcionará también) para ofertar por el tesoro en el índice dado en la lista de tesoros de la sala. Ambos argumentos deben ser enteros. Las carrozas se redondearán hacia abajo.'drop', <inventory index>
para soltar el tesoro llevado encontrado en el índice dado. El índice debería (naturalmente) ser un número entero.
Otras restricciones
- Solo puede usar la instancia aleatoria que se le proporcionó durante la inicialización para la pseudoaleatoriedad.
- Cualquier otra cosa que pueda introducir el no determinismo conductual no está permitida. La intención aquí es hacer que los bots se comporten de manera idéntica cuando se les da la misma semilla para ayudar a probar nuevos bots (y potencialmente errores en el controlador de prueba). Solo la radiación cósmica debería causar cualquier desviación / no determinismo.
- Tenga en cuenta que los códigos hash son aleatorios en Python 3, por
hash
lo que no está permitido usarlos para tomar decisiones.dict
s están bien incluso cuando se usa el orden de iteración para las decisiones, ya que se ha garantizado que el orden es consistente desde Python 3.6.
- No puede eludir el controlador de prueba utilizando
ctypes
hacks oinspect
stack vudú (o cualquier otro método). Hay algunas cosas impresionantemente aterradoras que puede hacer con esos módulos. Por favor no lo hagas.- Cada bot se guarda en una caja de arena razonablemente bien a través de copias defensivas y la inmutabilidad natural de
namedtuple
s, pero hay algunas lagunas / vulnerabilidades incompatibles. - Se puede usar otra funcionalidad de
inspect
yctypes
siempre que ninguna se use para burlar la funcionalidad del controlador. - No se permite ningún método de capturar instancias de los otros bots en tu juego actual.
- Cada bot se guarda en una caja de arena razonablemente bien a través de copias defensivas y la inmutabilidad natural de
- Los bots deben operar solos y no pueden coordinarse con ningún otro bot de ninguna manera para ningún propósito. Esto incluye la creación de dos bots con objetivos diferentes, de modo que uno se sacrifique por el éxito del otro. Una vez que haya más de 10 competidores, no se te garantizará tener los dos bots en el mismo juego y los nombres de los aventureros no dan ninguna indicación de la clase de bot, por lo que este tipo de estrategias son limitadas de todos modos.
- Actualmente no existe una restricción estricta en el tiempo de ejecución, sin embargo, me reservo el derecho de restringirlo en el futuro si los torneos comienzan a tomar demasiado tiempo. Sea razonable e intente mantener el procesamiento por turnos por debajo de 100 ms , ya que no preveo la necesidad de restringirlo por debajo de ese umbral. (Los torneos se ejecutarán en aproximadamente 2 horas si todos los bots tardan unos 100 ms por turno).
- Su clase de bot debe tener un nombre único entre todas las presentaciones.
- Es posible que no recuerdes nada entre juegos. (Sin embargo, usted puede recordar las cosas entre turnos )
- No edite sys.modules. Cualquier cosa fuera de las variables de instancia debe tratarse como una constante.
- No puede modificar el código de ningún bot mediante programación, incluido el suyo.
- Esto incluye eliminar y restaurar su código. Esto es para simplificar la depuración y los torneos.
- Cualquier código que haga que el controlador se bloquee será descalificado de inmediato. Si bien se detectarán la mayoría de las excepciones, algunas pueden pasar y los valores predeterminados no se pueden detectar. (Sí, puedes segfault en Python gracias a
ctypes
)
Envíos
Para facilitar el raspado de respuestas, indique el nombre de su bot en la parte superior de la respuesta con un #Header1
y asegúrese de que su respuesta incluya al menos un bloque de código (solo se usará el primero en su respuesta). No necesita incluir ninguna importación o cadena de documentos, ya que el raspador los agregará automáticamente.
Estaré más inclinado a votar las respuestas con explicaciones detalladas y comprensibles. Es probable que otros se comporten igual.
Hablando en términos generales, su respuesta debe tener el siguiente formato:
# Name of Bot
Optional blurb
#imports go here
class BotName(Adventurer):
#implementation
Explanation of bot algorithm, credits, etc...
(rendido como)
Nombre del bot
Comentario opcional
#imports go here class BotName(Adventurer): #implementation
Explicación del algoritmo bot, créditos, etc.
Ejecutar el controlador de prueba localmente
Necesitará Python 3.7+ y le recomiendo que también instale a tabulate
través de pip. Raspar esta página para envíos también requiere lxml
y requests
. También debe usar un terminal con soporte para escapes de color ANSI para obtener mejores resultados. Puede encontrar información sobre cómo configurar esto en Windows 10 aquí .
Agregue su bot a un archivo en un subdirectorio dentro del mismo directorio que ruins.py
( ruins_bots
de manera predeterminada) y asegúrese de agregarlo from __main__ import Adventurer
en la parte superior del módulo. Esto se agrega a los módulos cuando el raspador descarga su envío, y si bien es definitivamente hacky, esta es la forma más sencilla de asegurarse de que su bot tenga acceso correctamente Adventurer
.
Todos los bots en ese directorio se cargarán dinámicamente en tiempo de ejecución, por lo que no se necesitan más cambios.
Torneo
El vencedor final se determinará en una serie de juegos con hasta 10 bots en cada juego. Si hay más de 10 envíos totales, los 10 mejores bots se determinarán dividiéndolos sistemáticamente en grupos de 10 hasta que cada bot haya jugado (exactamente) 20 juegos. Los 10 mejores bots serán seleccionados de este grupo con puntajes de reinicio y jugarán juegos hasta que el primer lugar haya alcanzado una ventaja de 50 puntos sobre el segundo lugar o hasta que se hayan jugado 500 juegos.
Hasta que haya al menos 10 presentaciones, los espacios vacíos se llenarán con "borrachos" que deambulan aleatoriamente por las ruinas y toman (y ocasionalmente arrojan) tesoros aleatorios hasta que se quedan sin resistencia y tienen que ir directamente a la salida.
Los torneos se volverán a ejecutar semanalmente si hay nuevos envíos. Este es un desafío KOTH abierto sin fecha de finalización establecida.
Tabla de clasificación
Desde el 4 de mayo de 2019 a las 4:25 PM MDT: (2019-05-04 4:25 -6: 00)
Seed: K48XMESC
Bot Class | Score | Mean Score
--------------+---------+--------------
BountyHunter | 898 | 7.301
Scoundrel | 847 | 6.886
Accountant | 773 | 6.285
Ponderer | 730 | 5.935
Artyventurer | 707 | 5.748
PlanAhead | 698 | 5.675
Sprinter | 683 | 5.553
Accomodator | 661 | 5.374
Memorizer | 459 | 3.732
Backwards | 296 | 2.407
Actualización - 15 de abril: un par de actualizaciones / aclaraciones de reglas
Actualización - 17 de abril: prohibición de un par de casos extremos notables de acciones nefastas como modificar el código de otros bots.
Actualización: 4 de mayo: recompensa otorgada a Sleafar por destruir absolutamente al revés. ¡Felicidades!
fuente
pip
instalado y encendidoPATH
(que es el predeterminado para las instalaciones más nuevas AFAIK), desde Windows puede ejecutarlopip install modulename
en el símbolo del sistema. Para otras circunstancias (que no conozco), vaya a pip , busque el módulo necesario y elija una opción.Respuestas:
Contador
El contador es una persona muy reacia al riesgo. Le gusta estar seguro de que lo que hace realmente es la mejor opción en la situación dada. Entonces, se establece un objetivo, y solo recoge tesoros si sus cálculos muestran que esto lo coloca en el camino correcto hacia ese objetivo. Sin embargo, es muy burocrático y no le gusta dejar caer objetos que ya había decidido que quería; cualquier intento de enseñarle a hacerlo ha resultado hasta ahora en que el Contador deje caer un artículo y luego lo recoja nuevamente inmediatamente después.
Posiblemente para continuar.
fuente
Acomodador
Basado libremente en mi otro bot LightWeight. Donde el bot LightWeight era simple, este bot es mucho más complejo para acomodar interacciones con otros bots: benignos y deliberadamente distruptivos.
En primer lugar, este bot correrá a una habitación asignada al azar y luego intentará ofertar por el mejor tesoro de relación valor / peso, si hay otros jugadores en la sala, suponga que también ofertará, por lo que ofertará por el segundo mejor tesoro. Si esa oferta falla, entonces en el siguiente turno oferte por el siguiente mejor tesoro.
Una vez que una oferta fue exitosa, repita la oferta para el mejor / segundo mejor hasta que no existan más tesoros en la sala y luego muévase más profundo en la ruina
Para cada habitación, ingrese a la ruina, repita la oferta por el mejor / segundo mejor hasta que no existan más tesoros en la habitación, luego avance más en la ruina o si detectamos que no podemos ir más profundo, cambie al estado 'Salir' y comience a caer en el peor tesoro hasta que podamos garantizar que podemos salir vivos de la ruina.
Cuando esté en estado de salida, verificaremos si podemos agregar 1 kg de tesoro y aún así salir con vida, de ser así, intentaremos ofertar por un tesoro de 1 kg, de lo contrario, nos dirigiremos a la habitación anterior.
Su rendimiento es bastante variable ... sin embargo, normalmente será uno de los tres primeros bots.
fuente
Sprinter
Similar al Diver, Sprinter profundiza y recoge los mejores artículos en su camino de regreso.
Sprinter profundiza, luego calcula una puntuación para cada tesoro y recoge cualquier cosa por encima de un cierto umbral. Este umbral depende de la habitación en la que se encuentra actualmente porque cuesta más sacar artículos de habitaciones más profundas en las ruinas.
Todavía tengo 2 optimizaciones con respecto a "luchar por el tesoro" que están previstas para los próximos días.
17.04 .: Scoundrel se volvió demasiado inteligente, Sprinter decidió empujarlo a una trampa inicialmente. Quería matar a cualquier bot que intentara invocar a Sprinter, pero desafortunadamente el controlador de prueba no maneja las excepciones que ocurren en init. Entonces, la próxima solución para Scoundrel es bastante fácil ...
fuente
Planifica con anticipación
Utilicé los mejores / peores trozos de cálculo de la respuesta de Artemis Fowl , pero la lógica de elección es completamente de mi propio diseño y desde entonces ha sido modificada para incluir algunos factores adicionales, como los tesoros vistos en habitaciones anteriores (para minimizar recoger un tesoro, solo para retroceder, soltarlo y recoger otra cosa).
Las empresas de bot tan profundas como cree que es razonablemente seguro hacerlo (este cálculo efectivamente funciona para bucear a una profundidad específica, pero tiene la flexibilidad de manejar otros valores iniciales de resistencia), recolecta artefactos (priorizando el alto costo y el bajo peso), luego comienza a retirarse una vez que determina que no puede llevar más.
A la salida recogerá cualquier tesoro adicional que vea que determine que aún puede llevar con seguridad a la salida. Incluso dejará caer artefactos ya almacenados si el nuevo es un mejor negocio y no provocará agotamiento. Si tiene espacio en su mochila, recogerá el nuevo tesoro antes de dejar caer el de menor calidad, minimizando la lucha con otros bots.
fuente
__init__
función ya está implementada, no necesita anularla.Artyventurer
¡Derrota a los borrachos por alrededor de $ 1000! No se me ocurrió un nombre creativo, pero aquí están:
A veces, la mayor parte del código aquí no hace nada (al menos cuando lo pruebo con Drunkards), el programa solo (intenta) encontrar el mejor movimiento, incluido el procesamiento para situaciones en las que intenta no ponerse. Algunos de ellos nunca pueden ejecutarse, solo están allí, así que puedo jugar con los números, lo que probablemente aún se puede mejorar.
Explicación
if state.inventory ... worsti = None
Encuentre el artículo "peor" en el inventario, es decir, el artículo que tiene la relación más baja de valor a peso. Almacena
worsti
, que contiene el índice, su valor y su peso, como una tupla, oNone
si no hay artículos en el inventario.if self.drop ... return 'drop', worsti[0]
Si le dije que soltara este turno el último turno (ver más abajo), y puede, suelte el elemento "peor" como se calculó anteriormente.
extra = ... * state.room
Calcule cuánta resistencia le quedaría si le dijera que retroceda ahora.
if extra > CONTINUE_IN:\ return 'next'
Si es más que CONTINUE_IN, regrese
'next'
.if extra < 0 and worsti:\ return 'drop', worsti[0]
Si es menos de
0
, suelte el peor elemento.if extra < state.room:\ return 'previous'
Si es menor que el número de la habitación (no puede llevar más tesoros), regrese.
if state.treasures: ... bestt = None
Encuentre el mejor tesoro para llevar, similar al peor artículo en el inventario anterior. Guárdelo en
bestt
.if extra > 0 and bestt: ... return 'take', bestt[0], bid
Con los números actuales, esto se ejecuta cada vez que llegamos tan lejos y hay un tesoro disponible. Si es seguro tomar el "mejor" tesoro, lo hace. Su oferta es la mínima, o una más que eso si alguien está presente.
if bestt and worsti: ... return 'take', bestt[0], bid
Con los números actuales, este bloque de código nunca se ejecutará, porque el bloque de código anterior tiene una condición más amplia. Esto se ejecuta si hemos llegado tan lejos y hay dos tesoros en mi inventario y en la habitación. Si el "mejor" tesoro en la habitación es más valioso que el "peor" tesoro en mi inventario, y sería seguro intercambiarlos en los próximos dos turnos, lo hace.
return 'previous'
Si nada de esto sucede, simplemente regrese.
Actualización 16/04/19:
Medidas contra el sinvergüenza. Esto se convertirá en una guerra de ofertas :(
Actualización posterior 16/04/19:
Revertido anterior, en cambio cambia aleatoriamente cualquier otro elemento al encontrar el mejor, por ejemplo.
[1, 2, 3, 4, 5, 6] → [2, 1, 3, 4, 6, 5]
. Debería ser más difícil de copiar :).Actualización 17/04/19:
Revertido anterior, en su lugar borra su propio código fuente . Hace esto en
__init__
lo que siempre será antesScoundrel.enter_ruins
, y así evitará que Scoundrel lo cargue. Reemplaza su código cuandoget_action
se llama por primera vez, para que esté listo para la próxima vez. CORREGIDO, sinvergüenza ahora muere a la llegada.Actualización posterior 17/04/19:
Revertido anteriormente, en su lugar, reemplaza su
sys.modules
entrada con el módulo matemático, de modo que cuando Scoundrel intenta cargarlo, carga el módulo matemático. :)Además, me acabo de dar cuenta de que la resistencia del movimiento era 10 + peso / 5 , así que traté de arreglar eso.
Actualización posterior 17/04/19:
Ahora incluye ajo de las dos actualizaciones anteriores.
Actualización 18/04/19:
Jugueteando con números y cálculos, ahora obtiene $ 2000 - $ 3000.
Actualización adicional 18/04/19:
Se eliminó el ajo de limpieza de archivos, ya que se ha prohibido, se agregó ajo nuevo que se asegura de
'draco'
que no sea responsable de su funcionamiento, si es que solo regresaprevious
en su primer turno. Los resultados han llevado una inmersión misteriosa a $ 1200- $ 1800, que estoy investigando.fuente
El sinvergüenza
El canalla trabaja principalmente para interferir con otros concursantes. Actualmente interfiere con Sprinter, Artyventurer y Contador (esta lista crecerá con el tiempo, siempre que sea lo mejor para el sinvergüenza). Lo hace imitando a los otros bots y luego subastando, cortando o luchando por las reliquias. Como tal, es poco probable que esta entrada alguna vez domine la tabla de clasificación y, en cambio, funcione como una fuerza de deterioro. La revisión actual en el momento de esta publicación lo coloca en el segundo lugar con un puntaje promedio de aproximadamente 7.
El sinvergüenza frustra los intentos de otros robots de modificarse para defenderse del sinvergüenza al ejecutar directamente el código de los demás participantes como una copia clon indistinguible. Los problemas con las importaciones que resultaron en entrantes duplicados se resolvieron mediante la creación de clones a través de Reflection (editar guerras que involucren detalles finos de determinación matemática no es deseable desde el punto de vista de Stack Exchange, pero daría como resultado el mismo resultado). KOTH desafíos también tienen un historial de permitir esto.
Sinvergüenza reemplaza a los Teamsters para mantener a los Teamsters por el hecho de haber sido interesantes. Después de esta edición, Teamsters ya no debería ser raspado por el controlador.
Actualización 17/04/2019: nuevas medidas de contador.
Los Teamsters (ilegalizados)
¡Pero siéntase libre de correr localmente donde no hay más de 8 concursantes!
Esta entrada (aunque ahora es explícitamente inválida) es, de hecho, dos bots, y el controlador felizmente los raspará a ambos y los agregará a la lista de concursantes (¿por qué hurra Python?)
Fase 1:
1. Si no hay un tesoro que pese menos de 3 en un piso, se mueve hacia abajo
2. Como está casi garantizado que será el último aventurero en regresar a la superficie, todo lo que tiene que hacer es encontrar a alguien.
Fase 2:
El nombre de los tesoros en realidad fue útil para ayudar a que la lógica no se cargue en la basura del piso 25 y se vaya temprano, ya que no había forma de comunicarse entre los dos bots (y TeamsterA siempre se encontraría en una habitación con otra persona antes) TeamsterB había regresado).
La siguiente conclusión lógica: crear un ejército
En teoría, esto podría usarse para sondear las profundidades y adquirir tesoros desde tan profundo como la Sala 98, sin embargo, ya que eso requeriría más de 2 bots, la lógica que comprende esos bots se volvería cada vez más compleja, y como estoy seguro de que esto es una presentación ilegal por violar una regla no escrita, por lo que no voy a molestarme.
Efectivamente
A
espera a los 30,B
espera a los 50 ... sen
sumerge a 98, recoge un tesoro, se mueve a 97, lo deja caer (y luego muere),n-1
lo levanta y se mueve a 96 ... loC
deja caer (muere), loB
recoge arriba y se mueve a 30, lo deja caer (muere),A
lo levanta y vuelve a la salida.Calculo que esto tomaría 11 bots.
Sin embargo, no vale la pena hacerlo a menos que pueda recuperar alrededor de 4 tesoros de esa profundidad para competir con entradas como PlanAhead o Artyventure, debido a la escala entre los costos de resistencia para mover y el valor promedio de los tesoros.
Resultados de muestra
Raramente tiene un puntaje inferior a $ 4000, ocasionalmente alcanza un valor de $ 6000.
fuente
Hacia atrás
Porque opera en reversa
¿Por qué se llama al revés?
Porque tomé The Accountant y traté de hacer que funcionara su lógica de modo que se sumergiera profundamente, luego recogiera su botín preferido al salir (al revés del Contador).
Al final, todavía recoge gran parte de sus premios en el camino (recogiéndolos antes de que lo hagan los buscadores tradicionales dentro y fuera, operando hacia atrás para todos los demás), pero es mucho más selectivo sobre los que toma, aunque todavía recoge cosas en su camino de regreso.
El resultado final es que la resistencia se conserva en el camino al tiempo que se sigue dando prioridad a los tesoros de alto valor, y luego se aprovecha de un cambio profundo y una fácil selección en el camino de regreso. Se sabe que al revés se acumulan tesoros desde lugares como la Sala 41 (y durante el desarrollo entraría y luego saldría inmediatamente de la Sala 42).
fuente
Cazarrecompensas
El método simple es el mejor. Agarra tesoros valiosos y ligeros mientras profundizas lo más posible. Consigue tesoros menos valiosos en el camino de regreso.
fuente
Ligero
Un bot simple que aún funciona bastante bien.
Después de aventurarse en las ruinas (actualmente 21 habitaciones), tomará el mejor tesoro de la habitación que solo pesa 1 kg (de ahí el nombre del bot) y es más valioso que el tesoro menos valioso del inventario. Si el inventario está lleno, suelta el tesoro menos valioso. Si no se selecciona otra acción, muévete a las ruinas. Si estamos en el límite de nuestra resistencia para poder salir vivos, entonces dirígete a la salida
fuente
dumping
en elenter_ruins
método. Esto realmente lo recordará entre los juegos y no funcionará en el juego 2. Técnicamente no está permitido, pero agregué la regla en este momento (lo olvidé antes pero era mi intención), así que reduciré un poco la holgura. : PMemorizador
Puedo enviar bots a mi propio KotH, ¿verdad?
Este bot se sumerge en la habitación 30 y recuerda todos los tesoros que ha visto. En ese punto, comienza su caminata de regreso a la entrada, tratando de tomar buenos tesoros que recordaba haber visto en habitaciones anteriores.
Esperaba que fuera mejor. Las posibles mejoras pueden provenir de una mejor planificación y de ser más dinámico sobre qué sala deja de bucear y de estar más dispuesto a explorar opciones de respaldo.
Actualización: ahora toma tesoros de 1 kg por valor de $ 60 o más en el camino.
fuente
[Turn 072] Ryu Ridley (Memorizer) collapsed in the doorway to room #1 and died of exhaustion
Ponderer
Creo que es bastante similar a Memorizer en que utiliza el conocimiento de las habitaciones visitadas para elegir qué habitaciones y tesoros recoger en el camino de regreso a la salida, sin embargo, se ha derivado de forma independiente.
Este bot corre hasta una habitación profunda al azar que toma un registro de los tesoros encontrados en el camino. Una vez en la habitación objetivo, reflexionará sobre la selección ideal de tesoros para regresar a la salida. Cada turno meditará de nuevo para determinar la mejor selección de tesoros más probable.
Actualmente hay un algoritmo simple (potencia inversa del número de la habitación) que produce el número supuesto de tesoros tomados (o se habrán tomado cuando los visitó este bot) para cada habitación, por lo que estos tesoros se ignoran al reflexionar sobre qué tesoros / habitaciones tomar de. Tengo ideas para otros algoritmos más avanzados para modelar qué tesoros quedan. Pero tendré que ver si el beneficio lo vale.
fuente
Acaparador
El Acumulador permanece en una habitación hasta que haya tomado todos los tesoros de la habitación (o calcula que no tiene suficiente resistencia para seguir tomando / moviéndose). Cuando todos los tesoros se hayan ido, si el bot puede avanzar con seguridad, continuará y continuará el proceso de tomar todo el tesoro.
fuente
Backwards
's,Sprinter
' s yMemorizer
'funciona; porque saben cuáles son los valores relativos de cada tesoro que ven.Buzo
(No puedo probar en este momento, así que avíseme si esto está roto).
El mejor tesoro es más profundo en las ruinas, así que sumérgete profundamente y luego toma lo que podamos al salir.
fuente
diving
definido?Jacob the Orphan (Diver) was sliced in half by a swinging blade trap.
No estoy seguro de lo que hiciste mal, pero eso significa 'retorno no válido' AFAIK.