vak: (Default)
[personal profile] vak
Игру "посадка на Луну" написал в 1969 году семнадцатилетний американский школьник Джим Сторер. Изначально он назвал её Rocket, но позже игра стала известна как Lunar Landing. Написана игра была на языке Focal для компьютера PDP-8. Позже широко разошёлся вариант, переписанный на Бейсик. На БЭСМ-6 эта игра имелась в составе игровой системы Джин. Не так давно [personal profile] spamsink смог восстановить исходный бэсмовский код (landing.pas).

Игра довольно трудная. Чаще всего вы получаете результат вида:
SORRY,BUT THERE WERE NO SURVIVORS-YOU BLEW IT!
IN FACT YOU BLASTED A NEW LUNAR CRATER 267.13 FT. DEEP
Чтобы результат считался приемлемым, остаточная скорость не должна превышать 22 мили в час: "CONGRATULATIONS ON A POOR LANDING". Пришлось припомнить бэсмовский опыт и потрудиться несколько дней, чтобы снизить скорость меньше 10 mph: "GOOD LANDING-(COULD BE BETTER)". Хитрость в том, что не нужно начинать тормозить прямо сразу, иначе вам не хватит топлива. Надо первые 70 секунд просто свободно падать. Со временем мне удалось достичь 4 mph. Но судя по исходникам, можно сесть ещё более мягко, ниже 1 mph.

Пришлось сварганить серьёзный оптимизатор, методом Монте-Карло подбирающий оптимальные величины расхода топлива на каждом шаге. Вот мой рекорд: 0.17 мили в час остаточной скорости прилунения. Будем запускать версию, переписанную с Фокала на Си. Скачаем с сайта самого Джима Сторера, ныне профессора университета Brandeis в Массачусетсе:
$ wget https://www.cs.brandeis.edu/~storer/LunarLander/LunarLanderTranslations/LunarLanderJohnsonTranslation-c.txt 
$ mv LunarLanderJohnsonTranslation-c.txt rocket.c
$ cc rocket.c -o rocket
$ ./rocket
CONTROL CALLING LUNAR MODULE. MANUAL CONTROL IS NECESSARY
YOU MAY RESET FUEL RATE K EACH 10 SECS TO 0 OR ANY VALUE
BETWEEN 8 & 200 LBS/SEC. YOU'VE 16000 LBS FUEL. ESTIMATED
FREE FALL IMPACT TIME-120 SECS. CAPSULE WEIGHT-32500 LBS


FIRST RADAR CHECK COMING UP


COMMENCE LANDING PROCEDURE
TIME,SECS ALTITUDE,MILES+FEET VELOCITY,MPH FUEL,LBS FUEL RATE
0 120 0 3600.00 16000.0 K=:0
10 109 5016 3636.00 16000.0 K=:0
20 99 4224 3672.00 16000.0 K=:0
30 89 2904 3708.00 16000.0 K=:0
40 79 1056 3744.00 16000.0 K=:0
50 68 3960 3780.00 16000.0 K=:0
60 58 1056 3816.00 16000.0 K=:0
70 47 2904 3852.00 16000.0 K=:200
80 37 1930 3476.43 14000.0 K=:200
90 28 1385 3072.94 12000.0 K=:189
100 20 1515 2664.30 10110.0 K=:189
110 13 2592 2222.89 8220.0 K=:177
120 7 4892 1777.47 6450.0 K=:183
130 3 3573 1274.99 4620.0 K=:198
140 0 5050 673.10 2640.0 K=:198
150 0 9 1.49 660.0 K=:10
ON THE MOON AT 157.20 SECS
IMPACT VELOCITY OF 0.17 M.P.H.
FUEL LEFT: 588.05 LBS
PERFECT LANDING !-(LUCKY)
Исходный текст программы на Фокале лежит здесь: LunarLanderListing.jpg

В игру можно играть онлайн на сайте: lunar69.uber.space/lunar.html

Date: 2023-07-12 12:25 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Как интересно, это снижение расхода на 110-й секунде.

