2 poin oleh GN⁺ 2024-06-15 | 1 komentar | Bagikan ke WhatsApp
  • Saat memverifikasi jadwal bahan bakar pendaratan optimal di game Lunar Landing pertama yang dibuat siswa SMA Jim Storer pada 1969, terungkap bug yang membuat game salah menilai momen ketika seharusnya sudah mendarat sebagai masih sedang terbang
  • Strategi yang dimaksud adalah suicide burn: mematikan mesin selama 70 detik, lalu membakar 164.31426784 lbs/sec selama 10 detik, kemudian maksimum 200 lbs/sec, tetapi game melewatkan pendaratan mulus yang seharusnya berada di antara pendaratan keras dan naik kembali tanpa mendarat
  • Kode aslinya tidak memakai integrasi Euler sederhana, melainkan menggunakan persamaan roket Tsiolkovsky dan deret Taylor untuk menghitung gerakan selama giliran 10 detik, sangat canggih untuk karya siswa SMA di lingkungan PDP-8 tahun 1969
  • Penyebab bug adalah hilangnya operasi dibagi 2 pada penyebut di dalam akar kuadrat dalam rumus yang mendekati titik terendah lintasan sebelum menyentuh tanah, sehingga waktu mencapai titik terendah selalu terestimasi terlalu kecil
  • Setelah factor of two yang hilang diperbaiki dan koreksi 0.05 detik dihapus, hasil suicide burn membaik hingga 1.66 MPH, tetapi untuk pendaratan sempurna di bawah 1 MPH masih ada keterbatasan dari aproksimasi dua suku deret Taylor dan perhitungan ulang momen pendaratan

Lunar Landing 1969 dan pencarian pendaratan optimal

  • Jim Storer menulis game Lunar Landing pertama beberapa bulan setelah pendaratan bulan Neil Armstrong, saat ia masih menjadi siswa di Lexington High School, Massachusetts
  • Pada 1973, game ini telah menyebar begitu luas hingga disebut “by far and away the single most popular computer game”
  • Game ini berbasis teks, dan seluruh gerakan pendarat bulan berlangsung hanya dalam arah vertikal
  • Pemain menentukan jumlah bahan bakar yang akan dibakar setiap 10 detik dalam simulasi, lalu harus mendarat sehalus mungkin di permukaan bulan
  • Dalam proses mencari jadwal bahan bakar optimal, strategi yang secara teori paling baik ternyata tidak bekerja dengan benar di dalam game
    • Dalam kenyataannya, pendarat memang menyentuh permukaan
    • Game salah menilai bahwa pendarat tidak menyentuh permukaan
    • Penyebab akhirnya adalah divide by two yang hilang dan nyaris tak terlihat selama hampir 55 tahun

Pendaratan dengan bahan bakar minimum dan suicide burn

  • Untuk mendarat dengan bahan bakar minimum, pendarat harus turun dalam waktu sesingkat mungkin
  • Strategi optimalnya adalah mematikan mesin di awal agar kecepatan bertambah, lalu memperlambat dengan dorongan maksimum pada momen terakhir yang masih memungkinkan, sehingga saat menyentuh permukaan kecepatannya mendekati 0
  • Komunitas Kerbal Space Program menyebut strategi ini sebagai suicide burn
    • Karena timing-nya sangat ketat dan hampir tidak ada ruang untuk kesalahan
  • Jadwal yang ditemukan lewat trial-and-error dan pencarian biner manual adalah sebagai berikut
    • Tidak membakar bahan bakar selama 70 detik
    • Membakar bahan bakar pada 164.31426784 lbs/sec selama 10 detik berikutnya
    • Setelah itu membakar bahan bakar pada nilai maksimum 200 lbs/sec
  • Game menganggap pendaratan di bawah 1 MPH sebagai pendaratan sempurna
  • Dengan jadwal ini, pendarat mendarat pada kecepatan lebih dari 3.5 MPH dan mendapat penilaian “could be better”
  • Namun jika laju bahan bakar dinaikkan hanya 0.00000001 lbs/sec, pendarat justru tidak menyentuh permukaan dan naik kembali pada 114 MPH
  • Artinya, penilaian pendaratan mulus yang seharusnya ada di antara pendaratan keras dan naik kembali tanpa mendarat ternyata hilang

