油売り算

http://karetta.jp/article/blog/ll-spirit/033840

僕も書いてみた。一週間くらいかかった...orz
きっと一年後に書いたらもっと違うコードになるんだろうな。

CAPA = [ARGV[0].to_i, ARGV[1].to_i ,ARGV[2].to_i]
GOAL = [CAPA[0]/2, CAPA[0]/2, 0]
STEPS = [[0,1],[0,2],[1,0],[1,2],[2,0],[2,1]]
A = 97 #ASCII code of "a"
phase = [CAPA[0],0,0]
visited = Array.new
stack = Array.new
queue = Array.new

def pourAbura(visit)
  abura = visit[0..2]
  from = visit[3]
  to = visit[4]
  if abura[from] + abura[to] > CAPA[to]
    abura[from] -= CAPA[to] - abura[to]
    abura[to] = CAPA[to]
  else
    abura[to] += abura[from]
    abura[from] = 0
  end
  return abura 
end

def printRoute(s)
  i = 0
  while i < s.size-3 do
    printf("%c から %c に ", A + s[i+3], A + s[i+4])
    print s[i + 5 + s[i + 4]] - s[i + s[i + 4]]
    print " 升移す => " + s[i + 5, 3].join(",") + "\n"
    i += 5
  end
end

puts "初期値: " + phase.join(",")
until phase == GOAL do
  unless visited.include?(phase)
    STEPS.each{|step|
      queue.push(stack + phase + step)
    }
  end
  visited << phase
  stack = queue.shift
  if stack == nil
    puts "解けません!"
    break
  else
    phase = pourAbura(stack[(stack.size-5)..(stack.size-1)])
  end
  if phase == GOAL
    stack += phase
    printRoute(stack)
  end
end

で、結果。

[hide@localhost ~]$ ruby abura.rb 4 7 3
初期値: 4,0,0
解けません!
[hide@localhost ~]$ ruby abura.rb 6 7 3
初期値: 6,0,0
a から c に 3 升移す => 3,0,3
c から b に 3 升移す => 3,3,0
[hide@localhost ~]$ ruby abura.rb 8 7 3
初期値: 8,0,0
a から b に 7 升移す => 1,7,0
b から c に 3 升移す => 1,4,3
c から a に 3 升移す => 4,4,0
[hide@localhost ~]$ ruby abura.rb 10 7 3
初期値: 10,0,0
a から b に 7 升移す => 3,7,0
b から c に 3 升移す => 3,4,3
c から a に 3 升移す => 6,4,0
b から c に 3 升移す => 6,1,3
c から a に 3 升移す => 9,1,0
b から c に 1 升移す => 9,0,1
a から b に 7 升移す => 2,7,1
b から c に 2 升移す => 2,5,3
c から a に 3 升移す => 5,5,0
[hide@localhost ~]$ ruby abura.rb 12 7 3
初期値: 12,0,0
a から c に 3 升移す => 9,0,3
c から b に 3 升移す => 9,3,0
a から c に 3 升移す => 6,3,3
c から b に 3 升移す => 6,6,0
[hide@localhost ~]$ ruby abura.rb 14 7 3
初期値: 14,0,0
a から b に 7 升移す => 7,7,0
[hide@localhost ~]$ ruby abura.rb 16 7 3
初期値: 16,0,0
解けません!

んー。「解けません!」ていうパターンが、あってるんだかあってないんだか分かんない…