MAPPER = { "8": "eight", "7": "seven", "3": "three", "9": "nine", "5": "five", "4": "four", "6": "six", "2": "two", "1": "one" } #prepare the input which is a string containing new lines def parse(input) data = [] input.each_line do |line| data << line.chomp end data end def find_first_digit(line, reverse:false) line.length.times do |i| j = reverse ? line.length - 1 - i : i return line[j] if line[j].to_i != 0 sub_line = line[j..-1] MAPPER.each do |k,v| return k if sub_line.start_with?(v) end end end # result should a single string or integer def calculate(data) result = 0 data.each_with_index do |d,i| first = find_first_digit(d) last = find_first_digit(d, reverse: true) num = "#{first}"+"#{last}" result += num.to_i end result end