instructions, network = ARGF.read.split("\n\n") network = network .scan(/(\w+) = \((\w+), (\w+)\)/) .to_h { [_1, { L: _2, R: _3 }] } 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.inject(1, :lcm)