Меня зовут Дмитрий Шехтман, и я автор самых маленьких компьютерных шахмат в мире.


Началось всё с того, что моя (ныне бывшая) девушка предложила написать компьютерные шахматы. Идея меня заинтересовала, и я решил этим заняться. Правда, почитав интернет, я понял, что опоздал лет на сорок. Особенно впечатляли шахматные разработки Оскара Толедо — на Си размером в 1257 байт, на JavaScript в 1023 байта и, наконец, Atomchess на ассемблере x86, компилирующийся в 392 байта.


Прежде, чем я вернулся к теме, прошло несколько месяцев. Как оказалось, за это время был установлен новый рекорд размера — ChesSkelet для ZX Spectrum занимал всего 352 байта. Правда, он не знал всех правил и играл весьма слабо, но всё же! А не замахнуться ли мне на шахматы на ассемблере? — подумал я.


Писать было решено под 8086. Следует заметить, что задача оптимизации по размеру машинного кода первоначально не ставилась. Шансы переплюнуть Atomchess казались стремящимися к нулю, не говоря уже о том, чтобы потягаться с чемпионом мира — реализацией на ассемблере восьмиразрядного процессора.


Несколько дней спустя у меня на руках была программа, выводящая доску с фигурами (в виде восьми строк текста) и генератор ходов, поддерживающий рокировку, замену пешек на произвольные фигуры и взятие на проходе. Правда, с небольшой оговоркой: программа не работала.


В результате нескольких "перезапусков" с исключением всего лишнего получился довольно изящный код. Предвидя возражения относительно того, что прыжок пешкой через поле нельзя считать лишним, предлагаю ознакомиться с описаним возможностей ChesSkelet-352. В какой-то момент возникла идея переключиться на оптимизацию. Как выяснилось, с уменьшением размера программы она становится более доступной для понимания и отладки. Немало помогло добавление комментариев к каждой строке. В конце концов ошибка нашлась.


Когда уже казалось, что дальше оптимизировать некуда, совершенно случайно обнаружились команды pusha и popa, позволившие сэкономить ещё около 18 байт (точные данные не сохранились). Atomchess был повержен. Правда, за счёт повышения требований к системе — до IBM PC AT.


Не останавливаясь на дальнейших этапах разработки, перейдём к итогам. Минимальная вариация в виде COM-файла для DOS занимает 328 байт — на 24 байта меньше предыдущего рекордсмена (напомним, восьмиразрядного). Как уже было сказано, речь не идёт о полноценных шахматах. Ходы соперника вообще не проверяются на корректность. Зато реализован ИИ в виде полного NegaMax-перебора глубиной в три полухода с оценкой по материалу (при увеличении глубины до четырёх скорость приемлемая).


На данный момент LeanChess доступна в следующих вариациях:


  1. Barebone DOS (328 байт)
  2. Barebone BIOS (333 байта)
  3. Classic DOS (338 байт)
  4. Classic BIOS (342 байта)

Все четыре (теперь) играют одинаково, различия лишь в отображении доски (и нажатий клавиш). Не удивляйтесь "офицерам" в виде О в вариациях Barebone.


Для того, чтобы запустить игру, вам потребуется DOSBox. Вводите ходы в формате e2e4 без нажатия Enter. Проиграв, закройте окно эмулятора.


Скриншот


image

Ссылки



P.S. Если интересны технические подробности, пожалуйста, сообщите в комментариях.
P.P.S. Опубликована версия 1.1 с исправлением оценки слона и добавлением Classic DOS Edition.

