1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
#!/usr/bin/env ruby
def optimise_ortho_meta(loc, left, right, center)
opt = [loc[left], loc[right]].min
loc[left] -= opt
loc[right] -= opt
loc[center] += opt
return opt > 0
end
def optimise_para(loc, forth, back)
return false if loc[forth].zero? || loc[back].zero?
if loc[forth] > loc[back] then
loc[forth] = loc[forth] - loc[back]
loc[back] = 0
return true
end
if loc[back] > loc[forth] then
loc[back] = loc[back] - loc[forth]
loc[forth] = 0
return true
end
loc[forth] = 0
loc[back] = 0
return true
end
input = gets.chomp.split(',')
fl = {
n: 0,
ne: 0,
se: 0,
s: 0,
sw: 0,
nw: 0
}
max = 0
input.each do |dir|
fl[dir.intern] += 1
l = fl.dup
changed = true
while changed do
changed = false
changed |= optimise_ortho_meta(l, :ne, :nw, :n)
changed |= optimise_ortho_meta(l, :se, :sw, :s)
changed |= optimise_ortho_meta(l, :n, :se, :ne)
changed |= optimise_ortho_meta(l, :n, :sw, :nw)
changed |= optimise_ortho_meta(l, :s, :ne, :se)
changed |= optimise_ortho_meta(l, :s, :nw, :sw)
changed |= optimise_para(l, :nw, :se)
changed |= optimise_para(l, :n, :s)
changed |= optimise_para(l, :ne, :sw)
end
d = l.values.inject(:+)
max = d if d > max
end
puts max
|