advent_of_code_2024/Level4/Level4Solver.cs

68 lines
2.1 KiB
C#
Raw Permalink Normal View History

2024-12-13 16:04:54 +01:00
namespace AoC24;
using AoC24.Common;
using AoCLevelInputProvider;
using Parsing;
using Parsing.Data;
using Parsing.Schema;
public class Level4Solver : FullTextLevelSolverBase
{
public override int LevelNumber
{
get { return 4; }
}
protected override InputSchemaBuilder DefineInputSchema(InputSchemaBuilder schemaBuilder)
{
return schemaBuilder
.Repeat()
.Expect(InputType.Char)
.EndRepetition();
}
public override string SolveFirstStar()
{
var data = this.GetData()
.AsListRows<string>();
var searchSequence = new List<string> { "X", "M", "A", "S" };
var manipulator = DefaultTwoDimensionalManipulator.Create(data);
var searchResults = manipulator.FindInSet(searchSequence);
return searchResults.Count.ToString();
}
public override string SolveSecondStar()
{
var data = this.GetData()
.AsListRows<string>();
var searchSequence = new List<string> { "M", "A", "S" };
var manipulator = DefaultTwoDimensionalManipulator.Create(data);
var searchResults = manipulator.FindInSet(searchSequence, Direction.NE | Direction.SE | Direction.NW | Direction.SW);
var indicesComparator = (IDataIndex<int> index1, IDataIndex<int> index2) =>
{
return index1.GetIndices()[0] == index2.GetIndices()[0] && index1.GetIndices()[1] == index2.GetIndices()[1];
};
var foundMatches = 0;
for(int i = 0; i < searchResults.Count; i++)
{
var secondPositionA = manipulator.Move(searchResults[i].DataIndex, searchResults[i].Direction);
for(int j = i+1; j < searchResults.Count; j++)
{
var secondPositionB = manipulator.Move(searchResults[j].DataIndex, searchResults[j].Direction);
if(indicesComparator(secondPositionA, secondPositionB))
{
foundMatches++;
break;
}
}
}
return foundMatches.ToString();
}
}