@@ -0,0 +1,44 @@
+import * as O from "fp-ts/Option";
+
+import { findFirst, map, reduce } from "fp-ts/lib/Array";
+import { pipe } from "fp-ts/lib/function";
+import { draws as testDraws, RawTable, tables as testTables } from "./input.test";
+type Value = {
+ value: number,
+ marked: boolean
+};
+type Table = {
+ lastMarked?: number,
+ table: Value[][]
+}
+const calc = (draws: number[]) => (table: Table) => pipe(
+ draws,
+ reduce(table, (t, d) => pipe(
+ [...t.table],
+ map(findFirst((v: Value) => v.value === d)),
+ reduce(O.none as O.Option<Value>, (v, o) => pipe(o, O.alt(() => v))),
+ O.fold<Value, Table>(
+ () => t,
+ v => {
+ v.marked = true;
+ return {
+ lastMarked: d,
+ table: t.table
+ };
+ }
+ )))
+);
+const results = pipe(
+ testTables,
+ map<RawTable, Table>(t => ({
+ table: pipe(t, map(r => pipe(r, map<number, Value>(v => ({ value: v, marked: false })))))
+ })),
+ map(calc(testDraws))
+console.log("results: ", results[0]);
@@ -0,0 +1,26 @@
+export const draws = [7, 4, 9, 5, 11, 17, 23, 2, 0, 14, 21, 24, 10, 16, 13, 6, 15, 25, 12, 22, 18, 20, 8, 19, 3, 26, 1];
+export type RawTable = number[][];
+export const tables: RawTable[] = [
+ [
+ [22, 13, 17, 11, 0],
+ [8, 2, 23, 4, 24],
+ [21, 9, 14, 16, 7],
+ [6, 10, 3, 18, 5],
+ [1, 12, 20, 15, 19]
+ ],
+ [3, 15, 0, 2, 22],
+ [9, 18, 13, 17, 5],
+ [19, 8, 7, 25, 23],
+ [20, 11, 10, 24, 4],
+ [14, 21, 16, 12, 6]
+ [14, 21, 17, 24, 4],
+ [10, 16, 15, 9, 19],
+ [18, 8, 23, 26, 20],
+ [22, 11, 13, 6, 5],
+ [2, 0, 12, 3, 7]
+ ]
+];