From 73b650f44d8a2ba166936a13d275d606bae35395 Mon Sep 17 00:00:00 2001 From: Nat Lasseter Date: Mon, 25 Dec 2017 11:31:48 +0000 Subject: Day25 Part1 --- day25/input | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ day25/part1 | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 day25/input create mode 100755 day25/part1 diff --git a/day25/input b/day25/input new file mode 100644 index 0000000..81c1e6a --- /dev/null +++ b/day25/input @@ -0,0 +1,62 @@ +Begin in state A. +Perform a diagnostic checksum after 12425180 steps. + +In state A: + If the current value is 0: + - Write the value 1. + - Move one slot to the right. + - Continue with state B. + If the current value is 1: + - Write the value 0. + - Move one slot to the right. + - Continue with state F. + +In state B: + If the current value is 0: + - Write the value 0. + - Move one slot to the left. + - Continue with state B. + If the current value is 1: + - Write the value 1. + - Move one slot to the left. + - Continue with state C. + +In state C: + If the current value is 0: + - Write the value 1. + - Move one slot to the left. + - Continue with state D. + If the current value is 1: + - Write the value 0. + - Move one slot to the right. + - Continue with state C. + +In state D: + If the current value is 0: + - Write the value 1. + - Move one slot to the left. + - Continue with state E. + If the current value is 1: + - Write the value 1. + - Move one slot to the right. + - Continue with state A. + +In state E: + If the current value is 0: + - Write the value 1. + - Move one slot to the left. + - Continue with state F. + If the current value is 1: + - Write the value 0. + - Move one slot to the left. + - Continue with state D. + +In state F: + If the current value is 0: + - Write the value 1. + - Move one slot to the right. + - Continue with state A. + If the current value is 1: + - Write the value 0. + - Move one slot to the left. + - Continue with state E. 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 -- cgit v1.2.3