Intcode as a single file, add SPDX-License-Identifier

This commit is contained in:
Akumatic
2020-12-02 21:34:21 +01:00
parent 4ec62b1cdb
commit 10c048ab41
17 changed files with 386 additions and 387 deletions

View File

@ -1,36 +1,17 @@
""" https://adventofcode.com/2019/day/12 """
# SPDX-License-Identifier: MIT
# Copyright (c) 2019 Akumatic
#
# https://adventofcode.com/2019/day/12
from itertools import combinations
from moon import Moon
def readFile():
def readFile() -> list:
with open(f"{__file__.rstrip('code.py')}input.txt", "r") as f:
lines = [line[1:-2].replace(" ", "").split(",") for line in f.readlines()]
return [(int(line[0][2:]), int(line[1][2:]), int(line[2][2:])) for line in lines]
def cmp(a,b):
return 0 if a == b else -1 if a < b else 1
class Moon:
def __init__(self, pos):
self.pos = list(pos)
self.vel = [0] * 3
def changeGravity(self, other):
for i in range(3):
d = cmp(self.pos[i], other.pos[i])
self.vel[i] -= d
other.vel[i] += d
def move(self):
for i in range(3):
self.pos[i] += self.vel[i]
def energy(self):
pot = sum([abs(p) for p in self.pos])
kin = sum([abs(v) for v in self.vel])
return pot, kin, pot * kin
def simulate(moons : list, steps = 1):
def simulate(moons: list, steps: int = 1):
for i in range(steps):
for m, n in list(combinations(moons, 2)):
m.changeGravity(n)
@ -38,24 +19,24 @@ def simulate(moons : list, steps = 1):
for moon in moons:
moon.move()
def lcm(x, y):
def lcm(x: int, y: int) -> int:
tmp = x * y
while y:
x, y = y, x % y
return tmp // x
def part1(vals: list):
def part1(vals: list) -> int:
moons = [Moon(val) for val in vals]
simulate(moons, 1000)
return sum([moon.energy()[2] for moon in moons])
def part2(vals: list):
def part2(vals: list) -> int:
dims = [0, 0, 0]
for i in range(3):
moons = [Moon(val) for val in vals]
oPos = [moon.pos[i] for moon in moons]
while 1:
while True:
simulate(moons)
dims[i] += 1
if [moon.pos[i] for moon in moons] == oPos and \

25
2019/12/moon.py Normal file
View File

@ -0,0 +1,25 @@
# SPDX-License-Identifier: MIT
# Copyright (c) 2019 Akumatic
def cmp(a: int, b: int) -> int:
return 0 if a == b else -1 if a < b else 1
class Moon:
def __init__(self, pos):
self.pos = list(pos)
self.vel = [0] * 3
def changeGravity(self, other):
for i in range(3):
d = cmp(self.pos[i], other.pos[i])
self.vel[i] -= d
other.vel[i] += d
def move(self):
for i in range(3):
self.pos[i] += self.vel[i]
def energy(self):
pot = sum([abs(p) for p in self.pos])
kin = sum([abs(v) for v in self.vel])
return pot, kin, pot * kin