Комментарии (97)


  1. xFFFF
    01.12.2019 18:22

    Хоть бы скриншот вставил.


    1. leanchess Автор
      01.12.2019 18:24
      +2

      См. мою аватарку :)


  1. Daddy_Cool
    01.12.2019 18:34
    +1

    Здорово! Все же хочется крупную картинку, а лучше видео с процессом, и т.п… И самое главное — мировое сообщество уже знает об этом прорыве? Автор Atomchess уже прислал поздравления? Это я без иронии, я в смысле, что нужен пиар достижений.


    1. leanchess Автор
      01.12.2019 18:37
      +1

      Спасибо. Картинку добавил, авторам отправил твиты. Ждём-с :)


  1. t0lik
    01.12.2019 18:37

    Сразу вспомнилось, как в свое время с товарищем в техникуме решили написать резидентный переключатель клавиатуры (с русского на английский и обратно) под MS-DOS, который бы занимал в памяти как можно меньше места. В итоге получилось что-то около 80 с чем-то байт (точный размер не помню уже )) ). Была толстая книжка по командам ассемблера и я выискивал более короткие аналоги использованных команд. Например, классическое XOR DX,DX для очистки регистра вместо MOV DX,0.


    1. leanchess Автор
      01.12.2019 18:41

      80 с чем-то байт? Да это просто монстр :P

      А я в детстве написал вирус. Поскольку делать TSR я не умел, придумал полностью спрятать в таблице векторов прерываний. С тех пор и пытаюсь всё ужать до предела…


      1. t0lik
        01.12.2019 18:46

        Ну получилось так мало, потому что PSP-блок в 256 байт нужно было еще убрать, он в резидентной части был уже не нужен после загрузки.


      1. vp_arth
        02.12.2019 10:36
        +1

        Помню, в детстве был у меня на рабочем столе com-файл для перезагрузки, состоящий из одного far-jump на начало BIOS. :)


        1. vlivyur
          02.12.2019 11:19

          CD 19


          1. drWhy
            02.12.2019 12:37
            +1

            copy con command.com
            Alt+205
            Alt+25
            Ctrl+Z


            1. MaxVetrov
              02.12.2019 20:07

              copie con un amigo


      1. aliend
        02.12.2019 10:57

        (смахивая пыль с тетради), так эта ж:
        dec [0000:0413]


        1. mobi
          02.12.2019 11:22

          А можно для тех, кто не в теме, что этот код делает? Если речь об x86, то по этому адресу должен обработчик int 82h располагаться, а я такого раньше не встречал (максимум 80h в Linux/FreeBSD, а в DOS я помню только 33h для работы с мышкой).


          1. aliend
            02.12.2019 11:34

            В эпоху, когда «640К должно было хватать всем» в этой ячейке размещался объем доступной ОЗУ и MS-DOS выстраивала структуры памяти до этой границы. Boot-вирусы тех времен уменьшали значение и размещались в этом заветном килобайте.


            И да, это не «код» в чистом виде, а лишь иллюстрация.


          1. rogoz
            02.12.2019 14:52
            -1

            должен обработчик int 82h располагаться
            256*4=1024=400h [0000:0400]
            Не должен.


            1. mobi
              02.12.2019 15:09
              +1

              Да я уже понял, что чуть ошибся, но не стал акцентировать на этом внимания.


    1. we1
      01.12.2019 19:55

      Круто. А картинки русских букв не загружались? У меня бел резидентный переключатель треков на CD в 252, кажется, байта. Правда MSCDEX был нужен, не смог найти как прочитать список где треки прочитаются, а запускать с произвольного месте совсем без драйверов получилось (после очень долгих копаний в отладчике, оказалось, что довольно просто).


      1. leanchess Автор
        01.12.2019 20:27
        +1

        Я испугался, что вы о русских буквах в шахматах :O

        Кстати, в Classic-вариации LeanChess русификация реализуется элементарной заменой значений disp_db без увеличения размера (естесвенно, требуется кириллический BIOS).


      1. t0lik
        01.12.2019 22:18

        Нет, только переключение. KeyRus вроде как умел загружать русские буквы и переключение.


    1. VIPDC
      02.12.2019 06:18
      +2

      Вам срочно надо в Google, клавиатура для Android уже больше 300Mb


      1. adictive_max
        02.12.2019 09:20

        Не удивительно, учитывая, сколько туда напихано: словари и раскладки под любой язык (минимум 2 предустановлено), ввод свайпом, голосовой ввод, рукописный ввод (с локальным распознаванием), подсказки с самообучением, несколько режимов отображения, интеграция с поиском, переводчиком и облачным буфером обмена, эмоджи, адаптив, кастомизация. Может ещё что-то забыл.


        1. mclander
          02.12.2019 09:28

          Я бы не называл троллинг пользователя самообучением.


          1. ChessShire
            02.12.2019 09:50
            +1

            Троллинг пользователя с самообучением


            1. drWhy
              02.12.2019 12:41
              +1

              «Выеду, выеДу в 8. Ох уж этот Т9.»


              1. fougasse
                02.12.2019 16:28
                +1

                В Т9 «б» и «д» на разных кнопках были, разве нет?
                Вот автокоррекция — да, могла чудить.


  1. aliend
    01.12.2019 18:52

    Минимальная вариация в виде COM-файла для DOS занимает 328 байт

    Получается, что можно погрузить это в MBR и пока не выиграешь система не загрузится?
    А если добавить размножение, то уу...


    1. leanchess Автор
      01.12.2019 18:57

      Ага, Atomchess, например, запускается из boot-сектора (LeanChess пока так не умеет).


    1. drWhy
      01.12.2019 21:11

      Ну лучше уж в шахматы сыграть, чем на криптовымогателя глазеть.


    1. JerleShannara
      02.12.2019 16:50

      Кстати да, MBR можно весьма сильно упростить, если принять «первый раздел — всегда валидный загрузочный», то хватит 40-50 байт на его копирование и передачу управления.


  1. drWhy
    01.12.2019 20:10
    +3

    Мсье определённо знает толк… Молодчина.


  1. fougasse
    01.12.2019 21:49
    -2

    Тэг "новости" порадовал.


    1. leanchess Автор
      01.12.2019 21:57
      +3

      Чем не новость?


  1. DeuterideLitium6
    02.12.2019 01:11

    Что то вспомнилась попытка редакции «Техники Молодёжы» (и читателей) написать программу шахмат для ПМК МК-61, Б3-34 в 1986-1988 гг. Правда у них только эндельшпильды получились.
    Ещё можно попробовать более полноценную программку сделать под Win32, но скажем чтобы килобайт 5-6 была.


    1. demon416nds
      02.12.2019 06:52

      В 5кб под Винду можно даже трехмерные шахматы впихнуть но смысла особого нет
      Потому что без всяких мозголомных оптимизаций такие же шахматы влезут в килобайт 300


  1. aliend
    02.12.2019 08:45

    Кстати, мне давно не дает покоя философская мысль о том, что любое ПО (программа) – это набор байт. А набор байт – это какое-то (агроздоровенное) число. Т.е. фактически весь существующий и будущий софт – пронумерован!


    И появление таких крохотных шедевров все быстрее и быстрее приближает момент, когда по новостям прозвучит: «открыто очередное число, которое играет в шашки лучше всех на свете, и история этой игры теперь благополучно закончена навсегда».


    1. demon416nds
      02.12.2019 08:56

      Число само по себе ничего не делает даже если является точной копией программы.
      Чтобы программа работала нужно железо которое ее будет выполнять.
      Более того нужно железо подходящее именно для этой программы.
      Не говоря о том что программы работают на голом железе в основном в микроконтроллерах, в ПК программы работают взаимодействуя с кучей других программ зашитых в железки


    1. 5oclock
      02.12.2019 09:27
      +8

      Ладно «число», вот когда-нибудь «решат» шахматы — и всё закончится.

      Забавная шахматная шутка от кубинского гроссмейстера Хосе Рауля Капабланки.

      «Однажды я участвовал в турнире в Германии, когда ко мне подошел мужчина. Решив, что ему нужен всего лишь автограф, я потянулся за ручкой, но тут мужчина сделал поразительное заявление:
      — Я решил шахматы!
      Я стал благоразумно отступать, на случай, если мужчина был столь же опасен, сколь и безумен, но он продолжил:
      — Спорим на 50 марок, что если вы пойдете со мной в мой гостиничный номер, я смогу это доказать?
      Что же, 50 марок есть 50 марок, так что я решил быть снисходительным, и проводил мужчину к его номеру.

      Оказавшись в номере, он уселся за шахматную доску.
      — Я все понял, белые ставят мат на 12 ходу независимо ни от чего.
      Я играл черными возможно чересчур осторожно, но обнаружил, к своему ужасу, что белые фигуры координируются как-то странно, и что я получу мат на 12-м ходу!

      Я попробовал снова, разыграв на этот раз совершенно иной дебют, из которого в принципе невозможно было попасть в такое положение, но после серии очень странно выглядящих ходов, я снова обнаружил своего короля окруженным, и мат должен был прийтись на 12-й ход. Я попросил мужчину подождать, а сам сбегал вниз и позвал Эммануэля Ласкера, который был чемпионом мира до меня.

      Он был настроен крайне скептично, но согласился хотя бы придти и сыграть. По пути мы наткнулись на Алехина, который был текущим чемпионом мира, и вот все трое мы вернулись в тот номер.

      Ласкер не рисковал, но играл настолько осторожно, насколько это вообще возможно, и тем не менее, после причудливой, бессмысленно выглядящей серии маневров, обнаружил себя зажатым в матовой сети, из которой не было выхода. Алехин тоже попробовал, но опять же не преуспел.

      Это был какой-то кошмар! Вот они мы, лучшие игроки в мире, люди, посвятившие все свои жизни игре, и вот теперь всё кончено! Турниры, состязания, всё — шахматы решены, белые побеждают...»

      Тут один из друзей Капабланки вмешивается, со словами:
      — Погодите минутку, я никогда ни о чем таком не слышал! И что случилось дальше?
      — Как что, мы его убили, конечно!


    1. Aleco
      02.12.2019 09:28

      Я тебе больше скажу — любую шахматную программу можно найти в двоичной записи числа Пи. Нужно только знать откуда начинать.



      1. Refridgerator
        02.12.2019 17:57
        +1

        Нет. Из бесконечного количества цифр в числе ?и вовсе не следует, что они образуют в нём все возможные комбинации.


        1. Xobotun
          02.12.2019 18:11

          Однако можно разбивать код этой шахматной программы на последовательность байтов, которые гарантированно содержатся в ?, и получать не пару «смещение+размер», а последовательность таких пар. Кажется, я где-то это уже видел. Ах, да, точно. :)


          1. Refridgerator
            03.12.2019 05:34

            Ещё с тем же успехом можно использовать не ?и, а библию, коран, сценарий Симпсонов или любой другой священный текст.


        1. Iamkaant
          02.12.2019 19:56

          Вот так из комментариев к статье о самой маленькой шахматной программе я и узнал, что в числе Пи, оказывается, не закодированы Халф-лайф и «Война и мир». Спасибо!


          1. Refridgerator
            03.12.2019 05:40

            Пожалуйста) Даже если принять нормальность числа пи, то для поиска произвольного набора чисел их нужно знать заранее. Любое декодирование невозможно без предварительного кодирования; и поскольку в число ?и Халф-лайф 3 никто не кодировал, то для его извлечения его всё равно необходимо закодировать в смещении, а длина этого смещения совсем не обязательно должна иметь конечный набор цифр.


    1. leanchess Автор
      02.12.2019 10:35

      Если выбросить из LeanChess всю шахматную логику, она и будет таким (самым маленьким на сегодня) числом. Шашки это слишком просто.


      1. aliend
        02.12.2019 10:43
        +1

        И как в том анекдоте:
        — 5
        — ха-ха-ха
        — 12
        — (бах бах за нецензуру)


    1. CLR
      02.12.2019 17:00

      не дает покоя философская мысль о том, что любое ПО (программа) – это набор байт
      Таки да. Рекомендую хорошую книгу «Читаем Тьюринга» Петцольда, там в частности это разбирается.


    1. gohan
      03.12.2019 00:24

      И появление таких крохотных шедевров все быстрее и быстрее приближает момент, когда по новостям прозвучит: «открыто очередное число, которое играет в шашки лучше всех на свете, и история этой игры теперь благополучно закончена навсегда».

      Насколько я помню, шашки уже решены довольно давно.


    1. trintel
      03.12.2019 10:15

      Т.е. фактически весь существующий и будущий софт – пронумерован!

      И не только софт, но и все возможные данные, все прошлые, будущие, и никогда не выпущеные фильмы, музыка, изображения, и да, третья часть той самой игры тоже существует в виде числа!


  1. johnfound
    02.12.2019 09:03

    В какой-то момент возникла идея переключиться на оптимизацию. Как выяснилось, с уменьшением размера программы она становится более доступной для понимания и отладки.

    Это наблюдение вполне совпадает с моим опытом. И показывает, что в ассемблере не надо боятся оптимизировать на ранних стадиях разработки. Они часто помогают сделать код проще и понятнее.


  1. ormoulu
    02.12.2019 09:52
    -1

    image


    1. kryvichh
      02.12.2019 10:18

      Бывшая?


  1. alexxisr
    02.12.2019 10:40

    Проиграв, закройте окно эмулятора.

    — шансов выиграть нет совсем?


    1. artemerschow
      02.12.2019 10:48

      Ходы соперника вообще не проверяются на корректность.
      Жульничать? :)


    1. leanchess Автор
      02.12.2019 11:03

      Попробуйте )
      Просто смайлики в тексте статьи не разрешают.


  1. ormoulu
    02.12.2019 11:09
    +1

    А вот интересно — какой размер занимает ИИ и какой графика, управление и прочее вспомогательное?
    Как организовано хранение данных?
    Вы оптимизировали алгоритм или только ассемблерный код?
    Сколько процедур и сколько goto-переходов? Рекурсия применялась?


    1. leanchess Автор
      02.12.2019 12:05

      Благодарю за вопрос, коллега :)


      Программа условно делится на модули:


      1. Инициализация
      2. Вывод
      3. Ввод
      4. Логика игры

      Условно — поскольку, вследствие жёсткой оптимизации, рамки между первыми тремя немного размыты. У меня нет точных сведений по размерам отдельных модулей (в какой-то момент перестал отслеживать).


      Данные хранятся в виде массива 10+10x12.


      Статистика по Barebone DOS edition (в BIOS на процедуру больше):


      • call — 5
      • ret — 2
      • loop/loopz — 5
      • rep — 2
      • jmp — 1 (бесконечный основной цикл)

      Последний можно считать управлением, т.о. размер модуля управления — 2.


      Оптимизировано всё, алгоритм и код неразделимы. Рекурсия, естественно, применялась — иначе не было бы ИИ.


      1. ormoulu
        02.12.2019 13:04

        Спасибо! Под «управлением» подразумевался пользовательский ввод, это же игра )

        Можно чуть подробнее про данные? Что хранится в векторах? Мне не очень понятно, возможно потому, что ничего не смыслю в шахматах :( Догадываюсь что один из массивов это возможные ходы разных фигур, это так?

        Код действительно впечатляет (что вполне ожидаемо). Сколько приблизительно по времени заняла вся работа?


        1. leanchess Автор
          02.12.2019 13:23
          +2

          В общем, надо писать продолжение статьи :)


          Будем рассматривать отдельно метаданные (то, что уже в коде) и данные (шахматную доску).


          Метаданные заданы в массивах (опять-таки, в самой "тощей" вариации):


          1. init_db — то, из чего формируется доска при инициализации,
          2. moves_db — на каждую фигуру: кол-во векторов, дальность, адрес первого вектора
          3. vec_db (условно) — векторы ходов
          4. eval_db — величина для оценочной функции на каждую фигуру

          Данные — стандартные 10x12 плюс дополнительный ряд сверху от верхнего ряда (вместо байта слева).


          Вся работа заняла около двух недель (при этом остались наработки для полной реализации).


          1. ormoulu
            02.12.2019 14:18
            +1

            Да, почитать подробно описание алгоритма было бы очень интересно, так что если найдете время на статью, будет здорово!


  1. seoquickcom
    02.12.2019 11:33

    Самые легковесные шахматы для ПК были созданы Дэвидом Хорном (David Horne) в 1982-м. Они занимали 672 байта из 1000 байт тогдашних внутренних накопителей. Сегодня на компьютерах можно встретить тербайтные накопители, но это не помешало Оливеру Паудади (Olivier Poudade) сделать 472-х байтную версию шахмат. Но ваши, это круто!!!


    1. leanchess Автор
      02.12.2019 11:36

      Верно, я не упомянул 1K ZX Chess в статье (но не забыл о них, см. описание на английском). LeanChess немного не дотягивают по функционалу, но получились более, чем в два раза легче.


    1. leanchess Автор
      02.12.2019 11:39

      <francophilia-mode>Не Оливеру Паудади, а Оливье Пудад</francophilia-mode>


    1. ksr123
      04.12.2019 07:30

      Что за килобайтный накопитель в 1982 году? Странное уточнение.


  1. chv
    02.12.2019 11:40

    Я не понял, как ей можно проиграть. Ощущение, что программа делает первый ход из возможных, а не ищет что-то каким-то алгоритмом.


    1. leanchess Автор
      02.12.2019 11:41

      Вы выиграли? Тогда будьте добры, опубликуйте партию.


      1. RadicalDreamer
        02.12.2019 16:59
        +1

        Детский мат можно влегкую поставить (другое дело, при таких жестких ограничениях на размер программы вряд ли можно что-то с этим сделать):
        1. e4 h6
        2. Bc4 h5?
        3. Qf3 h4??
        4. Qxf7#

        Кстати, программа продолжает играть после мата, так что в каком-то смысле у нее и правда нельзя выиграть :)


        1. leanchess Автор
          02.12.2019 17:18

          Действительно, с глубиной в три полухода играет слабовато. Но стоит поменять на четыре, и мы получим

          3. Qf3 f6

          При этом размер программы не меняется, но задумывется она иногда надолго.


          1. RadicalDreamer
            02.12.2019 19:59
            +1

            Здорово!

            В голове не укладывается, что это можно реализовать всего в 328 байтах машинного кода.
            Было бы интересно увидеть продолжение статьи с техническими подробностями.


      1. chv
        02.12.2019 21:42

        Думаете, это так сложно? Эта штука делает совершенно неадекватные ходы.

        1. e4 h6
        2. d4 h5
        3. Nf3 h4
        4. Bc4 h3 LeanChess как будто продолжает делать первый ход из возможных
        5. gxh3 Rxh3 чудо-дебют
        6. Nc3 Rg3?? отдает ладью
        7. hxg3 g6
        8. Ne5 Bg7?? отдает ферзя
        9. Nxf7 Bh6
        10. Nxd8 Bxc1
        11. Qxc1 e6 не забирает коня
        12. Qg5 d6
        13. Qxg6+ Kd7 дальше уже не интересно
        14. Qxe6+ Kxd8
        15. Qf7 Ne7
        16. Rh8+ Kd7
        17. Qe8# d5 на доске мат, LeanChess как ни в чем не бывало продолжает
        18. Qxd7 съедаю короля, продолжаем игру... Bxd7


        1. RadicalDreamer
          03.12.2019 14:10
          +1

          Там нужно ставить глубину поиска ходов хотя бы 4. Я собирал на 4, вполне неплохо играет (хоть и по прежнему со странного дебюта 1… h6).
          При этом скорость эмуляции CPU желательно хотя бы поднять до 30000 (cycles=30000) в конфиге dosbox.
          Попозже попробую поднять глубину поиска выше 4 (интересно, до какого значения можно ее поднять, так, чтобы не упереться в лимит производительности железа).


          1. leanchess Автор
            03.12.2019 16:46

            Спасибо. Должен признаться, что опыт как в DOSBox, так и в шахматах, у меня нулевой.

            Дебют h6 объясняется очень просто: поиск снизу вверх с выбором первого максимума. Если поменять порядок поиска (или критерий выбора), получится дебют Na6, а дальше (если защищаться от коня) ладья начинает тупо метаться в углу.

            В рамках ограничений, думаю, получилось не так плохо.


          1. leanchess Автор
            03.12.2019 16:56

            Попробовал глубину 5. Думает по десять-двадцать секунд, но играет поинтереснее:

            1. e4 g7
            2. Qg4 h7


  1. egordi
    02.12.2019 11:41

    Здорово! Кстати, есть такой шахматный движок, Stockfish, так его в свое время портировали с C++ на assembler. И эта портированная версия стала называться asmFish. Размер при портировании уменьшился с ~1 Mb до 100 Kb, при том что скорость работы движка выросла на 10-15%. В голове не умещалось, как 100 Kb файлик может играть на уровне 3600 эло человеческих


    1. leanchess Автор
      02.12.2019 11:45

      Stockfish был до недавнего времени лучшим в мире.

      Не представляю, как такое портируется на ассемблер. Думаю, проще взять откомпилированный C++ и оптимизировать проблемные участки.

      P.S. Говоря о 100Kb, мы, скорее всего, не учитываем объём библиотек дебютов и эндшпилей.


      1. egordi
        02.12.2019 15:56

        Да, библиотеки из asm версии «выпилены». Но можно избавиться от них компиляцией с ключом static, что ужмет C++ версию до 250 Kb.


  1. asof
    02.12.2019 13:50

    Мощно


  1. Darlington
    02.12.2019 14:35
    +1

    Это всё очень круто, но как отличить свои от чужих, если на скриншоте все фигуры одного цвета?


    1. leanchess Автор
      02.12.2019 14:44
      +1

      Белые заглавные, чёрные строчные, как у всех.


  1. Ostrie_Brevna
    02.12.2019 14:46

    leanchess, полагаю, вы знаете про Code Golf, ваше достижение — именно из этой сферы (и это действительно круто). Вот тут обсуждение по теме: codegolf.stackexchange.com/questions/45179/smallest-chess-program


    1. leanchess Автор
      02.12.2019 14:53

      Спасибо.


      Size-coding и code golfing — немного разные вещи. Я как раз добавил там ответ, но его стёрли (при этом ответ reeagbo оставили) — может, потому что указал ссылку, а не выложил код целиком.


      1. Ostrie_Brevna
        02.12.2019 15:09

        Да, я перепутал size-coding и code golfing. И у reeagbo там тоже в качестве показателя размера указан размер скомпилированного бинарника (т.е. характеристика с точки зрения size-coding). И да, похоже, там надо выкладывать код, иначе трудно объяснить, почему ваше решение стёрли (как минимум по размеру бинаря вы «выиграли» у reeagbo.


        1. leanchess Автор
          02.12.2019 15:29

          Это довольно распространённая ошибка; собственно, Alex Garcia сам об этом написал. В любом случае, я добавил код и проголосовал за undelete. Для того, чтобы ответ стал видимым, нужны ещё голоса ;)


    1. Xobotun
      02.12.2019 17:16

      Да, автор по ссылке оставил свой ответ за три часа до публикации этой статьи, предвосхитив мой комментарий, что неплохо бы там отметиться – и теперь его там стёрли. Облом-с. :/


  1. Oldshelf
    02.12.2019 14:53

    Ходы соперника вообще не проверяются на корректность.

    Проверку хода можно сделать на основе допустимых ходов компьютера — это должно помочь сэкономить место.

    Думал, что меньше 10 килобайтных «Chess88» Дона Берга шахмат не бывает. Правда, там была ещё CGA графика.


    1. leanchess Автор
      02.12.2019 14:56

      Проверку хода можно сделать на основе допустимых ходов компьютера — это должно помочь сэкономить место.

      Разумеется. Задача — не просто сэкономить место, а максимально сэкономить место.


      1. vanxant
        02.12.2019 16:32

        тут есть тонкая грань между шахматами и не-шахматами. Фигли там выигрывать, если я могу на каждом ходу своей пешкой жрать любую вашу фигуру на поле?


        1. leanchess Автор
          02.12.2019 16:50

          Согласен, это не-шахматы. Для того, чтобы они стали шахматами, надо добавить прыжок и замену пешки, рокировку и взятие на проходе. Проверка допустимости хода стоит ниже в порядке приоритетов.


  1. Gargo
    02.12.2019 16:28
    -1

    только один вопрос — Зачем?!


    1. JerleShannara
      02.12.2019 16:54
      +2

      We do what we must because we can. =)


  1. glorfindeil
    02.12.2019 17:14

    Почему-то вспомнилась игра на Dendy c Take 5 в качестве саундтрека и очень слабым ИИ. Интересно, можно ли используя современные оптимизации написать реально сильные шахматы на восьмибитную платформу?


    1. leanchess Автор
      02.12.2019 17:23

      Что вы называете современными оптимизациями? Не думаю, что за последние двадцать лет изобрели что-то новое. Подозреваю, что для того, чтобы получить сильные шахматы на слабом процессоре, придётся идти окольными путями — например, запихнуть в картридж огромный ROM с библиотеками дебютов и эндшпилей.


      1. kozar
        02.12.2019 18:28

        Ну, CPU помощнее тоже можно в картридж запихнуть, как это на SNES делали, с en.wikipedia.org/wiki/List_of_Super_NES_enhancement_chips#SA1 или тем же Super FX.
        А если серьёзно, то всё же продвинутые ассемблеры, дебаггеры, накопленный опыт и т.д. позволили к концу жизненного цикла Famicom/NES делать более сложные и навороченные игры, чем ранние, даже если они уже использовали мапперы и доп. (V)ROM/(V)RAM.
        А сейчас еще и эмуляторы есть, что позволяет перепробовать разные финты гораздо быстрее, чем прошивая каждый раз eeprom и втыкая в консоль


      1. glorfindeil
        02.12.2019 18:46

        Насколько мне известно, как раз в те поры основная стратегия шахматного ПО была в зашивании как можно большего количества исторических данных, с оценками тех или иных ситуаций. Современные шахматные приложения становятся все более и более «умными», в них хитрым образом закладываются различные стратегии. Возможно это бред, но учитывая развитие шахматных машин как таковых, шахматная машина написанная сейчас, даже с известными техническими ограничениями, по моей версии должна на голову побеждать шахматную машину из прошлого. Не знаю:)


        1. leanchess Автор
          02.12.2019 18:54

          Возможно, но речь не идёт об оптимизациях.

          В комментарии выше упомянули asmFish, занимающий около 100K на 64-разрядном процессоре. Скорее всего, его можно было бы портировать на восьмиразрядник, уложившись в 64K. Так что в теории это возможно, да.


  1. somebody4
    03.12.2019 10:15

    А если в код добавить разархиватор который из собственного «ассемблера», сделает х86? Или на таких размерах выйгрыша не будет?

    Или важно сколько занимает в памяти, а не на диске?


    1. leanchess Автор
      03.12.2019 10:19

      Не пробовал, но, думаю, вряд ли поможет.