-
Notifications
You must be signed in to change notification settings - Fork 0
/
aoc-10.1.csx
64 lines (52 loc) · 2.34 KB
/
aoc-10.1.csx
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
using System.Linq;
var input = System.IO.File.ReadAllLines(@".\input.10.1.txt").ToArray();
int inputLength = input.Length;
var lowPointList = new List<string>();
var coordinatesCounted = new HashSet<string>();
var basinList = new List<int>();
for (int yPos = 0; yPos < inputLength; yPos++)
{
int lineLength = input[yPos].Length;
for (int xPos = 0; xPos < lineLength; xPos++)
{
// Check Y coordinates
var currPosHeight = input[yPos][xPos];
if (yPos > 0) // Check above current location
if (input[yPos-1][xPos] <= currPosHeight) continue;
if (yPos < inputLength - 1) // Check below current location
if (input[yPos+1][xPos] <= currPosHeight) continue;
// Check X coordinates
if (xPos > 0) // check to the left
if (input[yPos][xPos-1] <= currPosHeight) continue;
if (xPos < lineLength - 1) // check to the left
if (input[yPos][xPos+1] <= currPosHeight) continue;
lowPointList.Add($"{yPos},{xPos}");
}
}
foreach (var point in lowPointList)
{
var coordinates = point.Split(',').Select(p=>int.Parse(p)).ToArray();
int basinSize = FindAndCalculateBasin(coordinates[0], coordinates[1], input);
basinList.Add(basinSize);
}
System.Console.WriteLine(basinList.OrderByDescending(p => p).Take(3).Aggregate((p1,p2)=> p1 * p2 ));
int FindAndCalculateBasin(int yPos, int xPos, string[] input)
{
int basinSize = 0;
int lineLength = input[yPos].Length;
var currPosHeight = input[yPos][xPos];
var coordKey = $"{yPos},{xPos}";
if (coordinatesCounted.Contains(coordKey)) return 0;
coordinatesCounted.Add(coordKey);
if (currPosHeight == '9') return 0;
if (yPos > 0) // Check above current location
if (input[yPos-1][xPos] > currPosHeight) basinSize += FindAndCalculateBasin(yPos-1,xPos,input);
if (yPos < inputLength - 1) // Check below current location
if (input[yPos+1][xPos] > currPosHeight) basinSize += FindAndCalculateBasin(yPos+1,xPos,input);
// Check X coordinates
if (xPos > 0) // check to the left
if (input[yPos][xPos-1] > currPosHeight) basinSize += FindAndCalculateBasin(yPos,xPos-1,input);
if (xPos < lineLength - 1) // check to the left
if (input[yPos][xPos+1] > currPosHeight) basinSize += FindAndCalculateBasin(yPos,xPos+1,input);
return 1 + basinSize;
}