Towers of Hanoi: Difference between revisions
Content added Content deleted
m (→{{header|Groovy}}: cleanup) |
|||
Line 2,211: | Line 2,211: | ||
=={{header|Ruby}}== |
=={{header|Ruby}}== |
||
<lang ruby>def move(num_disks, |
<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, |
move(num_disks-1, start, using, target) |
||
move(1, |
move(1, start, target, using) |
||
move(num_disks-1, |
move(num_disks-1, using, target, start) |
||
end |
end |
||
end |
end |
||
n = 5 |
|||
@towers = [[*1..n].reverse, [], []] |
|||
⚫ | |||
{{out}} |
|||
<lang ruby> |
|||
<pre> |
|||
require 'pp' |
|||
Move disk from 0 to 1 : [[5, 4, 3, 2], [1], []] |
|||
⚫ | |||
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 |
|||
⚫ | |||
# 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 |
||
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) |
||
p towers # trace |
|||
end |
end |
||
end |
end |
||
end |
end |
||
end |
end |
||
⚫ | |||
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") |