第30回オフラインリアルタイムどう書くの問題をRubyで解く


問題はこちら。
http://nabetani.sakura.ne.jp/hena/ord30taxi/

DIST={AB:1090,AC:180,AD:540,BC:960,BG:1270,CD:400,CF:200,DE:720,DF:510,EG:1050,FG:230}
FEE={AB:60,AC:60,AD:50,BC:60,BG:60,CD:50,CF:60,DE:50,DF:50,EG:50,FG:50}
def solve(q)
  cur_pos, *pos = q.chars
  sum, dist = cur_pos < 'D' ? [400,995] : [350,845]
  pos.each{|p|
    key = [cur_pos, p].sort.join.to_sym
    d = DIST[key]
    if d <= dist
      dist -= d
    else
      d -= dist
      while true
        dist = 200
        sum += FEE[key]
        if d < dist
          dist -= d
          break
        else
          d -= dist
        end
      end
    end
    cur_pos = p
  }
  sum
end

DATA.readlines.each do |line|
  no,q,a = line.strip.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans.to_s
  puts ans == a.to_i ? ' o' : ' x'
end
__END__
0   ADFC    510
1   CFDA    500
2   AB  460
3   BA  460
4   CD  400
5   DC  350
6   BG  520
7   GB  530
8   FDA 450
9   ADF 450
10  FDACB   750
11  BCADF   710
12  EDACB   800
13  BCADE   810
14  EGFCADE 920
15  EDACFGE 910
16  ABCDA   960
17  ADCBA   1000
18  BADCFGB 1180
19  BGFCDAB 1180
20  CDFC    460
21  CFDC    450
22  ABGEDA  1420
23  ADEGBA  1470
24  CFGB    640
25  BGFC    630
26  ABGEDFC 1480
27  CFDEGBA 1520
28  CDFGEDABG   1770
29  GBADEGFDC   1680