Escasez de comida en Snakepit
Por primera vez en 35 años, la serpiente se está quedando sin comida. Las serpientes habitantes ahora tienen que luchar entre sí para sobrevivir a esta escasez de alimentos. ¡Solo una serpiente puede estar en la parte superior de la cadena alimentaria!
Tabla de clasificación
¡Todavía no aquí!
Última actualización el 24 de febrero
Enlace a visualizaciones de los últimos partidos
Descripción
Si desea luchar por las últimas manzanas / cerezas / lo que quede, debe proporcionar una serpiente en forma de un programa que acepte una entrada dada y devuelva su próximo movimiento.
El único giro es que no estás solo en tu pozo. ¡Otra serpiente también intentará conseguir la comida rara! Pero está oscuro dentro del cajón de la serpiente, así que solo puedes verte a ti mismo y a la manzana. Chocar contra tu oponente resultará en tu muerte, al igual que morderte a ti mismo o golpear una pared. Además, debido a que las manzanas son raras en estos días, mueres de hambre si tu oponente comió lo suficiente como para alcanzar una longitud de 7.
El snakepit es un mapa bidimensional con un ancho y una altura de 15, mientras que los mosaicos más exteriores construyen un muro infranqueable:
0 1 2 . . . c d e
0 # # # # # # # # #
1 # #
2 # x #
. # #
. # #
. # #
c # #
d # #
e # # # # # # # # #
Las coordenadas están indexadas a cero, por lo que el punto donde x
estaría 12,2
.
Se llamará a su bot con dos argumentos:
- La ubicación de la comida.
- Las ubicaciones de los segmentos de su cuerpo, separados por
/
Luego debe escribir uno de los siguientes en stdout:
L
por un cuarto de vuelta a la izquierda como su próximo movimientoR
por un cuarto de vuelta a la derecha- Cualquier otra cosa para un movimiento en la misma dirección.
Ejemplo:
Projects/Snakepit> python bot.py 12,2 4,8/4,9/3,9/2,9
'R'
Projects/Snakepit>
Reglas
Su bot tiene permitido:
- Dar salida a cualquier cosa, porque cualquier cosa es un movimiento válido
- Leer / escribir archivos en su propio directorio que se encuentra en ./snakes/ThisIsYourSnake
- Ejecutar en Ubuntu 14.04 y Windows 7 (en realidad tiene que hacerlo)
Tu bot no debe:
- Leer / escribir archivos fuera de su propio directorio
- Usa recursos externos como internet
- Tener un tiempo de ejecución superior a 10 segundos por ejecución
Debe proporcionar en su respuesta:
- El código fuente del bot
- Un nombre de bot / serpiente
- (Tu propio nombre)
- Un comando para ejecutar tu bot
Si quieres hacerme la vida más fácil, proporciona una línea como
CoolSnake MyOwnName python bot.py
.
Puntuación
Tu serpiente obtiene un punto por ganar un juego contra otra serpiente. Un juego se gana en las siguientes circunstancias:
- Tu oponente se golpea a ti mismo, a ti o a una pared
- Alcanzas la longitud 7
Además, ambas serpientes mueren de hambre después de 200 ciclos.
Cada serpiente luchará 10 partidos para su supervivencia contra la otra serpiente.
Bots de ejemplo
Solo para darle una idea, le proporcionaré estos dos ejemplos de serpientes (participantes):
SneakySnake
#!/usr/bin/env python
import sys, random
def main(food, me) :
food = [int(i) for i in food.split(",")]
me = [[int(i) for i in seg.split(",")] for seg in me.split("/")]
head = me[0]
v = [head[0] - me[1][0], head[1] - me[1][1]]
if food[0] < head[0] :
vn = [-1, 0]
elif food[0] > head[0] :
vn = [1, 0]
elif food[0] == head[0] :
if food[1] < head[1] :
vn = [0, -1]
elif food[1] > head[1] :
vn = [0, 1]
if v == vn :
return "..."
elif [-v[1], v[0]] == vn :
return "R"
elif [v[1], -v[0]] == vn :
return "L"
else :
return random.choice(("R", "L"))
if __name__ == "__main__" :
print main(*sys.argv[1:3])
SneakySnake Cipher python bot.py
ViciousViper
#!/usr/bin/env python
import sys, random
def main(food, me) :
food = [int(i) for i in food.split(",")]
me = [[int(i) for i in seg.split(",")] for seg in me.split("/")]
head = me[0]
v = [head[0] - me[1][0], head[1] - me[1][1]]
vn = [food[0] - head[0], food[1] - head[1]]
if 0 not in vn :
vn[v.index(0)-1] = 0
vn[vn.index(0)-1] = vn[vn.index(0)-1] / abs(vn[vn.index(0)-1])
if v == vn :
return "..."
elif [v[0] + vn[0], v[1] + vn[1]] == [0, 0] :
return random.choice(("R", "L"))
else :
return "R" if [-v[1], v[0]] == vn else "L"
if __name__ == "__main__" :
print main(*sys.argv[1:3])
ViciousViper Cipher python bot.py
Y sus partidos:
Programa de control
Puedes encontrar el programa de control en github , junto con todos los bots y registros de partidos pasados.
Requisitos:
- Python 2 + las bibliotecas
numpy
ypillow
(puede verificar si están presentes a través depython -c "import numpy, PIL"
, si arroja errores, faltan los módulos) - Se requiere copiar la estructura de carpetas completa para que el controlador funcione
- Registre su (s) bot (s) en el
./snakes/list.txt
archivo al estilo deCoolSnake MyOwnName Command To Run My Bot
- Coloque su bot dentro de un directorio con su nombre debajo
./snakes
- ¡Ni su nombre ni el de su bot pueden contener espacios en blanco!
Uso:
python run.py [-h] [-n int] [-s int] [-l int] [-c int] [-g]
python run.py
ejecutará el torneo con todos los bots registrados en list.txt y las propiedades estándar. Las opciones avanzadas son:
-h
muestra un mensaje de ayuda-n int
rondas de batallas para cada combinación de oponentes-s int
determina el tamaño de la cuadrícula (ancho y alto)-l int
establece la longitud requerida para ganar-c int
establece el límite de ciclos-g
o--no-gifs
no crea gifs de los partidos
fuente
Respuestas:
Zen - C ++
Este Codémon no está aquí para comer sino para luchar. Él sabe que un enemigo muerto no robará sus manzanas.
Name| Author |Launch with
Zen GholGoth21 Zen.exe
Estrategia
Todos (excepto CircleOfLife) corren hacia las manzanas, pero no Zen, no siempre. Si el enemigo puede alcanzar la comida antes que él, simplemente espera en el centro (¿qué? ¿Pero qué haces aquí, CircleOfLife?). De lo contrario, Zen va a la manzana y se da vuelta mientras espera que algo suceda. De hecho, usa la manzana como cebo.
No codifiqué nada en contra de la curiosa estrategia de CircleOfLife porque solo puede ganar con mucha suerte.
El código
Este es el código completo del proyecto C ++. Cortar los 11 archivos de origen y el Makefile y compilar con
make
O descargue el archivo zip: Zen.zip
Resultados
Y algunas batallas típicas (ViciousViper vs Zen y SneakySnake vs Zen):
Editar : agrego esta batalla muy interesante contra CircleOfLife:
fuente
CircleOfLife (Java)
CircleOfLife Manu java CircleOfLife
(Compilar conjavac CircleOfLife.java
)Corre hacia el medio y se queda allí. Espero que algunas presentaciones se estrellen en su camino hacia la comida.
fuente