diff --git a/AdventOfCode/Problems/AOC2025/Day7/Laboratories.cs b/AdventOfCode/Problems/AOC2025/Day7/Laboratories.cs index c26cda4..398d609 100644 --- a/AdventOfCode/Problems/AOC2025/Day7/Laboratories.cs +++ b/AdventOfCode/Problems/AOC2025/Day7/Laboratories.cs @@ -1,23 +1,111 @@ -using System; +using AdventOfCode.Utils.Models; + +using MaybeError; +using MaybeError.Errors; + +using System; using System.Collections.Generic; +using System.ComponentModel; using System.Text; namespace AdventOfCode.Problems.AOC2025.Day7; [ProblemInfo(2025, 7, "Laboratories")] internal class Laboratories : Problem { + private string[] _grid = []; + private Vec2 _size; + public override void CalculatePart1() { - throw new NotImplementedException(); + var start = GetStart(_grid).Value; + Part1 = TraceBeam(start, _grid, _size); } public override void CalculatePart2() { - throw new NotImplementedException(); + var start = GetStart(_grid).Value; + Part2 = QuantumTraceBeam(start, _grid, _size, []); } + private static Maybe> GetStart(string[] data) + { + for (int y = 0; y < data.Length; y++) + { + var ln = data[y]; + for (int x = 0; x < ln.Length; x++) + { + if (ln[x] == 'S') + return new Vec2(x, y); + } + } + return new Error("There is no start position"); + } + + private static long TraceBeam(Vec2 pos, string[] data, Vec2 size) + { + return TraceBeam(pos, data, size, []); + } + private static long TraceBeam(Vec2 pos, string[] data, Vec2 size, HashSet> visited) + { + if (pos.X < 0 || pos.Y < 0) + return 0; + if (pos.X >= size.X || pos.Y >= size.Y) + return 0; + var curPos = data[pos.Y][pos.X]; + + if (curPos == '^') + { + var left = new Vec2(pos.X - 1, pos.Y); + var right = new Vec2(pos.X + 1, pos.Y); + var leftCount = visited.Add(left) ? TraceBeam(left, data, size, visited) : 0; + var rightCount = visited.Add(right) ? TraceBeam(right, data, size, visited) : 0; + return 1 + leftCount + rightCount; + } + var next = new Vec2(pos.X, pos.Y + 1); + if (visited.Contains(next)) + return 0; + visited.Add(next); + return TraceBeam(next, data, size, visited); + } + + private static long QuantumTraceBeam(Vec2 pos, string[] data, Vec2 size, Dictionary, long> trace) + { + + if (pos.X < 0 || pos.Y < 0) + return 1; + if (pos.X >= size.X || pos.Y >= size.Y) + return 1; + if (trace.TryGetValue(pos, out var c)) + return c; + var curPos = data[pos.Y][pos.X]; + + if (curPos == '^') + { + var left = new Vec2(pos.X - 1, pos.Y); + var right = new Vec2(pos.X + 1, pos.Y); + + if (!trace.TryGetValue(left, out long leftCount)) + { + leftCount = QuantumTraceBeam(left, data, size, trace); + trace.Add(left, leftCount); + } + + if (!trace.TryGetValue(right, out long rightCount)) + { + rightCount = QuantumTraceBeam(right, data, size, trace); + trace.Add(right, rightCount); + } + + return leftCount + rightCount; + } + return QuantumTraceBeam(new(pos.X, pos.Y + 1), data, size, trace); + } + + + public override void LoadInput() { - throw new NotImplementedException(); + _grid = ReadInputLines("input.txt"); + _size = new Vec2(_grid[0].Length, _grid.Length); } } diff --git a/AdventOfCode/Utils/Models/Common.cs b/AdventOfCode/Utils/Models/Common.cs index 64eeed1..712dd42 100644 --- a/AdventOfCode/Utils/Models/Common.cs +++ b/AdventOfCode/Utils/Models/Common.cs @@ -36,6 +36,7 @@ public record struct Vec2(T X, T Y) where T : INumber public readonly Vec2 Abs() => new(T.Abs(X), T.Abs(Y)); + public override readonly string ToString() { return $"({X}, {Y})";