Perhitungan fisika yang lebih canggih dari perkiraan

  • Awalnya diperkirakan game ini memakai integrasi Euler yang juga umum di game modern
    • Menghitung gaya pada awal interval waktu
    • Mendapatkan percepatan dari F=ma
    • Mengasumsikan percepatan konstan selama interval waktu tersebut
  • Ternyata kode Lunar Landing yang asli jauh lebih canggih
  • Jim Storer menggunakan solusi eksak dari persamaan roket Tsiolkovsky
  • Untuk perhitungan logaritma, ia menerapkan pengembangan deret Taylor
    • Nilai maksimum argumennya adalah 0.1212
    • Dengan 5 suku, akurasinya mencapai lebih dari 6 digit
  • Penyederhanaan aljabar juga dipakai untuk mengurangi error pembulatan
  • Jim Storer mengingat bahwa saat itu ia sudah akrab dengan konsep seperti kalkulus dan deret Taylor, dan ayahnya yang seorang fisikawan membantu menurunkan persamaan
  • Alasan suicide burn menjadi optimal juga berasal dari persamaan roket ini, dan bagian tersebut bukan sumber bug

Mengapa penentuan kontak dengan permukaan itu rumit

  • Persamaan roket bekerja baik sampai pendarat menyentuh tanah
  • Tumbukan antar benda padat adalah area yang sulit dalam physics engine, dan Lunar Landing juga menghadapi tantangan terbesar saat menentukan kontak dengan permukaan
  • Tidak cukup hanya memeriksa awal dan akhir giliran 10 detik
    • Pada awal giliran pendarat bisa sedang turun
    • Pada akhir giliran pendarat bisa sedang naik
    • Di tengah-tengah, pendarat mungkin sempat turun melewati permukaan lalu naik lagi
  • Dalam kasus seperti ini, program harus memundurkan waktu untuk mencari momen kontak yang lebih awal
  • Titik pemeriksaan yang paling alami adalah titik terendah lintasan saat kecepatan menjadi 0
  • Dalam persamaan roket, titik terendah ini tidak bisa dinyatakan dalam bentuk tertutup hanya dengan fungsi matematika dasar
    • Catatan kaki menjelaskan bahwa diperlukan Lambert W
  • Namun titik itu bisa didekati dengan memakai beberapa suku awal deret Taylor dari logaritma
    • Jika hanya dua suku pertama yang dipakai, masalahnya menyederhana menjadi persamaan kuadrat
    • Ini memungkinkan penggunaan rumus kuadrat tingkat SMA
    • Dalam rentang giliran 10 detik, akurasi yang diharapkan berada dalam sekitar 0.1%

Bentuk alternatif rumus kuadrat dan stabilitas numerik

  • Dalam kode Jim Storer, muncul bentuk dengan akar kuadrat berada di penyebut, bukan di pembilang
  • Ini bukan rumus kuadrat biasa, melainkan sesuai dengan bentuk alternatif rumus kuadrat yang menempatkan akar kuadrat di bawah
  • Bentuk alternatif ini punya keuntungan numerik yang penting
    • Setelah game mendeteksi kontak dengan tanah, waktu kontak sebenarnya juga dicari dengan memotong deret Taylor menjadi aproksimasi persamaan kuadrat
    • Bentuk umum menimbulkan masalah pembagian dengan nol saat koefisien suku kuadrat bernilai 0
    • Hal itu terjadi jika dorongan roket tepat menyeimbangkan gravitasi
    • Situasi seperti ini bisa sering terjadi pada pemain yang melayang atau turun perlahan dekat permukaan
  • Saat dorongan mendekati gravitasi, bentuk umum juga menimbulkan catastrophic cancellation di pembilang, dan penyebut kecil memperbesar error
  • Bentuk alternatif tetap bekerja baik bahkan ketika suku kuadrat 0 dan persamaan pada dasarnya menjadi linear
  • Mengingat konteks zamannya, sangat mengesankan bahwa seorang siswa SMA pada 1969 bisa menurunkan ulang atau mempelajari bentuk ini

