python(day23): Day 23
This commit is contained in:
parent
6ff43c5335
commit
bf8d126ee9
1 changed files with 75 additions and 0 deletions
75
python/day23.py
Normal file
75
python/day23.py
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
import fileinput
|
||||||
|
import itertools
|
||||||
|
from pprint import pprint
|
||||||
|
from typing import Any, Dict, List, Optional, Tuple
|
||||||
|
|
||||||
|
|
||||||
|
def parse() -> List[int]:
|
||||||
|
line = next(fileinput.input()).strip()
|
||||||
|
return [int(cup) for cup in line]
|
||||||
|
|
||||||
|
|
||||||
|
def step(cups: Dict[int, int], current_label: int, min_, max_) -> int:
|
||||||
|
a = cups[current_label]
|
||||||
|
b = cups[a]
|
||||||
|
c = cups[b]
|
||||||
|
picked_up: List[int] = [a, b, c]
|
||||||
|
cups[current_label] = cups[c]
|
||||||
|
|
||||||
|
destination = current_label - 1
|
||||||
|
if destination < min_:
|
||||||
|
destination = max_
|
||||||
|
|
||||||
|
while destination in picked_up:
|
||||||
|
destination -= 1
|
||||||
|
if destination < min_:
|
||||||
|
destination = max_
|
||||||
|
|
||||||
|
cups[picked_up[2]] = cups[destination]
|
||||||
|
cups[destination] = picked_up[0]
|
||||||
|
return cups[current_label]
|
||||||
|
|
||||||
|
|
||||||
|
def part1(labels):
|
||||||
|
cups = [None] * (len(labels) + 1)
|
||||||
|
for i in range(len(labels)):
|
||||||
|
cups[labels[i]] = labels[(i + 1) % len(labels)]
|
||||||
|
|
||||||
|
current = labels[0]
|
||||||
|
min_ = min(labels)
|
||||||
|
max_ = max(labels)
|
||||||
|
for _ in range(100):
|
||||||
|
current = step(cups, current, min_, max_)
|
||||||
|
|
||||||
|
label = 1
|
||||||
|
print("Part 1: ", end="")
|
||||||
|
for _ in range(8):
|
||||||
|
label = cups[label]
|
||||||
|
print(label, end="")
|
||||||
|
print()
|
||||||
|
|
||||||
|
def part2(labels):
|
||||||
|
labels = labels + [i for i in range(max(labels) + 1, 1_000_001)]
|
||||||
|
cups = [0] * (len(labels) + 1)
|
||||||
|
for i in range(len(labels)):
|
||||||
|
cups[labels[i]] = labels[(i + 1) % len(labels)]
|
||||||
|
|
||||||
|
current = labels[0]
|
||||||
|
min_ = min(labels)
|
||||||
|
max_ = max(labels)
|
||||||
|
for turn in range(10_000_000):
|
||||||
|
current = step(cups, current, min_, max_)
|
||||||
|
|
||||||
|
a = cups[1]
|
||||||
|
b = cups[a]
|
||||||
|
print("Part 2:", a * b)
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
labels = parse()
|
||||||
|
part1(labels)
|
||||||
|
part2(labels)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
Reference in a new issue