Skip to content

Add Python solutions for 2023-12-01 through 2023-12-03 #14

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions 2023/day_01/python/day_1_1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@

import sys


INPUT_PATH = "day_1\input.txt"
if len(sys.argv) > 1:
INPUT_PATH = sys.argv[1]

with open(INPUT_PATH) as f:
data = f.readlines()


res = 0
for line in data:
for c in line:
if c.isdigit():
first = c
break
for c in line[::-1]:
if c.isdigit():
last = c
break
num = int(first + last)
res += num

print(res)
87 changes: 87 additions & 0 deletions 2023/day_01/python/day_1_2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@

import sys


INPUT_PATH = "day_1\input.txt"
if len(sys.argv) > 1:
INPUT_PATH = sys.argv[1]

with open(INPUT_PATH) as f:
data = f.readlines()


res = 0
for line in data:

used = ""
for c in line:
if c.isdigit():
first = c
break
used += c
if used.endswith("one"):
first = "1"
break
elif used.endswith("two"):
first = "2"
break
elif used.endswith("three"):
first = "3"
break
elif used.endswith("four"):
first = "4"
break
elif used.endswith("five"):
first = "5"
break
elif used.endswith("six"):
first = "6"
break
elif used.endswith("seven"):
first = "7"
break
elif used.endswith("eight"):
first = "8"
break
elif used.endswith("nine"):
first = "9"
break

used = ""
for c in line[::-1]:
if c.isdigit():
last = c
break
used = c + used
if used.startswith("one"):
last = "1"
break
elif used.startswith("two"):
last = "2"
break
elif used.startswith("thre"):
last = "3"
break
elif used.startswith("four"):
last = "4"
break
elif used.startswith("five"):
last = "5"
break
elif used.startswith("six"):
last = "6"
break
elif used.startswith("seven"):
last = "7"
break
elif used.startswith("eight"):
last = "8"
break
elif used.startswith("nine"):
last = "9"
break

num = int(first + last)
res += num

print(res)
39 changes: 39 additions & 0 deletions 2023/day_02/python/day_2_1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
"""
Determine which games would have been possible if the bag had been loaded with only 12
red cubes, 13 green cubes, and 14 blue cubes.
"""


import sys


INPUT_PATH = "day_2\input.txt"
if len(sys.argv) > 1:
INPUT_PATH = sys.argv[1]

with open(INPUT_PATH) as f:
data = f.readlines()


limit = {
"red": 12,
"green": 13,
"blue": 14
}
res = 0
for line in data:
game, game_info = line.split(":")
num = int(game.split()[1])
valid = True
for peek_info in game_info.split("; "):
for cubes_info in peek_info.split(","):
n, color = cubes_info.split()
if limit[color] < int(n):
valid = False
break
if valid == False:
break
else:
res += num

print(res)
29 changes: 29 additions & 0 deletions 2023/day_02/python/day_2_2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@

import sys


INPUT_PATH = "day_2\input.txt"
if len(sys.argv) > 1:
INPUT_PATH = sys.argv[1]

with open(INPUT_PATH) as f:
data = f.readlines()


res = 0
for line in data:
game, game_info = line.split(":")
maxi = {
"red": 0,
"green": 0,
"blue": 0
}
for peek_info in game_info.split("; "):
for cubes_info in peek_info.split(","):
n, color = cubes_info.split()
n = int(n)
if maxi[color] < n:
maxi[color] = n
res += maxi["red"] * maxi["green"] * maxi["blue"]

print(res)
69 changes: 69 additions & 0 deletions 2023/day_03/python/day_3_1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@

import sys


def get_symbols(line: str):
symbols = set()
for i, c in enumerate(line):
if c in "#%-=@/*&+$":
symbols.add(i)
return symbols


INPUT_PATH = "day_3\input.txt"
if len(sys.argv) > 1:
INPUT_PATH = sys.argv[1]

with open(INPUT_PATH) as f:
data = f.readlines()


res = 0
last_symbols = set()
symbols = get_symbols(data[0])
for i, line in enumerate(data):
if i == len(data) - 1:
next_symbols = set()
else:
next_symbols = get_symbols(data[i+1])

i = 0
while i < len(line):

while i < len(line) and not line[i].isdigit():
i += 1
start = i
# print(f"{start=}") # TEMP

if start == len(line):
continue

while i < len(line) and line[i].isdigit():
i += 1
if i == len(line):
end = i + 1
else:
end = i

is_part_number = (
start - 1 in symbols
or end in symbols
)
if not is_part_number:
last_next_symbols = last_symbols | next_symbols
for j in range(start-1, end+1):
if j in last_next_symbols:
is_part_number = True
break

if is_part_number:
number = int(line[start:end])
# print(f"{number=}, {start=}, {end=}") # TEMP
res += number

i += 1

last_symbols = symbols
symbols = next_symbols

print(res)
75 changes: 75 additions & 0 deletions 2023/day_03/python/day_3_2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@

import sys


def get_part_number(line: str, pos: int):
i = pos-1
while i > -1 and line[i].isdigit():
i -= 1

j = pos+1
while j < len(line) and line[j].isdigit():
j += 1

return int(line[i+1:j])


def get_symbols(line: str):
symbols = set()
for i, c in enumerate(line):
if c in "#%-=@/*&+$":
symbols.add(i)
return symbols


INPUT_PATH = "day_3\input.txt"
if len(sys.argv) > 1:
INPUT_PATH = sys.argv[1]

with open(INPUT_PATH) as f:
data = f.readlines()

n = len(data[0])
empty_line = "." * n
data.insert(0, empty_line)
data.append(empty_line)

res = 0
for i, line in enumerate(data[1:-1], 1):
symbols = get_symbols(line)

for symbol in symbols:
part_numbers = []

if symbol > 0 and line[symbol-1].isdigit():
part_numbers.append(get_part_number(line, symbol-1))

if symbol < len(line) - 1 and line[symbol+1].isdigit():
part_numbers.append(get_part_number(line, symbol+1))

last_line = data[i-1]
if last_line[symbol].isdigit():
part_numbers.append(get_part_number(last_line, symbol))
else:
if symbol > 0 and last_line[symbol-1].isdigit():
part_numbers.append(get_part_number(last_line, symbol-1))
if symbol < len(line) - 1 and last_line[symbol+1].isdigit():
part_numbers.append(get_part_number(last_line, symbol+1))

next_line = data[i+1]
if next_line[symbol].isdigit():
part_numbers.append(get_part_number(next_line, symbol))
else:
if symbol > 0 and next_line[symbol-1].isdigit():
part_numbers.append(get_part_number(next_line, symbol-1))
if symbol < len(line) - 1 and next_line[symbol+1].isdigit():
part_numbers.append(get_part_number(next_line, symbol+1))

if len(part_numbers) == 2:
# print(part_numbers) # TEMP
product = 1
for part_number in part_numbers:
product *= part_number
res += product

print(res)