Búsqueda de huevos de Pascua
Bot encuentra huevo antes de que conejito encuentre huevo. Bot feliz.
Visión general
¡Este es un desafío del rey de la colina en honor a la Pascua y la tradición de la caza del huevo de Pascua!
Tu bot tiene una visión de dos espacios en cada dirección, incluidas las diagonales, creando un cuadrado de 5x5 a tu alrededor que puedes ver. ¡Está buscando huevos, y el que encuentre más huevos gana!
El tablero
El tablero consistirá en o
s, que son huevos de Pascua, #
s, que son paredes, *
s, que son otros jugadores, y s, que son espacios vacíos.
- Será un cuadrado con longitud de borde
(number of entries) * 3
. - Estará rodeado de muros.
- Dentro de las paredes habrá una variedad de paredes de líneas rectas colocadas al azar
#
, que tendrán una longitud aleatoria entre 2 y 10 inclusive. Habrá(number of entries) * 3
de ellos. - Los huevos se colocarán al azar. Habrá
(number of entries) * 4
de ellos, y solo se generarán encuadrados en blanco ( ).
- Debe haber al menos 7 entradas para que el proceso de generación de la placa funcione correctamente.
Aquí hay un JSFiddle que generará un tablero aleatorio para que lo pruebe. Aquí hay un ejemplo, con (number of entries) = 7
:
#####################
# o ##
# # o ##
# #o ###### ##
###### # ##
## o # # ##
## o# #o# o o##
## #o # # o # #
## # o # # # #
## ## # # o # #
## # # o # # #
## # o # ## # # #
## # # # #
# o # ## # #
# o oo ##o #
#o ####### oo ## #
# # # #
# o o o# #
# o #### o o#
# #
#####################
Después de que se genera el tablero, cada jugador se coloca en un cuadrado aleatorio (espacio vacío).
Entrada
Tomarás seis líneas de entrada. Las primeras cinco líneas son su campo de visión (los espacios fuera de los límites del tablero estarán representados por X
, y el espacio intermedio siempre será *
usted), y la sexta línea estará vacía (al principio).
Salida
Saldrá tres líneas. Primero, la dirección en la que quieres moverte:
1 2 3
8 YOU 4
7 6 5
(9 es un no-op si no quiere moverse), segundo, uno de A
tack, C
onza u otro N
(esto se explicará en profundidad pronto), y la tercera línea será cualquier cadena de longitud hasta 1024 Esta será la memoria de tu bot. Puede usarlo para lo que desee, o puede dejarlo en blanco. Esta memoria será la sexta línea de entrada a su programa en la próxima ejecución.
Se ignoran todas las líneas de salida adicionales, y si solo hay una línea, se supone que la segunda está en blanco.
Moviente
El siguiente proceso se utiliza para determinar dónde se mudó:
- Si, cuando te mueves, terminas en un espacio vacío (
), tu jugador se coloca en ese espacio.
- Si terminas en una pared (
#
), tu movimiento es ignorado y pierdes tu turno. - Si terminas en un huevo (
o
) o en un jugador (*
), esta información se almacena y se usará después de que todos se hayan movido.
Después de que todos se han movido, se resuelven las ambigüedades.
Si hay dos jugadores que han aterrizado en el mismo espacio, ¡se produce una pelea! Aquí es donde entra A
/ C
/ N
para jugar. A
ttack supera a otro N
(ataque normal), otro N
supera a un C
kilo (no se puede contrarrestar nada) y C
onza supera a un A
segundo (contraataque). El jugador que gana esta pelea se queda en su casilla, y el jugador que pierde vuelve a la casilla original en la que comenzó. En caso de empate, ambos jugadores vuelven a donde estaban.
Si un jugador perdido o empatado vuelve a donde estaba y hay otro jugador allí, no hay pelea y el otro jugador también volverá a su espacio original. Si este espacio tiene otro jugador, ese jugador regresa, y esto continúa hasta que todos los jugadores estén en espacios diferentes.
Si hay tres o más jugadores en un espacio, todos vuelven a sus posiciones originales.
Si algún jugador todavía está parado sobre un huevo ...
- Si el jugador elige
A
, el huevo se destruye. - Si el jugador elige
C
, no pasa nada y el jugador vuelve a su espacio original. - Si el jugador elige
N
, ¡el jugador recoge el huevo! La puntuación del jugador se incrementa en uno y el huevo se elimina.
Idiomas
Puede usar cualquier idioma que esté disponible gratuitamente en Windows, OSX y Linux, para garantizar la equidad entre cada concursante. Si el código no se puede ejecutar libremente pero puede compilarse o empaquetarse en un formato que sí lo es, incluya este formato en su respuesta también. Idealmente, si puede compilar su código en un lenguaje más común (es decir, CoffeeScript -> JavaScript), hágalo.
Puntuación
Su puntaje será el número promedio de huevos que recolecta de cada diez carreras. Una carrera termina cuando se recogen todos los huevos o cuando (number of entries * 25)
han pasado los turnos. Me aseguraré manualmente de que sea posible alcanzar todos los huevos para cada mapa (generando mapas continuamente hasta que todos los huevos sean accesibles).
Marcador
Se agregará un marcador cuando se cumplan todas las siguientes condiciones:
- Se han enviado al menos siete entradas válidas con un puntaje positivo o cero (sin voto negativo)
- Han transcurrido al menos 48 horas desde la creación de este desafío (UTC 14:23)
Las reglas no cambiarán durante este período previo al concurso, excepto para agregar aclaraciones donde una regla no estaba clara. Una vez que se coloca el marcador, el programa de prueba también se publicará aquí para que pueda probar sus entradas. El código de prueba para esto todavía está en progreso, pero es jugable y funciona. Aquí está el repositorio de GitHub.
fuente
9
, nunca puede ser atacado de manera significativa. Si otro jugador (B) sube a la casilla de ese jugador y gana, A volverá a su casilla original (que es la misma). Pero ahora hay un choque porque A y B están allí, por lo que B tiene que volver a su propio cuadrado. Por lo tanto, el resultado es independiente de la pelea real, B siempre regresa al cuadrado inicial y A siempre se queda. Eso me permitiría escribir un tanto que podría ayudar a otra presentación al bloquear un camino para todos los demás.Respuestas:
Cart'o'Gophers
Aquí hay otra presentación, y esta en realidad está destinada a ser competitiva. De nuevo, está en Ruby. Así que ejecútalo con
ruby cartogophers.rb
. Esto tardó mucho más de lo esperado ...Este bot recuerda lo que ha visto antes e intenta construir un mapa más grande en cada turno. Luego usa una búsqueda de amplitud para el huevo y las cabezas más cercanas de esa manera. Si no se puede alcanzar un huevo en el mapa actual, el bot se dirige al borde abierto más cercano de su mapa (para expandir el mapa rápidamente en una dirección en la que aún puede moverse).
Este bot aún no tiene el concepto de otros bots y tampoco tiene una estrategia de lucha. Como no he encontrado una forma confiable de determinar si mi mudanza ha sido exitosa, esto puede causar algunos problemas. Simplemente siempre asumo que el movimiento ha sido exitoso, por lo que si no se trata de parches nuevos, se cargarán en el mapa en los lugares incorrectos, lo que puede o no ser perjudicial para la búsqueda de caminos.
El bot usa la memoria para almacenar el mapa y su nueva posición en el mapa (suponiendo que el movimiento sea exitoso). El mapa se almacena sin saltos de línea, comprimido y codificado en base64 (junto con el número de filas del mapa, para que los saltos de línea se puedan volver a insertar). Esta compresión reduce el tamaño a aproximadamente un tercio del mapa sin comprimir, por lo que con una sombra de más de 1000 bytes, podría almacenar un mapa de aproximadamente 3000 celdas, que corresponde aproximadamente a explorar completamente un mapa con 18 bots. Mientras no haya tantas presentaciones, no creo que pueda molestarme en encontrar una solución para ese caso.
Después de algunas pruebas en 5dumbbot
sy 1naivebot
(mi otra presentación), tuvo un desempeño realmente malo (como 1 o 2 huevos) o superó a los demás por un margen considerable (7 a 9 huevos). Puedo pensar en una mejor estrategia de lucha y cómo puedo determinar si realmente me moví o no. Ambos podrían mejorar algo el puntaje.Ah, y si te estás preguntando sobre el nombre del bot, deberías leer The Order of The Stick ( último panel de este cómic ).
EDITAR: Hubo algunos errores al detectar los bordes del mapa descubierto. Ahora que los he solucionado, este bot siempre obtiene puntajes de aproximadamente
20
contra 5dumbbot
sy 1naivebot
. Eso es más como eso! Si agrega$stderr.puts map
a mi bot ahora, realmente puede ver cómo descubre sistemáticamente el mapa y mientras tanto recoge todos los huevos. También he decidido elegir enA
lugar deN
no pisar un huevo, para reducir la probabilidad de volver a la celda original del bot (que en parte arruina el mapa).(No funciona tan bien contra 6
naivebot
s, especialmente porque es muy posible terminar en un "punto muerto" con otro bot cuando ambos quieren agarrar un huevo repetidamente y elegirN
. Tengo que pensar en eso ... )fuente
Conejito de java
Este conejito aún no ha terminado de crecer (todavía planeo hacer cambios), pero es un punto de partida por ahora. Busca el huevo más cercano y se dirige hacia él. No hay detección de muro o detección fuera de límites (todavía). Él irá a recoger el huevo en el que aterriza, pero de lo contrario intentará empujar y atacar cualquier otra cosa. Si no hay huevos cercanos, comenzará a seguir al conejito más cercano. Pueden saber algo que él no sabe. De lo contrario, simplemente elegirá una dirección aleatoria para caminar. Y es bastante olvidadizo (no usa la variable de memoria).
Planes para avanzar:
Actualización 1 Mi conejito seguirá a otros conejos si no ve un huevo. También refactorizó el código "buscar el huevo más cercano" en su propio método.
fuente
N
aiveBot (en Ruby)Aquí hay un bot muy simplista para poner en marcha el huevo (queremos llegar a esos 7 envíos rápidamente, ¿verdad?). Mi Ruby no es muy idiomático, por lo que este código puede hacer que los rubíes adecuados se encojan de dolor. Lea bajo su propio riesgo.
Corre con
ruby naivebot.rb
.Simplemente estoy codificando algunos casos, donde un huevo es visible y no está obstruido por una pared. Ni siquiera va por el huevo más cercano, sino que elige el primer movimiento que tiene sentido. Si no se encuentra ese huevo, el bot realiza un movimiento aleatorio. Ignora a todos los demás jugadores y nunca ataca ni contraataca.
fuente
WallFolower
(juego de palabras deliberado) en Python 3 :
Se mueve a un huevo si hay un huevo a la vista, pero solo si está más cerca de ese huevo que otro robot. Si hay un empate en la distancia, lo intenta de todos modos. De lo contrario, sigue un muro LH (actualmente no está bien implementado).
Todavía necesita trabajo en el muro, pero publicaré esto aquí de todos modos.
fuente
sys.exit(0)
aexit(0)
? Además, necesito trabajar en esto (en este momento, se supone que es un ``), pero realmente no tengo tiempo. Cuando tenga tiempo, iré a arreglar esto.