aocpy/2016/d19.py

88 lines
2.2 KiB
Python
Raw Normal View History

2024-05-18 14:48:54 +02:00
from dataclasses import dataclass
from typing import Optional
def part_1(data):
elf_count = int(data)
elves = [i for i in range(1, elf_count + 1)]
while len(elves) > 1:
is_odd = len(elves) % 2 == 1
elves = [elves[i] for i in range(0, len(elves), 2)]
if is_odd and len(elves) > 1:
elves = elves[1:]
print(elves[0])
def part_2(data):
elf_count = int(data)
power_3 = 3
while power_3 * 3 < elf_count:
power_3 *= 3
elf_count -= power_3
print(elf_count)
def main():
data = open(0).read().strip()
part_1(data)
part_2(data)
if __name__ == "__main__":
main()
def part_2_naiv(data):
@dataclass
class Elf:
id: int
prev: Optional["Elf"]
next: Optional["Elf"]
def delete(self):
if self.prev is not None:
self.prev.next = self.next
if self.next is not None:
self.next.prev = self.prev
self.prev = None
self.next = None
def all(self):
elf = self
elves = [elf]
while elf.next is not None and elf.next.id != self.id:
elf = elf.next
elves.append(elf)
return elves
def forward(self, n):
current = self
for _ in range(n):
assert current.next is not None
current = current.next
assert current.id != self.id
return current
def __repr__(self):
assert self.prev is not None and self.next is not None
return f"{self.prev.id} <- {self.id} -> {self.next.id}"
elf_count = int(data)
# elf_count = 5
elves = [Elf(i, None, None) for i in range(1, elf_count + 1)]
for i in range(len(elves)):
elves[i].prev = elves[(i - 1) % len(elves)]
elves[i].next = elves[(i + 1) % len(elves)]
remaining_elves = elf_count
current_elf = elves[0]
while remaining_elves > 1:
assert current_elf is not None
# print(current_elf.all())
current_elf.forward(remaining_elves // 2).delete()
current_elf = current_elf.next
remaining_elves -= 1
assert current_elf is not None
print(current_elf.id)