-
Notifications
You must be signed in to change notification settings - Fork 0
/
Day13.fs
91 lines (71 loc) · 2.24 KB
/
Day13.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
module aoc23.Day13
open FSharp.Stats
type MirrorPoint =
| Row of int
| Col of int
module MirrorPoint =
let value =
function
| Col c -> c
| Row r -> r * 100
type Grid(input) =
let rows, cols =
let matrix =
let lines = input |> StringEx.splitSs [| "\r\n"; "\n" |]
let rows = lines.Length
let cols = lines[0].Length
Matrix.init rows cols (fun r c -> if lines[r][c] = '#' then 1.0 else 0.0)
Array.init (matrix.NumRows - 1) (Matrix.getRow matrix >> RowVector.transpose),
Array.init (matrix.NumCols - 1) (Matrix.getCol matrix)
let findMirrorPoint comparer =
seq {
for r in 1 .. rows.Length - 1 do
if comparer rows r then
yield Row r
for c in 1 .. cols.Length - 1 do
if comparer cols c then
yield Col c
}
|> Seq.exactlyOne
member self.MirrorPoint =
let isMirrorAt (array: 'a array) idx =
let first, second = (array[.. idx - 1], array[idx..])
(first |> Seq.rev, second) ||> Seq.forall2 (=)
findMirrorPoint isMirrorAt
member self.UnsmugedMirrorPoint =
let isMirrorWithExactlyOneSmudge (array: vector array) idx =
let first, second = (array[.. idx - 1], array[idx..])
(first |> Seq.rev, second)
||> Seq.map2 (fun a b -> (a - b) |> Vector.map abs |> Vector.sum)
|> Seq.sum = 1.0
findMirrorPoint isMirrorWithExactlyOneSmudge
static member ParseMany input =
let parts = input |> StringEx.splitSs [| "\r\n\r\n"; "\n\n" |]
parts |> Array.map Grid
let solve mapper input =
input |> Grid.ParseMany |> Seq.map (mapper >> MirrorPoint.value) |> Seq.sum
let part1 = solve _.MirrorPoint
let part2 = solve _.UnsmugedMirrorPoint
let run = runReadAllText part1 part2
module Tests =
open Xunit
open Swensen.Unquote
let example =
"""#.##..##.
..#.##.#.
##......#
##......#
..#.##.#.
..##..##.
#.#.##.#.
#...##..#
#....#..#
..##..###
#####.##.
#####.##.
..##..###
#....#..#"""
[<Fact>]
let ``part 1 example`` () = part1 example =! 405
[<Fact>]
let ``part 2 example`` () = part2 example =! 400