71 lines
1.8 KiB
Python
71 lines
1.8 KiB
Python
import re
|
|
|
|
with open(r'advent_of_code\2023\01\input.txt', 'r') as file:
|
|
input = file.read()
|
|
|
|
def text_to_num(line: str) -> str:
|
|
'''Returns the line with the text numbers replaced with digits
|
|
input: line - string of characters
|
|
output: a string
|
|
|
|
example:
|
|
input: 'eightwothree'
|
|
output: '8wo3'
|
|
'''
|
|
text_to_num = {
|
|
"zero": "0",
|
|
"one": "one1one",
|
|
"two": "two2two",
|
|
"three": "three3three",
|
|
"four": "four4four",
|
|
"five": "five5five",
|
|
"six": "six6six",
|
|
"seven": "seven7seven",
|
|
"eight": "eight8eight",
|
|
"nine": "nine9nine"
|
|
}
|
|
#replace a text number with a digit surrounded by the same text numberm to resolve overlaps
|
|
for key, value in text_to_num.items():
|
|
if key in line:
|
|
line = line.replace(key, value)
|
|
return line
|
|
|
|
def grab_first_and_last_digit(line: str) -> (int):
|
|
'''Returns the first and last digit of the given line
|
|
input: line - string of characters
|
|
output: a 2 digit integer
|
|
|
|
example:
|
|
input: 'pqr3stu8vwx'
|
|
output: 38
|
|
'''
|
|
first_digit = re.findall(r'\d', line)[0]
|
|
last_digit = re.findall(r'\d', line)[-1]
|
|
return int(first_digit + last_digit)
|
|
|
|
def day_1_solution(input:str) -> int:
|
|
'''Returns the sum of the first and last digit of each line
|
|
input: input - string of characters
|
|
output: an integer
|
|
|
|
example:
|
|
input: '1abc2\npqr3stu8vwx\na1b2c3d4e5f\ntreb7uchet'
|
|
output: 48
|
|
'''
|
|
list = []
|
|
for line in input.split('\n'):
|
|
line = text_to_num(line)
|
|
list.append(grab_first_and_last_digit(line))
|
|
|
|
return sum(list)
|
|
|
|
|
|
test_input = 'two1nine\neightwothree\nabcone2threexyz\nxtwone3four\n4nineeightseven2\nzoneight234\n7pqrstsixteen'
|
|
day_1_test = day_1_solution(test_input)
|
|
print(day_1_test)
|
|
assert day_1_test == 281
|
|
|
|
day_1_answer = day_1_solution(input)
|
|
print(day_1_answer)
|
|
|