Anonymous user
Towers of Hanoi: Difference between revisions
m
→pictorial moves: added/changed whitespace and comments, elided some dead code, broke apart a long line of assignments, changed the wording in the REXX section header.
m (→simple text moves: added/changed whitespace and comments, changed the wording of the output.) |
m (→pictorial moves: added/changed whitespace and comments, elided some dead code, broke apart a long line of assignments, changed the wording in the REXX section header.) |
||
Line 2,561:
===pictorial moves===
This REXX version pictorially shows the moves for solving the Town of Hanoi.
Quite a bit of code has been dedicated to showing a "picture" of the towers with the disks, and the movement of the disk (
In addition, it shows each move in a countdown manner (the last move is marked as #1).
<lang rexx>/*REXX program shows pictorial moves to solve Tower of Hanoi (with N
parse arg N .; if N=='' then N=3 /*Not given? Then use default 3 disks.*/
sw=80; wp=sw%3-1; blanks=left('',wp) /*define some default REXX variables. */
Line 2,576:
#=0; z=2**N-1; moveK=z /*#moves; min# of moves; where to move.*/
@abc='abcdefghijklmnopqrstuvwxyN' /*dithering chars when many disks used.*/
ebcdic= ('f0'x==0)
if ebcdic then do; bar='bf'x; ar="df"x; boxen='db9f9caf'x; down="9a"x
end
else do; bar='c4'x; ar="10"x; boxen='b0b1b2db'x; down="18"x
end
verts
downs
box
$.=0; $.1=N; k=N; kk=k+k
do j=1 for N;
▲ if N<=length(boxchars) then @.1.j=translate(@.1.j,,substr(boxchars,kk%2,1),box)
kk=kk-2
call showtowers; call mov 1,3,N; say
▲say "The minimum number of moves to solve a " N ' Tower of Hanoi is ' z
exit
/*─────────────────────────────MOV subroutine─────────────────────────────────*/
mov: if arg(3)==1 then call
else do; call mov arg(1), 6-arg(1)-arg(2), arg(3)-1
call mov arg(1),
call mov 6-arg(1)-arg(2),
end
return
/*
if from==1 then do
pp=overlay(bl, pp, c.1)
pp=overlay(bar, pp, c.1+1, c.dest-c.1-1, bar) || tr
end
if from==2 then do
lpost=min(2, dest)
hpost=max(2, dest)
if dest==1 then do
pp=overlay(tl, pp, c.1)
pp=overlay(bar, pp, c.1+1, c.2-c.1-1, bar)||br
if dest==3 then
pp=overlay(
▲ pp=pp || tr
end
if from==3 then do
pp=overlay(br, pp, c.3)
pp=overlay(bar, pp, c.dest+1, c.3-c.dest-1, bar)
pp=overlay(tl, pp, c.dest)
end
say translate(pp, downs, Bcorners || Tcorners || bar);
say translate(pp, verts, Tcorners || Bcorners || bar)
say translate(pp, downs, Tcorners || Bcorners || bar); moveK=moveK-1
$.from=$.from-1; $.dest=$.dest+1; _f=$.from+1; _t=$.dest
return
/*─────────────────────────────SHOWTOWERS subroutine──────────────────────────*/
showtowers:
'''output''' when using the default input:
<pre>
░░
Line 2,693 ⟶ 2,684:
▓▓▓▓▓▓
The minimum number of moves to solve a 3-disk Tower of Hanoi is 7
</pre>
|