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