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