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 "."
Funny that I did not mention the problem with
recurring directory names in the first run of this
puzzle in Elixir, back in 2022 and bb708a5e58.
Most likely, the insight flew over my head that
time.
This time, I realized I could just add the size to
the size of each parent. I struggled to find a graph
traversal for it, until I realized I did not need
the graph.
The key rewrite was this:
for p in path:
fs[p] += size
fs["/"] += size
... to this:
p = "/"
fs[p] += size
for dir_name in path:
p += f"/{dir_name}"
fs[p] += size
This solved my issues for 3 hours by acknowledge that
- a directory name "a" can accour on multiple places,
example: /a, /b/a, /c/a
- a directory name "a" can have a parent directory named
"a", example: /a/b/a, /a/c/d/a
And as always, example input is the devil. Look at
the reak input as soon as possible.