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 meth to_s
: String
52 return "({_t.join(":")})"
56 attr _t
: Array[Int] # The stack of discus (only the diameter is stored).
59 # Build a new tower with `n' discus.
61 assert positive
: n
>= 0
62 _t
= new Array[Int].with_capacity
(n
)
69 # Build a empty tower.
76 # Hanoi is a city with 3 towers.
79 move
(_tower1
.height
, _tower1
, _tower2
, _tower3
)
82 private meth move
(nb
: Int, source
: Tower, intermediate
: Tower, destination
: Tower)
87 move
(nb-1
, source
, destination
, intermediate
)
88 destination
.push
(source
.pop
)
90 move
(nb-1
, intermediate
, source
, destination
)
93 redef meth to_s
: String
95 return "{_tower1} {_tower2} {_tower3}"
104 _tower1
= new Tower.full
(nb
)
105 _tower2
= new Tower.empty
106 _tower3
= new Tower.empty
112 print
("Usage: hanoi <number of discus>")
118 if args
.length
!= 1 then
122 var nb
= args
.first
.to_i
126 var h
= new Hanoi(nb
)