Bots de torneo
Cómo se diseña un bot que gana partidos de la liga F1: qué se cobra de verdad, qué conviene gastar y las virtudes que separan a los campeones del Bestiario.
En Competir están los formatos, las reglas y el Elo; esta página es la otra mitad: cómo se piensa un bot que las aproveche. Un partido no es una simulación libre. Los costos se cobran de verdad, los muertos no dejan comida, las mutaciones vienen apagadas y la ronda la gana el que dura. La estrategia de torneo es, antes que nada, economía.
Otra cancha, otras reglas
El mundo de un partido con la Base F1 es chico y sin rincones: un campo de 9237 × 6928 con los dos ejes conectados (no hay paredes donde esconderse), suelo con rozamiento, una velocidad máxima de 180 y sin día ni noche. Dos detalles que cambian todo el diseño:
- Los cadáveres están apagados (Cadáveres en 0): un bot que muere desaparece con su energía. Comer es solo por disparos o por lazos; matar de gusto no deja premio.
- Las mutaciones están apagadas y el ADN se congela al inscribirse: lo que anotás es exactamente lo que corre, partido tras partido. No hay evolución dentro de la liga; la selección la hacés vos en el taller.
La despensa también es finita: cada ronda arranca con 15 algas de 3000 y la repoblación solo repone si bajan de 10, así que la energía que entra al mundo es acotada. Con los valores por defecto del torneo (5 bots por especie, 3000 de arranque, tope de 5000 ciclos), lo que decide la ronda es cómo administrás la tuya.
Lo que la liga cobra, con el multiplicador en 1:
| Acción | Precio |
|---|---|
| Una comparación (aunque el gen no dispare) | 0,004 |
| Un store | 0,04 |
| Empujar, por unidad | 0,05 |
| Girar | gratis |
| Un disparo | 2 |
| Un intento de lazo | 2 |
| Un cloroplasto nuevo | 0,2 |
| Vivir un ciclo (edad + 1000 de cuerpo) | 0,02 |
Los números, las lecturas de memoria y toda la aritmética salen gratis, y girar también: escanear dando vueltas no cuesta nada; lo que cuesta es moverse, escribir y disparar. Medido con estos ajustes: un bot quieto paga 0,02 por ciclo, uno que empuja a fondo (40 de empuje) paga unos 2 y se queda seco antes de los 1500 ciclos, y uno que busca a empujoncitos paga 0,34 y llega al tope de 5000 con energía de sobra. Nadar a fondo es la forma más cara de no encontrar nada.
Las virtudes del campeón
Eficiencia antes que valor. Corrí un duelo suelto entre dos bots con pedigree, Russia y Teriyaki, en el campo de la liga: en 800 ciclos no se cruzaron ni una vez (los dos cazan a la espera), pero a ese ritmo uno quedaba con 2750 de energía y el otro con 580. Si la ronda llega al tope de ciclos y se decide por energía, gana el que gastó menos. Y ojo con el detalle más traicionero de la tabla: las comparaciones se cobran aunque el gen no dispare. Un ADN con decenas de condiciones paga todas, todos los ciclos: Russia dormida, sin hacer absolutamente nada, paga 0,31 por ciclo, casi todo en las unas 65 comparaciones de sus condiciones.
Robustez: no depender de un solo canal. Mi primer buscador tenía un solo ojo y una lección gratis: cuando un pariente se le ponía delante, se quedaba mirándolo para siempre. Veía algo (entonces no buscaba), pero no era comida (entonces no lo cazaba): clavado, gastando sin avanzar. Los bots de torneo reparten la mirada: Russia usa ocho ojos bien abiertos para el perímetro y uno fino de mira, así que ningún pariente distraído le tapa el mundo. La versión mínima del arreglo es hacer que «no veo nada o solo veo familia» cuenten igual.
Comportamiento social: no canibalizarse. En la liga tus cinco bots iniciales son tu equipo, y un equipo que se cobra entre sí pierde dos veces: pierde la energía y pierde bots. La forma más barata de distinguir a los suyos es la firma de .refeye contra .myeye (ver Un bot que reconoce a su especie); Russia, Teriyaki y el buscador de más abajo la usan. Lo medí con tres copias de Russia (200 ciclos) y dos del buscador (400): cero bajas propias. Y hay un motivo extra: a un conespecífico tu veneno y tu toxina no le hacen nada, así que morderlo es gastar gratis (Defensivos). El contraejemplo es Singula, de más abajo: drena a lo que mira sin preguntar, y su enjambre se lo cobra.
Saber rehusar una pelea. Las reglas premian al que dura: la ronda la gana la última especie en pie y, al tope de ciclos, la de más bots o más energía. Pelear siempre no es una estrategia: cada disparo te cuesta 2, lo absorbe o no el rival, y contra uno que absorbe tus golpes o te gana el intercambio, lo único que hacés es financiarte tu propia derrota. Antes de morder, mirá cómo viene equipado (.refshell, .refpoison, .refvenom): es lo que hace Paranoia para elegir a quién cazar (Defensivos). Y si el intercambio no te conviene, no lo aceptés: alejarse cuesta lo mismo que acercarse, y en el duelo de más arriba el bot que nunca peleó iba ganando.
Tres con pedigree, verificados
Los nombres del Bestiario con liga ganada se compran baratos: hay campeones de verdad y bots que solo se llaman campeón. Estos tres corren y hacen lo que acá se dice; cada corrida fue con los ajustes de la liga y sin mutaciones.
Russia duerme, Russia cobra
Russia (Russia_F1_League_By_Spike43884_11-19-2014.txt, de Spike43884, liga Rusia 2014) es un cazador a la espera. Su firma es la hibernación: al nacer (en el primer ciclo todos los sentidos leen 0) y siempre que no ve nada y anda corto de energía se apaga entera y paga 0,31 por ciclo; despierta en cuanto un ojo lateral ve algo. El gen que la apaga:
def hibernate 51
' Duermo si no veo nada (o si es familia) y ando corto de energia
cond
*.eye1 0 =
*.eye2 0 = and
*.eye3 0 = and
*.eye4 0 = and
*.eye5 0 = and
*.eye6 0 = and
*.eye7 0 = and
*.eye8 0 = and
*.eye9 0 = and
*.refeye *.myeye = or
*.nrg 3000 < and
*.hibernate 0 = and
start
1 .hibernate store
stopDe día caza con una mira fina y una periferia ancha, parándose al lado del blanco y robándole la energía con .shoot en −1. Y al que lo muerde le paga con veneno: la picadura le escribe 128 en el giro cada ciclo, así el ladrón se pasa la vida girando en redondo en vez de seguir robando. Contra un alga sola la vació en unos 20 ciclos y pasó de 3000 a más de 6000. Despierta y ociosa vira al azar —girar es gratis— y cría recién con 20000: cada hijo es una apuesta que solo paga con la despensa llena.
Teriyaki escupe y no se deja morder
Teriyaki (Teriyaki_F1_Spike43884_11-05-2014.txt, de Spike43884 con un arreglo de Shadowgod2) es lo contrario: paga un sueldo por andar armado. Mantiene 500 de toxina con un gen de dos líneas:
' No sabe a pollo: toxina mientras falte
cond
*.poison 500 <
start
50 .strpoison store
stopEso le cuesta unos 2,9 por ciclo (la toxina pierde el 2 % por ciclo, así que reponer 500 es un gasto permanente), pero quien lo muerde recibe el golpe de vuelta envenenado. Ataca mezclando −1 y −6: el −6 también le saca cuerpo, así que de una sola alga que entró con 3000 y 1000 de cuerpo terminó sacando más de 8000. A los parientes ricos les dispara esperma y cría sexual; y si se pasa de 100 de desechos, se alivia disparándolos para atrás. Un bot completo, con precio de bot completo: en el duelo con Russia era el que se quedaba seco.
Singula Haloculus 2: un gen y una bomba demográfica
Singula Haloculus 2 (Singula_Haloculus_2_F1_bacillus_21.04.08.txt, de bacillus, 2008) responde por qué a veces gana el más simple: es un solo gen, siempre encendido, y ganaba ligas igual. Hace tres cosas a la vez. Cría sin freno: pide un hijo con más de 200 de energía, y en 30 ciclos una sola copia había sido doce. Mantiene el cuerpo chico, en un tercio de su energía, con la línea más bonita del Bestiario:
' El cuerpo a un tercio de la energia: sobra, guardo; falta, devuelvo
cond
start
*.nrg 3 div *.body sub dup .strbody store - .fdbody store
stopY se alimenta atando al que está mirando y chupándole 1000 por ciclo por el lazo (.tieloc en −1, .tieval en −1000), sin preguntar de qué especie es: en una corrida sin comida su propio enjambre se drenó entre sí hasta quedar cuatro. La cereza: su disparo es de memoria, a la dirección de la .shootval del otro, y le deja escrito −32000. Un cazador que cobra con −1 y tiene la .shootval rota se mata con su propio disparo: contra Singula el cazador del tutorial amaneció con la .shootval en −32000 y no llegó lejos; y un cazador con la .shootval forzada a −32000 cayó él solo, con el alga de blanco intacta. Por algo su encabezado dice que mata a los bots que se alimentan a disparos.
Probalo antes de anotarlo
Acá va un bot de liga mínimo, completo, para partir: busca barato, caza lo que no es de su especie, cría con la despensa llena y no se come a sus hermanos.
' Bot de liga minimo: caza algas y extranos, no toca a los suyos
cond
*.robage 0 =
start
100 .eye5width store
stop
' Cuando no veo nada (o solo veo familia): empujoncito barato
cond
*.eye5 0 =
*.refeye *.myeye = or
start
5 .up store
stop
' Veo a un extrano: me le acerco
cond
*.eye5 0 >
*.refeye *.myeye !=
start
*.refveldx .dx store
*.refvelup 30 add .up store
stop
' Acompanado del blanco de cerca: le pido energia
cond
*.eye5 50 >
*.refeye *.myeye !=
start
*.refveldx .dx store
*.refvelup .up store
-1 .shoot store
stop
' Con energia de sobra, hijos
cond
*.nrg 5000 >
start
50 .repro store
stop
endCon los ajustes de la liga hace lo que promete: busca a 0,34 por ciclo recorriendo el campo entero, vacía un alga en unos 60 ciclos y con lo ganado tira su primer hijo, y dos copias juntas no se cruzan ni un golpe en 400 ciclos. Contra un cazador común del mismo estilo le banca el pulso: son números y cría. Lo que no tiene son defensas: contra un bot armado no tiene nada que decirle; para eso está Defensivos.
Para las pruebas de verdad, en la app:
- El escenario Partido F1 (en Escenarios) te da el mundo de la liga con tres especies adentro: sembrá el tuyo al lado y mirá la energía en el inspector.
- Experimentar con la base Liga F1 (y los costos F1 del panel, Experimentar) para tu propio banco de pruebas.
- Competir: un ⚡ partido rápido contra bots del Bestiario es el examen de ingreso. Si un resultado te raya, ↻ Repetir lo corre con la misma semilla y Repetir y analizar lo abre como corrida en Analizar para ver dónde se te fue la energía. Cómo se comportan las semillas, en Semillas y reproducibilidad.
Y recordá la letra chica del reglamento: el ADN se congela al inscribirse, así que inscribe la versión que quieras correr, no la que estás por arreglar.
Qué probar después
- Anotalo y mirá el Elo: una temporada entera dice mucho más que un partido suelto, y el Elo histórico del torneo acumula de temporada en temporada (Competir).
- Evolucioná en tu taller, no en la liga: la liga apaga las mutaciones y congela el ADN; la selección hacela vos en tu mundo, con tu criterio, y anotá al ganador (Tu primer experimento de evolución).
- Ponle defensas: en la liga, donde el que no puede ser mordido dura gratis, un caparazón o una toxina bien puestos se pagan solos (Defensivos).
- Enfrentalo a un enjambre: tu bot ordenado contra la bomba demográfica de siempre (Enjambres).