using System; using static System.Console; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; using Xunit; namespace AdventOfCode { public class Day09 { static bool Valid(List longs, int preambleSize, int target) { for (int i = target - preambleSize; i < target - 1; i++) { for (int j = i + 1; j < target; j++) { if (i == j) { continue; } if (longs[i] + longs[j] == longs[target]) { return true; } } } return false; } static long FindInvalid(List longs, int preambleSize) { for (int target = preambleSize; target < longs.Count(); target++) { if (!Valid(longs, preambleSize, target)) { return longs[target]; } } throw new Exception("didn't find an invalid int"); } static long CalculateWeakness(List longs, int minIndex, int maxIndex) { long largest = 0; long smallest = long.MaxValue; for (int i = minIndex; i <= maxIndex; i++) { if (longs[i] > largest) { largest = longs[i]; } if (longs[i] < smallest) { smallest = longs[i]; } } return smallest + largest; } static long FindWeakness(List longs, long target) { for (int i = 0; i < longs.Count() - 1; i++) { long total = 0; for (int j = i; j < longs.Count() && total < target; j++) { total += longs[j]; if (total == target) { return CalculateWeakness(longs, i, j); } } } throw new Exception("didn't find a weakness"); } static long Part1() { string[] input = File.ReadAllLines(Util.RootDir + "day09.txt"); List longs = input.ToList().Select(long.Parse).ToList(); return FindInvalid(longs, 25); } static long Part2(long target) { string[] input = File.ReadAllLines(Util.RootDir + "day09.txt"); List longs = input.ToList().Select(long.Parse).ToList(); return FindWeakness(longs, target); } [Fact] public static void Test() { string[] example = @"35 20 15 25 47 40 62 55 65 95 102 117 150 182 127 219 299 277 309 576".Split('\n'); List longs = example.ToList().Select(long.Parse).ToList(); Assert.Equal(127, FindInvalid(longs, 5)); long invalidNumber = Part1(); Assert.Equal(50047984, invalidNumber); Assert.Equal(5407707, Part2(invalidNumber)); } } }