diff --git a/Day2.cs b/Day2.cs index 0c5793c..31c4a15 100644 --- a/Day2.cs +++ b/Day2.cs @@ -1,43 +1,29 @@ #define Day2 #if Day2 -long f = 0; -long d = 0; +Position PartOne(Position p, Operation op) => op.op switch { + "down" => new Position(p.f, p.d + op.x, p.aim), + "up" => new Position(p.f, p.d - op.x, p.aim), + _ => new Position(p.f + op.x, p.d, p.aim) +}; + +Position PartTwo(Position p, Operation op) => op.op switch { + "down" => new Position(p.f, p.d , p.aim+ op.x), + "up" => new Position(p.f, p.d, p.aim - op.x), + _ => new Position(p.f + op.x, p.d + (p.aim * op.x), p.aim) +}; + + var linesSplit = File.ReadAllLines("day2/input") .Select(l => l.Split(" ")) - .Select(lineParts => new { op = lineParts[0], x = long.Parse(lineParts[1]) }) + .Select(lineParts => new Operation(lineParts[0], long.Parse(lineParts[1]))) .ToList(); -linesSplit.ForEach(v => { - switch (v.op) { - case "down": - d += v.x; - break; - case "up": - d -= v.x; - break; - default: - f += v.x; - break; - } -}); -Console.WriteLine(f * d); +var partOneResult = linesSplit.Aggregate(new Position(0, 0, 0), PartOne); +Console.WriteLine(partOneResult.f * partOneResult.d); -f = 0; -d = 0; -long aim = 0; -linesSplit.ForEach(v => { - switch (v.op) { - case "down": - aim += v.x; - break; - case "up": - aim -= v.x; - break; - default: - f += v.x; - d += aim * v.x; - break; - } -}); -Console.WriteLine(f * d); +var partTwoResult = linesSplit.Aggregate(new Position(0, 0, 0), PartTwo); +Console.WriteLine(partTwoResult.f * partTwoResult.d); + +record Operation(String op, long x); +record Position(long f, long d, long aim); #endif \ No newline at end of file