[HN Gopher] I found a 55 year old bug in the first Lunar Lander ...
       ___________________________________________________________________
        
       I found a 55 year old bug in the first Lunar Lander game
        
       Author : martincmartin
       Score  : 296 points
       Date   : 2024-06-14 12:24 UTC (10 hours ago)
        
 (HTM) web link (martincmartin.com)
 (TXT) w3m dump (martincmartin.com)
        
       | zug_zug wrote:
       | It's interesting. The naive way to write this would be not use
       | any special formulas, and just recalculate mass and acceleration
       | each frame (based on the new mass). And to calculate intersection
       | with the ground at each frame boundary.
       | 
       | I guess the idea is that the lower your frame-rate, the less
       | accurate this approach is, or maybe the idea is it's fun to use
       | the actual equations.
       | 
       | I'm curious how perceptible the difference is between the two at
       | the original framerate.
        
         | moconnor wrote:
         | There wasn't any graphical output or any frame rate to speak of
         | in the sense you are thinking. The output would appear printed,
         | like this:
         | 
         | https://www.cs.brandeis.edu/~storer/LunarLander/LunarLander/...
         | 
         | Only updating the mass/acceleration at ten-second intervals
         | would be wildly incorrect!
        
           | zug_zug wrote:
           | Oh, thanks. There was an arcade game called Lunar Lander and
           | I thought that this was the exact same thing, and I guess I
           | didn't pay much attention to the pictures.
        
           | vlovich123 wrote:
           | Just because your displaying results in 10s increments
           | doesn't mean anything about the simulation frame rate. You
           | could still simulation 10k frames at 1ms granularity between
           | the results printed each ms. The challenge is computational
           | for a 1960s machine and a closed form solution is sensible
           | here for that reason.
        
         | martincmartin wrote:
         | OP here (of this blog post, not the original game). The naive
         | way is what I expected too, and described as the Euler method
         | in the post.
         | 
         | In terms of physical accuracy, especially when you get near the
         | surface, the mass does change significantly if you have a high
         | rate of fuel burn. But in terms of how challenging/fun it would
         | be, and what strategies you use as a player, I doubt it would
         | make much difference. In fact, there are other lunar lander
         | simulations in the BASIC computer games book, I think one of
         | them does use the naive approach.
         | 
         | If 10 seconds is too long, you could still leave that as the
         | turn in the UI, but internally break each turn into a bunch of
         | smaller time steps, e.g. 10 time steps of 1 second each.
         | Actually, the existing game does that in certain places, which
         | is why his physics simulation takes in an arbitrary time S
         | rather than always the full 10 seconds.
        
       | jihadjihad wrote:
       | Pretty cool, the offending line seems to be 08.10 [1].
       | 
       | I thought it was a little odd that he mentioned "impressive for a
       | high school senior in 1969" multiple times throughout -- honestly
       | I would imagine that growing up in the Space Age would have had a
       | massive influence on technically minded folks, reminds me of that
       | movie from a while back called October Sky.
       | 
       | In the interview in TFA with the game's author he mentions being
       | skilled at calculus--seems to me that if you were interested in
       | space/rocketry/etc. and had the aptitude it makes sense that
       | you'd try your hand at programming a lunar landing game.
       | 
       | [1]:
       | https://www.cs.brandeis.edu/~storer/LunarLander/LunarLander/...
        
         | realslimjd wrote:
         | There were on the order of hundreds of high school students
         | with computer access in the US in 1969, and even fewer with
         | computer literacy. Growing up in the Space Age probably was
         | inspirational, but that doesn't change the fact that computers
         | basically didn't exist to the general public at that time.
         | Unlike now, software development wasn't a widely known career.
         | There wasn't a CS major in the US until 1962. I think that
         | makes it pretty notable he was a high school senior in 1969.
        
           | layer8 wrote:
           | It's unsurprising that at least one of the hundreds would
           | write such a game though? In particular when those having
           | access already are self-selected to some degree.
        
             | bee_rider wrote:
             | It's unsurprising that anything was done by somebody. In
             | fact it is inevitable that the most impressive thing is
             | done by somebody out there, because otherwise it wouldn't
             | be a thing that was done. But, being that person can still
             | be impressive.
        
             | BobaFloutist wrote:
             | It's unsurprising that someone is the best at the world at
             | running, but it's still pretty impressive when they do it.
        
           | schiffern wrote:
           | EDIT Personally, for clarification, _I do think the code is
           | impressive_ , but the above back-and-forth doesn't really
           | explain why.
           | 
           | ---
           | 
           | That explanation still wouldn't mean support the assertion
           | that writing the lander game is the part that's "impressive
           | for a high school senior in 1967."
           | 
           | If anything, all this explanation would show is that _their
           | having access to a computer_ is the  "impressive" part.
        
             | Closi wrote:
             | It needs access to a computer, creativity, and an
             | impressive amount of capability for a high school senior.
             | 
             | This is 5 years before pong - you are inventing game
             | concepts from scratch rather than standing on the shoulders
             | of giants.
        
               | WalterBright wrote:
               | > and an impressive amount of capability for a high
               | school senior
               | 
               | It's only impressive because very few (none?) high
               | schools teach calculus at the level required for his
               | implementation. High schoolers are quite capable of
               | handling that kind of calculus, it's just that the high
               | schools don't teach it.
        
               | Closi wrote:
               | It's not about the level of calculus knowledge for me -
               | it's about building this from scratch with 1960's
               | technology in 50 lines of basic and very little prior
               | art.
               | 
               | It's easier to be the second person to do something.
        
               | WalterBright wrote:
               | I agree with that.
        
               | renewiltord wrote:
               | Yeah but being first is part of it, no? In my mid 20s I
               | read Karl Popper's _Conjectures and Refutations_ and
               | realized I 'd reached the falsification pathway to
               | epistemology as a teenager. But was I a genius or was I
               | just lucky to be born in this age where the soup of
               | concepts we're bathed in makes that obvious? I think the
               | latter. Same with Goldbach's Conjecture, I came up with
               | an equivalent conjecture as a pre-teen.
               | 
               | Evidence since has shown I'm reasonably intelligent but
               | not the Popper or Goldbach or even the Walter Bright of
               | our times.
               | 
               | Humanity the organism evolves so more things become
               | obvious to more average members. Perhaps ten year olds
               | will see the intuitive use of monadic structures in the
               | future.
        
               | mhh__ wrote:
               | The UK stopped including calculus as part of physics
               | even!
               | 
               | I got told off for doing an integral.
        
               | WalterBright wrote:
               | How sad.
        
             | tivert wrote:
             | I think both. It's likely only very impressive high school
             | students got that much access to a computer in 1967.
             | 
             | It reminds me of an article I read about Jai alai years
             | ago: the sport is long, _long_ past its peak, and one of
             | the people interviewed said the players nowadays are some
             | of the best ever, because only people who are really,
             | really good and really, really love the game still try to
             | play professionally.
        
           | scrame wrote:
           | yeah bill gates at lakeside in Seattle was one of like 3 high
           | schools in the country that had a computer.
        
         | phkahler wrote:
         | I needed to know what language that is written in. Turns out
         | it's something called FOCAL, as mentioned in this article about
         | the game:
         | 
         | https://retro365.blog/2021/12/02/bits-from-my-personal-colle...
         | 
         | Wikipedia on FOCAL:
         | 
         | https://en.wikipedia.org/wiki/FOCAL_(programming_language)
        
           | martincmartin wrote:
           | OP here. One interesting thing about FOCAL is that * has
           | higher precedence than /. So in Lunar Lander, M*G/Z*K is what
           | mathematicians and other languages would write M*G/(Z*K). I
           | did a double take when I first saw that. :) As the Wikipedia
           | article says, "This can cause subtle errors when converting
           | FOCAL source code to other systems."
           | 
           | Also, the IF syntax is a little limiting and hard to read,
           | although I suppose programmers would get used to it.
        
             | pbhjpbhj wrote:
             | Your code got munged, use backslash to escape * (otherwise
             | it starts a span of italicised text), or use four leading
             | blanks for code blocks (in which escaping is usually not
             | needed):
             | 
             | M*G/Z*K
             | 
             | I think you meant, the above and
             | M*G/(Z*K)
             | 
             | respectively.
        
               | martincmartin wrote:
               | Thanks. Fixed!
        
             | jprete wrote:
             | That's surprising from today's perspective, but when I
             | imagine the thought process, it seems reasonable,
             | especially for math and science purposes where
             | multiplication and division operators usually get grouped
             | into a series of multiplications above the division bar,
             | and a series of multiplications below it.
        
               | martincmartin wrote:
               | True. + also has higher precedence than -, so that a - b
               | + c means a - (b + c).
        
               | MarkusQ wrote:
               | Ah, the old                   My         Dear
               | Aunt         Sally
               | 
               | vs.                   My Dear         Aunt Sally
               | 
               | debate. :)
        
             | omoikane wrote:
             | Another curious feature is that the labels appears to be
             | floating point, as in "G 5.9" appears to transfer control
             | to line starting at "05.90".
        
               | LegionMammal978 wrote:
               | They aren't actually floating-point: each label is a pair
               | of numbers, the first denoting the group and the second
               | denoting the line within that group. The groups have no
               | semantic importance, they are only for organization.
        
         | dn3500 wrote:
         | I was in high school in 1969, knew some calculus, and was very
         | interesting in programming. In a good size city with a major
         | engineering university and a large high school the main barrier
         | was access to computers. Our school had teletypes connected to
         | a remote mainframe. My friends and I found a few computers at
         | the university we could use at night, but most had card readers
         | and line printers, and none had graphics terminals of any kind.
         | I think the particular combination of skills, interest, and
         | access would have been pretty rare at the time.
        
         | hyperthesis wrote:
         | Though famous as the first lunar lander game, the impressive
         | part was the specific numerical techniques used.
        
           | martincmartin wrote:
           | OP here. Yes, that's what I meant. Using the rocket equation,
           | truncated Taylor series approximation, truncating even more
           | to make things solvable, then iterating to improve the
           | solution, were all things I wouldn't have expected.
        
         | martincmartin wrote:
         | _I thought it was a little odd that he mentioned "impressive
         | for a high school senior in 1969" multiple times throughout --
         | honestly I would imagine that growing up in the Space Age would
         | have had a massive influence on technically minded folks,
         | reminds me of that movie from a while back called October Sky._
         | 
         | OP here. I see your point. But think of what's needed to create
         | this game:
         | 
         | - From high school physics, you know to start with a free body
         | diagram. There are two forces, gravity and thrust. So far, your
         | average high school student with an A in physics should be able
         | to do that.
         | 
         | - Gravity depends on the distance to the center, which of
         | course is changing, that's the whole point of a lander. I mean,
         | you start 120 miles up. You have to realize it doesn't change
         | much, so can be approximated as a constant. But you've been
         | exposed to that in physics class, so maybe you just assume it's
         | a constant.
         | 
         | - How the hell does thrust work as a function of burn rate? Is
         | the exhaust velocity higher when you burn more? In other words,
         | considering 100 lbs/sec vs 200 lbs/sec, when you double the
         | flow of fuel into the engine, and then you burn it, it turns
         | into twice as much fuel in the same volume. Wouldn't it be
         | forced out at twice the speed? Or at least a higher speed?
         | Maybe you think of the universal gas law, PV=nRT. The volume is
         | constant (the volume of the engine), n is doubled, R is a
         | universal constant. So that means P or T changes, or both. Why
         | is T, which is a function of the velocity of the molecules,
         | constant why P is doubled? Why don't both change?
         | 
         | - So you talk to your Dad, who happens to be a physicist. Most
         | high school students, even those getting an A in physics, don't
         | have a physicist for a father who can look up the properties of
         | rocket engines and find the Tsiolkovsky rocket equation. So a
         | high school senior finding the rocket equation is impressive to
         | me.
         | 
         | - To go from velocity to position, you need to integrate. I'm
         | not sure your average A physics senior would think of replace
         | the FLOG() call with a Taylor series and integrating it term by
         | term.
         | 
         | - How many terms of the Taylor series do you need? Does it even
         | converge for you? If he thought of these subtleties, that's
         | impressive. But it's possible that young Jim didn't realize
         | these issues and just uses 5 terms because that seemed like a
         | lot of terms.
         | 
         | - So now you can simulate it in near the moon. Cool! But how do
         | you detect when it hits the ground? You could try to solve for
         | altitude equals zero, and see if there are zero or more
         | solutions. But even if there are solutions, they might be in
         | the past or the future. So instead you decide to look where the
         | velocity is zero, since you know this happens exactly once
         | during the turn. I think that shows some ingenuity there,
         | although I don't know if that was 18 year old Jim's thought
         | process.
         | 
         | - So you try to invert the rocket equation: given a desired
         | delta-V, how much fuel do you need to burn to achieve it? If
         | you try this with pencil and paper and high school math,
         | including Calculus, you keep getting stuck. You don't have the
         | tools to show that it's actually impossible and needs you to
         | introduce a new function, the Lambert W.
         | 
         | - So maybe you give up, or maybe your physicist Dad helps you
         | again. Using your Taylor series, you now have to solve a 5th
         | degree polynomial. So you decide to scrap the 3rd, 4th and 5th
         | term to get yourself a quadratic. Why is it ok to scrap these
         | now, when it wasn't ok when computing the regular dynamics? I'm
         | impressed that he realized he can use different levels of
         | approximation in different circumstances, without it generating
         | some inconsistencies or other problems.
         | 
         | - You somehow figure out how to use the alternate form of the
         | quadratic equation, which means you didn't just look it up and
         | type it in. Possibly impressive.
        
       | luxuryballs wrote:
       | I wonder if this works for braking in automobiles to minimize
       | brake pad wear.
        
         | lionkor wrote:
         | Automobiles are more (wear-)efficient at braking when they use
         | the engine to brake, not the brakes, so that would probably be
         | a better approach to automate
        
           | dadadad100 wrote:
           | A long time ago, in a book whose title I don't remember, a
           | character said, "but engine parts are more expensive than
           | brake parts". That has always stuck with me, even as I glide
           | to a stop with almost no braking.
        
             | ljf wrote:
             | Very true - but I drive cars until they die - and have
             | never had a car issue because of engine braking - it is
             | usually another part of the car that goes before whatever
             | damage I am adding to the engine, becomes an issue. So
             | engine brake away!
        
             | settsu wrote:
             | As an avid engine braker who lives in a hilly area and
             | drives in the foothills/mountains often, I figure that at
             | the relatively inconsequential loads and speeds my
             | passenger vehicles operate under, I'm simply leveraging the
             | engine's already constant state of wear while preserving my
             | brakes for a moment when I may need their optimal stopping
             | performance.
        
             | somat wrote:
             | True, however that statement sort of makes the assumption
             | that engine braking is the same ablative system as friction
             | braking. with the same wear characteristics.
             | 
             | I have to admit I don't know the exact wear characteristics
             | of an IC engine in breaking operation but I don't think it
             | is any different/more than it's normal running wear.
        
               | necovek wrote:
               | They are certainly in any way identical, but to engine
               | break, you usually need to switch into a lower gear (or a
               | couple gears lower), which means that the clutch needs to
               | reattach while the engine is rolling at a higher rpm than
               | the gearbox can handle in that gear. Every downshift will
               | do another "reattachment" through the clutch.
               | 
               | Which means that there will be some friction braking
               | before internal engine resistance "takes over". Now,
               | while both brake pads and clutches use "similar"
               | material, it's not the same, and the cost is not the same
               | (clutches are usually more expensive in modern cars).
        
           | necovek wrote:
           | Isn't that simply because the engine provides less resistance
           | through the clutch than brakes do? Would clutch really be
           | spent less than brake pads for the same braking power (light
           | press on the brakes)?
           | 
           | FWIW, modern flywheel clutch kits are way more expensive than
           | brake pads, so the cost is not so clear cut anyway.
        
             | AngryData wrote:
             | You aren't really using clutch surfaces to brake though,
             | mostly you are relying on the friction and energy used to
             | compress your intake air and blow it out the exhaust with
             | either minimal or no combustion/fuel input, and if at speed
             | air resistance. And everything else added up helps too like
             | in friction in transmission and differentials and cam and
             | crank bearings which are hopefully minimal, and also
             | pumping coolant and oil and running the alternator, etc. In
             | an automatic some will be lost lost in heating up fluid in
             | the torque converter too.
        
         | stevage wrote:
         | I often wonder the same thing about my bicycle.
        
         | lapetitejort wrote:
         | For regenerative braking, a similar question would be how best
         | to break to recover as much energy as possible.
        
       | benjedwards wrote:
       | If anyone is curious, in 2009, I discovered that Jim Storer was
       | the author of the first Lunar Lander game and interviewed him
       | about it (and also chronicled the history of the game beyond
       | that). He later provided the source code, which was awesome.
       | 
       | https://technologizer.com/2009/07/19/lunar-lander/index.html
       | 
       | My favorite part is this:
       | 
       | "After leaving high school I never thought about the game again,"
       | says Storer. "Until about a couple of months ago when someone
       | e-mailed me about this, I was completely unaware of any Lunar
       | Lander game other than the one I wrote in high school."
        
         | acyou wrote:
         | Wow, that is a great article. Incredible research and depth.
         | Thanks for the contribution.
        
         | scrame wrote:
         | dude,that's awesome!
        
         | nox101 wrote:
         | That's awesome
         | 
         | I just wanted to add, there's also mechanical lander games that
         | pre-date lunar lander
         | 
         | I can't find a picture. IIRC the machine was something like
         | this
         | 
         | https://content.invisioncic.com/r322239/monthly_10_2015/post...
         | 
         | Except it had terrain and pits. A pit would light up and you
         | needed to land in the pit (your ship landing would depress the
         | button in the center of the pit). If you didn't aim well your
         | ship would hit the edge of the pit, tilt, and you'd fail. If
         | you did hit the button then the light would go off and a
         | different pit would light up.
         | 
         | -- update --
         | 
         | now that I think about it, maybe the controls were more like
         | UFO catcher where you'd align at the top and then press "land".
         | 
         | Anyway, it used to be at Disneyland at the Main Street Arcade.
        
           | popctrl wrote:
           | I played the game in this picture at the pinball museum in
           | vegas. One lever operates the rear fan and the other operates
           | the bottom fan. It was a lot of fun for an analog arcade
           | game.
           | 
           | I returned to the museum a few years ago and it was no longer
           | working. I hope they fix it one day.
        
         | GMoromisato wrote:
         | I'm honored to be included in this article--I wrote Lander
         | (1990) originally for Windows 2.x.
         | 
         | When I applied for a job to work on Lotus Notes (back in 1989),
         | I showed the interviewer (Tim Halvorsen) my Lander game. He
         | said, "That's pretty cool--let's try running it on Windows 3."
         | 
         | At first, I thought, cool! I get to see Windows 3 (which had
         | not yet been released). But then he said, "Windows 3 runs
         | everything in protected mode, so if you have any out-of-bounds
         | pointer access, it will crash instantly. Let's see how you
         | did."
         | 
         | I was on pins and needles the entire time.
         | 
         | But fortunately, Lander didn't crash, and Tim was happy. I
         | ended up getting the job, which forever changed my career.
        
       | probably_wrong wrote:
       | > By 1973, it had become "by far and away the single most popular
       | computer game."
       | 
       | On Lunar Lander and bugs: my first programming book had a version
       | of this game in Basic that I never got to run correctly. 25 years
       | later I came back to it and I was surprised at the ridiculous
       | amount of bugs it had and the convoluted logic ("440 IF
       | <condition> GOTO 450").
       | 
       | I eventually rewrote it as an adult [1] but young me stood no
       | chance. And to this day I wonder what happened inside that
       | forgotten Spanish editorial that turned (almost) working code
       | into whatever made it to the final version.
       | 
       | [1] https://7c0h.com/blog/new/moon_landing_in_basic.html
        
         | darknavi wrote:
         | Probably copy/paste errors (in editorial) mixed with deadlines
         | mixed with no QA.
        
         | yourapostasy wrote:
         | Oy vey, "no chance" is putting it lightly.
         | 
         | A lot of this BASIC code had roots in the 1960's-70's. Back
         | then, editors ruled the roost of print magazines where this
         | code often showed up within, and in books of collections of
         | code they especially ruled with an iron fist. There was little
         | notion that source code had to be dropped in verbatim with
         | absolutely zero changes, so editors would make "judicious"
         | changes in the source code. They thought they were "helping"
         | with "obvious" typographical and editorial decisions.
         | 
         | This lesson was slowly, painfully learned until material
         | improvements across the industry started to take hold starting
         | in the 1980's and realization that source code shouldn't be
         | touched in print really began to permeate the print industry.
         | Though sometimes I wonder if this dynamic spurred the rise of
         | BBS' and helped loosen the stranglehold print media had upon
         | source code distribution, and what an alternative timeline
         | might have looked like if the ones in power in print media were
         | more open to "outsiders" having absolute control over some
         | portion of "their" content.
         | 
         | I learned all the above decades later after I first started
         | playing around with coding as a child, from talking with a much
         | older friend who rose up from within the print media world and
         | saw what happened. When I was a child, with zero adult
         | guidance, and only a handful of books from the school and
         | community library about programming, it was a wonder I stuck
         | with coding at all with the countless programs I typed in by
         | hand from print media that were similarly riddled with errors,
         | so your reminiscing brought back powerful memories.
        
         | anyfoo wrote:
         | That was an enjoyable read. I, too, when I was a child
         | sometimes thought the same thing about my C64 "magically" being
         | able to load some game-related images with just a few lines of
         | code that are... just somewhere inside it? A super bizarre
         | thought, but as a child you're still prone to a lot of magical
         | thinking.
         | 
         | > and the convoluted logic "440 IF <condition> GOTO 450"
         | 
         | To expand a little bit on that, while some instances in the
         | code of your book could indeed use some cleanup (line 440 is
         | especially egregious), the code in the book was likely written
         | for the common BASICs of home computers of the time, which only
         | operated on line numbers and had very limited branching
         | statements?
         | 
         | The BASIC you use seems to be "structured", which was extremely
         | unusual for home computers of the time. I just recently saw
         | that a C64 magazine from 1984 spent _at least 3 issues_ of the
         | magazine on a lengthy article series that introduced the
         | readers to the wonders of structured programming!
         | 
         | The severe restrictions of the IF statement made assembly-
         | language style conditional branches (using GOTO) extremely
         | common and necessary.
         | 
         | You definitely could not nest IFs (as done in your code), so if
         | you wanted to combine IFs together, you had to jump over the
         | ones not taken. Commodore/C64's BASIC (effectively Microsoft
         | BASIC) did not even have ELSE, so usually ELSE had to be
         | implemented with a negated condition and jumping over what
         | would be the "ELSE" branch.
         | 
         | C64 BASIC did however have the interesting quirk that any other
         | statement on the same line would belong to the THEN, e.g.
         | 10 IF A=1 THEN PRINT "FOO" : PRINT "BAR"
         | 
         | Would print FOO BAR if A=1, and nothing otherwise. This of
         | course worked only so far as you could fit statements on a
         | (limited) single BASIC line. Other BASIC dialects would
         | consider the PRINT "BAR" to not belong to the ELSE anymore,
         | which is syntactically cleaner, but could be less convenient
         | depending on what else the dialect offered.
         | 
         | A lot of the convenience and rigor we take as granted today
         | wasn't there. C64 BASIC seemed especially "dirty" to me, having
         | lots of bizarre quirks that are more the result of its
         | implementation. (Another random instance: Every function had to
         | have an argument, whether it was required or not, so you had to
         | write something like "?FRE(123)" to print the amount of free
         | memory, where the 123 did not matter at all.)
        
       | dn3500 wrote:
       | I was confused for a minute because I remember playing Spacewar
       | on a PDP-1 in the 1960s and mis-remembered there also being a
       | lander game. But there wasn't, Storer was the first. There is an
       | interesting history here:
       | 
       | https://www.acriticalhit.com/moonlander-one-giant-leap-for-g...
        
       | efields wrote:
       | Is it really a bug if it hasn't affected the integrity of the
       | game for 55 years? _ducks_
        
       | schiffern wrote:
       | >The rocket equation is what gives rise to the suicide burn being
       | optimal
       | 
       | Nitpick, but this isn't strictly true.
       | 
       | Even if you don't count the vehicle getting lighter as it burns
       | fuel (which is all the rocket equation does here), a suicide burn
       | will still be optimal.
       | 
       | The real reason is because a suicide burn minimizes gravity loss.
       | 
       | https://en.wikipedia.org/wiki/Gravity_loss
        
         | martincmartin wrote:
         | OP here. True, I oversimplified. What I meant was, there are
         | two parts to the dynamics, the rocket equation and gravity.
         | They add linearly, so any extra velocity that comes from
         | gravity needs to be eliminated by increasing the delta V from
         | the rocket equation. The gravity delta V is just acceleration
         | of gravity times time, so you want to minimize the time.
         | Surprisingly (to me), in the rocket equation, it doesn't matter
         | how long it takes, or what sequence of burns you use, or
         | whether you burn at a constant rate all the way through vs
         | short strong bursts, etc. So to land with zero velocity using
         | the least fuel, you just need to land in the shortest amount of
         | time.
        
       | sema4hacker wrote:
       | In the mid 70's I wrote a 2D vector graphics moon lander game for
       | the Adage graphics terminal. You came in fast horizontally and
       | had to use push buttons for the LEM side thrusters and main
       | engine to slow down and land horizontally, resulting in either a
       | crater if you were too fast, or if you ran out of fuel, otherwise
       | you saw one or more planted American flags depending on the
       | quality of the landing.
       | 
       | Years ago I threw out my only copy of the source code, thinking
       | it had no value and would never be re-used, something I regretted
       | later when I realized how early a graphics game it was
       | historically, and how easily it could have beeen resurrected with
       | a simple emulation.
        
       | schiffern wrote:
       | >It's also possible to land gently, you just need to end your
       | 14th turn with a low altitude and velocity, and then use low
       | thrust in your 15th turn, landing somewhere after 150 seconds.
       | It's just the theoretical full-thrust-on-landing suicide burn,
       | that takes around 148 seconds, that eludes us.
       | 
       | I expect the fuel-optimal _soft landing_ strategy (ignored
       | because it doesn 't fit the exact form of a "suicide burn") would
       | be to play 164.31426784 lbs/second at t=70 seconds, and then
       | replace one of the subsequent 200 lbs/second inputs with
       | 199.99999999 lbs/second.
       | 
       | The earlier you "play" 199.99999999 the better, so just use
       | exhaustive search and select the earliest play that still achieve
       | a soft landing.
        
         | martincmartin wrote:
         | The nature of the bug is that it has trouble finding when the
         | lander has touched the surface. You need to have an altitude of
         | less than zero for around 0.05 seconds for the game to notice
         | that you've landed. If your thrust during that time is 200 or
         | 199, to have an altitude < 0 for that long, then you need to
         | have a speed greater than 1 MPH when your altitude is zero.
         | 
         | Even when the bug is fixed, the code is still only
         | approximating the lowest point. Also, even when it detects that
         | you've landed, now it needs to compute the time when you land,
         | i.e. when the altitude is zero, not velocity. It also uses an
         | approximation for that.
         | 
         | So the times will be a little off. If you're burning 200 or 199
         | during that last time step, you have a high acceleration so
         | even a small amount of time turns into a large amount of
         | velocity. Instead, if you're burning say 10 lbs/sec, then being
         | off by say 0.08 sec won't change your velocity much.
        
           | schiffern wrote:
           | I get what you're saying, but I don't think that contradicts
           | the optimal strategy I outlined?
           | 
           | Rather than a large deviation from a suicide burn at the end
           | of the burn, a small deviation at the beginning of the burn
           | should be a cheaper way (w/r/t fuel burn) to "search" the
           | buggy code for a possible soft landing solution.
           | 
           | Anyway, what a fun write-up! Thanks for posting it.
        
             | martincmartin wrote:
             | Yeah, I think we're agreeing. :)
             | 
             | So it turns out, before discovering the bug, I actually
             | wrote code to find the optimal sequence when your choices
             | are restricted to integers. I thought, along the same lines
             | as you, "maybe if you burn 165 or 170 or something in the
             | first non-zero term, then you could burn less on the 14
             | turn and still land."
             | 
             | And this is how I know it's not possible, at least with
             | integer burn rates. :) I checked all 201^9 combinations,
             | with a few optimizations to cut down the search space.
             | 
             | That's different than what you said, of using floating
             | point for the last burn. But it is in a similar spirit.
        
               | necovek wrote:
               | I think they are saying that you need to switch to
               | 199.999... lbs/s for all the 200 lbs/s burns, not just
               | the last one.
               | 
               | Just trying to clarify where you seem to be speaking past
               | each other, though it seems that this might simply lead
               | to a non-optimal strategy (i.e. taking more time to land
               | than theoretically possible, however minute the
               | difference is).
        
               | schiffern wrote:
               | >switch to 199.999... lbs/s for all the 200 lbs/s burns,
               | not just the last one
               | 
               | That's not it. See here:
               | https://news.ycombinator.com/item?id=40685081
        
               | schiffern wrote:
               | >I thought, along the same lines as you, "maybe if you
               | burn 165 or 170 or something in the first non-zero term,
               | then you could burn less on the 14 turn and still land."
               | 
               | That's not exactly what I was thinking.
               | 
               | Clearly that won't work, because just by changing the
               | least significant digit (ie adding 1e-8 lb/s) in step
               | t=70 seconds, you "blow past" the soft landing window, in
               | part due to the bug.
               | 
               | Evidently the move played at t=70 seconds is, in effect,
               | too 'course-grained' to effectively target the (small)
               | soft landing window. By shifting your "subtract 1e-8
               | lb/s" move (ie playing 199.99999999 lb/s) later and later
               | in the burn, you effectively make it more and more fine-
               | grained (for a minimum fuel penalty) until you can
               | achieve that soft landing.
               | 
               | Thanks again. I'm not sure who's right, but it's
               | certainly a very stimulating problem!
        
       | Kiro wrote:
       | Surely the game must have hundreds of bugs like any other game.
        
         | qup wrote:
         | Given the simplistic nature of the game, I'm not convinced.
        
         | TheRealPomax wrote:
         | Why? This is from a time when there weren't any "other games".
         | Heck, there were no computer games, period: there were only
         | applications that could be described as "a sort of game on the
         | computer" but only in the sense that you were asked to perform
         | a task, tell the application what you though the task
         | parameters should be, and then the application told you whether
         | you were right.
         | 
         | Applications were also still measured in bytes (the idea of the
         | average program being so large that everything needed to be
         | described in kilobytes was still in its infancy). So you
         | literally didn't have enough space to hide 100 bugs that would
         | linger unnoticed for 55 years: 100 bugs would be your entire
         | source code. In fact, here's the source code for the game in
         | the article:
         | https://www.cs.brandeis.edu/~storer/LunarLander/LunarLander/...
         | - it's 2027 bytes. If it had 100 bugs, or even 5, it either
         | wouldn't run, or it would be _obviously_ wrong.
         | 
         | And that source code also illustrates the kind of "game" this
         | is: it's just a text prompt to get you to fill in the values
         | that set up the flight, and then it runs a simulation with your
         | parameters and spits out the result. That was enough to
         | constitute a game people would play religiously, back in the
         | day.
         | 
         | Things changed _a lot_ since then =D
        
         | anyfoo wrote:
         | The game is _tiny_. It does not even have any graphics. It
         | would be an impressive feat to fit even 10 bugs in there, and
         | still have it seem like a functioning game.
        
       | methuselah_in wrote:
       | That's why old people manage to create such great things. Writing
       | game damn
        
         | TheRealPomax wrote:
         | ...what? The game was made by a teenager. The only reason
         | they're now old is because 55 years have passed.
        
       | csa wrote:
       | Oh, fond memories.
       | 
       | I learned BASIC programming when I was 11 in 1981 (I think that's
       | right) at a summer computer camp on an Apple II.
       | 
       | I made a simplified version of lunar lander... it was
       | ridiculously fun to make and play.
       | 
       | One of my cohort mates who was in the "advanced" Pascal class is
       | still my friend to this day.
        
         | martincmartin wrote:
         | OP here. Cool! I was born in 1969, less than a month before
         | Neil Armstrong walked on the moon, and was only a few months
         | old when this game was written. I too learned BASIC, then spent
         | hours pouring over the book "BASIC Computer Games", before I
         | even had a computer of my own. Fond memories, as you say.
        
       | ck2 wrote:
       | vaguely related 1962 Spacewar video game on a PDP-1 on punchout
       | PAPER TAPE blew my mind
       | 
       | https://en.wikipedia.org/wiki/Spacewar%21
       | 
       | video of game is at 30 second but whole thing is a great watch
       | 
       | https://upload.wikimedia.org/wikipedia/commons/5/58/Restored...
        
         | GeorgeTirebiter wrote:
         | When I made the proposal to restore the CHM's pdp-1, the reason
         | was "Spacewar!"
        
       | smarks wrote:
       | Wow, pretty amazing. I remember playing this game after somebody
       | ported it to Wang 2200 BASIC sometime in the mid 1970s. I didn't
       | figure out how to land it myself, but I remember being shown the
       | technique of coasting for the first several turns before applying
       | maximum thrust. I don't recall the term "suicide burn" though.
       | (Or maybe that term came in later when the Kerbal Space Program
       | became popular.)
       | 
       | I also remember this lunar lander game running on a couple
       | terminals at the Lawrence Hall of Science in Berkeley,
       | California, also in the mid 1970s. I don't know what computer it
       | was running on though.
       | 
       | I never looked at the source code for this program. I had no idea
       | how sophisticated the math was. I wouldn't have understood it
       | anyway, as I was too young in the mid 1970s. Then again, I'm not
       | sure I'd be able to understand it now....
        
       | fl7305 wrote:
       | I played the ABC-80 version of Lunar Lander way back then.
       | Checking today, it seems to use a simpler Euler integration
       | instead, and a curious value for G (?)
        
       | readingnews wrote:
       | I still have a roll of punch tape, I think for a PDP11, that says
       | "Lunar Lander" on it, and I have no idea who to give it to.
        
         | aspenmayer wrote:
         | Internet Archive or Computer History Museum? Ask @textfiles for
         | recommendations for places that might be interested.
        
       | sigzero wrote:
       | It's probably why I kept crashing!
        
       | swayvil wrote:
       | That theme song. It still rattles in my head.
        
       | HappyCoder314 wrote:
       | wow
        
       ___________________________________________________________________
       (page generated 2024-06-14 23:00 UTC)