46 lines
1009 B
Ruby
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
|