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(); var searchSequence = new List { "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(); var searchSequence = new List { "M", "A", "S" }; var manipulator = DefaultTwoDimensionalManipulator.Create(data); var searchResults = manipulator.FindInSet(searchSequence, Direction.NE | Direction.SE | Direction.NW | Direction.SW); var indicesComparator = (IDataIndex index1, IDataIndex 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(); } }