Here is link to the puzzle. The first one is trivial. We have input file like this
1000 2000 3000 4000 5000 6000 7000 8000 9000 10000
Groups of numbers are separated by empty lines and task is to calculate the sum for each group and then output the largest one.
data = File.readlines("1.txt", chomp: true).map(&:to_i) results = data.reduce() do |acc, item| if item == 0 acc.push(0) else acc[-1] += item acc end end puts results.max
I am reading all lines into an array and converting them to integers, empty lines will become zeros. Then I am reducing the input array. Accumulator in this case will be the array of final groups. I am starting with first group of sum 0. While enumerating each number I adding it to the last group. If there is a zero, it means there was an empty line and I need to create a new group. So another zero is added to the accumulator.
At last we select the maximum value.
Now I need to return the sum of top 3 groups. The code is almost the same. At the end I am sorting the final array, selecting last 3 items and summing them up.
data = File.readlines("1.txt", chomp: true).map(&:to_i) results = data.inject() do |acc, item| if item == 0 acc.push(0) else acc[-1] += item acc end end puts results.sort[-3..-1].sum
Btw, there is a nice option for
chomp: true that removes newline characters, so you don’t have to clean it up yourself.