aboutsummaryrefslogtreecommitdiff
path: root/day11/part2
blob: 7fcaa66ae132f24ef74666a97f134558b360e3e9 (plain)
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