aboutsummaryrefslogtreecommitdiff
path: root/aoc-2022-dotnet/Common/Vec2.fs
diff options
context:
space:
mode:
Diffstat (limited to 'aoc-2022-dotnet/Common/Vec2.fs')
-rw-r--r--aoc-2022-dotnet/Common/Vec2.fs86
1 files changed, 58 insertions, 28 deletions
diff --git a/aoc-2022-dotnet/Common/Vec2.fs b/aoc-2022-dotnet/Common/Vec2.fs
index 61b313d..438135b 100644
--- a/aoc-2022-dotnet/Common/Vec2.fs
+++ b/aoc-2022-dotnet/Common/Vec2.fs
@@ -4,8 +4,8 @@
type Vec2 =
| Vec2 of int * int
- static member x(Vec2 (x, _)) = x
- static member y(Vec2 (_, y)) = y
+ static member inline x(Vec2 (x, _)) = x
+ static member inline y(Vec2 (_, y)) = y
static member zero = Vec2(0, 0)
static member up = Vec2(0, 1)
@@ -18,43 +18,73 @@ type Vec2 =
static member downLeft = Vec2(-1, -1)
static member downRight = Vec2(1, -1)
+ static member directionsUp =
+ Set [ Vec2.upLeft
+ Vec2.up
+ Vec2.upRight ]
+
+ static member directionsRight =
+ Set [ Vec2.upRight
+ Vec2.right
+ Vec2.downRight ]
+
+ static member directionsDown =
+ Set [ Vec2.downLeft
+ Vec2.down
+ Vec2.downRight ]
+
+ static member directionsLeft =
+ Set [ Vec2.upLeft
+ Vec2.left
+ Vec2.downLeft ]
+
static member directions4 =
- [ Vec2.up
- Vec2.right
- Vec2.down
- Vec2.left ]
+ Set [ Vec2.up
+ Vec2.right
+ Vec2.down
+ Vec2.left ]
static member directions8 =
- [ Vec2.up
- Vec2.upRight
- Vec2.right
- Vec2.downRight
- Vec2.down
- Vec2.downLeft
- Vec2.left
- Vec2.upLeft ]
-
- static member inline (~-) = Vec2.map (~-)
- static member inline (+)(Vec2 (x1, y1), Vec2 (x2, y2)) = Vec2(x1 + x2, y1 + y2)
- static member inline (-)(v1, v2) = v1 + Vec2.op_UnaryNegation (v2)
- static member inline (*)(v1, k) = Vec2.map ((*) k) v1
+ Set [ Vec2.up
+ Vec2.upRight
+ Vec2.right
+ Vec2.downRight
+ Vec2.down
+ Vec2.downLeft
+ Vec2.left
+ Vec2.upLeft ]
+
+ static member inline private _map f (Vec2 (x, y)) = Vec2(f x, f y)
+ static member inline private _combine fn (Vec2 (x1, y1)) (Vec2 (x2, y2)) = Vec2(fn x1 x2, fn y1 y2)
+
+ static member inline (~-)(v) = Vec2._map (~-) v
+ static member inline (+)(v1, v2) = Vec2._combine (+) v1 v2
+ static member inline (-)(v1, v2) = Vec2._combine (-) v1 v2
+ static member inline (*)(v1, k) = Vec2._map ((*) k) v1
+
static member inline dot (Vec2 (x1, y1)) (Vec2 (x2, y2)) = x1 * x2 + y1 * y2
static member inline cross (Vec2 (x1, y1)) (Vec2 (x2, y2)) = x1 * y2 - y1 * x2
- static member map f (Vec2 (x, y)) = Vec2(f x, f y)
- static member inline sign = Vec2.map sign
+ static member inline sign = Vec2._map sign
static member inline lengthSquared(Vec2 (x, y)) = x * x + y * y
static member mahattanDist (Vec2 (x1, y1)) (Vec2 (x2, y2)) = abs (x2 - x1) + abs (y2 - y1)
static member chebyshevDist (Vec2 (x1, y1)) (Vec2 (x2, y2)) = max (abs <| x2 - x1) (abs <| y2 - y1)
- static member neighbours4 v = List.map ((+) v) Vec2.directions4
- static member neighbours8 v = List.map ((+) v) Vec2.directions8
+
+ static member inline private _nb d v = Set.map ((+) v) d
+ static member neighboursUp = Vec2._nb Vec2.directionsUp
+ static member neighboursRight = Vec2._nb Vec2.directionsRight
+ static member neighboursDown = Vec2._nb Vec2.directionsDown
+ static member neighboursLeft = Vec2._nb Vec2.directionsLeft
+ static member neighbours4 = Vec2._nb Vec2.directions4
+ static member neighbours8 = Vec2._nb Vec2.directions8
+
+ static member boundingRectangle vs =
+ (Seq.reduce (Vec2._combine min) vs, Seq.reduce (Vec2._combine max) vs)
static member lineBetween(Vec2 (x1, y1), Vec2 (x2, y2)) =
if x1 = x2 then
- seq { min y1 y2 .. max y1 y2 }
- |> Seq.map (fun y -> Vec2(x1, y))
+ Seq.map (fun y -> Vec2(x1, y)) (seq { min y1 y2 .. max y1 y2 })
elif y1 = y2 then
- seq { min x1 x2 .. max x1 x2 }
- |> Seq.map (fun x -> Vec2(x, y1))
+ Seq.map (fun x -> Vec2(x, y1)) (seq { min x1 x2 .. max x1 x2 })
else
failwith "Points must be in a vertical or horizontal line!"
@@ -64,4 +94,4 @@ type Vec2 =
&& row >= 0
&& row < Array2D.length1 matrix
- static member toIndexOf matrix (Vec2 (col, row)) = (Array2D.length2 matrix) * row + col
+ static member inline toIndexOf matrix (Vec2 (col, row)) = (Array2D.length2 matrix) * row + col