Ο προγραμματιστής Hero βρίσκει σφάλματα στο Lunar Lander μετά από 55 χρόνια – «Υποθέτω ότι όλοι οι άλλοι ήταν χαρούμενοι που έπαιξαν το παιχνίδι και διασκέδασαν»

By | June 18, 2024

Το Apollo 11 προσγειώθηκε στη σεληνιακή επιφάνεια στις 20 Ιουλίου 1969, ένα κατόρθωμα όλης της ανθρωπότητας που τερμάτισε το πρώτο μέρος του διαστημικού αγώνα. Ο Νιλ Άρμστρονγκ μπήκε στο διάστημα καθώς ο κόσμος παρακολουθούσε, και μεταξύ των εκατομμυρίων που στάθηκαν με δέος ήταν και ο 17χρονος μαθητής Τζιμ Στόερερ.

Ο Storer ζούσε στη Μασαχουσέτη και είχε σημαντικές μαθηματικές γνώσεις, τις οποίες οφείλει εν μέρει στον πατέρα του, ο οποίος ήταν φυσικός. Εμπνεύστηκε από την ιδέα της προσγείωσης σε φεγγάρι: τους ακριβείς υπολογισμούς και τον έλεγχο που απαιτούνται για να προσγειωθεί με ασφάλεια ένα τεράστιο κομμάτι αλουμινίου σε μια άγονη, άγνωστη επιφάνεια. Το σχολείο του Στόρερ είχε ένα PDP-8ο πρώτος εμπορικά επιτυχημένος μίνι υπολογιστής και ο νεαρός ξεκίνησε να γράψει ένα νέο πρόγραμμα που ονομαζόταν Lunar Landing Game.

Βασισμένο σε κείμενο και γραμμένο στην πρώιμη γλώσσα προγραμματισμού FOCAL, το Lunar Landing Game ζητά από τον παίκτη οδηγίες σε κάθε στροφή, υπολογίζοντας το υψόμετρο, την ταχύτητα και το υπόλοιπο καύσιμο του σκάφους για κάθε δευτερόλεπτο της προσέγγισης προσγείωσης εντός του παιχνιδιού. Ουσιαστικά, το παιχνίδι αφορά τη χρήση της παροχής καυσίμου για την επιβράδυνση και τον έλεγχο της προσέγγισης του διαστημικού σκάφους στην προσγείωση, και όταν το διαστημόπλοιο φτάσει στην επιφάνεια, ο παίκτης λαμβάνει μια αναφορά της ταχύτητας προσγείωσης και του υπολειπόμενου καυσίμου.

Ολόκληρο το παιχνίδι αποτελείται από λιγότερες από 50 γραμμές κώδικα, αλλά η φαινομενική απλότητά του διαψεύδει τους υπολογισμούς που διέπουν την προσομοίωση, και με τα χρόνια το παιχνίδι έχει γίνει ευρέως δημοφιλές ως πρόκληση προγραμματισμού. Ακόμη αργότερα, διάφορες δημοφιλείς εμπορικές εκδόσεις πρόσθεσαν ένα οπτικό επίπεδο (για να δώσουν μια ιδέα της μακροζωίας του: το Atari βρίσκεται αυτή τη στιγμή στη διαδικασία Ανάπτυξη επίσημης συνέχειας).

Ο μηχανικός λογισμικού Martin C. Martin ανακοίνωσε σε μια νέα ανάρτηση στο blog ότι ενώ έπαιζε με τον κωδικό του αρχικού παιχνιδιού, βρήκε και διόρθωσε ένα σφάλμα που είχε κρυφτεί τα 55 χρόνια από την κωδικοποίηση του παιχνιδιού (εντοπίστηκε για πρώτη φορά από την Ars Technica). Τώρα συνταξιούχος, αλλά με μια λαμπρή καριέρα σε εταιρείες όπως η Rockstar, η Meta και ως μεταδιδάκτορας στο MIT, ο Martin είναι ακριβώς ο τύπος του ανθρώπου που κοιτάζει κάτι σαν το Lunar Lander και αποφασίζει να επεξεργαστεί τη βέλτιστη στρατηγική για μια τέλεια προσγείωση.

