|
| 1 | +import lcm from "@lib/lcm.ts"; |
| 2 | +import { parsePositions } from "../../positions.ts"; |
| 3 | + |
| 4 | +export default function solve(input: string) { |
| 5 | + const moons = parsePositions(input).map((initialPosition) => { |
| 6 | + const initialVelocity = [0, 0, 0]; |
| 7 | + const position = [...initialPosition], velocity = [...initialVelocity]; |
| 8 | + return ({ initialPosition, initialVelocity, position, velocity }); |
| 9 | + }); |
| 10 | + const repeats = [0, 0, 0]; |
| 11 | + for (let step = 0; repeats.some((r) => !r); step++) { |
| 12 | + for (let i = 0; i < moons.length; i++) { |
| 13 | + for (let j = i + 1; j < moons.length; j++) { |
| 14 | + for (let k = 0; k < 3; k++) { |
| 15 | + const change = Math.sign(moons[j].position[k] - moons[i].position[k]); |
| 16 | + moons[i].velocity[k] += change; |
| 17 | + moons[j].velocity[k] -= change; |
| 18 | + } |
| 19 | + } |
| 20 | + } |
| 21 | + for (let i = 0; i < moons.length; i++) { |
| 22 | + for (let k = 0; k < 3; k++) { |
| 23 | + moons[i].position[k] += moons[i].velocity[k]; |
| 24 | + } |
| 25 | + } |
| 26 | + for (let k = 0; k < repeats.length; k++) { |
| 27 | + if (repeats[k]) continue; |
| 28 | + const aligns = moons.every((moon) => |
| 29 | + moon.position[k] === moon.initialPosition[k] && |
| 30 | + moon.velocity[k] === moon.initialVelocity[k] |
| 31 | + ); |
| 32 | + if (aligns) repeats[k] = step + 1; |
| 33 | + } |
| 34 | + } |
| 35 | + return repeats.reduce(lcm); |
| 36 | +} |
0 commit comments