aoc_omni/ruby/2025/6/lib/cephalopod_math.rb
2025-12-06 06:51:04 -05:00

46 lines
1009 B
Ruby

class CephalopodMath
attr_reader :worksheet
def initialize(worksheet)
@worksheet = worksheet
end
def self.for(input)
new input
end
def wide_problem_answers
problems.map do |problem|
problem[..-2].map(&:to_i).reduce(&(problem[-1].strip.to_sym))
end
end
def narrow_problem_answers
problems.map do |problem|
operator = problem[-1].strip.to_sym
numbers = problem[..-2].map { |line| line.split("") }.transpose.map { |line| line.join("").to_i }.reject(&:zero?)
numbers.reduce operator
end
end
def problem_widths
@problem_widths ||= operator_line.split("+").map { |c| c.split "*" }.flatten.map(&:length)[1..]
end
def problems
@problems ||= lines.map(&:clone).map do |line|
problem_widths.reduce([]) do |chunks, problem_width|
slice = line.slice!(0, problem_width + 1)
chunks << slice
end
end.transpose
end
def operator_line
lines.last
end
def lines
worksheet.split("\n")
end
end