1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2004-2008 Jean Privat <jean@pryen.org>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
20 # A tower is a stack of discus.
22 # Diameter of the last discus.
34 # Put an discus of diameter `i'.
40 # Remove the last discus and get its diameter.
42 assert not_empty
: not _t
.is_empty
46 redef fun to_s
: String
52 return "({_t.join(":")})"
56 var t
= new Array[Int] # The stack of discus (only the diameter is stored).
59 # Build a new tower with `n' discus.
61 assert positive
: n
>= 0
69 # Build a empty tower.
75 # Hanoi is a city with 3 towers.
78 move
(_tower1
.height
, _tower1
, _tower2
, _tower3
)
81 private fun move
(nb
: Int, source
: Tower, intermediate
: Tower, destination
: Tower)
86 move
(nb-1
, source
, destination
, intermediate
)
87 destination
.push
(source
.pop
)
89 move
(nb-1
, intermediate
, source
, destination
)
92 redef fun to_s
: String
94 return "{_tower1} {_tower2} {_tower3}"
103 _tower1
= new Tower.full
(nb
)
104 _tower2
= new Tower.empty
105 _tower3
= new Tower.empty
111 print
("Usage: hanoi <number of discus>")
117 if args
.length
!= 1 then
121 var nb
= args
.first
.to_i
125 var h
= new Hanoi(nb
)