Вот у японцев что-то не вышло последний раз. Плохо тормозили.

Date: 2023-07-12 13:46 (UTC)
dmarck: (Default)
From: [personal profile] dmarck
вроде бы, тормозили-то хорошо, но из-за нерасчётного поведения высотомера решили что "уже фсйо", а там ещё было

(или я их с кем другим спутал? не, вроде про Хакуту именно это и пишут)

Date: 2023-07-12 15:41 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Кстати, он - одна из букв S в LZSS, которым пользуются все зипоподобные программы сжатия.

Date: 2023-07-12 16:07 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Как мы знаем, то ли из-за ошибки в формуле, то ли из-за последующего намеренного хака в бэсмовском варианте эта последовательность расходов горючего не работает, получается
ОN ТНЕ МООN АТ 145 SЕСОNDS. 
IМРАСТ VЕLОСIТУ ОF 556 F.Р.S. 
FUЕL LЕFТ 1657 LВS. 
ТНЕRЕ’S NОW А NЕW LUNАR СRАТЕR 105 FЕЕТ DЕЕР. 
.......SРLАТ.  NОТ SО GООD.  INЕХРЕRIЕNСЕ РЕRНАРS. 


Попробуй в своей программе подбора поменять в реактивной формуле log(1-x) на -log(1+x) и посмотри, удастся ли тебе найти решение для интервала 10 секунд.

Date: 2023-07-12 19:33 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Да этот полином в apply_thrust

J = V + G * S + Z * (-Q - Q_2 / 2 - Q_3 / 3 - Q_4 / 4 - Q_5 / 5);

это же, в сущности,


J = V + G * S + Z * log(1-Q);

Date: 2023-07-12 20:41 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Как и ожидалось, замена полинома на log(1-Q) приводит к тривиальным расхождениям, а замена на -log(1+Q) приводит к фиаско: оптимизация ничего лучше 500 с лишним футов в секунду не находит.

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

Date: 2023-07-12 22:08 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
В бэсмовском варианте было можно изменять шаг времени, поэтому там интервал сначала делится на секунды, и результат приложения тяги вычисляется посекундно. А свободное падение с любым шагом времени вычисляется одинаково.

Date: 2023-07-12 23:25 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
И бэсмовский вариант сажается:

The best score 0.673517, control { 0 0 0 0 0 0 0 200 194 174 200 200 196 191 188 11 }

Re: Вот это другое дело!

Date: 2023-07-13 01:36 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Пара замечаний: поскольку топлива осталось больше 500 фунтов, этот же вариант годится и для уровня 1.

Уровень 0 - явно нерешаемый.

Моя программа 3 года назад пыталась перебором с возвратом искать первый попавшийся годный способ сажать, но за время, которое я был готов ждать (минут 5) с интервалом 10 секунд ничего не находилось, поэтому я просто снизил интервал, и довольно быстро годный вариант нашелся. А optimize работает минут 15.


Re: Вот это другое дело!

Date: 2023-07-13 19:18 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Насчет нулевого уровня: если он был в версии с правильной формулой +Z*log(1-Q), то шанс ещё может быть. Если начинать с 15500 фунтов и оптимизировать с шагом 1 секунда не на минимум скорости посадки, а на максимум остающегося горючего при приемлемой скорости посадки, то за ночь мне нашло 228 фунтов:

The best score 228.297, control { 0 0 0 0 0 0 0 189 182 190 200 199 200 199 200 8 }

(последняя восьмерка незначащая, садится раньше)

    140               0   3858         594.76      1910.0      K=:200
ON THE MOON AT   148.41 SECS
IMPACT VELOCITY OF    21.50 M.P.H.
FUEL LEFT:   228.30 LBS
CONGRATULATIONS ON A POOR LANDING

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

Date: 2023-07-13 21:50 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Для доказательства возможности посадки скорость на 120 миль должна быть не меньше 3600 mph. А она падает до этого значения уже на 100 милях. Увы-с.


