#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