4.0 KiB
4.0 KiB
Vet mooi notebook van Bas
Laten we beginnen met de imports
import re
import numpy as np
Puzzel 1
Deel 1
f = open('data/puzzle_1.txt', 'r')
total = 0
for line in f:
digit_1 = re.search('(\d)', line).group()
digit_2 = re.search('(?:\d)(?!.*\d)', line).group()
total += int(digit_1+digit_2)
total
55834
Deel 2
l = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
digits = '|'+'|'.join(l)
f = open('data/puzzle_1.txt', 'r')
total = 0
for line in f:
string_digits = re.findall('(?=(\d'+digits+'))', line)
string_digits = [digit if (digit not in l) else str(l.index(digit)+1) for digit in string_digits]
total += int(string_digits[0] + string_digits[-1])
total
53221
Puzzel 2
data = open('data/puzzle_2.txt', 'r').readlines()
Deel 1
color_dict = {
'red': 12,
'green': 13,
'blue': 14
}
total = 0
for line in data:
possible = True
for amount, color in re.findall('(\d+)\W*(red|green|blue)', line):
if (color_dict[color] < int(amount)):
possible = False
if possible:
total += int(re.findall('(\d+)', line)[0])
total
3035
Deel 2
total = 0
for line in data:
color_dict = {'red': [], 'green': [], 'blue': []}
for pair in re.findall('(\d+)\W*(red|green|blue)', line):
color_dict[pair[1]].append(int(pair[0]))
total += max(color_dict['red']) * max(color_dict['green']) * max(color_dict['blue'])
total
66027
Puzzel 3
data = open('data/puzzle_3.txt', 'r').readlines()
data_list = [re.sub('\n', '', line) for line in data]
data_list = [re.sub('[^\d\.]', 'X', line) for line in data_list]
total = 0
for line_number, line in enumerate(data_list):
matches = re.findall('\d+', line)
for number in matches:
match = re.search(number, line)
surrounding_string = ""
start, end = match.span()
if start > 0:
start -= 1
if end <= len(line):
end += 1
if line_number != 0:
surrounding_string += data_list[line_number-1][start:end]
surrounding_string += line[start:end]
if line_number != len(data_list)-1:
surrounding_string += data_list[line_number+1][start:end]
if 'X' in surrounding_string:
total += int(match.group())
line = re.sub(match.group(), len(match.group())*'.', line, 1)
match = re.search('\d+', line)
total
517021
data_list = [re.sub('\n', '', line) for line in data]
asterisks = []
numbers = []
for line_number, line in enumerate(data_list):
match = re.search('(\*)|(\d+)', line)
while match is not None:
x, y = match.span()
if match.group() == '*':
asterisks.append({'x_pos': x, 'line_number': line_number})
else:
numbers.append({'x_start':x, 'x_end': y, 'line_number': line_number, 'number': int(match.group())})
line = re.sub('(\*)|(\d+)', len(match.group())*'.', line, 1)
match = re.search('(\*)|(\d+)', line)
for asterisk in asterisks:
asterisk_numbers = []
for number in numbers:
if number['line_number'] == asterisk['line_number']:
if number['x_end'] == asterisk['x_pos']:
asterisk_numbers.append(number['number'])
continue
if number['x_start']-1 == asterisk['x_pos']:
asterisk_numbers.append(number['number'])
continue
if (number['line_number']+1 == asterisk['line_number']) or (number['line_number']-1 == asterisk['line_number']):
if asterisk['x_pos'] in [num for num in range(number['x_start']-1, number['x_end']+1)]:
asterisk_numbers.append(number['number'])
asterisk['numbers'] = asterisk_numbers
total = 0
for asterisk in asterisks:
if len(asterisk['numbers']) == 2:
total+= asterisk['numbers'][0] * asterisk['numbers'][1]
total
81296995