import { of } from "rxjs"; import { concatAll, filter, map } from 'rxjs/operators'; import { ExerciseModuleFunc } from "../types"; type Pair = [T, K]; type Triple = [A, B, C]; const allTriples = (lst: T[]): Triple[] => { const results: Triple[] = []; lst.forEach((a, ai) => { lst.slice(ai + 1).forEach((b, bi) => { lst.slice(bi + 1).forEach((c, _ci) => { results.push([a, b, c]); }) }) }); return results; } const day1: ExerciseModuleFunc = async (input: string) => { const numbers = input.split("\n").map(line => Number(line)); const obs1 = of(...numbers).pipe( map((number, index) => [number, numbers.slice(index + 1)] as Pair), map(pair => [pair[0], pair[1].find(elem => pair[0] + elem === 2020)] as Pair), filter(pair => pair[1] !== undefined), map(pair => pair[0] * pair[1]), map(solution => solution.toString()) ) const first = await obs1.toPromise(); const obs2 = of(numbers).pipe( map(allTriples), concatAll(), filter(t => t[0] + t[1] + t[2] === 2020), map(t => t[0] * t[1] * t[2]), map(sol => sol.toString()) ); const second = await obs2.toPromise(); return [first, second]; } export default day1;