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);