Programm für den HP-42S zum Lösen des Puzzles ‚Türme von Hanoi‘.
Bedienung
- XEQ ‚HANOI‘
- Anzahl Scheiben [1..7] eingeben und R/S drücken
- Die Scheiben werden jetzt umgeschichtet
- Wenn das Puzzle gelöst ist, R/S drücken für Neustart
Programm
(Jetzt auch auf Github verfügbar)
{ 262-Byte Prgm } ;---------------------------------------------------------- ; Towers of Hanoi 001 § LBL "HANOI" ; ask user to enter number of disks and limit it to ; the supported range [1..7] 002 INPUT "DISKS" 003 7 004 X>Y? 005 X<>Y 006 1 007 X<Y? 008 X<>Y 009 STO "DISKS" 010 STO 08 ; current disk size ; smallest disk is moved to the right if number of disks ; is even, otherwise it is moved to the left 011 1 012 AND 013 LASTX 014 + 015 STO 07 ; disk 8 represents the basement and acts as a sentinel ; when moving disks 016 8 017 STO 00 018 STO 01 019 STO 02 ; initialize other data registers to zero 020 CLX 021 STO 03 022 STO 04 023 STO 05 024 STO 06 025 STO 09 ; set default AGRAPH mode 026 CF 34 027 CF 35 ; draw basement 028 CLLCD 029 -15 030 X<>Y 031 PIXEL 032 -16 033 X<>Y 034 PIXEL ; set up initial tower 035 § LBL 00 036 XEQ 04 037 XEQ 02 038 DSE 08 039 GTO 00 ; start solving puzzle 040 TONE 3 041 TONE 1 042 GTO 08 ;---------------------------------------------------------- ; remove disk of size R08 from pile R09 043 § LBL 01 ; erase disk 044 SF 34 045 XEQ 03 ; decrease tower height 046 RCL 09 047 3 048 + 049 DSE IND ST X 050 CLX ; update tower configuration ; (4 bits per disk) 051 RCL IND 09 052 16 053 ÷ 054 IP 055 STO IND 09 056 RTN ;---------------------------------------------------------- ; put disk of size R08 onto pile R09 057 § LBL 02 ; update tower configuration ; (4 bits per disk) 058 RCL IND 09 059 16 060 x 061 RCL 08 062 + 063 STO IND 09 ; increase tower height 064 RCL 09 065 3 066 + 067 ISG IND ST X 068 CLX ; draw disk and return 069 CF 34 ;---------------------------------------------------------- ; draw topmost disk of size R08 on pile R09 ; assumes ALPHA register contains disk pattern ; SF 34, CF 35 will erase the disk 070 § LBL 03 ; compute display row ; r := 15 - 2h(p) 071 RCL 09 072 3 073 + 074 15 075 RCL IND ST Y 076 ENTER 077 + 078 - ; compute display column ; c := 35p + 31 - 2s 079 RCL 09 080 35 081 x 082 31 083 + 084 RCL 08 085 ENTER 086 + 087 - ; finally, draw the disk 088 AGRAPH 089 RTN ;---------------------------------------------------------- ; build string for drawing disk of size R08 090 § LBL 04 ; width of disk in pixels := 4s + 1 091 "x" ; hex 01 092 RCL 08 093 LBL 05 094 |-"xxxx" ; hex 01 01 01 01 095 DSE ST X 096 GTO 05 097 RTN ;---------------------------------------------------------- ; main loop 098 § LBL 06 ; determine the one and only possible move after the ; smallest disk has been moved ; get indices of piles next to smallest disk 099 RCL 06 100 1 101 + 102 3 103 MOD 104 STO 09 105 1 106 + 107 3 108 MOD 109 STO 10 ; get sizes of topmost disks on these piles 110 RCL IND 09 111 15 112 AND 113 STO 08 114 LASTX 115 RCL IND 10 116 AND ; test which move is legal 117 X>Y? 118 GTO 07 ; move disk from pile R10 to pile R09 119 STO 08 120 RCL 10 121 X<> 09 122 STO 10 ; move disk from pile R09 to pile R10 123 § LBL 07 124 XEQ 04 125 XEQ 01 126 RCL 10 127 STO 09 128 XEQ 02 129 § LBL 08 ; remove smallest disk 130 1 131 STO 08 132 RCL 06 133 STO 09 134 XEQ 04 135 XEQ 01 ; move it to the next pile 136 RCL 06 137 RCL 07 138 + 139 3 140 MOD 141 STO 06 142 STO 09 143 XEQ 02 ; puzzle solved if all disk are on target pile 144 RCL "DISKS" 145 RCL 05 146 X<Y? 147 GTO 06 148 TONE 5 149 TONE 8 150 END Register Usage -------------- R00 configuration of tower 1 R01 configuration of tower 2 R02 configuration of tower 3 R03 height of tower 1 R04 height of tower 2 R05 height of tower 3 R06 pile with smallest disk R07 smallest disk move R08 current disk R09 current pile R10 destination pile Definitions ----------- s size of disk [1..7] p pile number [0..2] h height of pile p w width of disk in pixels w := 4s + 1 r display row of topmost disk on pile p r := 15 - 2h c display column of topmost disk on pile p c := 35p + 31 - 2s
How do you actually enter line 91 and 94 (hex 01…) in the HP-42s ?
thanks !
Hex 01 is the multiplication sign, refer to the ‚Character Table‘ in the HP-42S manual (page 288 et seq.).
Deine Seite gefällt mir sehr gut! Gestern habe ich meinen ersteigerten HP42S bekommen und gleich versucht ‚HANOI‘ abzutippen. An dieer Sequenz bin ich allerdings erst einmal gescheitert: |-„xxxx“
Wie gibt man das ein?
Und auch bei -15 habe ich Probleme. Wie gibt man das ein?
Vor vielen, vielen Jahren habe ich auch einmal eine Story über meine Programmiervergangenheit ins Netz gestellt: http://www.steinlaus.de/articles/articles2.html
Vielleicht interessiert es Dich!
Liebe Grüße
Tinkerpete
Mittlerweile habe ich heraus gefunden, wie man das komische Zeichen eingibt. Erst ALPHA und dann einmal ENTER.
Dafür eine neue Frage: Im Programm wird oft XY? verwendet, im HP-42S gibt es aber nur X/=Y?, also mit dem durchgestrichenen Gleichheitszeichen. Sind die identisch?
Da war ich wohl zu spät, aber selber rausfinden macht doch mehr Spass! 🙂 ALPHA ENTER und 4 mal das Multiplikationszeichen stimmt. Für -15 brauchst du die +/- Taste.
Deine Taschenrechner Story hat mir gut gefallen, da haben wir eine sehr ähnliche Karriere durchgemacht. Danke für den Link!
Da bin ich mir jetzt nicht sicher, was du meinst. Vielleicht die Funktion X<>Y (exchange X and Y register)? Diese Taste findest du neben der ENTER Taste. An Verleichsoperatoren wird eigentlich nur X>Y? und X
Da hatte ich wohl ein Brett vor dem Kopf! Ich habe vergessen, dass es ja diese Funktion gibt um X und Y Register auszutauschen! Ich habe es für eine Vergleichsfunktion gehalten.
Vielen Dank für den Tipp!
Hier noch ein Bericht von mir: http://www.steinlaus.de/articles/articles17.html
Alles in allem fand ich den eigentlich für damalige Verhältnisse perfekt. Die Gründe dafür finden sich im Artikel.
Aber der HP-42S ist auch eine Wucht, wie ich gerade entdecke.
Dein Programm läuft jetzt. Trotzdem sieht die Darstellung nicht so aus wie bei Dir. Es scheint so, als ob die Scheiben etwas weiter unten gezeichnet werden und es gibt auch keinen Zwischenraum, wie bei Dir auf dem Bild. Den Code habe ich mittlerweile 3 Mal geprüft. Gibt es irgend eine Anweisung, die man leicht falsch interpretieren kann?
Danke auch für diesen Link, habe gerade diese Woche einen Casio FX-602P erstanden 🙂
Das hört sich so an, wie beim Zeichnen etwas schief läuft. Schau Dir nochmals den Code ab LBL 03 bis und mit LBL 04 an. Bis auf die Anweisungen unter LBL 04 sind eigentlich alle eindeutig.
Ich habe es jetzt noch ein zweites Mal unter Free42 auf einem Galaxy Tab abgetippt – gleiches Problem! Im Gegensatz zu Deinem Bild gibt es bei der Ausführung keinen Zwischenraum bei den Scheiben und die Bodenplatte wird angeknabbert. Wann hast Du das Programm das letzte Mal abgetippt und ausprobiert? 😉
Ich habe das Problem gelöst! Ich habe in den Alpha-Strings immer ein kleines x angegeben, anstatt dem Multiplikatorzeichen!
Das Multiplikationszeichen hatte ich in meiner ersten Antwort bereits erwähnt, darum habe ich das (wohl zu voreilig) als Fehlerquelle ausgeschlossen. Aber Hauptsache, das Programm läuft jetzt!