From af660a1137dbc87bfc20fc874e527258b3966306 Mon Sep 17 00:00:00 2001 From: Alpha Chen Date: Thu, 29 Dec 2016 08:11:50 -0800 Subject: [PATCH] [2016][ruby][25.0] --- 2016/input/day_25.txt | 30 ++++++++++++++++++++++++++++++ 2016/ruby/day_25.rb | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 2016/input/day_25.txt create mode 100644 2016/ruby/day_25.rb diff --git a/2016/input/day_25.txt b/2016/input/day_25.txt new file mode 100644 index 0000000..47effc4 --- /dev/null +++ b/2016/input/day_25.txt @@ -0,0 +1,30 @@ +cpy a d +cpy 7 c +cpy 365 b +inc d +dec b +jnz b -2 +dec c +jnz c -5 +cpy d a +jnz 0 0 +cpy a b +cpy 0 a +cpy 2 c +jnz b 2 +jnz 1 6 +dec b +dec c +jnz c -4 +inc a +jnz 1 -7 +cpy 2 b +jnz c 2 +jnz 1 4 +dec b +dec c +jnz 1 -4 +jnz 0 0 +out b +jnz a -19 +jnz 1 -21 \ No newline at end of file diff --git a/2016/ruby/day_25.rb b/2016/ruby/day_25.rb new file mode 100644 index 0000000..491b903 --- /dev/null +++ b/2016/ruby/day_25.rb @@ -0,0 +1,43 @@ +class Assembunny + attr_reader :data + + def initialize(data) + @data = data + end + + def run(input) + return enum_for(__method__, input) unless block_given? + + registers = { ?a => input, ?b => 0, ?c => 0, ?d => 0 } + pc = 0 + + while pc < data.size + line = data[pc] + case line + when /cpy ([a-d]|\d+) ([a-d])/ + value = registers.fetch($1) { $1.to_i } + registers[$2] = value + pc += 1 + when /inc ([a-d])/ + registers[$1] += 1 + pc += 1 + when /dec ([a-d])/ + registers[$1] -= 1 + pc += 1 + when /jnz ([a-d]|\d+) (-?\d+)/ + value = registers.fetch($1) { $1.to_i } + pc += value.zero? ? 1 : $2.to_i + when /out ([a-d])/ + yield registers.fetch($1) + pc += 1 + else + raise "invalid line: #{line}" + end + end + end +end + +assembunny = Assembunny.new(ARGF.read.split("\n")) + +needle = ('01' * 6).chars.map(&:to_i) +puts (1..Float::INFINITY).find {|i| assembunny.run(i).take(12) == needle }