From 047f841a6cd53eeb633f2c36367520c19bebe672 Mon Sep 17 00:00:00 2001 From: Rob Date: Sun, 10 Dec 2023 14:42:35 +0100 Subject: [PATCH] Completed day 10 --- AdvendOfCode.Runner/Program.cs | 4 +- Advent Of Code.sln | 11 ++ AdventOfCode.Core/InputReader.cs | 3 +- AdventOfCode.Core/Shared/Grid.cs | 17 +- .../Shared/Grid/IntersectHelpers.cs | 35 ++++ AdventOfCode.Core/Shared/Grid/Line.cs | 36 +--- AdventOfCode.Solutions/2023/Day 05/Day05.cs | 58 +++++-- AdventOfCode.Solutions/2023/Day 10/Day10.cs | 154 ++++++++++++++++++ .../2023/Day 10/day-10-input.txt | 140 ++++++++++++++++ .../AdventOfCode.Solutions.csproj | 3 + AdventOfCode.Solutions/day-00-input.txt | 13 +- AdventOfCode.Tests/2d-shapes/LineTests.cs | 76 +++++++++ AdventOfCode.Tests/2d-shapes/PointTests.cs | 51 ++++++ .../2d-shapes/RectangleTests.cs | 12 ++ AdventOfCode.Tests/AdventOfCode.Tests.csproj | 24 +++ AdventOfCode.Tests/GlobalUsings.cs | 1 + 16 files changed, 588 insertions(+), 50 deletions(-) create mode 100644 AdventOfCode.Core/Shared/Grid/IntersectHelpers.cs create mode 100644 AdventOfCode.Solutions/2023/Day 10/Day10.cs create mode 100644 AdventOfCode.Solutions/2023/Day 10/day-10-input.txt create mode 100644 AdventOfCode.Tests/2d-shapes/LineTests.cs create mode 100644 AdventOfCode.Tests/2d-shapes/PointTests.cs create mode 100644 AdventOfCode.Tests/2d-shapes/RectangleTests.cs create mode 100644 AdventOfCode.Tests/AdventOfCode.Tests.csproj create mode 100644 AdventOfCode.Tests/GlobalUsings.cs diff --git a/AdvendOfCode.Runner/Program.cs b/AdvendOfCode.Runner/Program.cs index 2973390..821fcc7 100644 --- a/AdvendOfCode.Runner/Program.cs +++ b/AdvendOfCode.Runner/Program.cs @@ -7,9 +7,9 @@ InputReader inputReader = new() //IsDebug = true }; -//inputReader.SetInputByChallange(3); +//inputReader.SetInputByChallange(10); -IChallange challange = new Day09(inputReader); +IChallange challange = new Day10(inputReader); Console.WriteLine($"Part 1: {await challange.GetSolutionPart1()}"); diff --git a/Advent Of Code.sln b/Advent Of Code.sln index f9de55a..21fe267 100644 --- a/Advent Of Code.sln +++ b/Advent Of Code.sln @@ -9,6 +9,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AdventOfCode.Solutions", "A EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AdventOfCode.Runner", "AdvendOfCode.Runner\AdventOfCode.Runner.csproj", "{9A188168-565C-4D82-8C81-DD3A15386863}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{539CE5F8-74CE-44EC-A652-77E2E1501368}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdventOfCode.Tests", "AdventOfCode.Tests\AdventOfCode.Tests.csproj", "{2CA7AF19-ADD8-46E1-B889-534E21A3A9A8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -27,10 +31,17 @@ Global {9A188168-565C-4D82-8C81-DD3A15386863}.Debug|Any CPU.Build.0 = Debug|Any CPU {9A188168-565C-4D82-8C81-DD3A15386863}.Release|Any CPU.ActiveCfg = Release|Any CPU {9A188168-565C-4D82-8C81-DD3A15386863}.Release|Any CPU.Build.0 = Release|Any CPU + {2CA7AF19-ADD8-46E1-B889-534E21A3A9A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2CA7AF19-ADD8-46E1-B889-534E21A3A9A8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2CA7AF19-ADD8-46E1-B889-534E21A3A9A8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2CA7AF19-ADD8-46E1-B889-534E21A3A9A8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {2CA7AF19-ADD8-46E1-B889-534E21A3A9A8} = {539CE5F8-74CE-44EC-A652-77E2E1501368} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {D5D52D1F-5A13-43B7-BFC7-773C0E4623D7} EndGlobalSection diff --git a/AdventOfCode.Core/InputReader.cs b/AdventOfCode.Core/InputReader.cs index 13cb6e0..c0ca95a 100644 --- a/AdventOfCode.Core/InputReader.cs +++ b/AdventOfCode.Core/InputReader.cs @@ -78,9 +78,8 @@ namespace AdventOfCode.Core int row = 0; await foreach(string line in ReadAsStringLine()) { - int charIndex = 0; // create the nodes from the lines - result.DataGrid.AddRange(line.Select(c => new T { X = charIndex++, Y = row, Char = c })); + result.DataGrid.AddRange(line.Select((c, i) => new T { X = i, Y = row, Char = c })); row++; } diff --git a/AdventOfCode.Core/Shared/Grid.cs b/AdventOfCode.Core/Shared/Grid.cs index c2aba66..65304bd 100644 --- a/AdventOfCode.Core/Shared/Grid.cs +++ b/AdventOfCode.Core/Shared/Grid.cs @@ -4,6 +4,9 @@ { public List DataGrid { get; set; } = []; + public int Columns => DataGrid.Max(n => n.X); + public int Rows => DataGrid.Max(n => n.Y); + public Grid() { } public Grid(T[] data) => DataGrid.AddRange(data); @@ -12,17 +15,27 @@ public IEnumerable GetRow(int rowNumber) => DataGrid.Where(n => n.X == rowNumber); public IEnumerable GetColumn(int columnNumber) => DataGrid.Where(n => n.Y == columnNumber); + public T GetNode(int x, int y) => DataGrid.First(n => n.X == x && n.Y == y); + public IEnumerable FindWithValue(char toFind) => DataGrid.Where(n => n.Char == toFind); + + public void UpdateNode(T node) + { + T gridNode = DataGrid.First(n => n.X == node.X && n.Y == node.Y); + int nodeLocation = DataGrid.IndexOf(gridNode); + DataGrid[nodeLocation] = node; + } public IEnumerable GetNeighbors(T source, bool allowDiagonals = true) { - IEnumerable neighbors = DataGrid.Where(target => Math.Abs(source.X - target.X) <= 1 || Math.Abs(source.Y - target.Y) <= 1); + IEnumerable neighbors = DataGrid.Where(target => Math.Abs(source.X - target.X) <= 1 && Math.Abs(source.Y - target.Y) <= 1); if (allowDiagonals) { return neighbors; } - return neighbors.Where(target => !(Math.Abs(source.X - target.X) <= 1 && Math.Abs(source.Y - target.Y) <= 1)); + return neighbors.Where(target => (Math.Abs(source.X - target.X) <= 1 && source.Y == target.Y) + || (source.X == target.X && Math.Abs(source.Y - target.Y) <= 1)); } public IEnumerable GetSection(int fromX, int fromY, int toX, int toY) diff --git a/AdventOfCode.Core/Shared/Grid/IntersectHelpers.cs b/AdventOfCode.Core/Shared/Grid/IntersectHelpers.cs new file mode 100644 index 0000000..dfb1f82 --- /dev/null +++ b/AdventOfCode.Core/Shared/Grid/IntersectHelpers.cs @@ -0,0 +1,35 @@ +namespace AdventOfCode.Core.Shared.Grid +{ + internal static class IntersectHelpers + { + public static bool Intersect(Point one, Point two) + { + if (one == null || two == null) return false; + + return one.X == two.X && one.Y == two.Y; + } + + public static bool Intersect(Line line, Point point) + { + if (line == null || point == null) return false; + + if (point.Y != line.Start.Y) return false; + + return point.X >= line.Start.X && point.X <= line.End.X; + } + + public static bool Intersect(Line one, Line two) + { + if (one == null || two == null) return false; + + if (one.Start.Y != two.Start.Y) return false; + + // sort the lines so testing is easier + (Line first, Line second) = one.Start.X <=two.Start.X ? (one, two) : (two, one); + + return Intersect(first, second.Start) // is the start point of the other line in this line + || Intersect(first, second.End) // is the end point of the other line in this line + || (first.Start.X <= second.Start.X && first.End.X >= second.End.X); // is this line fully within the other line + } + } +} diff --git a/AdventOfCode.Core/Shared/Grid/Line.cs b/AdventOfCode.Core/Shared/Grid/Line.cs index fee585b..e265780 100644 --- a/AdventOfCode.Core/Shared/Grid/Line.cs +++ b/AdventOfCode.Core/Shared/Grid/Line.cs @@ -11,42 +11,16 @@ namespace AdventOfCode.Core.Shared.Grid { public Point Start { get; set; } = start; public Point End { get; set; } = end; + public long Length => End.X - Start.X + 1; public string Value { get; set; } = string.Empty; + public Line(long X, long Y, long length, string value = "") : this (new Point(X, Y), length, value) { } + public Line(Point start, long length, string value = "") : this(start, length) => Value = value; public Line(Point start, long length) : this(start, new Point (start.X + length - 1, start.Y)) { } - public Line(Point start, long length, string value) : this(start, length) => Value = value; - /// - /// This intersect assumes that the line horizontal. - /// Vertical may need to be added later - /// - /// The point search in this line. - /// - public bool Intersect(Point point) - { - if (point == null) return false; + public bool Intersect(Point point) => IntersectHelpers.Intersect(this, point); - if (point.Y != Start.Y) return false; - - return point.X >= Start.X && point.X <= End.X; - } - - /// - /// This intersect assumes that the line horizontal. - /// Vertical may need to be added later - /// - /// The line to seach in this line. - /// - public bool Intersect(Line line) - { - if (line == null) return false; - - if (line.Start.Y != Start.Y) return false; - - return Intersect(line.Start) // is the start point of the other line in this line - || Intersect(line.End) // is the end point of the other line in this line - || (line.Start.X <= Start.X && line.End.X >= End.X); // is this line fully within the other line - } + public bool Intersect(Line line) => IntersectHelpers.Intersect(this, line); public override string ToString() { diff --git a/AdventOfCode.Solutions/2023/Day 05/Day05.cs b/AdventOfCode.Solutions/2023/Day 05/Day05.cs index 647ef8f..de2b1f9 100644 --- a/AdventOfCode.Solutions/2023/Day 05/Day05.cs +++ b/AdventOfCode.Solutions/2023/Day 05/Day05.cs @@ -61,6 +61,8 @@ namespace AdventOfCode.Solutions._2023 public async Task GetSolutionPart2() { + return string.Empty; + List data = new(await _inputReader.ReadAsArrayString()); int stringSeperator = data.IndexOf(SeedSoil) + 1; @@ -83,7 +85,7 @@ namespace AdventOfCode.Solutions._2023 long lowestLocation = long.MaxValue; for(int index = 0; index < seedData.Length / 2; index++) { - ranges.Add(new Line(new Point(seedData[index], 0), seedData[index + 1])); + ranges.Add(new Line(seedData[index], 0, seedData[index + 1])); } return lowestLocation.ToString(); @@ -101,11 +103,11 @@ namespace AdventOfCode.Solutions._2023 .Select(long.Parse) .ToArray()) .Select(values => - new InOutMapper { - DestinationStart = values[0], - SourceStart = values[1], - Range = values[2] - }) + new InOutMapper ( + destinationStart: values[0], + sourceStart: values[1], + range: values[2] + )) .ToList(); } @@ -115,6 +117,32 @@ namespace AdventOfCode.Solutions._2023 return mapper != null ? location + mapper.Delta : location; } + private static Line[] GetTargetLocation(List mapping, Line[] seedRange) + { + List resultRanges = []; + for (int seedRangeIndex = 0; seedRangeIndex < seedRange.Length; seedRangeIndex++) + { + Line currentSeedRange = seedRange[seedRangeIndex]; + InOutMapper[] mappers = [.. mapping.Where(mapping => mapping.Intersect(currentSeedRange)).OrderBy(map => map.SourceStart)]; + if (mappers.Length == 0) + { + // I do not expect to hit this but just to be sure. + resultRanges.Add(currentSeedRange); + } + + if (mappers[0].Start.X > currentSeedRange.Start.X) + { + + } + } + + // merge the parts + + return [.. resultRanges]; + } + + + private class SeedLocationMapper { public long Seed { get; set; } @@ -134,17 +162,27 @@ namespace AdventOfCode.Solutions._2023 public long Location { get; set; } } - private class InOutMapper + private class InOutMapper : Line { - public long SourceStart { get; set; } + public long SourceStart => base.Start.X; public long DestinationStart { get; set; } - public long Range { get; set; } + public long Range => base.Length; public long Delta => DestinationStart - SourceStart; - public bool Intersect (long value) => value >= SourceStart && value < SourceStart + Range; + public bool Intersect(long value) => base.Intersect(new Point(value, 0)); + + public InOutMapper(long sourceStart, long destinationStart, long range) : base(sourceStart, 0, range) + { + DestinationStart = destinationStart; + } + + public override string ToString() + { + return $"Dest start: {DestinationStart}, Source start: {SourceStart}, Range: {Range}"; + } } } } \ No newline at end of file diff --git a/AdventOfCode.Solutions/2023/Day 10/Day10.cs b/AdventOfCode.Solutions/2023/Day 10/Day10.cs new file mode 100644 index 0000000..1881898 --- /dev/null +++ b/AdventOfCode.Solutions/2023/Day 10/Day10.cs @@ -0,0 +1,154 @@ +using AdventOfCode.Core; +using System.Linq.Expressions; + +namespace AdventOfCode.Solutions._2023 +{ + public class Day10(InputReader reader) : IChallange + { + private InputReader _inputReader = reader; + + public async Task GetSolutionPart1() + { + Grid grid = await _inputReader.ReadToGrid(); + return GetLoop(grid).Max(p => p.Steps).ToString(); + } + + public async Task GetSolutionPart2() + { + Grid grid = await _inputReader.ReadToGrid(); + _ = GetLoop(grid); // marks all the pipes from the main loop + + int inside = 0; + + for (int rowIndex = 0; rowIndex < grid.Rows; rowIndex++) + { + char prevSegment = '.'; + int pipesCrossed = 0; + for (int columnIndex = 0; columnIndex < grid.Columns; columnIndex++) + { + // filter the special cases that need checking + Pipe value = grid.GetNode(columnIndex, rowIndex); + + if (value.Steps >= 0) // this is in the main loop + { + if (value.Char == '-') // never crosses, also to not update prev + continue; + + if ((prevSegment == 'L' && value.Char == '7') // this is L7 meaning that there is no crossing + || prevSegment == 'F' && value.Char == 'J') // this is FJ meaning that there is no crossing + { + prevSegment = value.Char; + continue; + } + + prevSegment = value.Char; + pipesCrossed++; + continue; + } + + if (pipesCrossed % 2 == 1) // inside the main loop + inside++; + } + } + + return inside.ToString(); + } + + private List GetLoop(Grid grid) + { + Pipe startPipe = grid.FindWithValue('S').First(); + startPipe.Steps = 0; + + Pipe[] lineToWalk = grid.GetNeighbors(startPipe, false) + .Where(n => n.Char != '.') + .Where(n => n.GetNeighbors().Any(np => np.X == startPipe.X && np.Y == startPipe.Y)) + .ToArray(); + + for (int i = 0; i < lineToWalk.Length; i++) + lineToWalk[i].From = startPipe; + + List mainLoop = [startPipe]; + + int steps = 1; + while (true) + { + + List nextLoop = []; + foreach (Pipe line in lineToWalk) + { + line.Steps = steps; + + // update the pipe in the grid with the steps + grid.UpdateNode(line); + mainLoop.Add(line); + // get the pipe location + Pipe next = line.GetNextPipe(); + + // get the actual pipe from the grid + next = grid.GetNode(next.X, next.Y); + if (next.Steps != -1) + { + return mainLoop; + } + next.From = line; + + nextLoop.Add(next); + } + lineToWalk = [.. nextLoop]; + steps++; + } + } + + public class Pipe : Node + { + public Pipe From { get; set; } + + public int Steps { get; set; } = -1; + + public Pipe GetNextPipe() + { + if (From == null) + throw new ArgumentException("From not set"); + var neighbors = GetNeighbors(); + return neighbors.First(n => n.X != From.X || n.Y != From.Y); + } + + public IEnumerable GetNeighbors() + { + switch (Char) + { + case '|': + yield return GetNorth(); + yield return GetSouth(); + yield break; + case '-': + yield return GetWest(); + yield return GetEast(); + yield break; + + case 'L': + yield return GetNorth(); + yield return GetEast(); + yield break; + case 'J': + yield return GetNorth(); + yield return GetWest(); + yield break; + case '7': + yield return GetSouth(); + yield return GetWest(); + yield break; + case 'F': + yield return GetSouth(); + yield return GetEast(); + yield break; + } + } + + private Pipe GetNorth() => new() { X = this.X, Y = this.Y - 1 }; + private Pipe GetSouth() => new() { X = this.X, Y = this.Y + 1 }; + private Pipe GetWest() => new() { X = this.X - 1, Y = this.Y }; + private Pipe GetEast() => new() { X = this.X + 1, Y = this.Y }; + } + } +} \ No newline at end of file diff --git a/AdventOfCode.Solutions/2023/Day 10/day-10-input.txt b/AdventOfCode.Solutions/2023/Day 10/day-10-input.txt new file mode 100644 index 0000000..9ecf7d8 --- /dev/null +++ b/AdventOfCode.Solutions/2023/Day 10/day-10-input.txt @@ -0,0 +1,140 @@ +F-FJ--L7.FFJ..F--7FLF77FL7-77|7FF7--L-|.|FJJ7.L-L|7F-F.F7FF7-FF7L---7.|7|-F--|7FF7J7FJ7F7--L7FF---LL7F-7777.F7.L-|7FJF|7.F7FFF-77FJ.|F77F-77 +F7LLJJJLLJ|JFL7JLLF.|FFJ|LL7F-7LJL7.|.|F-J7F-77.||-LJLJ.L7F-7|LJF777.FL7F-|7-J7--JLJ|LJJ..L|.JJFJ.FL-7FLFF-F-7-L|LFJ.FJFFFJ-LL-77L--FL|L||.| +F77||-F7-F-7-.L|.-7--J|F-FJL7F|.7LJ-F--|J---JL|--|.L--7|F|JLFJF-FJL-7-|-JFL|F|F7.|.|L-.FF--LLJF-J.L.L7-J|LF|-|-FJF---|LLJJF--J7L--7-7-|--|F| +|-JJF7JL.JFL7|.F-7|7.-JF7.-JL7L||L|7J.L.|7L|L|L-7.FJ|LJFJJF7|FJJL7J-|-L7.||LJJ.F7JF-LJL-|J7.|7|..-J7LJJLL--F.-7L-.J.FL7FJFJ.7L|7|-J||L7.FL7| +J77LF7JJL--JJ||JFFLJ7LFJ7|J7.F-F|.||LF.FF7||-|-F-L7|F7|L--FJ|7J-7J.LL7|7-|77|-F-F7||--7FF-FJ7--7.|.|7JFJ.||L77F|-|---7.F|F|7L77F7..||LLLF--J +L|F77J|F-7..LFL7J-F.|.L-7J--LL--JJ77.F7F||F7|F7-.|F7777-7-LLJ|7.|-77L7J-.FJ|--7|.-J|.|FF77|J|L|F.F7-|||J|.|||LJJ-L7|LL7F-J-.J.LF|J-F---J|-|J +||JJL7--J|-F-7JJ.|JFF-|-JJFL.L.L7|F77LF7||||FJ||7F||-FFF--77LJF---J7.LJFFL-|LJL-J--7F|7||-L-J-F|7.|LF---F-L|7LLF-J---FJJF-7-JJ7|LJJ.|LLLLF-J +LJL7.-7L7|FJLJLJ.|F||.L7FFL-7|-FF7|L-7|LJLJ|L7L-7|||F7L|F-J7-L|77|L7-7|FF.LJJLJ7|JLJ-F-J|.LFJ.JJ-FL-L|J-L-J|J7L|7J||.L|||-F7|F7-77FF-J-F|L|- +JJL|FL7.|L7-|7J.F-F-LF-FF7-F77F7||L-7|L-7F-J.|F-J-||||7||F-77J.|-7.JF-7.|-F7.LL7..|JLL-7|7J|--.LF-J7L-7FLF7L7L-LF7|77FFLJ.|L-|J7|F|JL7.-JJ.| +|.77FJ|FFJ|LL--7.LJ7-F-FJL7||FJLJL77||F7||F77||FF7|LJ|F||L7|77FL7|.|F7|F|LL|7..L7FJ7-LL||LF77JF77JLLFJ77-J77L|7..LJ77FJFFLJF7.F|77L--LJ.J.-7 +|7L-7F|-JFJ7J-L|.|.|-LLL7FJ|||F---JFJ||||||L7|L-J||F-JF|L7||F77-LJF-F7-FJF-LJF|LJFJ7F-.|L-J|F7F7J7F7||||.LJ-JJL.7-|-F7.|7-L|JJ.-JLFJFJ77FJ.F +F--7FJ|.FLFF-F-JF-|J-LLL||FJLJL-7F7L7||||LJFJ|F--J||JF7L7||LJ|F7J-FJ.|-F77F77F7-F|J.|--L7F-J||||JLFF7LLJ7-7L7.|---LLJJFJ---L7JF|L-7-||F-F.FF +F-JL7J-F-JL|7F7J7LF77J.FJ|L---7FJ||FJ||LJF7L-JL--7||FJL7|LJF-J|L7F777JF||LJJF||-F-7F77LFJ|-FJ||L7JL|L7J.|LJFJFJLL-F7|JFJJ7FLF-FF-7|7-LJL|--L +JJL|LJFJ-7-|FF-77L|L-7FJFJF--7|L7||L7LJF7|L------J||L7FJ|F-J|JL7L7F-7LF|L7JJFJL7L7|||F7L7L7|FJ|FJ7FL7|LF7JF|.LJJ--F-7F|-|-L--JLJ-F7|-|FF|LFJ +|J-FJ-7.LF7F7L7|.FL-7|L7L7L-7|L7LJL7|F7|LJF--7F-7FJ|FJL-JL--7-FJFJ|FJ-FJFJJ-L7FJFJ||||L7L7LJL7|L7FF-JL7-.FF--JF7-|LJ.7JL-.|7|FJ|-F-L..7F|-|7 +|7-|LJL7.|LJ|FJL-7FFJ|FJFJF7|L7L--7|LJ||F7L-7||FJL7LJF------J-L7L7|L-7L7L-77FJ|LL7|||L7|-|F--JL7L7L-7FJ.F-7J..L-.|-|7LJ.L|JF-JF|LJ7L77L-JLL- +J7FLJ.F-7L-7||F--J-L7|L7L7|||FJJF7|L7FJLJL7FJ||L7FJF7L7F---7|JLL7LJF-JLL-7L7L7L7-|||L7|L-J|-F-7L7|F-JL-7L7L7F777|-J|7|7|.||L|L7|7F-|.77|J--7 +LJ7.|FL7L-7|LJL7.F77||JL7||LJL7FJ|L7||F---J|FJ|FJL-J|FJ|F--J7.FFL7FJF-7F7|FJLL7|FJ|L7||F-7L7L7|F||L7F-7|FJFJ||7-||--|LFJLJ---7|F-7LLFL7J.|F| +7JF-|||L-7|L-7FJFJ|FJL--J|L7F7|L7|FJ||L7F7FJ|FJ|-F7FJL-J|..F7F-7FJ|FL7||LJL7F7|||FJFJ|||FJFJFJL7||FJL7LJL7L-JL7.FL7JF7L7||L7FJFLJJ|.7-|||-F| +L-JLLLLJFJL7FJ|JL7|L7F--7L7LJ|L7|||FJ|FJ|LJFJL7|FJ|L7F-7L-7||L7|L7L7FJ|L-7FJ|||||L7|FJLJL7L-JF-J||L-7L-7F|F---J7|L|-|L77-L7L7|FL7F7.|FJ-F.FJ +|F---7JFL-7|L7L7FJ|7LJF-JFJF7L7LJ||L7||7|F-JF-J|L7|7||-L--J|L7||FJFJL7|7FJ|FJLJLJFJ||F7F7L7F-JF7|L7FJF-JFJL-7F7F77|L|FJJ-||.LJ-L-JJ-J77-LJ|. +-L.L7|JLF7|||L7|L7|-F7L-7L7||FJF7LJFJ|L-JL7|L-7L7||FJL7F7F7|FJ||L7L7FJL-JFJL----7|FJLJLJ|J|L--J|L7||FJ.FJF--J||||F7FJL7|FF7-|JJ.LJ7LJJFF|-F. +.L7F-JLFJLJL--JL7||FJ|F7|FJ||L-JL7FJFJF7F7|F-7L7LJ|L7FJ|||LJL7|L7L7|L--7FJF---7||LJF----JFJF-7FJFJ||L7FL7|F7||||||SL-7L-7||.||FFL7L-|.F-F.-7 +-7LLL|7L7F-7F7F7LJ|L7|||||7||-F--JL-JFJLJLJ|FJ|L7FJFJL7|||F-7||FJ7||F--JL7L7F-JFJF7|F--7FJFJ|LJ-L7||FJF7|||L7|||||||FJF-J|L-7-J.L|L7JF|JLJ.| +FL7-FF--J||LJLJL-7|FJLJLJL-JL7L--7F--JF7-FFJL7F-JL7|F-J|LJL7LJ||F-J|L---7|FJL-7L7|LJ|F-JL7L-7F--7||||J|||||FJ|LJLJL-JFJ-FJF-JJ|7.LFJ.FLJ-|77 +|JL7J|F-7|F------JLJF7F-----7|F7FJL---JL7FJF-JL-7FJ||F-JF--J7FJ||F-JF7F-JLJF--JFJL7||L7F7|F-J|F7LJ||L7|LJLJL-JF7F----JF-JFJF77J-|LJ-|JL7.-.| +|.F|7LJFJ|L7F7F7F---JLJF----JLJLJF7F----JL7L-7F7||7||L-7L-7F7L7||L7-||L-7F-JF-7L-7L7L7LJ||L-7LJL-7||FJ|F------J|L-7F7||F-JFJL7J.|7.7J7J|7L-7 +|-F-|L|L-J|LJ||LJF7|F7JL--7F----7|LJ|F7F7-|F7||||L-JL7FJF-J||FJ|L7|FJ|F7|L7FJFJF7L7|FJF7LJF-JF-7FJLJ|J||F7F--7|L--J|L7|L7FJF-JJF77.|L|.L7-7J +|.J||.-J|LLF7LJF-J|FJL----JL7F--J|JF-JLJL7LJ||||L---7||FJF7|LJFJFJ|L7||||FJL7|FJ|FJ|L7||F7L-7L7|L--7L7|||||F7|F7.F7L7|L7LJFJF-7LF77LFL|-77.. +|7||J.|-JFL|L-7L-7|L---7F-7FJL--7L7|F----JF-JLJL7F-7|LJL7||L-7L7L7L7|LJ|||F7||L7|L7L7LJLJ|F-JFJ|F--JFJ|||LJ|LJ||FJL7|L7|F-JJ|FJ7|L7.-7||.|.| +F-7|.F7FLFLL-7L--JL----J|FJ|F---JFJ||JF7F7L--7F-J|FJ|F--J||F7L7L7L7|L-7|||||||FJL7|FJF7LFJL--JFJL--7|-|||F-JF7||L7FJ|FJ||FF7||F7L7|77J-77-FJ +7.FJFF-J.--J||F7F7F7F7F-JL7|L--7FJL|L7|LJL7F7|L7FJ|FJL--7|||L7L7L7|L7FJLJ|||||L-7LJL7|L7L7F---JF7F-JL7|||L--JLJ|FJL7|L7|L-JLJLJL-JL-7LLJJF-L +LJJJ.LJ--|7-FLJLJ||||||F--J|F-7||F7|FJL-7FJ|||FJ|FJL7F--J||L7L7L7|L7||F7FJ|||L7FJF--JL7|FJL7F77||L7F-J|LJF---7FJL7FJ|FJ|F--7F-7F----J7-|F|F| +FJ---.|||LJF-JF--J|||LJL---JL7LJLJLJ|F7FJL7||||FJL7FJ|F-7|L7L7|FJ|FJ|LJ||FJ||FJL7L7F7FJ|L-7||L7||FJL-7|F-JF7-LJF7||FJL7||F7LJ|LJF---7J.-L.-J +|.LJ|L7-|JJFJLL--7|LJF-------JF7F7F7|||L7FJ||||L-7|L7|L7||FJF||L7||FJF7|||FJ||F7|FJ||L7|F7|||FJ||L7F-J||F-JL7|FJ||||F-J||||F---7|F--J7.LL-|J +LL.LFLLJL7FJ|F---J|F-JF7F----7|LJLJ||||FJL7||||F7|L7||FJ||L7FJ|FJ|||FJLJ||L7|||||L7|L7|||||||L7||FJ|F7|||F--JFJFJ||||F-JLJLJF--J||F7F77-|L|7 +F|FF7JLF|F7J-L--7FJ|F-JLJF---J|F---JLJ||F-J|||LJ|L7|||L7||FJL7||FLJ|L--7||FJ||||L7LJJ||LJ||LJFJ||L7||LJLJL--7L7|FJLJLJF----7|F7FJLJLJL7.|-|7 +JF|7J|-7|-FJJ.F-JL7||F---JF-7FJL7F--7-LJL-7||L-7L7|LJ|FJLJL7FJ|L7F-JF--J||L7|LJ|FJF--JL-7||F-JFJ|FJLJF------JFJ||F-7F7|LF-7|||LJF-7F--J-L.|. +L7|J.--||.LJJ7L---JLJL7F-7|FJL7FJ|F-JF--7FJ|L-7|-|L7J||F77FJ|LL7||F7L--7||FJ|F-J|FJF7F7FJLJ|F7|FJL-7FJF-----7L7LJL7||||FJFJLJ|F-J|LJFL7.L|J| +LLL.|JLFF7L7FF---7F-7JLJFJ|L--JL-JL--JF-JL7L-7LJFJFJFJLJL7L7|F-J|LJ|F7FJ||L7|L--JL7|LJ|||F-J|||L7F7||FJF----J-|F--JLJLJ|FJF7FJL----7-L|-LJ|. +J.FF7J.LL---JL--7|L7L-7.L-JF7F7F------JF7.L7FJF7L7L7|F7F7|LLJL-7|F-J|LJF|L7|L7F---J|F-JL7L7FJ||.LJLJLJ.L--7F-7|L---7F--JL7|||F7F7F-JF7J.|FFJ +.L7L-JLJLL-|FF--J|FJF7L7F-7||||L----7F-JL7FJL-JL7|FJ||LJ|L7F---J|L-7L-7FJFJ|FJL7F7FJL7F-J.LJF|L7F-7F-7F---J|FJ|F---JL-7F-J||||LJLJF7F7F77JJ. +F-L-7FL.FJF77L--7|L-J|FJL7LJ|||F----J|F7FJL-7F7FJLJFJL-7|FJ|F---JF-JF7|L-J|LJF7||||F-JL-----7L7|L7|L7|L----JL-JL-7F7F7|L7FJLJL7|F-JLJLJ|7|F7 +|||-J-JLF7|L7F7FJL7F7|L7JL-7|||L-7F--J|||7F7LJ|L-7LL7F-J|L7LJF---JF7|LJF----7|LJ||||F7F7F7F-J.||7||FJL------7F--7LJLJLJFJ|F--7L7|F-----J||-| +FF7-J-F||||FJ||L-7LJ||FJF7FJLJL7|LJF--JLJFJL7FJF7|F-JL7FJFJF-JF7F7||L--JF---J|F7||||||||||L--7||FJLJF-7F---7|L-7|F--7F7L-JL-7L-J|L-7F--7JJ-J +L-7.LLF-JLJL-J|LFJF7LJL-J|L--7FJF7FJF7F7FJF-JL-J|||F7FJL7L7|F-JLJ||L-7F7L---7LJ||||||||LJ|F--JLJL7F7|FJ|F--J|F7||L-7LJ|F-7F-JF--JF-J|F-JJ|.| +7L|-F-L7F7F--7L7L-JL----7|F--JL-J|L-JLJLJFJF7F-7|||||L7FL7|LJ|F7.|L7FJ|L7F--JF-J|LJLJ|L-7||F-7F--J|LJL-JL--7LJLJ|F7L-7||FJL--JF--JF7|L-7F|F7 +JJL-L7.LJ||F-JFJF7F7F--7||L-7F--7|F-7F7F7L-JLJFJLJ||L-JF7LJLF-JL-JFJ|FJFJ|F-7L-7L7F--JF7||LJFJ|F--J|F7F----JF7LFJ|L7FJ||L7F--7L--7|LJF7L---7 +|.L77LFF7LJ|F7L-JLJLJF7LJL-7LJF7||L7LJLJL7F--7L--7LJF-7||LF7L7F-7FJFJL7L7LJFJF-JFJL-7FJ||L7FJJLJF7F7||L--7F-JL7L7L7|L7||FJL7FL7F7LJF-JL----J +F77LFJF||7LLJL------7|L---7|F7||||-L----7LJF7L--7L--JFJ|L7|L-J|FJ|-L7FJJL7FJ-L7FJF--JL7LJ|LJF7FFJLJLJL--7LJF--J7|FJL-JLJL7FJF7LJL-7L7F7||.L| +LLJ-FF7||7FF7FF--7F7LJF--7|LJLJLJL----7FJF-JL-7-|F---J7L7LJF7FJL7L7FJ|.F7|L--7|L7L--7FJF7F7FJL-JF7F7F7F7L--JF--7|L----7F-JL-JL---7L-J|L-77J| +..|.FJLJ|F-JL-JF7LJ|F7|F7LJF--7F7F-7F7LJJ|F--7L7|L--7F7FJF7|||F-JFJL7L-J||F7FJL-JF--JL-JLJ|L7F7FJLJLJLJL----JF-JL-----J|F7F-7F--7L---JF7|JF7 +-7F7L-7FJL-----JL-7LJLJ||F-JF-J||L7LJL7FFJL77|FJL-7FJ|LJFJ|||||F7|F7|F7FJ|||L7F--JF7F7F---JFJ|LJF---------7F7L--------7LJ||FJL-7|F-7F7|LJ-J| +FF|L--JL-7F-------JF7F7||L7-L--JL-JF-7L-JF7L7|L-7|LJFJF7|.||LJ|||LJ||||L7||L7|L7F7||||L7|F7L-JF7L---7F---7LJL7F-7F---7L-7LJL7F-J|L7||LJ7|L-7 +|.L-----7|L7F-----7|LJLJL-JF-------J7|F7FJL-J|F7L--7L7|||FJL7FJ||F-J|||FJLJ.||FJ||||||FJFJL--7||F7F7LJF-7L7F-JL7|L--7L--JF-7|L-7|FJ|L-7JJ|J. +LLLF---7||.LJFF7F7LJF-7F7F7L--7F----7|||L---7|||F--JF||LJL-7|L-J|L-7|||L--7FJ|L7||||||L7|F--7LJLJLJ|F7L7|FJL--7||F--JF---JFJL7FJ|L7L-7|7F-.J +F|-L--7|||F7|FJLJL7LL7|||||F7FJ|F---J||L-7F-JLJ|L---7LJF-7JLJF--JF7|||L7F7|L7|FJ|||||L7|LJF7L-7F7F7LJL7||L-7F7LJ|L--7|F-7FJF7|L7L7L-7LJ7J.7J +L-F---JLJ|||FJF-7FJF7|LJLJLJ|L-JL---7||F7LJF7F7L----JF7|FJF7FJF7FJ|||L7LJ|||||L7|LJ|L7||F-JL--J|||L--7LJL-7LJL7FJF-7LJL7LJF||L-J-L7FJ7LJ.-L- +.LL7F7F-7LJ|L7|FJL-JLJF-7F-7L-------JLJ||JFJ||L7F7F--JLJL-J||FJ|L7||L7|LFJL7||FJL-7|FJLJL-7F-7FJ||F--JF--7L---JL-JFJF-7L7F7||F---7LJJ|-|F|F| +|.L||LJ7L-7L7LJL----7FJFJ|JL--7F7F-7F7J|L7|FJ|FJ||L7F--7F7FJLJFJFJLJFJ|FJF7|LJL7F7|||F----JL7||FJ|L-7FJF-JF---7F-7L7|7L7LJLJLJF7FJJ|.F-7-F-F +|FFLJFF7F7|FJ-F-----J|FJFJF7F7||LJ-LJL7L7LJL-JL-JL-JL-7LJ||F7|L7|J-LL7||FJLJJ.LLJ||LJL-----7|||L-JF7LJFJF-JF--J|FJFJL-7L7F7F--J|L7JF||LFJ|L| +FLFF7FJLJLJ|F7L---7F7|L-JFJLJLJ|F7F---JJ|F-7F7F7F-7F-7L-7LJ|L7-LJJ7.|LJ|L7-|7L-LFJL7F------J|||F--JL--JFJF-JF7FJL7L---J.LJ|L--7L-J7-77||.J.F +||FJ|L7F7F7|||F7F7LJ|L7F-JF----J||L----7||F||LJ|L7|L7L7FJF7|FJ7-|-7-|JF|FJ.LJLFLL--JL---7F7FJ||L------7|FJF7|||F-JF-7F7F77L7F7L7|JJLL|-7JL-J +|-L7L-J||||LJLJLJL--JFJL7FJF----JL----7LJL7|L-7L-JL-JFJL-JLJL77L-J..JFFLJF7JL-F-F-----7-LJLJ7||F-----7LJL7|||||L-7|FJ|LJL-7|||FJ777JF|7F..L| +|FL|F-7|LJL-7F7F-7F7FJF-JL7L7F-7F----7|F7FJL--JF----7L--7F--7L7J..F|LF|777L77..FL7F7F7L7F7.F7LJL----7L---J|LJLJF-J|L7|F--7|||||F777.L|-|F--L +FFLLJLLJLF--J||L7||LJFL7F-JFJ|FJ|F---JLJ|L-----JF7F7L7F7LJF7L-J.J77..||-7|J.F-7L-LJLJL7LJL-JL7|F7F7.L-----JF7F7L-7|FJ|L-7LJLJLJ|L-77.|.LL7|J +L|J|JLLJLL-7FJ|FJ||F-7F|L-7L7||FJL-----7|F-7F-7FJLJL7LJL--JL---7JL-.FF|7J.77-.|.||.LF-JF7F--7|FJLJ|F7F--7F7|LJL-7LJL-JF-JF---7FJF-JF-77--J7| +.|.L|7F7LF7LJFJ|FJ|L7L-JF-JFJ|LJF------J||LLJ.||JF7|L7F-7F7F-7FJ7.L-77LJ|.||FFJFL-F7L-7|LJF-JLJF-7|||L-7||LJF7F7L7F7F7L--JF7FJ|FJFFJFJ7..FL- +.F-FJFLF7|L-7|FJL-JFL7F7L7JL-J|FJF---7F7LJF7F7LJFJL-7|L7||||-LJL77JFLJ7L----7JLL7.|L--JL7-L----JFJLJL--JLJF7|||L7||||L----JLJFJL7FJFJJL7.FJJ +F|.7JF-|LJF7LJ|F7F7F7||L-JF7JF7L7|F--J||F-JLJL--JF7FJ|FJ|||L7|.L.F.-7J|FFF7L|JLLF7L-----JF---7F-JF7F---7F7|||LJFJLJLJF7F7|F7JL-7||FJ|F7LJ7|. +LJ-F-|J|F7|L7FJ||||||LJJF7||FJL-J|L7F7||L7F7F7F7FJLJ-LJ.||L7|77.FLJ7|FJ7F---FJ|J||F7.F7F7L--7LJF7|LJF-7||LJLJF7L7F7F7||||FJL77FJLJL-7JJLL777 +.|.LF-.LJLJ|LJJ|LJ|||F--JLJLJF7F7|LLJLJL-J|LJLJ|L7F7F--7|L7LJ-F777L77--FL---J.|.|LJL-JLJ|7F7L--JLJF7L7|LJF7F7||FJ|LJ||LJLJF7L-JF7F--JL|-LL|7 +-77F7-|LLLF----JF7LJ|L7F7F-7FJLJLJF------7L7F7FL7LJLJF-JL-J-J.L---FJJ|LJ..|..F|FL7F7F--7|FJL------JL-JL--JLJLJLJJ|F-JL-7F-JL-7FJLJ7||7JJF..| +.LLLJF-7|FL-7F7FJ|F7L-J||L7LJF7F7-L----7|L7LJL-7|F7F-JF7-|F77F7|||.|-7J|7.J-|7FF7||||F-JLJF7F7F7F--7F7F7F--7FF7F7|L--7FJL---7|L---7-|7FF77JJ +F.F|LJF|-FF-J|||J||L7F-JL-JF-JLJL-----7L7L|F7F7|LJ|L--JL--7|FFJ-7J.F---7F|JF7-FJ|LJLJL7F-7|||||LJF7||||||F-JFJLJLJF--JL7F---JL7F--J-F7-LJ||7 +LL||JLLJ.FJF7|||FJ|FJ|F---7L7F-------7L7L7LJLJ|L-7|F7F-7F-J--7.LJ-7JLJFFJ7-L|JL7L77LF-J|FJ||||||FJLJ|LJLJ|F-JF7F7FJF7LFJL----7LJ7F-7||J|-L-| +.JJ|J||F.L-J||||L-JL7|L7F7L7LJF7|F---JJ|FJF7F7L--JLJ|L7LJF7F|.F.F-|LF--L-|-||.FL7|7FJF7|L7|LJLJFJF-7|F---JL7FJ|||L-JL-JF-7F--JF-7|FJ|L--77FJ +F.F77.LJ.|FFJ|||F7F-JL7LJ|FJF-JL-JF---7|L-JLJL-7.F77L-JF7|L77|77|LF--FJ|7J.F--F-J|F|FJLJLLJF--7L-JJ||L-----JL7||L7F7F7FJ7|L-7FJFJ|L-JF-7L7J. +77..L7|---FL7|LJ||L---JFFJL7L-----JF--J|F------JFJ|F7F-JLJFJ7|.F7L||.||F7.F7|JL-7L-J|7F7-F7L7FJF7F-J|F-7F----J||F||||||LFJF-JL7|FJF-7L7|FJLF +L7.-JFJ.FLF-J|F7||F7F7LFJF7L---7F--JF7FLJ7F----7L7||||F---J7--FJL-77FLJ.7FL77||LL---JFJL-J|FJL-J|L--JL7|L---7FJ|FJ|LJ|L7L7L---JLJFJLL-JLJ|FF +|J7.F7.L77L--J|LJ||LJ|FJFJL---7|L---JL7F7FJF-7FJFJLJLJL--7F77LF7JLFF7J|F-J-F777-FF---JF7F7LJF-7FJF7.F-JL--7FJL7|L7L-7|FJ-L7F-7F-7L-----7JLJ| +7.F7F|..|FJJF-JF7LJF7|L-JLF7F7|L-7F---J|LJFJ|LJFJF--7F---J|L7FJL7-FJL77LFJ|||F7.FL-7F-JLJ|F-JFJ|.||FJF-7F7LJF7LJFJF7||L-77|L7|L7L7F-7F-J7|.7 +7-LF7.FFL--FL--JL-7||L----JLJLJF7|L-7F7|F-JLF--JFJF7|||F7J|FJ|F-J7|F-JJ.|7-||||FF7LLJF7F7|L-7L7L-JLJFJFJ|L--JL-7|FJ|||F-JFJFJL7|FJL7|L7F-JF- +LL.|.F-L|J.F-7F7F7LJL----7F-7F7||L--J|||L--7|F--JFJ|LJFJL7||J|L--7||F7F7F7FJ||L7|L7F7||||L--JJL7F---JFL-JF-----J|L7|||L77L7L-7||L7FJL-J77F7. +.L|F7F||F-7L7||LJ|F-7-F7FJ|FJ|LJL--7FJLJF--J|L-7FJFJLFJF7||L7|F--J|||LJLJ|L7||FJL7||LJLJL--77F7LJLF7F7-F7L-7F7F7L-JLJL-JF7|F-JLJJ||77.LJL-|J +77.-|FL-L7L7|LJF7|L7|FJLJFJL-JF7F7JLJF--JF--JF-J|FJF7|FJLJ|FJ|L7F7|||F--7|FJ|||F7||L7F-7F-7L-JL7F-JLJL-JL--J|LJL-----7F7||||F---7|L7F7J|LL-J +LFJ.||JJ|L7LJF7||L-J|L---JF7JFJLJL--7L---JF--JF7|L-J||L7F7||7|FJ|LJ|||F7LJL7||||||L7LJ-LJ-L---7|L7F7F----7F-JF7F-7F-7LJ||LJLJF--JL-J7JL-7FL7 +L|.FFL7-7|L7FJLJL7F7L-7F-7||FJF7F7F7|F7F7FJF7F|LJF--J|FJ|LJL-JL7L-7||LJL7F7|||||||FJ|F--7.F7F7|L-J|LJF---J|F-J|L7LJ-L--JL-7F7L-7JJ|F77-L77JJ +--LJ.L|7F7FLJF--7LJ|F7LJFJ||L-JLJLJ|LJ|||L-JL-JF-JF7L||L|F-----JF-J||F--J|||||LJLJL-7|F7|FJLJ|L---JF-JF---JL-7L-J-F7F--7F7LJ|F-J7.77FJF-JJ7| +L7||7.LFJ|-F7L-7|F-J||F7L-JL-------JF7LJ|F7F--7L7FJ|FJ|FJL----7FJF7LJ|F7J|LJ||F7F--7|LJ|||F-7|F7FF7L--JF7F---JF---JLJF-J|L77LJF-7F-7LFJ7J.L7 +JJ.JLF|L7|F||LFJ|L--JLJL--------7F--JL-7|||L7|L-JL7||FJL7F----JL-JL-7LJL7L-7LJ|LJF7LJ|FJLJ|FJ|||FJL----JLJF--7|F-----JF7|FJF7-L7||FJL|.FJF|J +J.J.77LFJL-JL-JFJF7-F7F7F------7LJJF7F-J|||FJF-7F7||||F7|L---7F7F---JF-7L7FJF7L7L|L7F7|F-7|L7|||L---------JF7||L7F7F7FJLJL-JL7FJLJL7.|7.--|7 +|-LL7-7L7F-7F-7L7||FJ|||L-----7|-F-JLJF7LJLJJ|FJ|||LJ||||F---J||L---7L7L7|L-J|FJFJFJ||LJ|LJFJ|||JF-7F------JLJ|FJ|||||F--7F-7LJF7F7|FJJF|7JL +77.LL7||LJ7LJ|L7LJ|L7LJL---7F-JL7L----JL7F7-FJL7||L-7||LJL7F7F|L7F-7L7L7LJF7|||FJFJFJ||F7F7L7LJL7L7|L-------7FJL-JLJLJL-7LJJ|F7|LJLJJ------7 +LF-||F-7F7F-7F-JF7|JL---7F7|L--7L-------J|L7L7FJ|L7FJLJF--J||FJFJL7|-L7L7L||FJ|L7|7L7L7|||||L7F7L-JL--------J|F----7F7F7L--7|||L-7JFJ|JLJ|F- +F|--FL7LJ||FJL-7|LJF7-F7LJ||LF7|F7F7-F7F7L7|FJL-JFJL--7L7F7||L7|FFJL-7L7L7|LJFJFJL7FJFJ||||F7||L---7F7F------JL-7F7LJLJL---JLJ|F-JJF-7.7|F|| +F|JLLFL-7LJL7F-JL7FJL-J|F7||FJ|LJLJL7|LJ|||||F-7FJF7F7L7LJLJL7|L7L7F-JFJFJL-7L7L7FJL7|FJLJLJ|LJF7F7LJLJF7F---7F7LJL---------7F|L7F-77|-LLF7L +|.-7LF--JF-7LJF-7LJF7F7||||||FJFF-7FJL7FJFJLJL7||L||||F|F7F--JL7L-J|F7L7|7F7|FJFJL-7||L--7F-JF7|LJ|F7F7||L--7LJL-7F7F------7|FJFJ|FJJ|L|-LJJ +7FFFFL7F7|JL-7||L-7|LJ|LJLJLJL-7L7||LFJL-JF---J||FJLJL-J|LJF7F7L-7FJ||FJL7|LJL-JF7FJ||F--JL7FJ|L-7LJLJ||L---J|F7FJ|LJF----7LJL-JF||F--7-F-.| +LF-FJ|LJLJF--J|F--JL7FJF---7F-7L-J|L-JF7F-JF--7LJL-----7L7.|LJL7FJL-JLJF-JL-7F--JLJ.|||F--7|L7|F7|F7F7LJF--7F7||L-JF-JF---JF7F7F7|||F-J-L7F| +|LF7.F---7L--7|L--7FJL-JF--J|FJF-7L-7FJLJF7|F-JF--7F7F7L7L7|F--J|F7F-7FJF-7FJL7-F7F7||LJF7|L-JLJ|||LJL--JF-J|||L--7|F-JJF7FJLJLJLJ||||7JLF7. +JFLJFL--7|F--J|F-7LJ|F7FJF-7||FJJ|F7LJLF-J||L7LL-7LJLJL7|FJ||F-7LJLJFJL7L7|L-7|FJLJ||L7FJ|L---7FJLJF7F7F-JF7|||F--J||FF7|LJF-----7LJL--7J.FL +FJJLF7.FJLJF7FJL7L7F-JLJFJFJ|LJFFJ|L7F7L-7||FJF7LL----7|||FJLJFJF77FJF7L7||JFJ|L7F-JL7|L7|F7F7||7|FJ||||F-JLJLJL---JL7|||F-JF7F-7L7F---J.FJ7 +L|.LF7FL---JLJF7L7|L---7|LL-JF-7|FJFJ|L7FJLJ|FJL7F7F7FJLJ|L-7FJL||FJFJL-J||FJFJ-|L7F7|L7|||||||L7FJFJ||||F--7F7F--7F-J|LJL--JLJFJL||F-7J7..| +J.F.|7FF-7F7F7|L7||F-7JLJF7F7L7|LJFJ.|FJL--7||F-J||||L7F-JF7||F7||L7|F7F7||L7|F7|FJ|||FJ|||||||FJ|FJJ||LJL-7|||L-7|L--JF7F--7F7|.FJLJFJJ7F|J +|F7-FF7L7|||||L7|||L7|F7FJLJL-JL--JF7||F7F-J||L7FJ|||FJ|F7|||||LJ|FJ||||||L7||||||FJ||L7|LJ||LJL7||F7|L7F--J||L7FJL7F--J|L-7LJLJ-L7F7L7LL-|. +.||.||L-JLJ|||FJ||L-JLJ||F7F--7F--7|LJ|||L-7|L7|L7|||||LJLJ||||F-JL7||||LJFJ|LJ|||L7||F||7FJL--7||||||.|L-7J||FJ||FJL-7LL--JF7F7LLLJ|FJ7-J|F +FL77-L----7LJ|L7LJF-7F7LJ|||F-J|F-JL-7||L7FJL7|L7||||L--7F-J|||L7F-J|||L-7L7|F-J|L7|||FJL7L-7F7|||LJ||FJF7|FJ|L7|FJF--JF----JLJ|F--7LJJL-7LJ +-||F---7F7L-7L-JF7|JLJL7FJLJL7FJ|F7F7||L7|L-7|L7LJLJL7F-JL7FJ|||||F-J||F-JFJ||F7L7|||||F7|F-J||||L-7LJ|FJ||L7||||L7L--7L7F-----J|F-J..77F||7 +LLFL--7LJL--JF-7|LJF---J|F---J|FJ|||||L-J|F7|L7L-7|F-JL--7LJFJ|FJ||F-J||F7L7|LJL7|||LJLJ||L7FJ|||F7L7FJL7|L7|L7|L7L7F7L-JL----7FJL7.7F|7-7F| +F|JLF-JF--7F7L7||F-JF7F7||F--7|L7|||||7F-J||L7|F7|FJF7F--JF7L7|L7|||F-JLJL7|L7F-J|||F---J|FJL7||LJ|FJL7FJ|FJ|FJ|FJF||L7F7F---7LJF7|-L-F-FJJJ +-FFFL--JF-J|L7|||L--JLJ||LJF-J|FJ|||||FJF7|L7|||||L7||L---JL7|L7||LJL-7F-7||FJL-7|LJL7F7FJL-7||L7FJL7L||7LJFJ|7LJJFJ|FJ||L--7L7FJLJ7.F|J||F| +|LJ7JLF-JF7L7||LJF--7F-JL7FJF7||FJ|||||FJ|L7||||LJFJ||F7F7F-J|FJLJF---JL7||||F--JL7F7|||L--7|||FJ|F7|FJL--7L7L-7F7|FJL7|L7F-J|||LLL..F|--7JJ +J-LJLFJF-J|FJ||F-JF7LJF7FJ|FJ||||7||LJLJ7|FJ||LJF7L7||||||L7FJL--7L---7FJ|||||F--7|||LJL7F-J|||L7LJLJL7F--JJ|F7LJ|LJF7||FJ|FF7LJJ|LLLJJ7F77. +|.|L-L7|FFJL7||L-7||F7|||FJ|FJ||L7LJF---7|||||F-JL-J||||||FJL-7F7L7.F-J||LJLJ||F-JLJ|F7FJL7FJ||FJF7JF-JL---7LJL-7L7F|LJ|L7L-JL-7-F.J.LFFL-|7 +7J|.|JLJ-L7FJLJ-FJ|LJ||LJ|FJL7|L7|F7L--7||L7||L7F--7|||||||F--J||FJFJF7L----7|||F7F7LJ|L7FJL7||L-JL7L7F7F-7L--7J|FJFJF7L7|F7F--JF77.FF|J.L-| +|LF--7.LF-J||-|7L7|F-J|F-JL-7||FJLJ|F--JLJFJ|L7LJF-J|||||LJL7F7|LJFJFJL7F7F7||||||||F7|-|L-7||L7F7FJFJ||L7L---JFJ|L|FJ|FJ|||L---JL--7-|J.LLJ +7-|7.FJ|L-7L77LF-J||F-J|F7F7|LJ|F7FJL-7F7FJ-|FJF-JF7||||L-7FLJ|L-7L7L-7LJ||||||LJ||LJ|L7|F7|||FJ||L7L7|L7L----7L7L7LJJLJFJ|L7F7F7F7FJF|.L7J| +L7FJ7|.||-|FJF7L-7|||F-J|||LJF-J|LJJF7|||L7FJL7|F7|||||L7FJF--JF-J7|F-JF-J|LJ|L7F|L-7L-JLJLJ||L7|L-JFJL7|F----JFJFJJF---JFJL||||||LJFJJ-.||7 +LLJ-L--|77||FJL--J||||F-J||7FJF7L7|FJLJ|L-J|F-JLJLJ||LJF||FJF-7L7|FJL-7|F7|F-JFJFJF7L-7LF7JFJL7|L-7FJF7||L----7|FJ|.L---7L-7||||||-L|7|.F|FJ +7|...F-LF-LJ|F-7F7|||LJ7FJL7L7|L7L7L7F7L--7|L-7FF--JL--7|||FJFJFJFJF7FJ|||||F-JLL7||F7L7|L7|F7||F7|L7||||F7F7FJ||.77|.LLL7FJLJ||||FLLFJ7F-J| +LL.F7J.F77J-||LLJ||||LF-JF7|FJL7|FJ7||L7F-J|F7L7L7F7F--J||LJ|L7L7|FJ|L7||||||F7F7||||L7LJFJ|||||||L7||LJ||||LJ-LJ--7-|-|||L-7LLJ||7.LJ.F-|J| +--LJJ|.|J-J.LJ7J|LJLJJL7FJ||L7FJ|L-7||FJL7FJ|L-JF|||L--7||F---JFJ||FJFJ||LJ|LJLJ|||||FJF7|JLJLJ||L7||L7|||||7FFL7|L|7|JF-JF-J-|J|L7F7J.7JL-7 +|7||LJ.L||FF-L77|.LLJ-J|||LJFLJ.|F7||||F-JL7L-7F7LJL7F-J||L7F-7|7LJL7|FJL-7|F--7|||||L7||L----7||FJ||FJFJ||L-7--F7FJF||L--JJ.LJ|L-JJLF7-7|FJ +J-LL-L7L---J7|.J.F7.J7-||F------J|LJ||||F7FJF7LJ|F7FJL-7||FJ|FJL--7FJ|L7F7||L7.||LJ||FJ|L7F---JLJL7|LJ-L7|L--J|.LLJJLLJFFL-FL7L|J||.7J|.FF-L +|7|L-.L7L7|J|77.|-F7-F-|||F-7F--7L7FJ||||LJFJ|F-J|LJF-7||||FJL7F-7|L7|FJ|||L7L7||F-J|L7|FJL----7F7LJJ|L7LJ7.|J|7L-7LJ|LL77FJ-J|L-J--|-J.LLJ| +F--F-|LL-L||L7.F7FJ.|.|LJLJJ||JFJFJL-J|||F7|-|L-7|F7L7||LJ|L7FJ|FJL7||L7||L7|FJ||L7FJ|LJ|F7F---J||7LLJJ|LLJ-|.F7F-L--7.L77|J.FL-7F7.LF-7FFFJ +|.F7F777L|L--JFL-JFL-J77.F|L|L7L7|F--7||LJ||FJF-JLJ|FJ||F-JFJ|FJL7FJLJJLJ|FJLJFJL7LJF---J||L----JL7.||||F.|-|-LJJF|J.|7|L.F77F-7LF.LJJF7|-JL +.FJ|-|-7L7LL7JF-FL-7.LJJ-F7-L-JFJLJF-J||F-J|L7L--7FJL7||L-7L7LJF-JL--7F--JL-7FL-7|F-JF7F7||F--7F7FJ--|-7J.|7.|.|7FL.F|---FJ-L.FJ7|7|7FL7|..| +7.||7LL|J|F|F7.F||-|.-J..||-FF-JF7FJLFJ|L7FJ7|F7FJ|F7|||F-JFJF7L-7F--J|F-7F7L-7FJ||F-J||LJ|L7FJ|LJFJL|-L.FJJF-.|FL|J7L|J7FJJ|-|FJL-|F-.LLF7. +|FF|J--JLJLFL--J|L.J-JFF77|.FJF7||L77L7|LLJLFJ||||LJ||LJL7FJFJL--JL--7||FJ|L7FJ|FJLJ7FJL-7|FJL7L7F7-FF7L7.|.|-|JL-L.|JL7J7J.7-LL|..|J7FL7|J7 +|7L7J|-F.L7|.|7.|J-J7FJJ.|LFL7|LJL7|JLLJ7JF-JFJ|L7F-JL7JJ||F|F7F7F7F7|LJL7L7||FJL7F--JF7FJ|L-7L7LJL-7LJ-J-77J-L7JFL7JF7|LF--|F7.J.F||-|-LJ.7 +|JJJFJ.|7L|-L|77J.F.L|7LFJLFFLJ7JJLJJ7.LL-L7FJFJFJL7F7L7FLJ-LJ||||||LJ.|7|FJ||L--JL-7FJ||FJF-JLL7F-7|7L-L..||F|JL77L7LJ|.7|J|LJ7.F-FJFF7FFFF +|JJ.|JFL-7|J.L---7.FLLF7L.FJ7FL7L7-LLF7..L-|L7|FJ77LJL7L7F|FL7LJ||||-J-LFJL7|L7F----J|7LJL7|7FLFJL7LJ-JJ..-FJ.|---J|FJJ.FLF.L7.|.L|LJ|L|7||7 +JFF-77JL|LL7777.||-7J|L|7.-FJ-|JFL-FLL777JLL-J||--7|||L-J-|7.LLFJ|LJ-FL.L7FJL-JL---7FJ7JJF|L-7-L--J-J.|FF.||FF|.|.L-|-7-F.LF-J-FFJ|7.FJL-7J. +L|7JJFJFF7LJJL77FF7J7|LL7-LJJJ|.|7.JJLJ-J7.L|.||||LF|-.LJJ.L|..L-J||FJJFLLJJ..L7LJ7LJJ7.F-JF-J.JJL77|-FF|-7.L-L7|-FFL.|..|F-7J-JJ7LF7L7FLF7. +FJ7.F|FF-|.LF7F7-|J|-|FFL--|.F.|7LLJ.|LFL7-F|-LJ-L7.|.L-J-F7.-|.L.L-J7-77FLF|-|L.FJ7|7JFL-7L7|7|LL|L77J|JJFJ.L|7|-LFL7L77LJ.7.--|LJL7|F7J.L7 +.|||7JLF---F|FJJLJ7FF-|-.L-LJ---J.|F-7.7.|.F7.||F7LF|7|..-7|.LFJJF|7LL-J77-LJ-|J.FJ|FJ.L7LL-JJ--F.FLL.FL7F7J.L--F7--.-JFF7|F-7|F-J7.L-|JF77. +-F7||7|LFJ.LFL7|.FFJJFL-F.|.|-JJJLF|-||JL7F7|F--7-J||-L7-F7FFJ|JL7JF|.F-|7J|JF|J7J|L|JF7|JFLJ|.|LL|FF-FL7J7FJ|F-L|7|FL7.LF--J7LF-|.|J-|FJJ|7 +L.L|.L-LJ--JJ-FL---L-J--LLF--7J--LLJJF77LFJL--.LJJ--JJ-L.-JJJ7..L7L|J--J.J.|-|.L-7-LJ7JFJ.|J---L.L---.FJLJLJJL-|.L7-JJF7.FFJL-J.LL.L|7-LJ-JL \ No newline at end of file diff --git a/AdventOfCode.Solutions/AdventOfCode.Solutions.csproj b/AdventOfCode.Solutions/AdventOfCode.Solutions.csproj index db47f0a..5b0ba7c 100644 --- a/AdventOfCode.Solutions/AdventOfCode.Solutions.csproj +++ b/AdventOfCode.Solutions/AdventOfCode.Solutions.csproj @@ -12,6 +12,9 @@ + + Always + Always diff --git a/AdventOfCode.Solutions/day-00-input.txt b/AdventOfCode.Solutions/day-00-input.txt index 70c5595..fbc0300 100644 --- a/AdventOfCode.Solutions/day-00-input.txt +++ b/AdventOfCode.Solutions/day-00-input.txt @@ -1,3 +1,10 @@ -0 3 6 9 12 15 -1 3 6 10 15 21 -10 13 16 21 30 45 \ No newline at end of file +FF7FSF7F7F7F7F7F---7 +L|LJ||||||||||||F--J +FL-7LJLJ||||||LJL-77 +F--JF--7||LJLJ7F7FJ- +L---JF-JLJ.||-FJLJJ7 +|F|F-JF---7F7-L7L|7| +|FFJF7L7F-JF7|JL---7 +7-L-JL7||F7|L7F-7F7| +L.L7LFJ|||||FJL7||LJ +L7JLJL-JLJLJL--JLJ.L \ No newline at end of file diff --git a/AdventOfCode.Tests/2d-shapes/LineTests.cs b/AdventOfCode.Tests/2d-shapes/LineTests.cs new file mode 100644 index 0000000..0ce244f --- /dev/null +++ b/AdventOfCode.Tests/2d-shapes/LineTests.cs @@ -0,0 +1,76 @@ +using AdventOfCode.Core.Shared.Grid; + +namespace AdventOfCode.Tests._2d_shapes +{ + [TestFixture] + public class LineTests + { + private Line TestLine; + + [SetUp] + public void SetupLine() + { + TestLine = new Line(3, 1, 5); + } + + [Test] + public void LineInfrontDoesNotIntersect() + { + Line line = new Line(0, 1, 3); + + bool intersectResult = TestLine.Intersect(line); + + Assert.That(intersectResult, Is.False); + } + + [Test] + public void LineBehindDoesNotIntersect() + { + Line line = new Line(8, 1, 3); + + bool intersectResult = TestLine.Intersect(line); + + Assert.That(intersectResult, Is.False); + } + + [Test] + public void LineInfrontDoesIntersect() + { + Line line = new Line(0, 1, 4); + + bool intersectResult = TestLine.Intersect(line); + + Assert.That(intersectResult, Is.True); + } + + [Test] + public void LineBehindDoesIntersect() + { + Line line = new Line(7, 1, 3); + + bool intersectResult = TestLine.Intersect(line); + + Assert.That(intersectResult, Is.True); + } + + [Test] + public void LineInLineDoesIntersect() + { + Line line = new Line(4, 1, 2); + + bool intersectResult = TestLine.Intersect(line); + + Assert.That(intersectResult, Is.True); + } + + [Test] + public void LineOverLineDoesIntersect() + { + Line line = new Line(2, 1, 8); + + bool intersectResult = TestLine.Intersect(line); + + Assert.That(intersectResult, Is.True); + } + } +} diff --git a/AdventOfCode.Tests/2d-shapes/PointTests.cs b/AdventOfCode.Tests/2d-shapes/PointTests.cs new file mode 100644 index 0000000..fbccd32 --- /dev/null +++ b/AdventOfCode.Tests/2d-shapes/PointTests.cs @@ -0,0 +1,51 @@ +using AdventOfCode.Core.Shared.Grid; +using NUnit.Framework; + +namespace AdventOfCode.Tests._2d_shapes +{ + [TestFixture] + public class PointTests + { + [Test] + public void PointDoIntersectPoint() + { + Point one = new Point(0,0), two = new Point(0,0); + + bool doesIntersect = one.Intersect(two); + + Assert.That(doesIntersect, Is.True); + } + + [Test] + public void PointDoNotIntersectPoint() + { + Point one = new Point(0, 0), two = new Point(0, 1); + + bool doesIntersect = one.Intersect(two); + + Assert.That(doesIntersect, Is.False); + } + + [Test] + public void LineDoesIntersectPoint() + { + Point one = new Point(3, 1); + Line two = new Line(new Point(1, 1), 5); + + bool doesIntersect = two.Intersect(one); + + Assert.That(doesIntersect, Is.True); + } + + [Test] + public void LineDoNotIntersectPoint() + { + Point one = new Point(3, 1); + Line two = new Line(new Point(1, 2), 5); + + bool doesIntersect = two.Intersect(one); + + Assert.That(doesIntersect, Is.False); + } + } +} diff --git a/AdventOfCode.Tests/2d-shapes/RectangleTests.cs b/AdventOfCode.Tests/2d-shapes/RectangleTests.cs new file mode 100644 index 0000000..b9cc0c2 --- /dev/null +++ b/AdventOfCode.Tests/2d-shapes/RectangleTests.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdventOfCode.Tests._2d_shapes +{ + internal class RectangleTests + { + } +} diff --git a/AdventOfCode.Tests/AdventOfCode.Tests.csproj b/AdventOfCode.Tests/AdventOfCode.Tests.csproj new file mode 100644 index 0000000..2a0bf9c --- /dev/null +++ b/AdventOfCode.Tests/AdventOfCode.Tests.csproj @@ -0,0 +1,24 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + + + + + + + + + diff --git a/AdventOfCode.Tests/GlobalUsings.cs b/AdventOfCode.Tests/GlobalUsings.cs new file mode 100644 index 0000000..cefced4 --- /dev/null +++ b/AdventOfCode.Tests/GlobalUsings.cs @@ -0,0 +1 @@ +global using NUnit.Framework; \ No newline at end of file