| 1234567891011121314151617181920212223242526272829303132333435363738394041 |
- import * as A from "fp-ts/Array";
- import * as N from "fp-ts/number";
- import { pipe } from "fp-ts/lib/function";
- import { concatAll } from "fp-ts/lib/Monoid";
- import { ages as testAges } from "./input.test";
- import { ages as inputAges } from "./input";
- type Generations = number[];
- const GEN_CYCLES = 9;
- const GEN_RESTART_CYCLE = 6;
- const DAYS = 256;
- const parseAges = (input: string): Generations => pipe(
- input.split(","),
- A.map(parseInt),
- A.reduce(A.replicate(GEN_CYCLES, 0) as Generations, (gens, age) => A.unsafeUpdateAt(age, gens[age] + 1, gens))
- );
- const generations = parseAges(
- // testAges
- inputAges
- );
- const simulateDay = (gens: Generations): Generations => pipe(
- gens,
- A.rotate(-1),
- A.splitAt(GEN_RESTART_CYCLE),
- A.reduceWithIndex([] as Generations, (i, gens, part) => i == 0 ? part : A.concat(A.unsafeUpdateAt(0, part[0] + part[2], part))(gens))
- );
- const simulate = (generations: Generations, days: number): Generations => {
- if (days === 0) {
- return generations;
- }
- return simulate(simulateDay(generations), days - 1);
- }
- const entities = concatAll(N.MonoidSum)(simulate(generations, DAYS));
- console.log(entities);
|