- Un motor de ajedrez ligero que funciona con un tamaño de apenas 2 KB y permite jugar una partida completa dentro de reglas limitadas
- Incluye algoritmos clave como tablero mailbox de 120 casillas, búsqueda negamax y poda alfa-beta
- Usa evaluación basada solo en el valor material (material-only eval) y prioridad a capturas (move ordering)
- No implementa enroque, captura al paso, promoción, repetición ni la regla de las 50 jugadas
- Muestra un rendimiento aproximado de 1170~1200 Elo y destaca como un caso de implementación de un motor de ajedrez en menos de 2 KB de código
Resumen del proyecto
- Sameshi es un motor de ajedrez mínimo con soporte para reglas limitadas, cuyo tamaño total de código es de apenas 1.95 KB
- El archivo principal es
sameshi.h, y una versión más legible está incluida en readable/sameshi.h
- El repositorio de GitHub también incluye
main.c, Makefile, .gitignore y otros archivos
- Hay un video de demostración publicado en YouTube donde se puede ver su funcionamiento real
Estructura principal (core)
- El motor está compuesto por estos seis elementos principales
- Estructura de tablero mailbox de 120 casillas
- Algoritmo de búsqueda Negamax
- Poda Alpha-Beta
- Evaluación basada en el valor material (material-only evaluation)
- Prioridad a capturas (move ordering)
- Verificación completa de jugadas legales, incluyendo jaque, jaque mate y ahogado
- Entre las funciones no implementadas se indican enroque, captura al paso, promoción, repetición y la regla de las 50 jugadas
Rendimiento (strength)
- Se estima en alrededor de 1170 Elo, con un intervalo de confianza del 95% entre 1110 y 1225 Elo
- La medición se basa en 240 partidas contra Stockfish (nivel 1320~1600)
- Se probó con profundidad fija 5 (fixed depth 5), máximo de 60 ply y reglas limitadas
Características técnicas
- El tamaño total del código es de menos de 2 KB, compuesto por C 98.6% y Makefile 1.4%
- Maximiza la ligereza y la eficiencia algorítmica para implementar la lógica de ajedrez con el mínimo código posible
- Está clasificado bajo temas relacionados con chess-engine, chess y demoscene
Estado del repositorio
- En GitHub registra 143 estrellas y 5 forks
- Las secciones Issues, Pull requests, Projects y Security están vacías
- La descripción del repositorio se resume como: “a ~1200 Elo chess engine that fits within 2KB”
1 comentarios
Opiniones en Hacker News
Es un proyecto realmente genial. Está bueno que tenga función de tablas por ahogado, pero me pregunto cuánto espacio haría falta para implementar todas las reglas
Como menciona el autor, si faltan enroque, captura al paso, promoción, repetición y la regla de las 50 jugadas, cuesta llamarlo ajedrez moderno
En un motor pequeño quizá se puedan omitir la repetición y la regla de las 50 jugadas, pero el enroque, la captura al paso y la promoción me parecen imprescindibles
Video Chess de 1980 soportaba todas las reglas dentro de 4KB
Así que me da curiosidad cuál es hoy el motor compatible con UCI más pequeño. Superarlo con un motor diminuto y de reglas completas sería una meta divertida
Como referencia, el Fidelity CC3 que usé a inicios de los 80 también soportaba enroque y captura al paso
La versión en JavaScript de 2KB incluye enroque, captura al paso, promoción, búsqueda e incluso GUI
La versión en ensamblador de 326 bytes no incluye reglas especiales
No hay una versión compatible con UCI, pero parece más fácil de implementar que una GUI. Puede que alguno de los forks de la versión JS ya haya agregado esa función
Gran proyecto. Parece que se podría reducir la cantidad de líneas reutilizando el frontend de GNU Chess e implementando solo el backend
Como reporte de bug, encontré que se permite
b6b4, aunque un peón no puede avanzar dos casillas después de haber movido una vezLa herramienta que más usan los desarrolladores de motores de ajedrez para estimar ELO es cutechess. Internamente usa SPRT
Otra herramienta es Ordo, aunque no la he usado personalmente
Me pregunto si se podrá lograr 1 ELO por byte. Se puede hacer más pequeño, pero quizá también menos inteligente
Esto se parece más a un programa que puede mover piezas de ajedrez que a ajedrez propiamente dicho. Faltan enroque, captura al paso, promoción, repetición y la regla de las 50 jugadas
A veces se dice que se implementó ajedrez en un tamaño extremadamente pequeño, pero en realidad suelen omitirse reglas importantes
Si buscas motores realmente pequeños y potentes, recomendaría asmFish (unos 130KiB), escrito en ensamblador x86, OliThink con unas 1000 líneas, y Xiphos, que logra gran fuerza con código C simple
También hay motores de 4KB que aparecieron en TCEC, pero creo que esas afirmaciones merecen un asterisco (*)
Toledo es una familia de programas de ajedrez pequeños pero bastante fuertes
Yo también implementé hace poco un motor de ajedrez con todas las reglas en unas 400 líneas de código legible
Al principio lo hice en Java, y después lo porté a mi lenguaje Bau
Incluso incluye una interfaz de terminal, y aunque todavía estoy midiendo el ELO, yo no he podido ganarle
En especial, implementar el enroque fue complicado, pero el reto en sí fue divertido
Ver el código de ajedrez en el lenguaje Bau
Me pregunto cómo manejaron las partidas en las que Stockfish intentaba enrocar. Como es una jugada tan frecuente, me parece difícil evaluar la fuerza del motor sin soportarla
Así que todas las partidas se jugaron bajo la misma “variante de ajedrez sin enroque”
Esa evaluación no corresponde al ajedrez completo, sino a esa variante limitada
¡Está buenísimo! Agregué este proyecto a HN Arcade
Enlace a HN Arcade