Bug sebenarnya: factor of two yang hilang

  • Ketika rumus diturunkan langsung dan dibandingkan, hasilnya hampir sama dengan kode Jim Storer, tetapi 2 yang seharusnya ada di penyebut di dalam akar kuadrat ternyata hilang
  • Hilangnya nilai ini kemungkinan hanya kesalahan sederhana saat menurunkan rumus atau saat memasukkannya ke komputer
  • Pada masa itu, MACSYMA baru berusia sekitar satu tahun dan jelas bukan lingkungan yang bisa dipakai di SMA, jadi penurunannya harus dilakukan dengan kertas dan pensil
  • Akibat bug ini, waktu menuju titik terendah selalu terestimasi terlalu kecil
  • Kode mencoba mengompensasi hal ini dengan dua cara
    • Menambahkan 0.05 detik
    • Melakukan estimasi ulang dari posisi baru yang lebih dekat
  • Namun dalam skenario suicide burn tertentu, justru kompensasi inilah yang membuat momen pendaratan terlewat
    • Estimasi pertama terjadi saat pendarat masih turun di atas permukaan
    • Estimasi kedua terjadi setelah melewati titik terendah dan mulai naik kembali
    • Selang waktu di antara keduanya bisa lebih pendek dari 0.05 detik

Hasil setelah diperbaiki dan keterbatasan yang tersisa

  • Setelah factor of two yang hilang ditambahkan dan koreksi 0.05 detik dihapus, hasil suicide burn membaik
  • Setelah perbaikan, suicide burn terbaik menghasilkan kecepatan pendaratan 1.66 MPH
    • Ini mendekati sekitar 3/4 perjalanan menuju pendaratan sempurna di bawah 1 MPH
  • Alasannya belum sempurna adalah karena game masih hanya memakai dua suku pertama deret Taylor
  • Setelah diputuskan bahwa titik terendah berada di bawah permukaan, game masih harus mencari ulang waktu saat pertama kali menyentuh permukaan
    • Proses ini juga memakai aproksimasi serupa
    • Iterasi tambahan mungkin bisa membantu
  • Setelah bug diperbaiki, estimasi waktu justru menjadi terlalu besar, sehingga mungkin perlu memundurkan waktu
    • Dalam kasus itu, mungkin perlu memilih akar lain dari persamaan kuadrat
  • Cara yang lebih sederhana adalah memakai satu suku deret Taylor dan menanganinya dengan metode yang mirip Newton’s method
  • Alternatif lain adalah berhenti saat besar kecepatan turun di bawah ambang tertentu, lalu menilai pendaratan berdasarkan ketinggian saat itu
  • Namun perubahan seperti ini akan membuat kode lebih kompleks, sementara game aslinya sudah cukup menyenangkan untuk dimainkan

Mengapa bug ini bisa bertahan begitu lama

  • Pendaratan mulus sebenarnya tetap mungkin dilakukan
    • Giliran ke-14 diakhiri pada ketinggian rendah dan kecepatan rendah
    • Pada giliran ke-15 digunakan dorongan rendah
    • Pendaratan terjadi di suatu titik setelah 150 detik
  • Yang bermasalah adalah suicide burn dengan dorongan maksimum yang secara teori optimal dan berakhir sekitar 148 detik
  • Secara keseluruhan, kode ini sangat mengesankan untuk karya seorang siswa SMA berusia 18 tahun di PDP-8 pada 1969
  • Pada masa itu, komputer sains belum diajarkan di SMA, dan konsep komputasi numerik seperti memperbaiki estimasi berulang dengan metode Newton atau mengkhawatirkan catastrophic cancellation juga belum dikenal luas
  • Alasan bug ini nyaris tak terlihat selama hampir 55 tahun adalah karena meski bug ada, game tetap sulit, menyenangkan, dan tetap memungkinkan pendaratan mulus
  • Upaya untuk mencari strategi optimal, bukan sekadar menang, akhirnya mengarah pada pemahaman terhadap ketidaksesuaian kecil ini

