aboutsummaryrefslogtreecommitdiff
path: root/day11/part1
blob: 372fb71a700440f8d4e79fa0a0b52d510f53d12f (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
#!/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(',')

l = {
  n:  0,
  ne: 0,
  se: 0,
  s:  0,
  sw: 0,
  nw: 0
}

input.each do |dir|
  l[dir.intern] += 1
end

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

puts l.values.inject(:+)