2017-10-22 20:50:54 +02:00
|
|
|
The Tower of Hanoi (also called the Tower of Brahma or Lucas' Tower
|
|
|
|
and sometimes pluralized) is a mathematical game or puzzle. It
|
|
|
|
consists of three rods and a number of disks of different sizes,
|
|
|
|
which can slide onto any rod. The puzzle starts with the disks in
|
|
|
|
a neat stack in ascending order of size on one rod, the smallest
|
|
|
|
at the top, thus making a conical shape.
|
|
|
|
|
|
|
|
The objective of the puzzle is to move the entire stack to another
|
|
|
|
rod, obeying the following simple rules:
|
|
|
|
|
|
|
|
- Only one disk can be moved at a time.
|
|
|
|
- Each move consists of taking the upper disk from one of the
|
|
|
|
stacks and placing it on top of another stack.
|
|
|
|
- No disk may be placed on top of a smaller disk.
|
|
|
|
|
|
|
|
With 3 disks, the puzzle can be solved in 7 moves. The minimal
|
|
|
|
number of moves required to solve a Tower of Hanoi puzzle is
|
|
|
|
2^n-1, where n is the number of disks.
|
|
|
|
|
|
|
|
Taken from https://en.m.wikipedia.org/wiki/Tower_of_Hanoi
|
|
|
|
|
|
|
|
I am tracking state in a few variables, so I define them first.
|
|
|
|
|
2017-10-20 21:58:42 +02:00
|
|
|
~~~
|
2017-10-22 19:45:28 +02:00
|
|
|
'Num var
|
|
|
|
'From var
|
|
|
|
'To var
|
|
|
|
'Via var
|
2017-10-22 20:50:54 +02:00
|
|
|
~~~
|
|
|
|
|
|
|
|
Next, a quick word to setup all the variables.
|
2017-10-20 21:58:42 +02:00
|
|
|
|
2017-10-22 20:50:54 +02:00
|
|
|
~~~
|
2017-10-22 19:45:28 +02:00
|
|
|
:set-vars !Via !To !From !Num ;
|
2017-10-22 20:50:54 +02:00
|
|
|
~~~
|
|
|
|
|
2018-04-25 19:20:31 +02:00
|
|
|
Then, implementing the recursive algorithm from the Wikipedia article:
|
2017-10-22 20:50:54 +02:00
|
|
|
|
|
|
|
~~~
|
2017-10-20 21:58:42 +02:00
|
|
|
:hanoi (num,from,to,via-)
|
2017-10-22 19:45:28 +02:00
|
|
|
set-vars
|
|
|
|
@Num n:-zero?
|
2017-10-20 21:58:42 +02:00
|
|
|
[
|
2017-10-22 19:45:28 +02:00
|
|
|
@Num @From @To @Via
|
|
|
|
@Num n:dec @From @Via @To hanoi
|
|
|
|
set-vars
|
2018-04-25 18:51:46 +02:00
|
|
|
@To @From '\nMove_a_ring_from_%n_to_%n s:format puts
|
2017-10-22 19:45:28 +02:00
|
|
|
@Num n:dec @Via @To @From hanoi
|
2017-10-20 21:58:42 +02:00
|
|
|
] if ;
|
2017-10-22 20:50:54 +02:00
|
|
|
~~~
|
2017-10-20 21:58:42 +02:00
|
|
|
|
2017-10-22 20:50:54 +02:00
|
|
|
And a test.
|
|
|
|
|
|
|
|
~~~
|
2017-10-22 19:45:28 +02:00
|
|
|
#3 #1 #3 #2 hanoi nl
|
2017-10-20 21:58:42 +02:00
|
|
|
~~~
|