Compare commits

...

2 commits

Author SHA1 Message Date
abc28306b3 Solve 2022 dat 10 pt 1-2
Not pretty, but it works :)
2025-11-28 00:26:02 +01:00
e7ddb92024 Solve 2022 day 9 pt 1-2
Pt 1 was just head and tail. For pt 2 I rewrote the
code to instead build the rope (snake) from head to
tail by always moving the head first and traverse
the body of the snake.

Yes, I think of it as a body of a snake - not knots
on a rope. Child hood memories are to damn colorful
:)

For reference, this is my visually debugging code:

def dbg(seen, snake):
    print(snake)
    for r in range(-4, 1):
        print("".join([v(r, c, snake) for c in range(0, 7)]))
    print("")

def v(r, c, snake):
    if (r,c) == snake[0]:
        return "H"
    for i, n in enumerate(snake[1:-1], start=1):
        if (r,c) == n:
            return str(i)
    if (r,c) == snake[-1]:
        return "T"
    if (r,c) == (0,0):
        return "s"
    return "."
2025-11-27 22:36:09 +01:00
2 changed files with 121 additions and 0 deletions

View file

@ -0,0 +1,71 @@
from output import DD, ints
def solve(data):
p12 = []
for sl in [2, 10]:
seen = set([(0, 0)])
snake = [(0, 0)] * sl
for line in data.splitlines():
d = line[0]
for i in range(ints(line)[0]):
ns = []
hd, *tls = snake
r, c = hd
hd = r + DD[d][0], c + DD[d][1]
ns.append(hd)
for tl in tls:
r, c = tl
match (r - hd[0], c - hd[1]):
case (2, -1):
tl = r - 1, c + 1
case (-2, -1):
tl = r + 1, c + 1
case (-2, 1):
tl = r + 1, c - 1
case (2, 1):
tl = r - 1, c - 1
case (1, 2):
tl = r - 1, c - 1
case (-1, 2):
tl = r + 1, c - 1
case (-1, -2):
tl = r + 1, c + 1
case (1, -2):
tl = r - 1, c + 1
case (0, 2):
tl = r, c - 1
case (0, -2):
tl = r, c + 1
case (2, 0):
tl = r - 1, c
case (-2, 0):
tl = r + 1, c
case (2, -2):
tl = r - 1, c + 1
case (-2, -2):
tl = r + 1, c + 1
case (-2, 2):
tl = r + 1, c - 1
case (2, 2):
tl = r - 1, c - 1
ns.append(tl)
hd = tl
snake = ns
seen.add(tl)
p12.append(len(seen))
p1, p2 = p12
return p1, p2
if __name__ == "__main__":
with open("./input/09.txt", "r") as f:
inp = f.read().strip()
p1, p2 = solve(inp)
print(p1)
print(p2)
assert p1 == 6212
assert p2 == 2522

View file

@ -0,0 +1,50 @@
from output import sints
def solve(data):
x = 1
P = data.splitlines()
p1 = 0
c = 0
p = 0
running = True
busy = False
pixels = []
while running:
if not p < len(P) and not busy:
running = False
continue
line = P[min([p, len(P) - 1])]
if (c + 21) % 40 == 0:
p1 += (c + 1) * x
if c % 40 == 0:
pixels.append("\n")
pixels.append("" if (x - 1) <= (c % 40) <= (x + 1) else " ")
if busy:
busy = False
x += int(sints(line)[0])
p += 1
c += 1
continue
if line.startswith("noop"):
p += 1
c += 1
continue
busy = True
c += 1
p2 = None
p2 = "".join(pixels)
return p1, p2
if __name__ == "__main__":
with open("./input/10.txt", "r") as f:
inp = f.read().strip()
p1, p2 = solve(inp)
print(p1)
print(p2)
assert p1 == 11820
# assert p2 == "EPJBRKAH"