Спасибо. Должен признаться, что опыт как в DOSBox, так и в шахматах, у меня нулевой.
Дебют h6 объясняется очень просто: поиск снизу вверх с выбором первого максимума. Если поменять порядок поиска (или критерий выбора), получится дебют Na6, а дальше (если защищаться от коня) ладья начинает тупо метаться в углу.
В рамках ограничений, думаю, получилось не так плохо.
В комментарии выше упомянули asmFish, занимающий около 100K на 64-разрядном процессоре. Скорее всего, его можно было бы портировать на восьмиразрядник, уложившись в 64K. Так что в теории это возможно, да.
Что вы называете современными оптимизациями? Не думаю, что за последние двадцать лет изобрели что-то новое. Подозреваю, что для того, чтобы получить сильные шахматы на слабом процессоре, придётся идти окольными путями — например, запихнуть в картридж огромный ROM с библиотеками дебютов и эндшпилей.
Согласен, это не-шахматы. Для того, чтобы они стали шахматами, надо добавить прыжок и замену пешки, рокировку и взятие на проходе. Проверка допустимости хода стоит ниже в порядке приоритетов.
Это довольно распространённая ошибка; собственно, Alex Garcia сам об этом написал. В любом случае, я добавил код и проголосовал за undelete. Для того, чтобы ответ стал видимым, нужны ещё голоса ;)
Size-coding и code golfing — немного разные вещи. Я как раз добавил там ответ, но его стёрли (при этом ответ reeagbo оставили) — может, потому что указал ссылку, а не выложил код целиком.
Данное разделение несколько условно, поскольку, вследствие жёсткой оптимизации, рамки между модулями немного размыты. У меня нет точных сведений по размерам отдельных модулей (в какой-то момент перестал отслеживать).
Данные хранятся в виде массива 10+10x12.
Статистика по Barebone DOS edition (в BIOS на процедуру больше):
call — 5
ret — 2
loop/loopz — 5
rep — 2
jmp — 1 (бесконечный основной цикл)
Последний можно считать управлением, т.о., размер модуля управления — 2.
Оптимизировано всё, алгоритм и код неразделимы. Рекурсия, естественно, применялась — иначе не было бы ИИ.
Верно, я не упомянул 1K ZX Chess в статье (но не забыл о них, см. описание на английском). LeanChess немного не дотягивают по функционалу, но получились более, чем в два раза легче.
1. e4 g7
2. Qg4 h7
Дебют h6 объясняется очень просто: поиск снизу вверх с выбором первого максимума. Если поменять порядок поиска (или критерий выбора), получится дебют Na6, а дальше (если защищаться от коня) ладья начинает тупо метаться в углу.
В рамках ограничений, думаю, получилось не так плохо.
В комментарии выше упомянули asmFish, занимающий около 100K на 64-разрядном процессоре. Скорее всего, его можно было бы портировать на восьмиразрядник, уложившись в 64K. Так что в теории это возможно, да.
3. Qf3 f6
При этом размер программы не меняется, но задумывется она иногда надолго.
Согласен, это не-шахматы. Для того, чтобы они стали шахматами, надо добавить прыжок и замену пешки, рокировку и взятие на проходе. Проверка допустимости хода стоит ниже в порядке приоритетов.
Это довольно распространённая ошибка; собственно, Alex Garcia сам об этом написал. В любом случае, я добавил код и проголосовал за undelete. Для того, чтобы ответ стал видимым, нужны ещё голоса ;)
Разумеется. Задача — не просто сэкономить место, а максимально сэкономить место.
Спасибо.
Size-coding и code golfing — немного разные вещи. Я как раз добавил там ответ, но его стёрли (при этом ответ reeagbo оставили) — может, потому что указал ссылку, а не выложил код целиком.
Белые заглавные, чёрные строчные, как у всех.
В общем, надо писать продолжение статьи :)
Будем рассматривать отдельно метаданные (то, что уже в коде) и данные (шахматную доску).
Метаданные заданы в массивах (опять-таки, в самой "тощей" вариации):
init_db
— то, из чего формируется доска при инициализации,moves_db
— на каждую фигуру: кол-во векторов, дальность, адрес первого вектораvec_db
(условно) — векторы ходовeval_db
— величина для оценочной функции на каждую фигуруДанные — стандартные 10x12 плюс дополнительный ряд сверху от верхнего ряда (вместо байта слева).
Вся работа заняла около двух недель (при этом остались наработки для полной реализации).
Благодарю за вопрос, коллега :)
Объём модулей в Barebone DOS edition:
Данное разделение несколько условно, поскольку, вследствие жёсткой оптимизации, рамки между модулями немного размыты.
У меня нет точных сведений по размерам отдельных модулей (в какой-то момент перестал отслеживать).Данные хранятся в виде массива 10+10x12.
Статистика по Barebone DOS edition (в BIOS на процедуру больше):
call
— 5ret
— 2loop/loopz
— 5rep
— 2jmp
— 1 (бесконечный основной цикл)Последний можно считать управлением, т.о., размер модуля управления — 2.Оптимизировано всё, алгоритм и код неразделимы. Рекурсия, естественно, применялась — иначе не было бы ИИ.
Не представляю, как такое портируется на ассемблер. Думаю, проще взять откомпилированный C++ и оптимизировать проблемные участки.
P.S. Говоря о 100Kb, мы, скорее всего, не учитываем объём библиотек дебютов и эндшпилей.
Попробуйте )
Просто смайлики в тексте статьи не разрешают.
Если выбросить из LeanChess всю шахматную логику, она и будет таким (самым маленьким на сегодня) числом. Шашки это слишком просто.