- Um motor de xadrez leve que funciona com cerca de 2 KB, permitindo jogar uma partida completa dentro de um conjunto limitado de regras
- Inclui algoritmos centrais como tabuleiro mailbox de 120 casas, busca Negamax e poda alfa-beta
- Usa avaliação baseada apenas no valor das peças (material-only eval) e priorização de capturas (move ordering)
- Roque, en passant, promoção, repetição e regra dos 50 lances ainda não foram implementados
- Apresenta desempenho de cerca de 1170~1200 Elo e chama atenção como um caso de implementação de um motor de xadrez em menos de 2 KB de código
Visão geral do projeto
- Sameshi é um motor de xadrez mínimo com suporte a regras limitadas, com tamanho total de código de apenas cerca de 1,95 KB
- O arquivo principal é
sameshi.h, e uma versão mais legível está em readable/sameshi.h
- O repositório no GitHub também fornece
main.c, Makefile, .gitignore e outros arquivos
- Um vídeo de demonstração foi publicado no YouTube, onde é possível ver o funcionamento real
Estrutura principal (core)
- O motor é composto pelos seis elementos principais a seguir
- Estrutura de tabuleiro mailbox de 120 casas
- Algoritmo de busca Negamax
- Poda Alpha-Beta
- Avaliação baseada apenas no valor das peças (material-only evaluation)
- Priorização de capturas (move ordering)
- Validação completa de lances legais, incluindo xeque, xeque-mate e afogamento
- As funcionalidades não implementadas indicadas são roque, en passant, promoção, repetição e regra dos 50 lances
Desempenho (strength)
- É avaliado em cerca de 1170 Elo, com intervalo de confiança de 95% entre 1110 e 1225 Elo
- A medição foi baseada no resultado de 240 partidas contra o Stockfish (nível 1320~1600)
- Os testes foram realizados sob as condições de profundidade fixa 5 (fixed depth 5), máximo de 60 plies e regras limitadas
Características técnicas
- O tamanho total do código é inferior a 2 KB, composto por 98,6% em C e 1,4% em Makefile
- Maximiza a leveza e a eficiência algorítmica, implementando a lógica de xadrez com o mínimo de código
- Está classificado em tópicos relacionados a chess-engine, chess e demoscene
Situação do repositório
- No GitHub, registra 143 estrelas e 5 forks
- As seções Issues, Pull requests, Projects e Security estão todas vazias
- A descrição do repositório é resumida como “a ~1200 Elo chess engine that fits within 2KB”
1 comentários
Comentários no Hacker News
Projeto realmente incrível. É bom ver que há suporte a stalemate, mas fico curioso sobre quanto espaço seria necessário para implementar todas as regras
Como o autor mencionou, se castling, en passant, promoção, repetição e a regra dos 50 lances estão faltando, acho difícil chamar isso de xadrez moderno
Para um motor pequeno, até daria para omitir repetição e a regra dos 50 lances, mas castling, en passant e promoção eu considero essenciais
O Video Chess, de 1980, suportava todas as regras em 4KB
Então fiquei curioso sobre qual é o menor motor compatível com UCI atualmente. Seria uma meta divertida criar um motor minúsculo com regras completas que superasse isso
Só como referência, o Fidelity CC3 que eu usei no começo dos anos 1980 também suportava castling e en passant
A versão em JavaScript de 2KB inclui castling, en passant, promoção, busca e até GUI
A versão em assembly de 326 bytes não tem as regras especiais
Não existe uma versão compatível com UCI, mas isso parece mais fácil de implementar do que uma GUI. Talvez algum fork da versão JS já tenha adicionado isso
Projeto muito legal. Usando o frontend do GNU Chess, talvez desse para reduzir o número de linhas de código e implementar só o backend
Como bug report, encontrei um problema em que
b6b4é permitido, embora um peão não possa avançar duas casas depois de já ter se movido uma vezA ferramenta mais usada por desenvolvedores de motores de xadrez para estimar ELO é o cutechess. Internamente ele usa SPRT
Outra ferramenta é o Ordo, embora eu nunca tenha usado
Fico pensando se dá para alcançar 1 ELO por byte. Dá para deixar ainda menor, mas talvez também menos inteligente
Isso está mais para um programa que consegue mover peças de xadrez do que para xadrez de fato. Afinal, faltam castling, en passant, promoção, repetição e a regra dos 50 lances
Às vezes dizem ter implementado xadrez em tamanho extremamente pequeno, mas na prática acabam omitindo regras importantes
Se você quer um motor realmente pequeno e forte, eu recomendaria o asmFish (cerca de 130KiB), escrito em assembly x86, o OliThink com algo em torno de 1000 linhas, e o Xiphos, que consegue ótimo desempenho com código C simples
Também existem motores de 4KB que apareceram no TCEC, mas acho que essas alegações merecem um asterisco (*)
O Toledo é uma família de programas de xadrez pequenos, mas bastante fortes
Eu também implementei recentemente um motor de xadrez com todas as regras em cerca de 400 linhas de código legível
Primeiro fiz em Java e depois portei para a minha linguagem, Bau
Ele até inclui uma UI de terminal, e o ELO ainda está sendo medido, mas eu não consegui vencê-lo
A implementação de castling em especial foi complicada, mas o desafio em si foi divertido
Veja o código de xadrez na linguagem Bau
Fiquei curioso sobre como lidaram com partidas em que o Stockfish tentaria fazer castling. Como castling é um lance tão comum, acho difícil avaliar a força do motor sem isso
Assim, todas as partidas foram jogadas na mesma “variante de xadrez sem castling”
Essa avaliação não era sobre o xadrez completo, mas sobre essa variante limitada
Muito legal mesmo! Adicionei este projeto ao HN Arcade
Link do HN Arcade