“Πρόσφατα ερεύνησα το σχέδιο βέλτιστης κατανάλωσης καυσίμου για να προσγειωθεί όσο το δυνατόν πιο ήπια και με όσο το δυνατόν περισσότερο υπολειπόμενο καύσιμο”, γράφει ο Martin. “Περίεργα, η καλύτερη θεωρητική στρατηγική δεν λειτούργησε. Το παιχνίδι εσφαλμένα υποθέτει ότι ο προσγειωτής δεν θα αγγίξει την επιφάνεια, ενώ στην πραγματικότητα θα αγγίξει. Καθώς έψαχνα βαθύτερα, εξεπλάγην από την περίπλοκη φυσική και τους αριθμητικούς υπολογισμούς στο Τελικά, βρήκα ένα λάθος: ένα «διαίρεσε με δύο» που προφανώς είχε περάσει απαρατήρητο για σχεδόν 55 χρόνια».

Καύση αυτοκτονίας

Αυτό σημαίνει ότι η τέλεια στρατηγική του Martin δεν καταγράφηκε από το παιχνίδι ως επιτυχημένη προσγείωση. Ο προγραμματιστής χρησιμοποίησε αυτό που οι παίκτες του Διαστημικού Προγράμματος Kerbal αναφέρουν ως «έγκαυμα αυτοκτονίας». Αυτό περιλαμβάνει τη μεγιστοποίηση της ταχύτητας με την μη κατανάλωση καυσίμου και, στη συνέχεια, την εφαρμογή τέρματος του γκαζιού την τελευταία στιγμή για να μειώσετε την ταχύτητα σχεδόν στο μηδέν λίγο πριν χτυπήσετε στην επιφάνεια.

«Με κάποιες δοκιμές και σφάλματα και λίγη (χειροκίνητη) δυαδική αναζήτηση, μπορείτε να βρείτε το χρονοδιάγραμμα που σχεδόν σας οδηγεί εκεί. «Δεν καίτε τίποτα για 70 δευτερόλεπτα, μετά 164,31426784 λίβρες ανά δευτερόλεπτο για τα επόμενα 10 δευτερόλεπτα και το μέγιστο 200 λίβρες ανά δευτερόλεπτο μετά από αυτό», γράφει ο Martin.

“Το παιχνίδι υποθέτει ότι μια προσγείωση σε λιγότερο από 1 MPH είναι τέλεια, αλλά εδώ προσγειωνόμαστε σε πάνω από 3,5 MPH και μας λένε ότι “θα μπορούσε να είναι καλύτερο”. Αλλά αν κάψουμε μόνο 0,00000001 λίβρες/δευτερόλεπτο περισσότερο, θα χάσουμε εντελώς την επιφάνεια και θα ανέβουμε στα 114 mph:

«Πώς φτάσαμε από μια σκληρή προσγείωση σε καθόλου προσγείωση χωρίς μια ήπια προσγείωση ενδιάμεσα;»

Όταν ο προγραμματιστής έψαξε τους λόγους, ανακάλυψε ότι η λογική του παιχνιδιού δεν βασιζόταν στην «απλή ενσωμάτωση του Euler που εξακολουθεί να είναι κοινή στα βιντεοπαιχνίδια σήμερα», αλλά μάλλον σε πιο σύνθετες εξισώσεις: «Jim [Storer] χρησιμοποίησε την ακριβή λύση, την εξίσωση πυραύλων του Tsiolkowski, με μια επέκταση της σειράς Taylor για τον λογάριθμο», γράφει ο Martin. «Χρησιμοποίησε επίσης κάποια άλγεβρα για να την απλοποιήσει και να μειώσει τα σφάλματα στρογγυλοποίησης. Πολύ εντυπωσιακό για έναν μαθητή Λυκείου το 1969».

Ο Μάρτιν επικοινώνησε με τον Στόρερ για να επιβεβαιώσει τα αποτελέσματά του και να ρωτήσει από πού προήλθαν αυτά τα περίπλοκα μαθηματικά. «Ήμουν έμπειρος μαθηματικός εκείνη την εποχή και γνώριζα έννοιες όπως μια σειρά Taylor», λέει ο Storer, «αλλά θυμάμαι επίσης τον πατέρα μου, ο οποίος ήταν φυσικός, να με βοήθησε να εξάγω τις εξισώσεις».

Όποια κι αν είναι η περίπτωση, η εξίσωση του πυραύλου θα πρέπει να κάνει την απόπειρα αυτοκτονίας βέλτιστη και η ακρίβεια της σειράς Taylor υποδηλώνει ότι ούτε αυτό είναι το πρόβλημα. Το πρόβλημα ήταν μάλλον η επαφή: τη στιγμή που προσγειώνεται το προσγειωμένο.

