Intcode as a single file, add SPDX-License-Identifier
This commit is contained in:
@ -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
25
2019/12/moon.py
Normal 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
|
Reference in New Issue
Block a user