[py] Port 2018_09
This commit is contained in:
parent
26433b8618
commit
15ab5575b2
3 changed files with 87 additions and 88 deletions
|
|
@ -1,87 +0,0 @@
|
||||||
import sys
|
|
||||||
import collections
|
|
||||||
|
|
||||||
# PART 1
|
|
||||||
|
|
||||||
class Circle:
|
|
||||||
def __init__(self):
|
|
||||||
self.marbles = collections.deque([0])
|
|
||||||
#self.marbles = [0]
|
|
||||||
self.next = 1
|
|
||||||
|
|
||||||
def move_focus(self, steps):
|
|
||||||
self.marbles.rotate(steps)
|
|
||||||
#self.marbles = self.marbles[steps:] + self.marbles[:steps]
|
|
||||||
|
|
||||||
def insert(self):
|
|
||||||
self.marbles.append(self.next)
|
|
||||||
#self.marbles = [self.next] + self.marbles
|
|
||||||
self.next += 1
|
|
||||||
|
|
||||||
def remove(self):
|
|
||||||
return self.marbles.pop()
|
|
||||||
#n = self.marbles[0]
|
|
||||||
#self.marbles = self.marbles[1:]
|
|
||||||
#return n
|
|
||||||
|
|
||||||
def insert_marble(self):
|
|
||||||
# returns the two marbles removed in a tuple, or None
|
|
||||||
if self.next % 23 == 0:
|
|
||||||
return self.insert_multiple()
|
|
||||||
else:
|
|
||||||
self.insert_normal()
|
|
||||||
return None
|
|
||||||
|
|
||||||
def insert_normal(self):
|
|
||||||
self.move_focus(2)
|
|
||||||
self.insert()
|
|
||||||
|
|
||||||
def insert_multiple(self):
|
|
||||||
cur = self.next
|
|
||||||
self.next += 1
|
|
||||||
|
|
||||||
self.move_focus(-7)
|
|
||||||
left = self.remove()
|
|
||||||
|
|
||||||
return (cur, left)
|
|
||||||
|
|
||||||
class Game:
|
|
||||||
def __init__(self, elves, until):
|
|
||||||
self.circle = Circle()
|
|
||||||
self.until = until
|
|
||||||
self.elves = [0 for _ in range(elves)]
|
|
||||||
|
|
||||||
def play(self):
|
|
||||||
while True:
|
|
||||||
for elf in range(len(self.elves)):
|
|
||||||
if self.circle.next % 10000 == 0:
|
|
||||||
print(f"{self.circle.next:5} of {self.until:5} - {100 * self.circle.next / self.until:.04}% {len(self.circle.marbles):8}")
|
|
||||||
|
|
||||||
if self.circle.next > self.until:
|
|
||||||
return
|
|
||||||
|
|
||||||
result = self.circle.insert_marble()
|
|
||||||
if result is not None:
|
|
||||||
fst, snd = result
|
|
||||||
self.elves[elf] += fst + snd
|
|
||||||
|
|
||||||
def highscore(self):
|
|
||||||
return max(self.elves)
|
|
||||||
|
|
||||||
# PART 2
|
|
||||||
|
|
||||||
def main(elves, until):
|
|
||||||
game = Game(elves, until)
|
|
||||||
game.play()
|
|
||||||
score = game.highscore()
|
|
||||||
print(score)
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
#main( 9, 25)
|
|
||||||
#main(10, 1618)
|
|
||||||
#main(13, 7999)
|
|
||||||
#main(17, 1104)
|
|
||||||
#main(21, 6111)
|
|
||||||
#main(30, 5807)
|
|
||||||
main(429, 70901)
|
|
||||||
main(429, 70901*100)
|
|
||||||
|
|
@ -2,7 +2,7 @@ import sys
|
||||||
import argparse
|
import argparse
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from .y2018 import d01, d02, d03, d04, d05, d06, d07, d08
|
from .y2018 import d01, d02, d03, d04, d05, d06, d07, d08, d09
|
||||||
from .y2020 import d10
|
from .y2020 import d10
|
||||||
from .y2021 import d14
|
from .y2021 import d14
|
||||||
from .y2022 import d01, d02, d03, d04, d05, d06
|
from .y2022 import d01, d02, d03, d04, d05, d06
|
||||||
|
|
@ -16,6 +16,7 @@ DAYS = {
|
||||||
"2018_06": y2018.d06.solve,
|
"2018_06": y2018.d06.solve,
|
||||||
"2018_07": y2018.d07.solve,
|
"2018_07": y2018.d07.solve,
|
||||||
"2018_08": y2018.d08.solve,
|
"2018_08": y2018.d08.solve,
|
||||||
|
"2018_09": y2018.d09.solve,
|
||||||
"2020_10": y2020.d10.solve,
|
"2020_10": y2020.d10.solve,
|
||||||
"2021_14": y2021.d14.solve,
|
"2021_14": y2021.d14.solve,
|
||||||
"2022_01": y2022.d01.solve,
|
"2022_01": y2022.d01.solve,
|
||||||
|
|
|
||||||
85
py/aoc/y2018/d09.py
Normal file
85
py/aoc/y2018/d09.py
Normal file
|
|
@ -0,0 +1,85 @@
|
||||||
|
import collections
|
||||||
|
|
||||||
|
|
||||||
|
class Circle:
|
||||||
|
def __init__(self):
|
||||||
|
self.marbles = collections.deque([0])
|
||||||
|
# self.marbles = [0]
|
||||||
|
self.next = 1
|
||||||
|
|
||||||
|
def move_focus(self, steps):
|
||||||
|
self.marbles.rotate(steps)
|
||||||
|
# self.marbles = self.marbles[steps:] + self.marbles[:steps]
|
||||||
|
|
||||||
|
def insert(self):
|
||||||
|
self.marbles.append(self.next)
|
||||||
|
# self.marbles = [self.next] + self.marbles
|
||||||
|
self.next += 1
|
||||||
|
|
||||||
|
def remove(self):
|
||||||
|
return self.marbles.pop()
|
||||||
|
# n = self.marbles[0]
|
||||||
|
# self.marbles = self.marbles[1:]
|
||||||
|
# return n
|
||||||
|
|
||||||
|
def insert_marble(self):
|
||||||
|
# returns the two marbles removed in a tuple, or None
|
||||||
|
if self.next % 23 == 0:
|
||||||
|
return self.insert_multiple()
|
||||||
|
else:
|
||||||
|
self.insert_normal()
|
||||||
|
return None
|
||||||
|
|
||||||
|
def insert_normal(self):
|
||||||
|
self.move_focus(2)
|
||||||
|
self.insert()
|
||||||
|
|
||||||
|
def insert_multiple(self):
|
||||||
|
cur = self.next
|
||||||
|
self.next += 1
|
||||||
|
|
||||||
|
self.move_focus(-7)
|
||||||
|
left = self.remove()
|
||||||
|
|
||||||
|
return (cur, left)
|
||||||
|
|
||||||
|
|
||||||
|
class Game:
|
||||||
|
def __init__(self, elves, until):
|
||||||
|
self.circle = Circle()
|
||||||
|
self.until = until
|
||||||
|
self.elves = [0 for _ in range(elves)]
|
||||||
|
|
||||||
|
def play(self):
|
||||||
|
while True:
|
||||||
|
for elf in range(len(self.elves)):
|
||||||
|
# if self.circle.next % 10000 == 0:
|
||||||
|
# print(
|
||||||
|
# f"{self.circle.next:5} of {self.until:5} - {100 * self.circle.next / self.until:.04}% {len(self.circle.marbles):8}"
|
||||||
|
# )
|
||||||
|
|
||||||
|
if self.circle.next > self.until:
|
||||||
|
return
|
||||||
|
|
||||||
|
result = self.circle.insert_marble()
|
||||||
|
if result is not None:
|
||||||
|
fst, snd = result
|
||||||
|
self.elves[elf] += fst + snd
|
||||||
|
|
||||||
|
def highscore(self):
|
||||||
|
return max(self.elves)
|
||||||
|
|
||||||
|
|
||||||
|
def solve(inputstr):
|
||||||
|
elves, _, _, _, _, _, until, _ = inputstr.strip().split()
|
||||||
|
elves, until = int(elves), int(until)
|
||||||
|
|
||||||
|
game = Game(elves, until)
|
||||||
|
game.play()
|
||||||
|
score = game.highscore()
|
||||||
|
print(f"Part 1: {game.highscore()}")
|
||||||
|
|
||||||
|
game = Game(elves, until * 100)
|
||||||
|
game.play()
|
||||||
|
score = game.highscore()
|
||||||
|
print(f"Part 2: {game.highscore()}")
|
||||||
Loading…
Add table
Add a link
Reference in a new issue