bodicsek hace 4 años
padre
commit
46775b9e5a
Se han modificado 1 ficheros con 20 adiciones y 14 borrados
  1. 20 14
      day05/day05.ts

+ 20 - 14
day05/day05.ts

@@ -1,5 +1,6 @@
 import * as A from "fp-ts/Array";
 import * as N from "fp-ts/number";
+import * as O from "fp-ts/Option";
 
 import { pipe } from "fp-ts/lib/function";
 import { contramap, max, min } from "fp-ts/lib/Ord";
@@ -47,13 +48,13 @@ const expand = (vector: Vector): Point[] => pipe(
         ? A.replicate(maxNum(vector.to.y, vector.from.y) - minNum(vector.to.y, vector.from.y) + 1, vector.from.x)
         : A.makeBy(
             maxNum(vector.to.x, vector.from.x) - minNum(vector.to.x, vector.from.x) + 1,
-            n => (vector.to.x > vector.from.x ? vector.from.x : vector.to.x) + n
+            n => (vector.to.x > vector.from.x ? vector.from.x + n : vector.from.x - n)
         ),
     A.zip(vector.from.y === vector.to.y
         ? A.replicate(maxNum(vector.to.x, vector.from.x) - minNum(vector.to.x, vector.from.x) + 1, vector.from.y)
         : A.makeBy(
             maxNum(vector.to.y, vector.from.y) - minNum(vector.to.y, vector.from.y) + 1,
-            n => (vector.to.y > vector.from.y ? vector.from.y : vector.to.y) + n
+            n => (vector.to.y > vector.from.y ? vector.from.y + n : vector.from.y - n)
         )),
     A.map(([x, y]) => ({ x, y }))
 );
@@ -65,25 +66,30 @@ const eqPoint: Eq<Point> = struct({
     y: N.Eq
 });
 
-const group = (points: Point[]): Point[][] => {
-    const iterator = (points: Point[], grouppedPoints: Point[][]): Point[][] => {
-        if (A.isEmpty(points)) {
-            return grouppedPoints;
-        }
-        const { init, rest } = pipe(points, A.spanLeft(p => eqPoint.equals(points[0], p)));
-        return iterator(rest, pipe([init], A.concat(grouppedPoints)))
-    }
-    return iterator(points, [[]]);
-}
+const group = (points: Point[]): Point[][] => pipe(
+    points,
+    A.reduce([] as Point[][], (groupped, p) =>
+        pipe(groupped,
+             A.last,
+             O.chain(A.last),
+             O.map(pp => eqPoint.equals(pp, p)),
+             O.getOrElse(() => false))
+        ? pipe(groupped,
+               A.init,
+               O.map(is => [...is, pipe(groupped, A.last, O.map(l => [...l, p]), O.getOrElse(() => [p]))]),
+               O.getOrElseW(() => pipe(groupped, A.append([p]))))
+        : pipe(groupped,
+               A.append([p])))
+);
 
 const result = pipe(
     vectors,
-    A.filter(v => v.from.x === v.to.x || v.from.y === v.to.y),
+    // A.filter(v => v.from.x === v.to.x || v.from.y === v.to.y),
     A.map(expand),
     A.flatten,
     A.sortBy([byX, byY]),
     group,
-    // A.reduce(0, (count, ps) => ps.length > 1 ? count + 1 : count)
+    A.reduce(0, (count, ps) => ps.length > 1 ? count + 1 : count)
 );
 
 console.log(result);