var lines = File.ReadAllLines("input.txt"); var reports = lines.Select(line => line.Split(" ").ToList()).ToList(); int safeReportsNumber = 0, problemDampenerSafeReports = 0; for (int i = 0; i < reports.Count; i++) { var currentReport = reports[i].Select(x => int.Parse(x)).ToList(); if (IsReportSafe(currentReport)) safeReportsNumber++; if (IsReportSafeWithDampener(currentReport)) problemDampenerSafeReports++; } Console.WriteLine($"Part1: {safeReportsNumber}\nPart2: {problemDampenerSafeReports}"); bool IsReportSafe(List levels) { var isAscending = levels.SequenceEqual(levels.OrderBy(x => x)); var isDescending = levels.SequenceEqual(levels.OrderByDescending(x => x)); var allValidDifferennce = levels.Zip(levels.Skip(1), (a, b) => Math.Abs(a - b) > 0 && Math.Abs(a - b) < 4).All(x => x); return (isAscending || isDescending) && allValidDifferennce; } bool IsReportSafeWithDampener(List levels) { if (IsReportSafe(levels)) return true; // Performance killa.. for (int i = 0; i < levels.Count; i++) { var modifiedLevels = new List(levels); modifiedLevels.RemoveAt(i); if (IsReportSafe(modifiedLevels)) return true; } return false; }