Towers of Hanoi: Difference between revisions

Content added Content deleted
Line 2,211: Line 2,211:


=={{header|Ruby}}==
=={{header|Ruby}}==
<lang ruby>def move(num_disks, starting_stick, target_stick, using_stick)
<lang ruby>def move(num_disks, start=0, target=1, using=2)
if num_disks == 1
if num_disks == 1
@towers[target] << @towers[start].pop
target_stick << starting_stick.shift
puts "Move disk from #{start} to #{target} : #{@towers}"
status
else
else
move(num_disks-1, starting_stick, using_stick, target_stick)
move(num_disks-1, start, using, target)
move(1, starting_stick, target_stick, using_stick)
move(1, start, target, using)
move(num_disks-1, using_stick, target_stick, starting_stick)
move(num_disks-1, using, target, start)
end
end
end</lang>
end

n = 5
@towers = [[*1..n].reverse, [], []]
move(n)</lang>


{{out}}
<lang ruby>
<pre>
require 'pp'
Move disk from 0 to 1 : [[5, 4, 3, 2], [1], []]
# solve(source, via, target)
Move disk from 0 to 2 : [[5, 4, 3], [1], [2]]
Move disk from 1 to 2 : [[5, 4, 3], [], [2, 1]]
Move disk from 0 to 1 : [[5, 4], [3], [2, 1]]
Move disk from 2 to 0 : [[5, 4, 1], [3], [2]]
Move disk from 2 to 1 : [[5, 4, 1], [3, 2], []]
Move disk from 0 to 1 : [[5, 4], [3, 2, 1], []]
Move disk from 0 to 2 : [[5], [3, 2, 1], [4]]
Move disk from 1 to 2 : [[5], [3, 2], [4, 1]]
Move disk from 1 to 0 : [[5, 2], [3], [4, 1]]
Move disk from 2 to 0 : [[5, 2, 1], [3], [4]]
Move disk from 1 to 2 : [[5, 2, 1], [], [4, 3]]
Move disk from 0 to 1 : [[5, 2], [1], [4, 3]]
Move disk from 0 to 2 : [[5], [1], [4, 3, 2]]
Move disk from 1 to 2 : [[5], [], [4, 3, 2, 1]]
Move disk from 0 to 1 : [[], [5], [4, 3, 2, 1]]
Move disk from 2 to 0 : [[1], [5], [4, 3, 2]]
Move disk from 2 to 1 : [[1], [5, 2], [4, 3]]
Move disk from 0 to 1 : [[], [5, 2, 1], [4, 3]]
Move disk from 2 to 0 : [[3], [5, 2, 1], [4]]
Move disk from 1 to 2 : [[3], [5, 2], [4, 1]]
Move disk from 1 to 0 : [[3, 2], [5], [4, 1]]
Move disk from 2 to 0 : [[3, 2, 1], [5], [4]]
Move disk from 2 to 1 : [[3, 2, 1], [5, 4], []]
Move disk from 0 to 1 : [[3, 2], [5, 4, 1], []]
Move disk from 0 to 2 : [[3], [5, 4, 1], [2]]
Move disk from 1 to 2 : [[3], [5, 4], [2, 1]]
Move disk from 0 to 1 : [[], [5, 4, 3], [2, 1]]
Move disk from 2 to 0 : [[1], [5, 4, 3], [2]]
Move disk from 2 to 1 : [[1], [5, 4, 3, 2], []]
Move disk from 0 to 1 : [[], [5, 4, 3, 2, 1], []]
</pre>
or
<lang ruby># solve(source, via, target)
# Example:
# Example:
# solve([5, 4, 3, 2, 1], [], [])
# solve([5, 4, 3, 2, 1], [], [])
Line 2,233: Line 2,270:
disks = towers.inject(0){|sum, tower| sum+tower.length}
disks = towers.inject(0){|sum, tower| sum+tower.length}
x=0 # sequence number
x=0 # sequence number
pp towers # initial trace
p towers # initial trace
# have we solved the puzzle yet?
# have we solved the puzzle yet?
while towers.last.length < disks do
while towers.last.length < disks do
Line 2,246: Line 2,283:
# ok, do it!
# ok, do it!
towers[to].push(towers[from].pop)
towers[to].push(towers[from].pop)
pp towers # trace
p towers # trace
end
end
end
end
end
end
end
end

</lang>
solve([5, 4, 3, 2, 1], [], [])</lang>
{{out}}
<pre>
[[5, 4, 3, 2, 1], [], []]
[[5, 4, 3, 2], [], [1]]
[[5, 4, 3], [2], [1]]
[[5, 4, 3], [2, 1], []]
[[5, 4], [2, 1], [3]]
[[5, 4, 1], [2], [3]]
[[5, 4, 1], [], [3, 2]]
[[5, 4], [], [3, 2, 1]]
[[5], [4], [3, 2, 1]]
[[5], [4, 1], [3, 2]]
[[5, 2], [4, 1], [3]]
[[5, 2, 1], [4], [3]]
[[5, 2, 1], [4, 3], []]
[[5, 2], [4, 3], [1]]
[[5], [4, 3, 2], [1]]
[[5], [4, 3, 2, 1], []]
[[], [4, 3, 2, 1], [5]]
[[1], [4, 3, 2], [5]]
[[1], [4, 3], [5, 2]]
[[], [4, 3], [5, 2, 1]]
[[3], [4], [5, 2, 1]]
[[3], [4, 1], [5, 2]]
[[3, 2], [4, 1], [5]]
[[3, 2, 1], [4], [5]]
[[3, 2, 1], [], [5, 4]]
[[3, 2], [], [5, 4, 1]]
[[3], [2], [5, 4, 1]]
[[3], [2, 1], [5, 4]]
[[], [2, 1], [5, 4, 3]]
[[1], [2], [5, 4, 3]]
[[1], [], [5, 4, 3, 2]]
[[], [], [5, 4, 3, 2, 1]]
</pre>

=={{header|Run BASIC}}==
=={{header|Run BASIC}}==
<lang runbasic>a = move(4, "1", "2", "3")
<lang runbasic>a = move(4, "1", "2", "3")