aoc2023/day_5/impl.rb

51 lines
1.0 KiB
Ruby

#prepare the input which is a string containing new lines
def parse(input)
data = []
map = []
input.each_line do |line|
if data.empty?
data << line.split(":").last.split(" ").map(&:to_i)
next
end
if line.include?(":") && !map.empty?
puts map
data << map
map = []
next
end
next if line.include?(":")
next if line.strip.empty?
# build the map
target,source,ranges = line.split(" ").map(&:to_i)
diff = target-source
map << [source,ranges,diff]
end
data << map
data
end
# result should a single string or integer
def calculate(data)
seeds = nil
data.each do |d|
if seeds.nil?
seeds = d
next
end
# start mapping
new_seeds = seeds.map do |seed|
mapped = seed
d.each do |mapping|
source,ranges,diff = mapping
if source <= seed && seed <= source + ranges
mapped = seed + diff
break
end
end
mapped
end
seeds = new_seeds
end
seeds.min
end