Add Day 8 (polu sapios kwdikas)

This commit is contained in:
Dimitrios
2024-12-08 12:40:24 +02:00
parent 668736a34a
commit 6560c2e2b1
4 changed files with 268 additions and 0 deletions

View File

@@ -17,6 +17,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Day6", "Day6\Day6.csproj",
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Day7", "Day7\Day7.csproj", "{D177FD38-032B-4053-8E84-38368F74CBCE}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Day7", "Day7\Day7.csproj", "{D177FD38-032B-4053-8E84-38368F74CBCE}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Day8", "Day8\Day8.csproj", "{4D1D9998-BA7C-44F9-8305-DBB066485BAF}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@@ -51,6 +53,10 @@ Global
{D177FD38-032B-4053-8E84-38368F74CBCE}.Debug|Any CPU.Build.0 = Debug|Any CPU {D177FD38-032B-4053-8E84-38368F74CBCE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D177FD38-032B-4053-8E84-38368F74CBCE}.Release|Any CPU.ActiveCfg = Release|Any CPU {D177FD38-032B-4053-8E84-38368F74CBCE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D177FD38-032B-4053-8E84-38368F74CBCE}.Release|Any CPU.Build.0 = Release|Any CPU {D177FD38-032B-4053-8E84-38368F74CBCE}.Release|Any CPU.Build.0 = Release|Any CPU
{4D1D9998-BA7C-44F9-8305-DBB066485BAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4D1D9998-BA7C-44F9-8305-DBB066485BAF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4D1D9998-BA7C-44F9-8305-DBB066485BAF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4D1D9998-BA7C-44F9-8305-DBB066485BAF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

16
Day8/Day8.csproj Normal file
View File

@@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<None Update="input.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

196
Day8/Program.cs Normal file
View File

@@ -0,0 +1,196 @@
var lines = File.ReadAllLines("input.txt");
var charArray = new char[lines.Length, lines[0].Length];
for (var i = 0; i < charArray.GetLength(0); i++)
for (var j = 0; j < charArray.GetLength(1); j++)
{
charArray[i, j] = lines[i][j];
}
var uniqueCharacterPositions = GroupUniqueCharacterPositions(charArray);
var antinodeLocations = new List<(int, int)>();
var antinodeHarmonicsLocations = new List<(int, int)>();
foreach (var uniqueCharacter in uniqueCharacterPositions)
{
for (var i = 0; i < uniqueCharacter.Value.Count - 1; i++)
{
var currentPosition = uniqueCharacter.Value[i];
for (var j = i + 1; j < uniqueCharacter.Value.Count; j++)
{
var nextPosition = uniqueCharacter.Value[j];
if (Distance(currentPosition.Item1, currentPosition.Item2, nextPosition.Item1, nextPosition.Item2) >= 1)
{
antinodeLocations.AddRange(CalculateAntinodes(currentPosition, nextPosition, charArray));
}
antinodeHarmonicsLocations.AddRange(CalculateAntinodesWithHarmonics(currentPosition, nextPosition, charArray));
}
}
}
Console.WriteLine(
$"Part 1: {antinodeLocations.Distinct().Count()}\nPart 2: {antinodeHarmonicsLocations.Distinct().Count()}");
List<(int, int)> CalculateAntinodesWithHarmonics((int, int) currentPosition, (int, int) nextPosition, char[,] input)
{
var locations = new List<(int, int)>
{
currentPosition,
nextPosition
};
var verticalDistance = Math.Abs(currentPosition.Item1 - nextPosition.Item1);
var horizontalDistance = Math.Abs(currentPosition.Item2 - nextPosition.Item2);
var currentPositionClone = currentPosition;
var nextPositionClone = nextPosition;
int antinodePositionRow, antinodePositionColumn;
while (true)
{
if (currentPositionClone.Item1 < nextPositionClone.Item1)
{
antinodePositionRow = currentPositionClone.Item1 - verticalDistance;
}
else
{
antinodePositionRow = currentPositionClone.Item1 + verticalDistance;
}
if (currentPositionClone.Item2 < nextPositionClone.Item2)
{
antinodePositionColumn = currentPositionClone.Item2 - horizontalDistance;
}
else
{
antinodePositionColumn = currentPositionClone.Item2 + horizontalDistance;
}
if (IsValid(antinodePositionRow, antinodePositionColumn, input))
{
locations.Add((antinodePositionRow, antinodePositionColumn));
nextPositionClone = currentPositionClone;
currentPositionClone = (antinodePositionRow, antinodePositionColumn);
}
else
{
break;
}
}
currentPositionClone = currentPosition;
nextPositionClone = nextPosition;
while (true)
{
if (currentPositionClone.Item1 < nextPositionClone.Item1)
{
antinodePositionRow = nextPositionClone.Item1 + verticalDistance;
}
else
{
antinodePositionRow = nextPositionClone.Item1 - verticalDistance;
}
if (currentPositionClone.Item2 < nextPositionClone.Item2)
{
antinodePositionColumn = nextPositionClone.Item2 + horizontalDistance;
}
else
{
antinodePositionColumn = nextPositionClone.Item2 - horizontalDistance;
}
if (IsValid(antinodePositionRow, antinodePositionColumn, input))
{
locations.Add((antinodePositionRow, antinodePositionColumn));
currentPositionClone = nextPositionClone;
nextPositionClone = (antinodePositionRow, antinodePositionColumn);
}
else
{
break;
}
}
return locations;
}
List<(int, int)> CalculateAntinodes((int, int) currentPosition, (int, int) nextPosition, char[,] input)
{
var locations = new List<(int, int)>();
int firstAntinodePositionRow,
firstAntinodePositionColumn,
secondAntinodePositionRow,
secondAntinodePositionColumn;
var verticalDistance = Math.Abs(currentPosition.Item1 - nextPosition.Item1);
var horizontalDistance = Math.Abs(currentPosition.Item2 - nextPosition.Item2);
if (currentPosition.Item1 < nextPosition.Item1)
{
firstAntinodePositionRow = currentPosition.Item1 - verticalDistance;
secondAntinodePositionRow = nextPosition.Item1 + verticalDistance;
}
else
{
firstAntinodePositionRow = currentPosition.Item1 + verticalDistance;
secondAntinodePositionRow = nextPosition.Item1 - verticalDistance;
}
if (currentPosition.Item2 < nextPosition.Item2)
{
firstAntinodePositionColumn = currentPosition.Item2 - horizontalDistance;
secondAntinodePositionColumn = nextPosition.Item2 + horizontalDistance;
}
else
{
firstAntinodePositionColumn = currentPosition.Item2 + horizontalDistance;
secondAntinodePositionColumn = nextPosition.Item2 - horizontalDistance;
}
if (IsValid(firstAntinodePositionRow, firstAntinodePositionColumn, input))
{
locations.Add((firstAntinodePositionRow, firstAntinodePositionColumn));
}
if (IsValid(secondAntinodePositionRow, secondAntinodePositionColumn, input))
{
locations.Add((secondAntinodePositionRow, secondAntinodePositionColumn));
}
return locations;
}
Dictionary<char, List<(int, int)>> GroupUniqueCharacterPositions(char[,] array)
{
var charLocations = new Dictionary<char, List<(int, int)>>();
for (var i = 0; i < array.GetLength(0); i++)
{
for (var j = 0; j < array.GetLength(1); j++)
{
var currentChar = array[i, j];
if (currentChar == '.') continue;
if (!charLocations.ContainsKey(currentChar))
{
charLocations[currentChar] = new List<(int, int)>();
}
charLocations[currentChar].Add((i, j));
}
}
return charLocations;
}
bool IsValid(int row, int column, char[,] grid) => row >= 0 && row < grid.GetLength(0) && column >= 0 && column < grid.GetLength(1);
double Distance(int position1Row, int position1Column, int position2Row, int position2Column) => Math.Sqrt(Math.Pow(position1Column - position2Column, 2) + Math.Pow(position2Row - position1Row, 2));

50
Day8/input.txt Normal file
View File

@@ -0,0 +1,50 @@
..........K........................A..............
.K................................A...............
......................................D.....A.....
....................................6............D
..................................................
.............................d....................
.........4.e.......................DT.B...........
....................d.....D......A...........B....
.............K....................................
...........................k......................
...w..............4.....................y.........
........w.........................................
..............g..k..............d..........y......
.....w.....Q..............................T.......
...............b..........k................6......
.................................W...T............
................w..............BW..T..............
............g....4e.....................W.........
.......1.................g.......................W
........k..........................6.....0........
.................a................................
....................4.a........3.g..............7.
.............m........................I.0.........
..............K7..............V...................
....Q................................I............
..9........b......................I...............
...................d..............................
.......e..........................................
....e...........t..E................3.............
......1..aQ........t....v.....3..........I..0.....
...........................v.t.....3.7............
..........i.......m........M......................
...Q..29..a...................m...................
...9......q..........mt...........................
....1...............Y.....M.........7.............
..........b..1...E.v..Y...........................
................v..........q...............0......
..................E.................5.............
9...i..2b................................8........
.....q..2............Y..M.........................
............q...............................V.....
...i.................................V............
.i..............E............M....................
.........................................G........
............8................Y....................
.........2................8..............5........
......................................5....V......
............................................G.....
.....................................5...........G
.................................8................