moshkit

hanoi

Apr 25th, 2020
8,683
0
Never
2
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.56 KB | None | 0 0
  1.  
  2.  
  3. $n = 11
  4.  
  5. ​
  6.  
  7. $towers = {}
  8.  
  9. ​
  10.  
  11. $idx = {a: 1, b: 2, c: 3}
  12.  
  13. ​
  14.  
  15. def init
  16.  
  17.   $towers = {
  18.  
  19.     a: 1.upto($n).to_a.reverse,
  20.  
  21.     b: [],
  22.  
  23.     c: []
  24.  
  25.   }
  26.  
  27. end
  28.  
  29. ​
  30.  
  31. init()
  32.  
  33. ​
  34.  
  35. def stat()
  36.  
  37.   ts = [:a, :b, :c]
  38.  
  39.   puts ts.join("\t")
  40.  
  41.   ($n - 1).downto(0).each do |i|
  42.  
  43.     [:a, :b, :c].each do |t|
  44.  
  45.       print "#{$towers[t][i]}\t"
  46.  
  47.     end
  48.  
  49.     puts
  50.  
  51.   end
  52.  
  53. end
  54.  
  55. ​
  56.  
  57. def m(from, to)
  58.  
  59.   d = $towers[from].pop
  60.  
  61.   dest_d = $towers[to].last
  62.  
  63.   if (to == :b && d == 1) || (dest_d && d > dest_d)
  64.  
  65.     puts("illegal move")
  66.  
  67.     exit(0)
  68.  
  69.   end
  70.  
  71.   $towers[to].push(d)
  72.  
  73.   puts "#{d} #{$idx[from]} #{$idx[to]}"
  74.  
  75. end
  76.  
  77. ​
  78.  
  79. ​
  80.  
  81. def move_right
  82.  
  83.   m(:a,:c)
  84.  
  85.   m(:a,:b)
  86.  
  87.   m(:c,:a)
  88.  
  89.   m(:b,:c)
  90.  
  91.   m(:a,:c)
  92.  
  93. end
  94.  
  95. ​
  96.  
  97. def move_left
  98.  
  99.   m(:c,:a)
  100.  
  101.   m(:c,:b)
  102.  
  103.   m(:a,:c)
  104.  
  105.   m(:b,:a)
  106.  
  107.   m(:c,:a)
  108.  
  109. end
  110.  
  111. ​
  112.  
  113. def swap()
  114.  
  115.   da = $towers[:a].last.to_i
  116.  
  117.   db = $towers[:b].last.to_i
  118.  
  119.   dc = $towers[:c].last.to_i
  120.  
  121. ​
  122.  
  123.   ts = [da, db, dc]
  124.  
  125. ​
  126.  
  127.   idx = [:a, :b, :c]
  128.  
  129. ​
  130.  
  131.   ts.each_with_index do |d, i|
  132.  
  133.     next if d == 0 || d == 1
  134.  
  135. ​
  136.  
  137.     ts.each_with_index do |dd, ii|
  138.  
  139.       next if dd == d
  140.  
  141. ​
  142.  
  143.       if dd == 0 || d < dd
  144.  
  145.         return [idx[i], idx[ii]]
  146.  
  147.       end
  148.  
  149.     end
  150.  
  151.   end
  152.  
  153. end
  154.  
  155. ​
  156.  
  157. ​
  158.  
  159. def done?()
  160.  
  161.   $towers[:a].last == nil && $towers[:b].last == nil
  162.  
  163. end
  164.  
  165. ​
  166.  
  167. def solve
  168.  
  169.   while true
  170.  
  171.     move_right
  172.  
  173.     break if done?()
  174.  
  175.     m(*swap())
  176.  
  177.     move_left
  178.  
  179.     m(*swap())
  180.  
  181.   end
  182.  
  183. end
  184.  
  185. ​
  186.  
  187. stat()
  188.  
  189. solve()
  190.  
  191. stat()
Advertisement
Comments
  • User was banned
  • User was banned
Add Comment
Please, Sign In to add comment