«Φανταστείτε το σκάφος να κατεβαίνει στην αρχή μιας στροφής 10 δευτερολέπτων, αλλά να ανεβαίνει ξανά στο τέλος», γράφει ο Martin. “Το να ελέγχετε απλώς ότι είναι πάνω από την επιφάνεια και στα δύο σημεία δεν είναι αρκετό. Θα μπορούσε να έχει βυθιστεί κάτω από την επιφάνεια κάπου στο ενδιάμεσο. Εάν συμβεί αυτό, το πρόγραμμα πρέπει να γυρίσει προς τα πίσω και να εξετάσει μια προηγούμενη στιγμή.”

Όπως εξηγεί περαιτέρω ο Martin, το σφάλμα εμφανίζεται όταν το παιχνίδι προσπαθεί να εκτιμήσει το κάτω μέρος της τροχιάς. Ο προγραμματιστής παρουσιάζει τον πλήρη υπολογισμό του στην ανάρτηση του ιστολογίου, αλλά αυτό που ουσιαστικά συνοψίζεται είναι ότι ο Storer χρησιμοποιεί μια εναλλακτική μορφή τετραγωνικού τύπου όπου για κάποιο λόγο “χάνει το 2 στον παρονομαστή μέσα στην τετραγωνική ρίζα!” Ήταν πιθανώς ένα απλό λάθος, είτε στην εξαγωγή του τύπου είτε στην πληκτρολόγηση του στον υπολογιστή.” Όπως επισημαίνει προσεκτικά ο Martin, ο Storer δεν είχε πρόσβαση στο λογισμικό άλγεβρας και τα έκανε όλα με μολύβι και χαρτί.

Το “2” που λείπει σημαίνει ότι το παιχνίδι “υποτιμά σταθερά το χρόνο στο χαμηλότερο σημείο”, το οποίο στη συνέχεια αντισταθμίζει προσθέτοντας ένα κλάσμα του χρόνου (0,05 δευτερόλεπτα) και επανεκτιμώντας το. «Και αυτό εξηγεί γιατί χάνει τον χρόνο προσγείωσης: η πρώτη εκτίμηση γίνεται ενώ ο προσγειωτής βρίσκεται πάνω από την επιφάνεια και εξακολουθεί να κατεβαίνει, η δεύτερη αφού φτάσει στο έδαφος και ανέβει ξανά, κάτι που διαρκεί λιγότερο από 0,05 δευτερόλεπτα».

Ο Μάρτιν συνεχίζει εξηγώντας τον αντίκτυπο της διόρθωσης του σφάλματος και εικάζει για μερικούς από τους λόγους. Ωστόσο, σημειώνει δυστυχώς ότι ακόμη και με την επιδιόρθωση του σφάλματος, υπάρχουν ορισμένες βέλτιστες στρατηγικές προσγείωσης, αλλά «η θεωρητική επίθεση αυτοκτονίας με πλήρη ώθηση κατά την προσγείωση, η οποία διαρκεί περίπου 148 δευτερόλεπτα, μας διαφεύγει».

Ο Μάρτιν καταλήγει αναγνωρίζοντας την πολυπλοκότητα του παιχνιδιού προσγείωσης στη Σελήνη, που προγραμματίστηκε από έναν μαθητή γυμνασίου το 1969 και ενσωματώνει πτυχές του αριθμητικού υπολογισμού «για τις οποίες έμαθα μόνο κατά τη διάρκεια των διδακτορικών μου σπουδών στη ρομποτική».

Και τι γίνεται με ένα σφάλμα που επιβιώνει για 55 χρόνια στο δημοφιλές λογισμικό;

“Αυτό οφείλεται πιθανώς στο ότι παρά το σφάλμα, ήταν ένα διασκεδαστικό παιχνίδι που ήταν δύσκολο και μαλακό να προσγειωθεί”, γράφει ο Martin. “Η αναζήτηση όχι μόνο για τη νίκη αλλά και για την εύρεση της βέλτιστης στρατηγικής μπορεί σίγουρα να οδηγήσει στην προσπάθεια κατανόησης μικρών αποκλίσεων. Υποψιάζομαι ότι όλοι οι άλλοι ήταν απλά χαρούμενοι παίζοντας το παιχνίδι και διασκέδαζαν.”

Εάν ενδιαφέρεστε για την ιστορία του Lunar Lander, ο Storer μιλά προσωπικά για τη δημιουργία του παιχνιδιού σε αυτήν την αναδρομική 40η επέτειο. Και αν σας αρέσουν απλώς τα παλιά σφάλματα, ιδού μια έκρηξη: ο προγραμματιστής που επέστρεψε στο παιχνίδι του μετά από τέσσερις δεκαετίες, στη συνέχεια βρήκε και διόρθωσε ένα τυπογραφικό λάθος, ώστε να λειτουργήσει πραγματικά.

Leave a Reply

Your email address will not be published. Required fields are marked *