Vor einigen Tagen kam mein Sohn im Gespräch auf das Thema Programmierung . Das ganze Gespräch will ich hier nicht wiedergeben, aber irgendwann sind wir bei dem legendären Send More Money Problem gelandet. Kennt das jemand?
Ein amerikanischer Student macht eine Weltreise. Als er gerade Europa besichtigt, geht ihm das Geld aus. Er schickt eine Postkarte nach Hause mit dem folgenden Inhalt:
SEND
+MORE
-----
MONEY
Wenn man jeden Buchstaben durch eine Ziffer ersetzt, erhält man den Betrag, den sich der Student wünscht.
Diese Art von Symbolrätsel nennt man Alphametik. Dabei werden unterschiedliche Buchstaben durch unterschiedliche Ziffern so ersetzt, dass die mathematische Operation sinnvoll ist. Heutzutage findet man den richtigen Geldbetrag natürlich im Internet. (Schaut nicht nach 😉 Die Rechnung lautet 9567 + 1085 = 10652.)
Mein Sohn wollte wissen, wie man das Rätsel mit dem Computer lösen kann. Ende der 1980er Jahre habe ich das mal in 6502 (bzw. 6510) Assembler gelöst. Der 6502 war der Mikroprozessor, der im Apple II+ und später in modifizierter Form als 6510 im Commodore C-64 (von dem hatte ich damals 3, einer davon funktioniert auf jeden Fall heute noch) eingebaut war.
Natürlich konnte man auch diese Computer bereits in höheren Programmiersprachen programmieren. Ich entschied mich damals aus Zeitgründen für Assembler, da ich im ersten Ansatz einen ziemlich dummen Algorithmus umsetzen wollte, nämlich das stumpfsinnige Durchprobieren aller Möglichkeiten. Um die Laufzeiten möglichst niedrig zu halten, wollte ich direkt in Maschinensprache/Assembler programmieren.
Mich würde einmal interessieren, ob es da draußen in der weiten Welt noch jemanden gibt, der mal in 6502-Assembler programmiert hat und möglichweise den folgenden Code noch halbwegs versteht? Würde mich über eure Kommentare unterhalb des Artikels freuen!
Meine Lösung sieht als Hex-Dump folgendermaßen aus (per Mausklick gibt es eine größere Darstellung):
Das ist ein Originalausdruck mit Nadeln auf Rollenpapier (2 Streifen nebeneinander auf ein Blatt A4 geklebt.).
Wer genau hinsieht, entdeckt einen kleinen Rechtschreibfehler: ich habe das Problem damals immer „Sent More Money“ genannt, obwohl es natürlich „Send More Money“ heißen muss.
Ein bißchen leichter lesbar ist das Programm in Assembler-Code:

Disassembling des Send More Money Programms – Seite 1

Disassembling des Send More Money Programms – Seite 2

Disassembling des Send More Money Programms – Seite 3
Zugegeben: besonders elegant war das Programm nicht, aber es hat alle Lösungen ausgespuckt:

Alle vom Bildschirm abgeschriebenen Lösungen des Send More Money Problems
Letztendlich korrekt ist hierbei nur die letzte Lösung, denn eine 0 als erste Ziffer ist für Alphametiken nicht zugelassen.
Natürlich zeigt auch das Disassembling oben nicht, wie ich das Programm entwickelt habe. Üblicherweise arbeitet man nicht mit festen Speicheradressen für Variablen und Unterprogramme, sondern mit Symbolen. Ein Unterprogramm hat zum Beispiel bei der Anzeige jeder neuen Lösung auf dem Bildschirm zusätzlich ein akustisches Signal ausgegeben. Das sah dann im Original so aus:

Unterprogramm AKUSIG in 6510 Assembler – in meiner Original-Handschrift
Aber auch das war nicht der Anfang. 🙂 Davor habe ich für jedes Unterprogramm einen Programmablaufplan entwickelt. Alles noch handgezeichnet:

Das kann aber jetzt dann jeder nachvollziehen, oder?
1989 habe ich das ganze Programm auch noch mal in Turbo-Pascal programmiert. Aber darauf gehe ich in diesem Artikel nicht weiter ein.
Sehr schön ist das Problem und ein progammtechnischer Ansatz in dem „Artikel Von Professor Urban“ (Hinweis 03.02.2019: Leider funktioniert der Link nicht mehr: http://www.hib-wien.at/leute/wurban/informatik/sendmoremoney.pdf.) dargestellt.
Für alle, die nun – wie ich – wieder Lust auf 6502-Assembler bekommen haben, habe ich noch eine Buch-Empfehlung: Programmierung des 6502 von Rodnay Zaks.
Das Buch steht bei mir seit 1983 im IT-Bücherregal und ist sowohl für Einsteiger als auch für Fortgeschrittene wärmstens zu empfehlen.
Auch wenn heute kaum noch jemand direkt in Assembler programmiert, so macht es doch Spaß, sich auf diese Tiefe hinabzubegeben und kleinere Probleme damit zu lösen.
(Vielleicht, mein Sohn, ist das ja auch für dich ein Anreiz!)