1 komentar

 
GN⁺ 2024-06-15
Komentar Hacker News
  • Pada 2009, Jim Storer ditelusuri sebagai orang yang membuat game Lunar Lander pertama dan diwawancarai, lalu sejarah game tersebut juga dirangkum
    Belakangan ia bahkan menyediakan source code-nya, benar-benar keren
    https://technologizer.com/2009/07/19/lunar-lander/index.html
    Bagian favorit saya adalah ketika Storer berkata, “Sejak lulus SMA, saya tidak pernah memikirkan game itu lagi. Sampai seseorang mengirimi saya email soal ini beberapa bulan lalu, saya bahkan sama sekali tidak tahu bahwa ada game Lunar Lander lain selain yang saya buat saat SMA.”
    • Merasa terhormat karena ikut disebut dalam tulisan ini. Lander (1990) awalnya saya buat untuk Windows 2.x
      Pada 1989, saat melamar pekerjaan terkait Lotus Notes, saya menunjukkan game Lander kepada pewawancara Tim Halvorsen, dan ia berkata, “Keren, mari kita jalankan di Windows 3”
      Awalnya saya senang karena bisa melihat Windows 3 yang belum dirilis, tetapi tak lama kemudian ia berkata, “Windows 3 menjalankan semuanya dalam protected mode, jadi kalau ada pointer yang keluar batas, programnya akan langsung mati,” lalu mengajak saya mengujinya
      Sepanjang program berjalan saya sangat tegang, tetapi untungnya Lander tidak crash, Tim juga puas, dan akhirnya saya mendapatkan pekerjaan itu, yang sepenuhnya mengubah karier saya
    • Sebelum Lunar Lander juga ada game pendaratan mekanis
      Saya tidak bisa menemukan fotonya, tetapi seingat saya mirip mesin seperti ini
      https://content.invisioncic.com/r322239/monthly_10_2015/post...
      Namun ada medan dan lubang-lubang, dan kita harus mendarat di lubang yang menyala. Jika pesawat antariksa menekan tombol di tengah lubang, lampunya padam dan lubang lain menyala; kalau bidikannya buruk, pesawat akan menabrak tepi, miring, lalu gagal
      Kalau dipikir lagi, mungkin kontrolnya seperti UFO catcher: disejajarkan dari atas lalu menekan “land”. Dulu ada di Disneyland Main Street Arcade
    • Salah satu game awal yang saya coba tiru saat belajar pemrograman di SMA adalah Lunar Lander: https://github.com/celwell/space-landing yang dibuat sebagai applet Java
  • Baris yang bermasalah tampaknya 08.10
    Saya agak heran karena tulisan itu beberapa kali menyebut “mengesankan untuk siswa kelas 12 pada 1969”. Rasanya itu pasti sangat berpengaruh bagi orang-orang berorientasi teknologi yang tumbuh di era antariksa, dan saya juga teringat film lama October Sky
    Dalam wawancara aslinya, pembuat game itu disebut mahir kalkulus, jadi kalau ia punya minat dan bakat di bidang antariksa atau roket, mencoba memprogram game pendaratan di Bulan terasa wajar
    [1]: https://www.cs.brandeis.edu/~storer/LunarLander/LunarLander/...
    • Pada 1969 di AS, siswa SMA yang punya akses ke komputer kira-kira hanya beberapa ratus orang, dan yang memiliki kemampuan menggunakan komputer lebih sedikit lagi
      Era antariksa mungkin memberi inspirasi, tetapi bagi masyarakat umum saat itu komputer pada dasarnya tidak ada, dan pengembangan software juga bukan profesi yang dikenal luas. Jurusan ilmu komputer di AS baru muncul pada 1962, jadi fakta bahwa ia adalah siswa kelas 12 pada 1969 memang cukup patut diperhatikan
    • Saya siswa SMA pada 1969, cukup mengerti kalkulus, dan sangat tertarik pada pemrograman
      Saya bersekolah di SMA besar di kota yang cukup besar dengan kampus teknik besar, tetapi hambatan terbesarnya adalah akses ke komputer
      Sekolah punya teletype yang terhubung ke mainframe jarak jauh, dan bersama teman-teman saya menemukan beberapa komputer universitas yang bisa dipakai malam hari, tetapi kebanyakan hanya punya card reader dan line printer, sama sekali tidak ada terminal grafis
      Saat itu kombinasi keterampilan, minat, dan akses seperti itu pasti cukup langka
    • Saya penasaran ditulis dengan bahasa apa, dan dari artikel tentang game ini ternyata bahasanya FOCAL
      https://retro365.blog/2021/12/02/bits-from-my-personal-colle...
      Wikipedia tentang FOCAL:
      https://en.wikipedia.org/wiki/FOCAL_(programming_language)
    • Saya penulis artikel aslinya. Saya mengerti bahwa ungkapan “mengesankan untuk siswa kelas 12 pada 1969” bisa terasa aneh, tetapi untuk membuat game ini dibutuhkan cukup banyak hal
      Dalam fisika SMA, mulai dari diagram benda bebas hingga menangani dua gaya, gravitasi dan daya dorong, adalah sesuatu yang bisa dilakukan siswa rata-rata yang mendapat nilai A fisika
      Namun gravitasi bergantung pada jarak ke pusat, yaitu nilai yang terus berubah. Ia harus tahu bahwa meski dimulai dari ketinggian 120 mil, perubahannya tidak besar sehingga bisa didekati sebagai konstanta
      Cara kerja daya dorong sebagai fungsi laju pembakaran juga rumit. Jika laju aliran bahan bakar digandakan, apakah kecepatan gas buang juga menjadi dua kali lipat, atau bagaimana P dan T berubah dalam hukum gas ideal PV=nRT, adalah pertanyaan-pertanyaan yang muncul
      Jadi jika ia bertanya kepada ayahnya yang fisikawan, lalu menemukan karakteristik mesin roket dan persamaan roket Tsiolkovsky, itu sendiri sudah mengesankan untuk siswa kelas 12
      Untuk beralih dari kecepatan ke posisi, perlu dilakukan integrasi, dan saya tidak tahu apakah siswa rata-rata bernilai A fisika akan terpikir untuk mengganti panggilan FLOG() dengan deret Taylor lalu mengintegrasikannya suku demi suku
      Detail seperti berapa banyak suku deret Taylor yang harus dipakai dan apakah deretnya konvergen juga sulit. Kalau Jim memikirkan nuansa ini, itu luar biasa; bisa juga ia sekadar memakai 5 suku karena tampak cukup banyak