TIME,SECS   ALTITUDE,MILES+FEET   VELOCITY,MPH   FUEL,LBS   FUEL RATE
      0               0      0         -22.00         0.0      K=:200
     10               1     70        -694.90      2000.0      K=:200
     20               3   4199       -1297.84      4000.0      K=:200
     30               8    897       -1843.40      6000.0      K=:200
     40              13   5236       -2341.03      8000.0      K=:200
     50              21    727       -2798.05     10000.0      K=:200
     60              29   2660       -3220.19     12000.0      K=:200
     70              38   5277       -3612.07     14000.0      K=:200
     80              49   2155       -3779.86     15000.0      K=:0
     90              59   4529       -3743.86     15000.0      K=:0
    100              70   1095       -3707.86     15000.0      K=:0
    110              80   2413       -3671.86     15000.0      K=:0
    120              90   3203       -3635.86     15000.0      K=:0
    130             100   3465       -3599.86     15000.0      K=:^C

Edited Date: 2023-07-13 21:50 (UTC)

Date: 2023-07-12 20:14 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
The best score 0.122718, control { 0 0 0 0 0 0 0 200 181 196 200 188 187 185 197 10 }

Date: 2023-07-12 20:47 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Бинарник с диска какой-то очень джинозависимый. Неясно, почему остальные игры более или менее работают, а у "посадки" проблемы с текстами. Лучше пользоваться landing.sh и pult2.b6 оттуда же, где landing.pas.
(screened comment)

Date: 2023-07-12 21:33 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Так я и говорю, в бэсмовской посадке формула неправильная. Какой-то %чудак неправильно понял знак аргумента в полиноме, когда переводил из Фокала или Бейсика в Паскаль.

https://www.desmos.com/calculator/fmmxwekfpo

А не подскажете?

Date: 2023-07-12 16:32 (UTC)
From: [personal profile] dedekha
Для управления одним домашним прибором мне нужно включить 150Ohm/2Wt сопротивление последовательно с реле, напряжение 24V. Не хочется чтобы это в воздухе висело - наверное есть коробочки или sleaves для таких поделок.


Re: А не подскажете?

Date: 2023-07-12 17:21 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Двухваттное сопротивление сгорит нахер. 24^2/150 = почти 4 ватта.

Re: А не подскажете?

Date: 2023-07-12 18:03 (UTC)
From: [personal profile] dedekha
Они вообще рекомендуют 1/8 Wt - видимо сопротивление нагрузки весьма существенно и ток переменный.
Я считал что я подстраховался с 2Wt, возьму 4.

На а коробочку для поделок не посоветуете?

Re: А не подскажете?

Date: 2023-07-12 18:11 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Это на всякий случай, если что где закоротит. А коробочки гуглить нужно: https://www.google.com/search?q=diy+electronic+box

Date: 2023-07-12 21:15 (UTC)
sab123: (Default)
From: [personal profile] sab123
Подобная программа также стала первой в серии космических игр на программируемом калькуляторе в "Технике-молодежи". Первая компьютерная (калькуляторная) игра, в которую я играл.

Date: 2023-07-13 08:33 (UTC)
green_fr: (Default)
From: [personal profile] green_fr
Ага, аналогично :-)

Date: 2023-07-12 22:27 (UTC)
From: [personal profile] master_a
I found the BASIC version of the code and also wrote a program to find a good solution. But the BESM6 version has a minor bug. When calculating log using 3 (as I recall) terms, the sign is wrong in one place. Found by accident when I wrote a Python version and compared results.

Date: 2023-07-13 08:34 (UTC)
green_fr: (Default)
From: [personal profile] green_fr
Я не сразу понял, зачем тебе тут Монте-Карло, когда задача тупо решается аналитически. Но потом вспомнил, что они же не принимают дробных чисел расхода топлива, поэтому да, надо подбирать. А так задача с одной переменной: сколько нужно сжечь топлива на 70-й секунде, чтобы потому всё время жечь ровно 200 и приземлиться со скоростью рувно 0. Заодно и топливо экономит :-)