aboutsummaryrefslogtreecommitdiffstats
path: root/day5/index.ts
diff options
context:
space:
mode:
Diffstat (limited to 'day5/index.ts')
-rw-r--r--day5/index.ts59
1 files changed, 59 insertions, 0 deletions
diff --git a/day5/index.ts b/day5/index.ts
new file mode 100644
index 0000000..1cf4a3c
--- /dev/null
+++ b/day5/index.ts
@@ -0,0 +1,59 @@
+import { Observable, of } from "rxjs";
+import { concatAll, count, filter, groupBy, map, max, mergeMap, reduce, tap } from 'rxjs/operators';
+import { ExerciseModuleFunc } from "../types";
+
+type Pair = [number, number];
+
+const getColumnAndRow = (line: string): Pair => {
+ const chars = line.split("");
+ let lo: number, hi: number;
+
+ lo = 0; hi = 127;
+ for (let i = 0; i < 7; i += 1) {
+ console.log("i:",i,"lo:",lo,"hi:",hi);
+
+ const chr = chars[i];
+ const diff = hi - lo;
+ if (chr === "F") {
+ hi = Math.floor(hi - diff / 2);
+ }
+ else if (chr === "B") {
+ lo = Math.ceil(lo + diff / 2);
+ }
+ }
+
+ const row = hi;
+
+ lo = 0; hi = 7;
+ for (let i = 0; i < 3; i += 1) {
+ console.log("i:",i,"lo:",lo,"hi:",hi);
+
+ const chr = chars[i + 7];
+ const diff = hi - lo;
+ if (chr === "L") {
+ hi = Math.floor(hi - diff / 2);
+ }
+ else if (chr === "R") {
+ lo = Math.ceil(lo + diff / 2);
+ }
+ }
+
+ const col = hi;
+ return [col, row];
+}
+
+const calcID = (pair: Pair) => pair[1] * 8 + pair[0];
+
+const day5: ExerciseModuleFunc = async (input: string) => {
+ const prom1 = of(input).pipe(
+ map(l => l.split("\n")),
+ concatAll(),
+ map(getColumnAndRow),
+ map(calcID),
+ max()
+ ).toPromise();
+
+ return Promise.all([prom1]);
+}
+
+export default day5;