aboutsummaryrefslogtreecommitdiff
path: root/day25/part1
diff options
context:
space:
mode:
authorNat Lasseter <Nat Lasseter nathan@bytemark.co.uk>2017-12-25 11:31:48 +0000
committerNat Lasseter <Nat Lasseter nathan@bytemark.co.uk>2017-12-25 11:31:48 +0000
commit73b650f44d8a2ba166936a13d275d606bae35395 (patch)
tree24085054dcc1a4ffa3f0e96aff6e32a68049faf0 /day25/part1
parent3da21a8a69b5e616bd6f83b2104ba5bddd2f3bbf (diff)
Day25 Part1
Diffstat (limited to 'day25/part1')
-rwxr-xr-xday25/part168
1 files changed, 68 insertions, 0 deletions
diff --git a/day25/part1 b/day25/part1
new file mode 100755
index 0000000..65eed44
--- /dev/null
+++ b/day25/part1
@@ -0,0 +1,68 @@
+#!/usr/bin/env ruby
+
+INFINITY = 10001
+
+class State
+ def self.from_input(input)
+ this = input.shift.split[2][0]
+ input.shift
+ zero = [
+ input.shift.split[4][0].to_i,
+ input.shift.split[6][0] == 'r' ? 1 : -1,
+ input.shift.split[4][0]
+ ]
+ input.shift
+ one = [
+ input.shift.split[4][0].to_i,
+ input.shift.split[6][0] == 'r' ? 1 : -1,
+ input.shift.split[4][0]
+ ]
+ return [this, State.new(zero, one)]
+ end
+
+ attr_reader :zero, :one
+
+ def initialize(zero, one)
+ @zero = zero
+ @one = one
+ end
+end
+
+class Machine
+ def initialize(start, states)
+ @state = start
+ @states = states
+ @tape = [0] * INFINITY
+ @cursor = (INFINITY - 1) / 2
+ end
+
+ def step!
+ st = @states[@state]
+ pro = @tape[@cursor].zero? ? st.zero : st.one
+ @tape[@cursor] = pro[0]
+ @cursor += pro[1]
+ @state = pro[2]
+ end
+
+ def checksum
+ return @tape.count(1)
+ end
+end
+
+input = $stdin.readlines.map(&:strip) - [""]
+
+bgn = input.shift.split[3][0]
+dnc = input.shift.split[5].to_i
+
+states = []
+(0...input.length).step(9) do |i|
+ states << State.from_input(input[i...i+9])
+end
+states = states.to_h
+
+m = Machine.new(bgn, states)
+dnc.times do
+ m.step!
+end
+
+puts m.checksum