-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday02.py
84 lines (77 loc) · 2.95 KB
/
day02.py
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
76
77
78
79
80
81
82
83
84
# --- 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?
# Answer: 41887
#
# --- 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?
# Answer: 226
#
# ------------------------------------------------------------------------------
import os
def checksum1(lines):
return sum([min_max_diff(line) for line in lines])
def min_max_diff(line):
return max(line) - min(line)
def checksum2(lines):
return sum([mod(line) for line in lines])
def mod(line):
for n in line:
l2 = line.copy()
l2.remove(n)
for n2 in l2:
if n % n2 == 0:
return int(n / n2)
if __name__ == '__main__':
file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "inputs/day02.txt")
f = open(file_path)
data = f.read().split('\n')
data = [[int(e) for e in line.split()] for line in data]
print(checksum1(data))
print(checksum2(data))