-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday08_part01.fs
73 lines (60 loc) · 2.05 KB
/
day08_part01.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
module day08_part01
open AdventOfCode_2024.Modules
open AdventOfCode_Utilities
type Coord = {
Row: int;
Col: int;
}
type Antenna = {
Name: char;
Position : Coord;
}
type AntennaMap = {
MaxRow: int;
MaxCol: int;
}
let parseContent (lines: string array) =
let maxRows = lines.Length
let maxCols = lines[0].Length
let antennas =
[for row in [0..maxRows-1] do
for col in [0..maxCols-1] do
let value = lines[row][col]
if value <> '.' then
yield { Name = value; Position = {Row = row; Col = col} }]
({ MaxRow = maxRows; MaxCol = maxCols } , antennas)
let inBoundaries (coord: Coord) (maxRows: int) (maxCols: int) =
coord.Row >= 0 && coord.Row < maxRows &&
coord.Col >= 0 && coord.Col < maxCols
let mirror (coordA: Coord) (coordB: Coord) =
let mirrored1 = (2 * coordB.Row - coordA.Row, 2 * coordB.Col - coordA.Col)
let mirrored2 = (2 * coordA.Row - coordB.Row, 2 * coordA.Col - coordB.Col)
(
{ Row = fst mirrored1; Col = snd mirrored1 },
{ Row = fst mirrored2; Col = snd mirrored2 }
)
let calculateAntinode (antennas: Antenna list) (mapAntennas: AntennaMap) =
let combinations = Utilities.combination 2 antennas
let maxRows = mapAntennas.MaxRow
let maxCols = mapAntennas.MaxCol
let rAntennas =
[for comb in combinations do
let (coordA, coordB) = comb.Item(0).Position, comb.Item(1).Position
let (fromFirst, fromSecond) = mirror coordA coordB
if inBoundaries fromFirst maxRows maxCols then
yield fromFirst
if inBoundaries fromSecond maxRows maxCols then
yield fromSecond
]
rAntennas
let execute() =
let path = "day08/day08_input.txt"
let content = LocalHelper.GetLinesFromFile path
let (mapAntennas, antennas) = parseContent content
let groups = antennas |> List.groupBy _.Name
groups
|> List.collect(fun g ->
calculateAntinode (snd g) mapAntennas
)
|> List.distinct
|> List.length