Day 2: Red-Nosed Reports
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://blocks.programming.dev/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/22323136
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
C#
using MathNet.Numerics.LinearAlgebra; public class Day02 : Solver { private ImmutableList<Vector<Double>> data; public void Presolve(string input) { data = input.Trim().Split("\n") .Select( line => Vector<Double>.Build.DenseOfEnumerable(line.Split(' ').Select(double.Parse)) ).ToImmutableList(); } private bool IsReportSafe(Vector<Double> report) { Vector<Double> delta = report.SubVector(1, report.Count - 1) .Subtract(report.SubVector(0, report.Count - 1)); return (delta.ForAll(x => x > 0) || delta.ForAll(x => x < 0)) && Vector<Double>.Abs(delta).Max() <= 3; } private bool IsDampenedReportSafe(Vector<Double> report) { for (Double i = 0; i < report.Count; ++i) { var dampened = Vector<Double>.Build.DenseOfEnumerable( report.EnumerateIndexed() .Where(item => item.Item1 != i) .Select(item => item.Item2)); if (IsReportSafe(dampened)) return true; } return false; } public string SolveFirst() => data.Where(IsReportSafe).Count().ToString(); public string SolveSecond() => data.Where(IsDampenedReportSafe).Count().ToString(); }