-
Notifications
You must be signed in to change notification settings - Fork 0
/
day02.rb
75 lines (60 loc) · 2.68 KB
/
day02.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# --- Day 2: Corruption Checksum ---
# As you walk through the door, a glowing humanoid shape yells in your direction. "You there! Your
# state appears to be idle. Come help us repair the corruption in this spreadsheet - if we take
# another millisecond, we'll have to display an hourglass cursor!"
#
# The spreadsheet consists of rows of apparently-random numbers. To make sure the recovery process
# is on the right track, they need you to calculate the spreadsheet's checksum. For each row,
# determine the difference between the largest value and the smallest value; the checksum is the
# sum of all of these differences.
#
# For example, given the following spreadsheet:
#
# 5 1 9 5
# 7 5 3
# 2 4 6 8
#
#
# The first row's largest and smallest values are 9 and 1, and their difference is 8.
# The second row's largest and smallest values are 7 and 3, and their difference is 4.
# The third row's difference is 6.
#
# In this example, the spreadsheet's checksum would be 8 + 4 + 6 = 18.
#
# What is the checksum for the spreadsheet in your puzzle input?
#
require_relative 'input'
day = __FILE__[/\d+/].to_i(10)
input = Input.for_day(day, 2017)
# input = <<-SS
# 5 1 9 5
# 7 5 3
# 2 4 6 8
# SS
# puts "solving day #{day} from input:\n#{input}"
puts "Part1:", input.each_line.map{|row|row.split(' ').map(&:to_i).minmax.reverse.reduce(:-)}.sum
# --- Part Two ---
# "Great work; looks like we're on the right track after all. Here's a star for your effort."
# However, the program seems a little worried. Can programs be worried?
# "Based on what we're seeing, it looks like all the User wanted is some information about the
# evenly divisible values in the spreadsheet. Unfortunately, none of us are equipped for that kind
# of calculation - most of us specialize in bitwise operations."
# It sounds like the goal is to find the only two numbers in each row where one evenly divides the
# other - that is, where the result of the division operation is a whole number. They would like
# you to find those numbers on each line, divide them, and add up each line's result.
# For example, given the following spreadsheet:
# 5 9 2 8
# 9 4 7 3
# 3 8 6 5
# In the first row, the only two numbers that evenly divide are 8 and 2; the result of this division is 4.
# In the second row, the two numbers are 9 and 3; the result is 3.
# In the third row, the result is 2.
# In this example, the sum of the results would be 4 + 3 + 2 = 9.
# What is the sum of each row's result in your puzzle input?
# input = <<-SS2
# 5 9 2 8
# 9 4 7 3
# 3 8 6 5
# SS2
spreadsheet = input.each_line.map{|row| row.split(' ').map(&:to_i)}
puts "Part2:", spreadsheet.map {|row| row.permutation(2).detect {|a,b| a.divmod(b).last.zero? } }.map {|a,b| a/b}.sum