aboutsummaryrefslogtreecommitdiff
path: root/day11/part1
diff options
context:
space:
mode:
authorNat Lasseter <Nat Lasseter nathan@bytemark.co.uk>2017-12-11 10:40:38 +0000
committerNat Lasseter <Nat Lasseter nathan@bytemark.co.uk>2017-12-11 10:40:38 +0000
commit91fbd98401dcde40c483cad42b746115d133bbd1 (patch)
treef4227fcecb848f3d086c64efecdd27c3934570ea /day11/part1
parent53c1f2ca21484b732f646787898e68cbbf731972 (diff)
Day 11
Diffstat (limited to 'day11/part1')
-rwxr-xr-xday11/part163
1 files changed, 63 insertions, 0 deletions
diff --git a/day11/part1 b/day11/part1
new file mode 100755
index 0000000..372fb71
--- /dev/null
+++ b/day11/part1
@@ -0,0 +1,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(:+)