Программист обнаружил баг в игре про лунный посадочный модуль спустя 55 лет после релиза
20 июля 1969 года Аполлон-11 совершил посадку на поверхность Луны, что стало достижением для всего человечества и окончанием первой космической гонки. Нил Армстронг вошел в историю, а среди миллионов людей, наблюдавших за этим событием, был 17-летний школьник Джим Сторер. Благодаря увлечению математикой и своему отцу-физику, Сторер был вдохновлен идеей высадки на Луну: точными расчетами и контролем, необходимыми для безопасной посадки огромного куска алюминия на пустынную, незнакомую поверхность. В школе у Сторера был PDP-8 — первый коммерчески успешный миникомпьютер, и тогда же он приступил к созданию новой программы под названием Lunar Landing Game.Текстовая игра, написанная на раннем языке программирования FOCAL, просила игрока вводить команды на каждом ходу, рассчитывая высоту, скорость и оставшееся топливо лунного модуля каждую игровую секунду спуска. Суть игры заключалась в использовании запаса топлива для замедления и контроля спуска аппарата, а после достижения поверхности игрок получал отчет о скорости посадки и оставшемся топливе.Игра состоит из менее чем 50 строк кода, но её кажущаяся простота скрывала сложные расчеты, лежащие в основе симуляции, и с годами игра стала популярным программным челленджем. Позже различные коммерческие версии добавили визуальный слой, а Atari сейчас даже разрабатывает официальное продолжение.Инженер-программист Мартин С. Мартин объявил в новом блоге, что, играя с кодом оригинальной игры, он нашел и исправил ошибку, которая оставалась незамеченной в течение 55 лет.Недавно я исследовал оптимальный график сжигания топлива, чтобы приземлиться максимально мягко и с максимальным оставшимся топливом. Удивительно, но теоретически лучшая стратегия не сработала. Игра ошибочно считает, что лунный модуль не касается поверхности, хотя на самом деле это так. Погружаясь в код, я был поражен сложной физикой и расчетами в игре. В конце концов я нашел ошибку: отсутствующее "деление на два", которое оставалось незамеченным почти 55 лет.Мартин объяснил, что ошибка возникала, когда игра пыталась приблизить нижнюю точку траектории. Он представил свои выводы в блоге, где объяснил, что Сторер использовал альтернативную форму квадратного уравнения, где по какой-то причине "отсутствует 2 в знаменателе под корнем! Это, вероятно, была простая ошибка, либо при выводе формулы, либо при её вводе в компьютер". Мартин отметил, что у Сторера не было доступа к программам для алгебры и делал все это вручную.Мартин связался со Сторером, чтобы подтвердить свою находку и узнать, откуда взялась эта сложная математика. На что оригинальный разработчик ответил:Я хорошо умел проводить расчеты и знаком с такими понятиями, как ряд Тейлора, но также помню, что мой отец-физик, помогал в выводе уравнений.Мартин подчеркивает, что даже с исправленной ошибкой некоторые оптимальные стратегии посадки существуют, но "теоретически полный отказ от тяги при посадке, который занимает около 148 секунд, реализовать у нас не вышло". Он завершает статью, отдавая должное изысканности Lunar Landing Game, выпущенной в 1969 году старшеклассником, и включающей аспекты численного моделирования, которые Мартин сам изучал только в процессе получения докторской степени по робототехнике.