using System; using System.IO; using BenTek.AdventOfCode.TwentyTwentyFive.Interfaces; namespace BenTek.AdventOfCode.TwentyTwentyFive.Days { class Day1 : IPuzzle { /// public string ExpectedTestValue1 => "5"; public int StartingPosition => 50; public int Limit => 99; public string[] WrongAnswers => ["461", "5572", "7139", "7214", "7255", "6563", "8854", "6793", "8102", "7823", "7815"]; // 6684 public string TestDataPath => Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Data", "Day1", "sample_input.txt"); public string RealDataPath => Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Data", "Day1", "input.txt"); public bool Test() { return true; } public string Run() { string input = Utilities.FileLoader.LoadFile(RealDataPath); return Logic(input); } /// public string Logic(string input) { string output1 = string.Empty; string[] lines = input.Split("\n"); if (lines == null) { throw new Exception("Cannot split test input data"); } int[] values = new int[lines.Length]; for (int i = 0; i < lines.Length; i++) { string line = lines[i]; string sign = line.Substring(0, 1); string value = line.TrimStart(sign.ToCharArray()); int parsedValue = int.Parse(value); int coefficient = sign.Contains("R") ? 1 : -1; values[i] = parsedValue * coefficient; } int zeroCount = 0; int wrapCount = 0; int currentValue = StartingPosition; for (int i = 0; i < values.Length; i++) { currentValue = Wrap(currentValue, values[i], ref wrapCount); // Console.WriteLine($"The dial is rotated {values[i]} to point at {currentValue}"); if (currentValue == 0) { zeroCount++; } } output1 = zeroCount.ToString(); string output2 = (wrapCount).ToString(); if (!CheckOutput(output1)) { return $"Error - {output1} is wrong answer for 1"; } if (!CheckOutput(output2)) { return $"Error - {output2} is wrong answer for 2"; } return $"1: {output1}, 2: {output2}"; } private int Wrap(int currentState, int delta, ref int wrapCount) { bool positive = delta > 0; int absDelta = (int)MathF.Abs(delta); for (int i = 0; i < absDelta; i++) { if (positive) { currentState++; } else { currentState--; } if (currentState < 0) { currentState += 100; } else if (currentState > Limit) { currentState -= 100; } if (currentState == 0) { wrapCount++; } } return currentState; } private bool CheckOutput(string output) { if (WrongAnswers.Contains(output)) { return false; } return true; } } }