Add day 1-5
This commit is contained in:
@@ -0,0 +1 @@
|
||||
*/*/input.txt
|
||||
Executable
+33
@@ -0,0 +1,33 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
filename = "example.txt"
|
||||
filename = "input.txt"
|
||||
|
||||
with open(filename) as f:
|
||||
data = f.readlines()
|
||||
|
||||
|
||||
l = []
|
||||
r = []
|
||||
|
||||
for line in data:
|
||||
split = line.split(" ")
|
||||
l.append(int(split[0]))
|
||||
r.append(int(split[-1].strip()))
|
||||
|
||||
if len(l) != len(r):
|
||||
raise Exception("lists must be the same length")
|
||||
|
||||
l_sort = sorted(l)
|
||||
r_sort = sorted(r)
|
||||
|
||||
distance = 0
|
||||
for i in range(len(l)):
|
||||
print(f"l: {l_sort[i]}, r: {r_sort[i]}")
|
||||
v = l_sort[i] - r_sort[i]
|
||||
d = abs(v)
|
||||
print(f"v: {v}, d: {d}")
|
||||
distance = distance + d
|
||||
print("")
|
||||
|
||||
print(distance)
|
||||
@@ -0,0 +1,6 @@
|
||||
3 4
|
||||
4 3
|
||||
2 5
|
||||
1 3
|
||||
3 9
|
||||
3 3
|
||||
@@ -0,0 +1,14 @@
|
||||
[tool.poetry]
|
||||
name = "aoc"
|
||||
version = "0.1.0"
|
||||
description = ""
|
||||
authors = ["restitux <restitux@ohea.xyz>"]
|
||||
readme = "README.md"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.12"
|
||||
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
Executable
+30
@@ -0,0 +1,30 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
filename = "example.txt"
|
||||
filename = "input.txt"
|
||||
|
||||
with open(filename) as f:
|
||||
data = f.readlines()
|
||||
|
||||
|
||||
l = []
|
||||
r = []
|
||||
|
||||
for line in data:
|
||||
split = line.split(" ")
|
||||
l.append(int(split[0]))
|
||||
r.append(int(split[-1].strip()))
|
||||
|
||||
if len(l) != len(r):
|
||||
raise Exception("lists must be the same length")
|
||||
|
||||
total = 0
|
||||
|
||||
for e in l:
|
||||
count = r.count(e)
|
||||
result = e * count
|
||||
print(f"count: {count}, result: {result}")
|
||||
total += result
|
||||
print("")
|
||||
|
||||
print(total)
|
||||
@@ -0,0 +1,6 @@
|
||||
3 4
|
||||
4 3
|
||||
2 5
|
||||
1 3
|
||||
3 9
|
||||
3 3
|
||||
@@ -0,0 +1,14 @@
|
||||
[tool.poetry]
|
||||
name = "aoc"
|
||||
version = "0.1.0"
|
||||
description = ""
|
||||
authors = ["restitux <restitux@ohea.xyz>"]
|
||||
readme = "README.md"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.12"
|
||||
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
Executable
+49
@@ -0,0 +1,49 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
filename = "example.txt"
|
||||
filename = "input.txt"
|
||||
|
||||
def valid_deltas(report):
|
||||
for x in range(len(report) - 1):
|
||||
if not (1 <= abs(report[x] - report[x + 1]) <= 3):
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def is_ascending(report):
|
||||
x = [
|
||||
report[i] < report[i + 1]
|
||||
for i in range((len(report) - 1))
|
||||
]
|
||||
print(x)
|
||||
return all(x)
|
||||
|
||||
def is_decending(report):
|
||||
return is_ascending(list(reversed(report)))
|
||||
|
||||
reports = []
|
||||
|
||||
with open(filename) as f:
|
||||
for line in f.readlines():
|
||||
reports.append([int(x) for x in line.strip().split(" ")])
|
||||
|
||||
valid_reports = 0
|
||||
|
||||
for report in reports:
|
||||
print(", ".join([str(x) for x in report]))
|
||||
ascending = is_ascending(report)
|
||||
decending = is_decending(report)
|
||||
deltas = valid_deltas(report)
|
||||
print(f"ascending: {ascending}")
|
||||
print(f"decending: {decending}")
|
||||
print(f"deltas: {deltas}")
|
||||
valid = (ascending or decending) and deltas
|
||||
print(f"valid: {valid}")
|
||||
print()
|
||||
print()
|
||||
if valid:
|
||||
valid_reports += 1
|
||||
|
||||
print(f"valid_reports: {valid_reports}")
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
7 6 4 2 1
|
||||
1 2 7 8 9
|
||||
9 7 6 2 1
|
||||
1 3 2 4 5
|
||||
8 6 4 4 1
|
||||
1 3 6 7 9
|
||||
@@ -0,0 +1,14 @@
|
||||
[tool.poetry]
|
||||
name = "aoc"
|
||||
version = "0.1.0"
|
||||
description = ""
|
||||
authors = ["restitux <restitux@ohea.xyz>"]
|
||||
readme = "README.md"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.12"
|
||||
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
Executable
+59
@@ -0,0 +1,59 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
filename = "example.txt"
|
||||
filename = "input.txt"
|
||||
|
||||
def print_report(report):
|
||||
print(", ".join([str(x) for x in report]))
|
||||
|
||||
def valid_deltas(report):
|
||||
for x in range(len(report) - 1):
|
||||
if not (1 <= abs(report[x] - report[x + 1]) <= 3):
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def is_ascending(report):
|
||||
x = [
|
||||
report[i] < report[i + 1]
|
||||
for i in range((len(report) - 1))
|
||||
]
|
||||
print(x)
|
||||
return all(x)
|
||||
|
||||
def is_decending(report):
|
||||
return is_ascending(list(reversed(report)))
|
||||
|
||||
reports = []
|
||||
|
||||
with open(filename) as f:
|
||||
for line in f.readlines():
|
||||
reports.append([int(x) for x in line.strip().split(" ")])
|
||||
|
||||
valid_reports = 0
|
||||
|
||||
for report in reports:
|
||||
ascending = is_ascending(report)
|
||||
decending = is_decending(report)
|
||||
deltas = valid_deltas(report)
|
||||
valid = (ascending or decending) and deltas
|
||||
if valid:
|
||||
valid_reports += 1
|
||||
continue
|
||||
|
||||
for i in range(len(report)):
|
||||
x = report.copy()
|
||||
x.pop(i)
|
||||
ascending = is_ascending(x)
|
||||
decending = is_decending(x)
|
||||
deltas = valid_deltas(x)
|
||||
valid = (ascending or decending) and deltas
|
||||
|
||||
if valid:
|
||||
valid_reports += 1
|
||||
break
|
||||
|
||||
|
||||
print(f"valid_reports: {valid_reports}")
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
7 6 4 2 1
|
||||
1 2 7 8 9
|
||||
9 7 6 2 1
|
||||
1 3 2 4 5
|
||||
8 6 4 4 1
|
||||
1 3 6 7 9
|
||||
@@ -0,0 +1,14 @@
|
||||
[tool.poetry]
|
||||
name = "aoc"
|
||||
version = "0.1.0"
|
||||
description = ""
|
||||
authors = ["restitux <restitux@ohea.xyz>"]
|
||||
readme = "README.md"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.12"
|
||||
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
Executable
+61
@@ -0,0 +1,61 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
filename = "example.txt"
|
||||
filename = "input.txt"
|
||||
|
||||
with open(filename) as f:
|
||||
input = f.read().strip()
|
||||
|
||||
accumulator = 0
|
||||
|
||||
x = 0
|
||||
|
||||
i = 0
|
||||
while True:
|
||||
print("\n\n")
|
||||
a = input[i:].find("mul(")
|
||||
a_mod = a + i
|
||||
b = input[a_mod:].find(",")
|
||||
b_mod = b + a_mod
|
||||
c = input[a_mod:].find(")")
|
||||
c_mod = c + a_mod
|
||||
if a == -1:
|
||||
break
|
||||
if b == -1:
|
||||
break
|
||||
if c == -1:
|
||||
break
|
||||
|
||||
a = a_mod
|
||||
b = b_mod
|
||||
c = c_mod
|
||||
print(input[i:])
|
||||
print(input[a:])
|
||||
print(input[b:])
|
||||
print(input[c:])
|
||||
|
||||
print(a, b, c)
|
||||
|
||||
|
||||
|
||||
print(input[a+4:b])
|
||||
print(input[b+1:c])
|
||||
try:
|
||||
val0 = int(input[a+4:b])
|
||||
val1 = int(input[b+1:c])
|
||||
except ValueError:
|
||||
i = a + 4
|
||||
#if x == 2:
|
||||
# break
|
||||
#x += 1
|
||||
continue
|
||||
print(f"{val0=}")
|
||||
print(f"{val1=}")
|
||||
|
||||
accumulator += val0 * val1
|
||||
|
||||
i = c + 1
|
||||
|
||||
print(accumulator)
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))
|
||||
@@ -0,0 +1,14 @@
|
||||
[tool.poetry]
|
||||
name = "aoc"
|
||||
version = "0.1.0"
|
||||
description = ""
|
||||
authors = ["restitux <restitux@ohea.xyz>"]
|
||||
readme = "README.md"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.12"
|
||||
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
Executable
+131
@@ -0,0 +1,131 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import dataclasses
|
||||
import heapq
|
||||
import re
|
||||
|
||||
filename = "example.txt"
|
||||
filename = "input.txt"
|
||||
|
||||
with open(filename) as f:
|
||||
input = f.read().strip()
|
||||
|
||||
|
||||
mul_re = r"mul\((\d+),(\d+)\)"
|
||||
do_re = r"do\(\)"
|
||||
dont_re = r"don't\(\)"
|
||||
|
||||
@dataclasses.dataclass
|
||||
class MulCmd():
|
||||
l: int
|
||||
r: int
|
||||
|
||||
@dataclasses.dataclass
|
||||
class EnableCmd():
|
||||
on: bool
|
||||
|
||||
|
||||
commands = []
|
||||
for mul in re.finditer(mul_re, input):
|
||||
heapq.heappush(
|
||||
commands,
|
||||
(
|
||||
mul.span(1)[0],
|
||||
MulCmd(
|
||||
l = int(input[mul.span(1)[0]:mul.span(1)[1]]),
|
||||
r = int(input[mul.span(2)[0]:mul.span(2)[1]]),
|
||||
),
|
||||
)
|
||||
)
|
||||
for do in re.finditer(do_re, input):
|
||||
heapq.heappush(
|
||||
commands,
|
||||
(
|
||||
do.span(0)[0],
|
||||
EnableCmd(on=True)
|
||||
)
|
||||
)
|
||||
for dont in re.finditer(dont_re, input):
|
||||
heapq.heappush(
|
||||
commands,
|
||||
(
|
||||
dont.span(0)[0],
|
||||
EnableCmd(on=False)
|
||||
)
|
||||
)
|
||||
|
||||
accumulator = 0
|
||||
enable = True
|
||||
while commands:
|
||||
#for index, cmd in commands:
|
||||
(index, cmd) = heapq.heappop(commands)
|
||||
if isinstance(cmd, MulCmd):
|
||||
print(f"mul: {cmd.l} * {cmd.r}")
|
||||
if enable:
|
||||
accumulator += cmd.l * cmd.r
|
||||
elif isinstance(cmd, EnableCmd):
|
||||
print(f"enable: {cmd.on}")
|
||||
enable = cmd.on
|
||||
|
||||
|
||||
print(accumulator)
|
||||
|
||||
#for mul in muls:
|
||||
# print(input[mul.span(0)[0]:mul.span(0)[1]])
|
||||
# print(input[mul.span(1)[0]:mul.span(1)[1]])
|
||||
# print(input[mul.span(2)[0]:mul.span(2)[1]])
|
||||
#print(mul.span(0))
|
||||
#print(mul.span(1))
|
||||
# accumulator += int(mul[0]) * int(mul[1])
|
||||
#
|
||||
#print(accumulator)
|
||||
|
||||
#i = 0
|
||||
#while True:
|
||||
#
|
||||
#
|
||||
#
|
||||
# print("\n\n")
|
||||
# a = input[i:].find("mul(")
|
||||
# a_mod = a + i
|
||||
# b = input[a_mod:].find(",")
|
||||
# b_mod = b + a_mod
|
||||
# c = input[a_mod:].find(")")
|
||||
# c_mod = c + a_mod
|
||||
# if a == -1:
|
||||
# break
|
||||
# if b == -1:
|
||||
# break
|
||||
# if c == -1:
|
||||
# break
|
||||
#
|
||||
# a = a_mod
|
||||
# b = b_mod
|
||||
# c = c_mod
|
||||
# print(input[i:])
|
||||
# print(input[a:])
|
||||
# print(input[b:])
|
||||
# print(input[c:])
|
||||
#
|
||||
# print(a, b, c)
|
||||
#
|
||||
#
|
||||
#
|
||||
# print(input[a+4:b])
|
||||
# print(input[b+1:c])
|
||||
# try:
|
||||
# val0 = int(input[a+4:b])
|
||||
# val1 = int(input[b+1:c])
|
||||
# except ValueError:
|
||||
# i = a + 4
|
||||
# continue
|
||||
# print(f"{val0=}")
|
||||
# print(f"{val1=}")
|
||||
#
|
||||
# accumulator += val0 * val1
|
||||
#
|
||||
# i = c + 1
|
||||
#
|
||||
#print(accumulator)
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))
|
||||
@@ -0,0 +1,14 @@
|
||||
[tool.poetry]
|
||||
name = "aoc"
|
||||
version = "0.1.0"
|
||||
description = ""
|
||||
authors = ["restitux <restitux@ohea.xyz>"]
|
||||
readme = "README.md"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.12"
|
||||
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
Executable
+124
@@ -0,0 +1,124 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
filename = "example.txt"
|
||||
filename = "input.txt"
|
||||
|
||||
with open(filename) as f:
|
||||
input = f.readlines()
|
||||
|
||||
board = [
|
||||
[letter for letter in line.strip()]
|
||||
for line in input
|
||||
]
|
||||
|
||||
y_dim = len(board)
|
||||
x_dim = len(board[0])
|
||||
|
||||
valids = []
|
||||
|
||||
do_print = False
|
||||
|
||||
def print_board(b, indexes_to_print=[]):
|
||||
if not do_print:
|
||||
return
|
||||
|
||||
for y in range(y_dim):
|
||||
for x in range(x_dim):
|
||||
if indexes_to_print:
|
||||
if (y, x) in indexes_to_print:
|
||||
print(b[y][x], end="")
|
||||
else:
|
||||
print(".", end="")
|
||||
else:
|
||||
print(b[y][x], end="")
|
||||
print()
|
||||
print()
|
||||
|
||||
print_board(board)
|
||||
|
||||
def is_xmas(*args):
|
||||
a = board[args[0][0]][args[0][1]]
|
||||
b = board[args[1][0]][args[1][1]]
|
||||
c = board[args[2][0]][args[2][1]]
|
||||
d = board[args[3][0]][args[3][1]]
|
||||
if f"{a}{b}{c}{d}" == "XMAS":
|
||||
print_board(board, args)
|
||||
valids.append(args)
|
||||
return True
|
||||
return False
|
||||
|
||||
count = 0
|
||||
|
||||
for y in range(y_dim):
|
||||
for x in range(x_dim):
|
||||
# left (backwards)
|
||||
if x > 2:
|
||||
count = count + is_xmas(
|
||||
(y, x),
|
||||
(y, x - 1),
|
||||
(y, x - 2),
|
||||
(y, x - 3),
|
||||
)
|
||||
# right
|
||||
if x_dim - x > 3:
|
||||
count = count + is_xmas(
|
||||
(y, x),
|
||||
(y, x + 1),
|
||||
(y, x + 2),
|
||||
(y, x + 3),
|
||||
)
|
||||
# up
|
||||
if y > 2:
|
||||
count = count + is_xmas(
|
||||
(y, x),
|
||||
(y - 1, x),
|
||||
(y - 2, x),
|
||||
(y - 3, x),
|
||||
)
|
||||
# down
|
||||
if y_dim - y > 3:
|
||||
count = count + is_xmas(
|
||||
(y, x),
|
||||
(y + 1, x),
|
||||
(y + 2, x),
|
||||
(y + 3, x),
|
||||
)
|
||||
# diagonal up left
|
||||
if x > 2 and y > 2:
|
||||
count = count + is_xmas(
|
||||
(y, x),
|
||||
(y - 1, x - 1),
|
||||
(y - 2, x - 2),
|
||||
(y - 3, x - 3),
|
||||
)
|
||||
# diagonal up right
|
||||
if x_dim - x > 3 and y > 2:
|
||||
count = count + is_xmas(
|
||||
(y, x),
|
||||
(y - 1, x + 1),
|
||||
(y - 2, x + 2),
|
||||
(y - 3, x + 3),
|
||||
)
|
||||
# diagonal down left
|
||||
if x > 2 and y_dim - y > 3:
|
||||
count = count + is_xmas(
|
||||
(y, x),
|
||||
(y + 1, x - 1),
|
||||
(y + 2, x - 2),
|
||||
(y + 3, x - 3),
|
||||
)
|
||||
# diagonal down right
|
||||
if x_dim - x > 3 and y_dim - y > 3:
|
||||
count = count + is_xmas(
|
||||
(y, x),
|
||||
(y + 1, x + 1),
|
||||
(y + 2, x + 2),
|
||||
(y + 3, x + 3),
|
||||
)
|
||||
|
||||
|
||||
print_board(board, [x for xs in valids for x in xs])
|
||||
|
||||
print(count)
|
||||
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
MMMSXXMASM
|
||||
MSAMXMSMSA
|
||||
AMXSXMAAMM
|
||||
MSAMASMSMX
|
||||
XMASAMXAMM
|
||||
XXAMMXXAMA
|
||||
SMSMSASXSS
|
||||
SAXAMASAAA
|
||||
MAMMMXMMMM
|
||||
MXMXAXMASX
|
||||
@@ -0,0 +1,14 @@
|
||||
[tool.poetry]
|
||||
name = "aoc"
|
||||
version = "0.1.0"
|
||||
description = ""
|
||||
authors = ["restitux <restitux@ohea.xyz>"]
|
||||
readme = "README.md"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.12"
|
||||
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
Executable
+87
@@ -0,0 +1,87 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
filename = "example.txt"
|
||||
filename = "input.txt"
|
||||
|
||||
with open(filename) as f:
|
||||
input = f.readlines()
|
||||
|
||||
board = [
|
||||
[letter for letter in line.strip()]
|
||||
for line in input
|
||||
]
|
||||
|
||||
y_dim = len(board)
|
||||
x_dim = len(board[0])
|
||||
|
||||
valids = []
|
||||
|
||||
do_print = False
|
||||
|
||||
def print_board(b, indexes_to_print=[]):
|
||||
if not do_print:
|
||||
return
|
||||
|
||||
for y in range(y_dim):
|
||||
for x in range(x_dim):
|
||||
if indexes_to_print:
|
||||
if (y, x) in indexes_to_print:
|
||||
print(b[y][x], end="")
|
||||
else:
|
||||
print(".", end="")
|
||||
else:
|
||||
print(b[y][x], end="")
|
||||
print()
|
||||
print()
|
||||
|
||||
print_board(board)
|
||||
|
||||
def is_x_mas(center):
|
||||
|
||||
vals = ["L", "M", "N", "O"]
|
||||
vals[0] = board[center[0] - 1][center[1] - 1]
|
||||
vals[1] = board[center[0] - 1][center[1] + 1]
|
||||
vals[2] = board[center[0] + 1][center[1] - 1]
|
||||
vals[3] = board[center[0] + 1][center[1] + 1]
|
||||
|
||||
vals = "".join(vals)
|
||||
|
||||
x_mases = [
|
||||
"MMSS",
|
||||
"MSMS",
|
||||
"SMSM",
|
||||
"SSMM",
|
||||
]
|
||||
|
||||
print(f"{center}: {vals}")
|
||||
if vals in x_mases:
|
||||
poses = [
|
||||
center,
|
||||
(center[0] - 1, center[1] - 1),
|
||||
(center[0] - 1, center[1] + 1),
|
||||
(center[0] + 1, center[1] - 1),
|
||||
(center[0] + 1, center[1] + 1),
|
||||
]
|
||||
|
||||
print_board(
|
||||
board,
|
||||
poses
|
||||
)
|
||||
valids.append(poses)
|
||||
return True
|
||||
return False
|
||||
|
||||
count = 0
|
||||
|
||||
for y in range(1, y_dim - 1):
|
||||
for x in range(1, x_dim - 1):
|
||||
if board[y][x] != "A":
|
||||
continue
|
||||
count = count + is_x_mas((y, x))
|
||||
|
||||
|
||||
print_board(board, [x for xs in valids for x in xs])
|
||||
|
||||
print(count)
|
||||
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
MMMSXXMASM
|
||||
MSAMXMSMSA
|
||||
AMXSXMAAMM
|
||||
MSAMASMSMX
|
||||
XMASAMXAMM
|
||||
XXAMMXXAMA
|
||||
SMSMSASXSS
|
||||
SAXAMASAAA
|
||||
MAMMMXMMMM
|
||||
MXMXAXMASX
|
||||
@@ -0,0 +1,14 @@
|
||||
[tool.poetry]
|
||||
name = "aoc"
|
||||
version = "0.1.0"
|
||||
description = ""
|
||||
authors = ["restitux <restitux@ohea.xyz>"]
|
||||
readme = "README.md"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.12"
|
||||
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
Executable
+46
@@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import collections
|
||||
|
||||
filename = "example.txt"
|
||||
filename = "input.txt"
|
||||
|
||||
with open(filename) as f:
|
||||
input = f.readlines()
|
||||
input = [line.strip() for line in input]
|
||||
|
||||
rs = [
|
||||
line.split("|") for line in input if "|" in line
|
||||
]
|
||||
|
||||
rules = collections.defaultdict(list)
|
||||
|
||||
for r in rs:
|
||||
rules[r[0]].append(r[1])
|
||||
|
||||
print(rules)
|
||||
|
||||
|
||||
print_orders = [
|
||||
line.split(",") for line in input if "|" not in line and len(line) > 0
|
||||
]
|
||||
|
||||
count = 0
|
||||
|
||||
for print_order in print_orders:
|
||||
bad = False
|
||||
for i, x in enumerate(print_order):
|
||||
for v in rules[x]:
|
||||
if v in print_order:
|
||||
if print_order.index(v) <= i:
|
||||
bad = True
|
||||
|
||||
if bad:
|
||||
print(f"{print_order} is bad")
|
||||
continue
|
||||
print(f"{print_order} is good")
|
||||
|
||||
count = count + int(print_order[len(print_order) // 2])
|
||||
|
||||
print(count)
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
47|53
|
||||
97|13
|
||||
97|61
|
||||
97|47
|
||||
75|29
|
||||
61|13
|
||||
75|53
|
||||
29|13
|
||||
97|29
|
||||
53|29
|
||||
61|53
|
||||
97|53
|
||||
61|29
|
||||
47|13
|
||||
75|47
|
||||
97|75
|
||||
47|61
|
||||
75|61
|
||||
47|29
|
||||
75|13
|
||||
53|13
|
||||
|
||||
75,47,61,53,29
|
||||
97,61,53,29,13
|
||||
75,29,13
|
||||
75,97,47,61,53
|
||||
61,13,29
|
||||
97,13,75,29,47
|
||||
@@ -0,0 +1,14 @@
|
||||
[tool.poetry]
|
||||
name = "aoc"
|
||||
version = "0.1.0"
|
||||
description = ""
|
||||
authors = ["restitux <restitux@ohea.xyz>"]
|
||||
readme = "README.md"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.12"
|
||||
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
Executable
+69
@@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import collections
|
||||
|
||||
filename = "example.txt"
|
||||
filename = "input.txt"
|
||||
|
||||
with open(filename) as f:
|
||||
input = f.readlines()
|
||||
input = [line.strip() for line in input]
|
||||
|
||||
rs = [
|
||||
line.split("|") for line in input if "|" in line
|
||||
]
|
||||
|
||||
rules = collections.defaultdict(list)
|
||||
|
||||
for r in rs:
|
||||
rules[r[0]].append(r[1])
|
||||
|
||||
print(rules)
|
||||
|
||||
|
||||
print_orders = [
|
||||
line.split(",") for line in input if "|" not in line and len(line) > 0
|
||||
]
|
||||
|
||||
count = 0
|
||||
|
||||
def validate_rule(order):
|
||||
for i, x in enumerate(print_order):
|
||||
for v in rules[x]:
|
||||
if v in print_order:
|
||||
if print_order.index(v) <= i:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def fix_rule(order):
|
||||
to_fix = []
|
||||
for i, x in enumerate(print_order):
|
||||
for v in rules[x]:
|
||||
if v in print_order:
|
||||
if print_order.index(v) <= i:
|
||||
order.insert(print_order.index(v), x)
|
||||
order.pop(i + 1)
|
||||
return order
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
for print_order in print_orders:
|
||||
if not validate_rule(print_order):
|
||||
print(f"{print_order} is bad")
|
||||
#count = count + fix_rule(print_order)
|
||||
while True:
|
||||
new = fix_rule(print_order)
|
||||
if validate_rule(new):
|
||||
print_order = new
|
||||
break
|
||||
else:
|
||||
continue
|
||||
print(f"{print_order} is good")
|
||||
|
||||
count = count + int(print_order[len(print_order) // 2])
|
||||
|
||||
print(count)
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
47|53
|
||||
97|13
|
||||
97|61
|
||||
97|47
|
||||
75|29
|
||||
61|13
|
||||
75|53
|
||||
29|13
|
||||
97|29
|
||||
53|29
|
||||
61|53
|
||||
97|53
|
||||
61|29
|
||||
47|13
|
||||
75|47
|
||||
97|75
|
||||
47|61
|
||||
75|61
|
||||
47|29
|
||||
75|13
|
||||
53|13
|
||||
|
||||
75,47,61,53,29
|
||||
97,61,53,29,13
|
||||
75,29,13
|
||||
75,97,47,61,53
|
||||
61,13,29
|
||||
97,13,75,29,47
|
||||
@@ -0,0 +1,14 @@
|
||||
[tool.poetry]
|
||||
name = "aoc"
|
||||
version = "0.1.0"
|
||||
description = ""
|
||||
authors = ["restitux <restitux@ohea.xyz>"]
|
||||
readme = "README.md"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.12"
|
||||
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
Reference in New Issue
Block a user