From 5d7fc5b308f6835d137135bc57d0d87ba53594e0 Mon Sep 17 00:00:00 2001 From: Alpha Chen Date: Fri, 8 Dec 2023 08:47:34 -0800 Subject: [PATCH] [2023][ruby][8.2] --- 2023/ruby/day_08.rb | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/2023/ruby/day_08.rb b/2023/ruby/day_08.rb index 5f7c2b2..92e73f9 100644 --- a/2023/ruby/day_08.rb +++ b/2023/ruby/day_08.rb @@ -1,14 +1,30 @@ +require "prime" + instructions, network = ARGF.read.split("\n\n") network = network .scan(/(\w+) = \((\w+), (\w+)\)/) .to_h { [_1, { L: _2, R: _3 }] } -node = "AAA" -p instructions.chars.map(&:to_sym) - .cycle.with_index.lazy - .filter_map {|dir, i| - node = network.fetch(node).fetch(dir) - (node == "ZZZ") ? i+1 : nil - } - .first +steps = ->(start, finish) { + node = start + instructions.chars.map(&:to_sym) + .cycle.with_index.lazy + .filter_map {|dir, i| + node = network.fetch(node).fetch(dir) + (node =~ finish) ? i+1 : nil + } + .first +} + +# part one +p steps.("AAA", /ZZZ/) + +# part two +nodes = network.keys.select { _1.end_with?(?A) } +node_steps = nodes.map { steps.(_1, /Z$/) } +p node_steps + .map { Prime.prime_division(_1).to_h } + .inject {|acc, fac| acc.merge(fac) {|_,old,new| [old, new].max}} + .map { _1**_2 } + .inject(:*)