Kalaupun simulasi di dekat Bulan sudah beres, cara mendeteksi tumbukan dengan permukaan juga jadi masalah. Alih-alih menyelesaikan langsung akar saat ketinggian menjadi 0, pendekatan melihat titik kecepatan 0 yang muncul tepat sekali selama rotasi itu cukup kreatif
Membalik persamaan roket untuk mencari jumlah bahan bakar yang diperlukan dari delta-V yang diinginkan juga mentok kalau hanya memakai matematika SMA dan kalkulus. Dalam praktiknya dibutuhkan fungsi baru seperti Lambert W
Pada akhirnya, karena harus menyelesaikan polinom orde 5 dengan deret Taylor, perlu diambil keputusan untuk membuang suku orde 3, 4, dan 5 agar menjadi persamaan kuadrat. Yang mengesankan adalah ia menilai bahwa suku-suku yang biasanya tidak dibuang saat menghitung dinamika boleh dibuang di sini; itu berarti ia memahami bahwa tingkat aproksimasi yang berbeda bisa dipakai untuk situasi yang berbeda
Selain itu, melihat bahwa ia entah bagaimana memakai bentuk alternatif dari persamaan kuadrat, mungkin ini bukan sekadar menyalin dari hasil mencari saja

  • Gim ini terkenal sebagai Lunar Lander pertama, tetapi bagian yang benar-benar mengesankan adalah metode analisis numerik yang digunakan
  • Pada pertengahan 1970-an, dibuat gim pendaratan Bulan dengan grafik vektor 2D untuk terminal grafis Adage
    Setelah masuk dengan cepat secara horizontal, pemain harus memperlambat dengan tombol pendorong samping LEM dan mesin utama lalu mendarat secara vertikal; jika terlalu cepat atau bahan bakar habis, akan muncul kawah, dan tergantung kualitas pendaratan, satu atau lebih bendera Amerika akan ditancapkan
    Beberapa tahun lalu, karena mengira kode sumbernya tidak bernilai dan tidak akan pernah digunakan ulang, satu-satunya salinan dibuang. Belakangan baru disadari bahwa itu adalah gim grafis yang cukup awal secara historis dan bisa dihidupkan kembali dengan emulasi sederhana, sehingga muncul penyesalan
    • Maksudnya bukan “pendaratan horizontal”, melainkan “pendaratan vertikal”
  • Buku pemrograman pertama saya memuat versi BASIC dari gim ini, tetapi saya tidak pernah berhasil menjalankannya dengan benar
    Setelah melihatnya lagi 25 tahun kemudian, saya terkejut karena bug-nya luar biasa banyak dan logikanya juga kusut seperti “440 IF GOTO 450”
    Akhirnya saya menulis ulang setelah dewasa [1], tetapi diri saya saat kecil memang tidak punya peluang untuk berhasil. Sampai sekarang saya masih penasaran bagaimana kode yang hampir berfungsi di dalam penerbit Spanyol yang terlupakan itu bisa berubah menjadi bentuk seperti versi akhirnya
    [1] https://7c0h.com/blog/new/moon_landing_in_basic.html
    • Mengatakan “tidak punya peluang” rasanya masih kurang
      Kode BASIC semacam ini berakar pada era 1960–70-an, dan di majalah cetak serta kumpulan kode tempat kode-kode saat itu dimuat, editor punya wewenang besar
      Kesadaran bahwa kode sumber harus dimuat persis tanpa mengubah satu karakter pun masih lemah, sehingga para editor sering “dengan hati-hati” memperbaiki kode sumber karena menganggapnya sebagai salah ketik yang “jelas” atau keputusan editorial
      Pelajaran ini dipelajari perlahan dan menyakitkan, sejak perbaikan di seluruh industri mulai terjadi pada 1980-an hingga menyebarnya pemahaman bahwa kode sumber di media cetak tidak boleh disentuh
      Saya juga bertanya-tanya apakah arus ini ikut mendorong naiknya BBS dan melemahkan kekuatan media cetak yang memegang distribusi kode sumber. Jika para penguasa media cetak lebih terbuka terhadap kendali mutlak pihak luar atas sebagian konten “mereka”, mungkin sejarahnya bisa berbeda
      Saat kecil, saya mulai coding hanya bermodalkan beberapa buku pemrograman dari sekolah dan perpustakaan lokal tanpa bantuan orang dewasa, dan rasanya hampir ajaib saya tetap bertahan mengoding meski begitu banyak program yang saya ketik tangan sama-sama penuh error
    • Bacaan yang menyenangkan. Saat kecil, melihat C64 “secara ajaib” memuat gambar terkait gim hanya dengan beberapa baris kode, saya pernah mengira gambar-gambar itu memang tersimpan begitu saja di suatu tempat di dalamnya
      Menambahkan sedikit soal logika kusut seperti “440 IF GOTO 450”, sebagian kode di buku itu jelas perlu dirapikan, tetapi BASIC umum pada komputer rumahan saat itu kemungkinan besar hanya menangani nomor baris dan memiliki pernyataan percabangan yang sangat terbatas
      BASIC yang digunakan tampaknya mendukung pemrograman terstruktur, yang sangat langka pada komputer rumahan saat itu. Majalah C64 pada 1984 bahkan memuat seri panjang setidaknya selama 3 edisi untuk memperkenalkan keajaiban pemrograman terstruktur kepada pembaca
      Karena batasan IF sangat ketat, percabangan kondisional bergaya assembly yang memakai GOTO sangat umum dan pada dasarnya diperlukan
      IF bersarang tidak mungkin, dan untuk menggabungkan beberapa IF, bagian yang tidak dipilih harus dilewati dengan lompatan. Commodore/C64 BASIC, yang pada dasarnya Microsoft BASIC, bahkan tidak punya ELSE, sehingga biasanya cabang ELSE ditiru dengan kondisi negatif dan lompatan
      C64 BASIC punya perilaku unik: pernyataan lain pada baris yang sama juga termasuk dalam THEN. Misalnya, 10 IF A=1 THEN PRINT “FOO” : PRINT “BAR” akan mencetak FOO BAR saat A=1, dan tidak mencetak apa pun jika tidak
      Tentu itu hanya mungkin jika semua pernyataan bisa dimasukkan ke dalam satu baris yang terbatas. Dialek BASIC lain bisa saja menganggap PRINT “BAR” berada di luar ELSE, sehingga secara sintaks lebih rapi, tetapi bisa kurang nyaman tergantung fitur yang disediakan dialeknya
      Tidak ada kenyamanan dan ketegasan yang sekarang kita anggap wajar. C64 BASIC punya banyak karakteristik aneh yang terasa seperti artefak implementasi, sehingga terasa sangat “berantakan”. Misalnya semua fungsi harus punya argumen meskipun sebenarnya tidak diperlukan, jadi untuk mencetak sisa memori harus menulis sesuatu yang tak bermakna seperti ?FRE(123)
    • Mungkin itu hasil campuran dari kesalahan salin/tempel dalam proses editorial, tenggat, dan tidak adanya jaminan kualitas
  • Strategi pendaratan mulus yang optimal bahan bakar tampaknya diabaikan karena tidak sesuai dengan bentuk persis “suicide burn”, tetapi kemungkinan caranya adalah memasukkan 164.31426784 lbs/second pada t=70 detik lalu mengganti salah satu input 200 lbs/second setelahnya menjadi 199.99999999 lbs/second
    Semakin awal 199.99999999 itu “dimainkan”, semakin baik, jadi cukup lakukan pencarian menyeluruh untuk memilih input paling awal yang menghasilkan pendaratan mulus
    • Inti bug-nya adalah sulitnya menemukan saat pendarat menyentuh permukaan
      Agar gim mengenali pendaratan, ketinggian harus berada di bawah 0 selama sekitar 0,05 detik. Jika selama waktu itu daya dorongnya 200 atau 199, maka agar ketinggian negatif selama itu, kecepatan di titik ketinggian 0 harus lebih dari 1 MPH
      Bahkan setelah bug diperbaiki, kode tetap hanya mengaproksimasi titik terendah. Setelah mendeteksi pendaratan pun, waktu pendaratan sebenarnya—yakni saat ketinggian menjadi 0, bukan saat kecepatannya—harus dihitung, dan ini juga memakai aproksimasi
      Karena itu waktunya bisa sedikit meleset. Jika pada langkah waktu terakhir sedang membakar pada 200 atau 199, akselerasinya besar sehingga galat waktu yang sangat kecil pun dapat menghasilkan galat kecepatan yang besar
      Sebaliknya, jika membakar sekitar 10 lbs/sec, selisih sekitar 0,08 detik pun tidak banyak mengubah kecepatan
  • Kalau ditulis secara naif, saya mungkin tidak akan memakai rumus khusus; saya akan menghitung ulang massa dan akselerasi berdasarkan massa baru di setiap frame, lalu menghitung perpotongan dengan permukaan pada batas tiap frame

