view day8b.rb @ 33:676461cc3a70

Day 23 - track segments, not each space This allows us to explore the branches once then do quicker calculations for valid route lengths. But still requires exploring 1,262,816 routes to find the longest!
author IBBoard <dev@ibboard.co.uk>
date Thu, 04 Jan 2024 14:52:24 +0000
parents a7fb64b48830
children
line wrap: on
line source

#! /usr/bin/env ruby

if ARGV.length != 1
        abort("Incorrect arguments - needs input file")
elsif not File.exist? (ARGV[0])
	abort("File #{ARGV[0]} did not exist")
end

file = ARGV[0]

lines = File.open(file, "r").each_line(chomp: true)

steps = lines.first.each_char.to_a

node_lines = lines.drop(1).to_a

#first_node, _ = node_lines[0].split("=")
#first_node.strip!

nodes = node_lines.map {|line| node, rest = line.split("="); left, right = rest.split(","); [node.strip, {"L" => left.strip[1..-1], "R" => right.strip[0..-2]}]}.to_h

cur_nodes = nodes.keys.filter {|v| v[-1] == "A"}

step_counts = cur_nodes.map do |cur_node| 
	step_count = 0
	step_cycle = steps.cycle
	while cur_node[-1] != "Z"
		step_count += 1
		cur_node = nodes[cur_node][step_cycle.next]
	end
	step_count
end
puts step_counts.reduce(1, :lcm)