view day1b.rb @ 17:92144824cbb7

Add "inside the loop" counting for day 10 part 2 Use the "how many lines do we cross?" approach. We also need extra state for "am I actually inside a line, or did it just revert back on itself". Slightly slow, but not terrible.
author IBBoard <dev@ibboard.co.uk>
date Sun, 10 Dec 2023 20:26:12 +0000
parents 76cc43966538
children
line wrap: on
line source

#! /usr/bin/env ruby

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

file = ARGV[0]
sum = 0

number_map = {
	"one" => 1,
	"two" => 2,
	"three" => 3,
	"four" => 4,
	"five" => 5,
	"six" => 6,
	"seven" => 7,
	"eight" => 8,
	"nine" => 9
}

(1..9).each {|i| number_map[i.to_s] = i}

File.open(file, "r").each_line do |line|
	pos = line.length
	value_1 = 0
	number_map.each do |k,v| 
		index = line.index(k)
		if index and index < pos
			value_1 = v
			pos = index
		end
	end
	pos = line.length
	line.reverse!
	value_2 = 0
	number_map.each do |k,v| 
		index = line.index(k.reverse)
		if index and index < pos
			value_2 = v
			pos = index
		end
	end
	sum += (value_1 * 10) + value_2
end

puts sum