Saya penasaran apakah maksudnya metode ini makin tidak akurat pada frame rate yang lebih rendah, atau hanya karena menarik memakai persamaan sebenarnya
Saya juga penasaran seberapa terasa perbedaan kedua metode itu pada frame rate aslinya

  • Tidak ada keluaran grafis atau frame rate dalam arti yang kita pikirkan. Keluarannya kemungkinan dicetak seperti ini
    https://www.cs.brandeis.edu/~storer/LunarLander/LunarLander/...
    Jika massa dan percepatan hanya diperbarui setiap interval 10 detik, hasilnya menjadi sangat tidak akurat
  • Saya penulis artikel aslinya. Saya juga menduga pendekatan naif itu, dan di artikel saya menjelaskannya sebagai metode Euler
    Dari sisi akurasi fisika, terutama dekat permukaan, jika laju pembakaran bahan bakar tinggi, massanya berubah cukup besar. Namun dari sisi tingkat kesulitan atau keseruan game, maupun strategi pemain, sepertinya tidak akan ada perbedaan besar
    Bahkan salah satu simulasi pendaratan bulan lain dalam buku BASIC computer games tampaknya memakai pendekatan naif seperti itu
    Jika 10 detik terlalu panjang, satu giliran pada antarmuka pengguna bisa tetap 10 detik, sementara secara internal setiap giliran dipecah lebih kecil, misalnya menjadi 10 langkah waktu masing-masing 1 detik
    Game yang ada pun sebenarnya melakukan hal itu pada bagian tertentu, sehingga simulasi fisikanya dirancang menerima waktu sembarang S sebagai masukan, bukan selalu 10 detik penuh
  • Saya sempat keliru karena ingatan pernah memainkan Spacewar di PDP-1 pada 1960-an, dan salah mengingat bahwa ada juga game pendaratan
    Namun ternyata tidak ada game pendaratan, dan Storer adalah yang pertama. Sejarah menarik terkait hal itu ada di sini
    https://www.acriticalhit.com/moonlander-one-giant-leap-for-g...
  • Ungkapan “suicide burn menjadi optimal karena persamaan roket” secara ketat tidak tepat
    Bahkan tanpa menghitung efek wahana menjadi lebih ringan saat membakar bahan bakar, yaitu tanpa bagian yang dilakukan persamaan roket di sini, suicide burn tetap optimal
    Alasan sebenarnya adalah karena suicide burn meminimalkan gravity loss
    https://en.wikipedia.org/wiki/Gravity_loss
    • Saya penulis artikel aslinya. Benar, saya menyederhanakannya
      Maksud saya adalah dalam dinamika ada dua bagian, yaitu persamaan roket dan gravitasi, dan keduanya dijumlahkan secara linear. Kecepatan tambahan akibat gravitasi harus dihilangkan dengan menambah delta-V dari persamaan roket
      Delta-V gravitasi adalah percepatan gravitasi dikalikan waktu, jadi waktunya harus diminimalkan
      Menariknya, dalam persamaan roket, tidak penting berapa lama waktunya, urutan pembakaran seperti apa yang dipakai, apakah membakar terus-menerus dengan laju konstan atau dengan semburan singkat dan kuat
      Jadi untuk mendarat dengan kecepatan 0 memakai bahan bakar minimum, kita harus mendarat dalam waktu sesingkat mungkin
  • Saya masih punya gulungan pita berlubang yang sepertinya untuk PDP-11, dan di situ tertulis “Lunar Lander”, tapi saya tidak tahu harus memberikannya kepada siapa
    • Internet Archive atau Computer History Museum sepertinya pilihan bagus. Untuk rekomendasi tempat yang mungkin berminat, bisa tanyakan ke @textfiles
  • Cukup mengejutkan. Saya ingat pernah memainkan game ini pada pertengahan 1970-an setelah seseorang mem-porting-nya ke Wang 2200 BASIC
    Saya tidak pernah berhasil menemukan sendiri cara mendarat, tapi saya ingat seseorang menunjukkan teknik melaju dengan inersia pada beberapa giliran pertama lalu menyalakan dorongan maksimum. Saat itu saya tidak ingat istilah “suicide burn”. Mungkin istilah itu muncul belakangan setelah Kerbal Space Program menjadi populer
    Saya juga ingat pada pertengahan 1970-an di Lawrence Hall of Science, Berkeley, game pendaratan bulan ini berjalan di beberapa terminal. Saya tidak tahu dijalankan di komputer apa
    Saya tidak pernah melihat kode sumber program ini, dan sama sekali tidak tahu bahwa matematikanya secanggih ini. Saat itu saya terlalu kecil untuk memahaminya, dan sejujurnya saya juga tidak yakin bisa memahaminya sekarang
    • Saya ingat pada awal 1973 di Lawrence, mungkin lewat terminal ADM-3, Lunar Lander bisa dimainkan. Biasanya ada kerumunan remaja laki-laki
      Salah satu “fitur” mode kios game itu adalah dengan Ctrl-C yang waktunya tepat, kita bisa keluar dari mode kios dan memainkan game lain
      Apakah itu kebetulan, atau umpan yang dilemparkan kepada para hacker awal?