diff --git a/.github/workflows/build-2024.yml b/.github/workflows/build-2024.yml index ae2b65c..fcaf9ea 100644 --- a/.github/workflows/build-2024.yml +++ b/.github/workflows/build-2024.yml @@ -13,8 +13,21 @@ on: jobs: build: - - runs-on: ubuntu-latest + name: Build + strategy: + matrix: + kind: ['linux', 'windows', 'macOS'] + include: + - kind: linux + os: ubuntu-latest + target: linux-x64 + - kind: windows + os: windows-latest + target: win-x64 + - kind: macOS + os: macos-latest + target: osx-x64 + runs-on: ${{ matrix.os }} defaults: run: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..1bad79c --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,62 @@ +name: Publish +on: + release: + types: [published] + +jobs: + release: + name: Release + strategy: + matrix: + kind: ['linux', 'windows', 'macOS'] + include: + - kind: linux + os: ubuntu-latest + target: linux-x64 + - kind: windows + os: windows-latest + target: win-x64 + - kind: macOS + os: macos-latest + target: osx-x64 + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup dotnet + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.0.x + + - name: Build + shell: bash + run: | + # define the tag and name + tag= $(git describe --tags --abbrev=0) + + # tag without the v prefix + version= ${tag:1} + + release_name="Advent-of-Code-$tag-${{ matrix.kind }}" + + # build the 2024 + dotnet publish ./2024/Advent/Advent.csproj -c Release -r ${{ matrix.target }} -p:Version=$version -p:DebugType=None -p:DebugSymbols=false -o "$release_name" + + # Pack files + if [ "${{ matrix.target }}" == "win-x64" ]; then + 7z a -tzip "${release_name}.zip" "./${release_name}/*" + else + tar czvf "${release_name}.tar.gz" "$release_name" + fi + + # Delete output directory + rm -r "$release_name" + + - name: Publish + uses: softprops/action-gh-release@v1 + with: + files: "Advent-of-Code-*" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/2024/Advent.Tests/Commands/Day15CommandTests.cs b/2024/Advent.Tests/Commands/Day15CommandTests.cs index a3f5f11..23979fd 100644 --- a/2024/Advent.Tests/Commands/Day15CommandTests.cs +++ b/2024/Advent.Tests/Commands/Day15CommandTests.cs @@ -1,6 +1,5 @@ using Advent.Common.Commands; using Advent.Common.Settings; -using Advent.UseCases.Day15; using Spectre.Console.Cli; namespace Advent.Tests.Commands; @@ -27,7 +26,7 @@ public async Task Day15Command_Solves_Part1_Correctly() var command = new Day15Command(mockReader, console); var result = await command.ExecuteAsync( new CommandContext(_arguments, _remaining, "day15", null), - new Day15Settings { PartChoice = new(Part.Part1), Live = false, } + new LiveSettings { PartChoice = new(Part.Part1), Live = false, } ); result.Should().Be(0); console.Output.Should().Contain("Day 15 Part 1"); @@ -45,7 +44,7 @@ public async Task Day15Command_Solves_Part2_Correctly() var command = new Day15Command(mockReader, console); var result = await command.ExecuteAsync( new CommandContext(_arguments, _remaining, "day15", null), - new Day15Settings { PartChoice = new(Part.Part2), Live = false, } + new LiveSettings { PartChoice = new(Part.Part2), Live = false, } ); result.Should().Be(0); console.Output.Should().Contain("Day 15 Part 2"); diff --git a/2024/Advent.Tests/UseCases/FileReaderTest.cs b/2024/Advent.Tests/Common/FileReaderTest.cs similarity index 55% rename from 2024/Advent.Tests/UseCases/FileReaderTest.cs rename to 2024/Advent.Tests/Common/FileReaderTest.cs index 54ecd9e..8705714 100644 --- a/2024/Advent.Tests/UseCases/FileReaderTest.cs +++ b/2024/Advent.Tests/Common/FileReaderTest.cs @@ -1,6 +1,4 @@ -using Advent.UseCases; - -namespace Advent.Tests.UseCases; +namespace Advent.Tests.Common; public class FileReaderTest { @@ -8,20 +6,13 @@ public class FileReaderTest public async Task ReadInputAsync_ShouldReturnFileContent() { // Arrange - var filename = Path.GetRandomFileName(); - var filePath = Path.Combine(Path.GetTempPath(), filename); - var expectedContent = "Hello, World!"; - await File.WriteAllTextAsync(filePath, expectedContent); var fileReader = new FileReader(); // Act - var result = await fileReader.ReadInputAsync(filePath); + var result = await fileReader.ReadInputAsync("day1"); // Assert - Assert.Equal(expectedContent, result); - - // Cleanup - File.Delete(filePath); + result.Should().StartWith("99006 28305"); } [Fact] diff --git a/2024/Advent.Tests/IntegrationTests/CommandAppTests.cs b/2024/Advent.Tests/IntegrationTests/CommandAppTests.cs index c55f247..f86760a 100644 --- a/2024/Advent.Tests/IntegrationTests/CommandAppTests.cs +++ b/2024/Advent.Tests/IntegrationTests/CommandAppTests.cs @@ -1,11 +1,10 @@ -using Advent.UseCases; using Microsoft.Extensions.DependencyInjection; using Spectre.Console.Cli; using Spectre.Console.Cli.Extensions.DependencyInjection; namespace Advent.Tests.IntegrationTests; -public class CommandAppTests : IClassFixture +public class CommandAppTests { private readonly TestConsole _console = new(); private readonly FileReader _fileReader = new(); @@ -1185,12 +1184,3 @@ public async Task Day25Part1_IntegrationTest_Success() } #endregion } - -public class TestFixture -{ - public TestFixture() - { - // One-time setup goes here - Directory.SetCurrentDirectory("../../../"); - } -} diff --git a/2024/Advent/Advent.csproj b/2024/Advent/Advent.csproj index 455d663..c62ed2a 100644 --- a/2024/Advent/Advent.csproj +++ b/2024/Advent/Advent.csproj @@ -5,6 +5,8 @@ net9.0 enable enable + true + true @@ -22,5 +24,7 @@ - + + + diff --git a/2024/Advent/Commands/Day10Command.cs b/2024/Advent/Commands/Day10Command.cs index 27b285e..62dabfd 100644 --- a/2024/Advent/Commands/Day10Command.cs +++ b/2024/Advent/Commands/Day10Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day10; using Advent.UseCases.Day6; using Spectre.Console; @@ -13,7 +11,7 @@ public class Day10Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day10input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day6Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day11Command.cs b/2024/Advent/Commands/Day11Command.cs index 5fbc324..845fdd0 100644 --- a/2024/Advent/Commands/Day11Command.cs +++ b/2024/Advent/Commands/Day11Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day11; using Spectre.Console; using Spectre.Console.Cli; @@ -12,7 +10,7 @@ public class Day11Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day11input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day11Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day12Command.cs b/2024/Advent/Commands/Day12Command.cs index 9b855cc..98101ee 100644 --- a/2024/Advent/Commands/Day12Command.cs +++ b/2024/Advent/Commands/Day12Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day12; using Advent.UseCases.Day6; using Spectre.Console; @@ -13,7 +11,7 @@ public class Day12Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day12input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day6Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day13Command.cs b/2024/Advent/Commands/Day13Command.cs index 7d8010e..781b4c6 100644 --- a/2024/Advent/Commands/Day13Command.cs +++ b/2024/Advent/Commands/Day13Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day13; using Spectre.Console; using Spectre.Console.Cli; @@ -12,7 +10,7 @@ public class Day13Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day13input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day13Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day14Command.cs b/2024/Advent/Commands/Day14Command.cs index 45c9ad2..97d562b 100644 --- a/2024/Advent/Commands/Day14Command.cs +++ b/2024/Advent/Commands/Day14Command.cs @@ -1,4 +1,3 @@ -using Advent.Common; using Advent.Common.Commands; using Advent.UseCases.Day14; using Spectre.Console; @@ -11,7 +10,7 @@ public class Day14Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, Day14Settings settings) { - var input = await _reader.ReadInputAsync("../input/day14input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day14Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day15Command.cs b/2024/Advent/Commands/Day15Command.cs index 002c64e..995bf99 100644 --- a/2024/Advent/Commands/Day15Command.cs +++ b/2024/Advent/Commands/Day15Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day15; using Spectre.Console; using Spectre.Console.Cli; @@ -8,11 +6,11 @@ namespace Advent.Commands; public class Day15Command(IFileReader reader, IAnsiConsole console) - : AdventCommand(reader, console) + : AdventCommand(reader, console) { - public override async Task ExecuteAsync(CommandContext context, Day15Settings settings) + public override async Task ExecuteAsync(CommandContext context, LiveSettings settings) { - var input = await _reader.ReadInputAsync("../input/day15input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var choice = settings.PartChoice ?? PromptForPartChoice(); Day15Data data; diff --git a/2024/Advent/Commands/Day16Command.cs b/2024/Advent/Commands/Day16Command.cs index eec1cd1..65fb8e8 100644 --- a/2024/Advent/Commands/Day16Command.cs +++ b/2024/Advent/Commands/Day16Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day16; using Advent.UseCases.Day6; using Spectre.Console; @@ -13,7 +11,7 @@ public class Day16Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day16input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day6Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day17Command.cs b/2024/Advent/Commands/Day17Command.cs index 14289ca..46b3119 100644 --- a/2024/Advent/Commands/Day17Command.cs +++ b/2024/Advent/Commands/Day17Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day17; using Spectre.Console; using Spectre.Console.Cli; @@ -12,7 +10,7 @@ public class Day17Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day17input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day17Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day18Command.cs b/2024/Advent/Commands/Day18Command.cs index a7e9e83..b310eba 100644 --- a/2024/Advent/Commands/Day18Command.cs +++ b/2024/Advent/Commands/Day18Command.cs @@ -1,4 +1,3 @@ -using Advent.Common; using Advent.Common.Commands; using Advent.UseCases.Day18; using Spectre.Console; @@ -11,7 +10,7 @@ public class Day18Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, Day18Settings settings) { - var input = await _reader.ReadInputAsync("../input/day18input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day18Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day19Command.cs b/2024/Advent/Commands/Day19Command.cs index c098810..716ba07 100644 --- a/2024/Advent/Commands/Day19Command.cs +++ b/2024/Advent/Commands/Day19Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day19; using Spectre.Console; using Spectre.Console.Cli; @@ -12,7 +10,7 @@ public class Day19Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day19input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var (buildingBlocks, targets) = Day19Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day1Command.cs b/2024/Advent/Commands/Day1Command.cs index 581b986..57eb0ef 100644 --- a/2024/Advent/Commands/Day1Command.cs +++ b/2024/Advent/Commands/Day1Command.cs @@ -1,6 +1,5 @@ -using Advent.Common; +using System.Reflection; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day1; using Spectre.Console; using Spectre.Console.Cli; @@ -12,7 +11,7 @@ public class Day1Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day1input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day1Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day20Command.cs b/2024/Advent/Commands/Day20Command.cs index 628b249..c843789 100644 --- a/2024/Advent/Commands/Day20Command.cs +++ b/2024/Advent/Commands/Day20Command.cs @@ -1,4 +1,3 @@ -using Advent.Common; using Advent.Common.Commands; using Advent.UseCases.Day20; using Advent.UseCases.Day6; @@ -12,7 +11,7 @@ public class Day20Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, Day20Settings settings) { - var input = await _reader.ReadInputAsync("../input/day20input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day6Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day21Command.cs b/2024/Advent/Commands/Day21Command.cs index 7376f63..db44432 100644 --- a/2024/Advent/Commands/Day21Command.cs +++ b/2024/Advent/Commands/Day21Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day21; using Spectre.Console; using Spectre.Console.Cli; @@ -12,7 +10,7 @@ public class Day21Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day21input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day21Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day22Command.cs b/2024/Advent/Commands/Day22Command.cs index 160311e..ce8f949 100644 --- a/2024/Advent/Commands/Day22Command.cs +++ b/2024/Advent/Commands/Day22Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day21; using Advent.UseCases.Day22; using Spectre.Console; @@ -13,7 +11,7 @@ public class Day22Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day22input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day21Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day23Command.cs b/2024/Advent/Commands/Day23Command.cs index 3911edf..886de7a 100644 --- a/2024/Advent/Commands/Day23Command.cs +++ b/2024/Advent/Commands/Day23Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day23; using Spectre.Console; using Spectre.Console.Cli; @@ -12,7 +10,7 @@ public class Day23Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day23input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day23Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day24Command.cs b/2024/Advent/Commands/Day24Command.cs index a7a4a14..8debe5b 100644 --- a/2024/Advent/Commands/Day24Command.cs +++ b/2024/Advent/Commands/Day24Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day24; using Spectre.Console; using Spectre.Console.Cli; @@ -12,7 +10,7 @@ public class Day24Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day24input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day24Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day25Command.cs b/2024/Advent/Commands/Day25Command.cs index 5f93ff0..ec81210 100644 --- a/2024/Advent/Commands/Day25Command.cs +++ b/2024/Advent/Commands/Day25Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day25; using Spectre.Console; using Spectre.Console.Cli; @@ -12,7 +10,7 @@ public class Day25Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day25input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day25Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day2Command.cs b/2024/Advent/Commands/Day2Command.cs index e54f018..d5c011c 100644 --- a/2024/Advent/Commands/Day2Command.cs +++ b/2024/Advent/Commands/Day2Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day2; using Spectre.Console; using Spectre.Console.Cli; @@ -12,7 +10,7 @@ public class Day2Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day2input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day2Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day3Command.cs b/2024/Advent/Commands/Day3Command.cs index 0877969..c4599ef 100644 --- a/2024/Advent/Commands/Day3Command.cs +++ b/2024/Advent/Commands/Day3Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day3; using Spectre.Console; using Spectre.Console.Cli; @@ -12,7 +10,7 @@ public class Day3Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day3input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day3Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day4Command.cs b/2024/Advent/Commands/Day4Command.cs index f7aec0e..f9df9c8 100644 --- a/2024/Advent/Commands/Day4Command.cs +++ b/2024/Advent/Commands/Day4Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day4; using Spectre.Console; using Spectre.Console.Cli; @@ -12,7 +10,7 @@ public class Day4Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day4input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day4Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day5Command.cs b/2024/Advent/Commands/Day5Command.cs index 15cc8cb..31dc73a 100644 --- a/2024/Advent/Commands/Day5Command.cs +++ b/2024/Advent/Commands/Day5Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day5; using Spectre.Console; using Spectre.Console.Cli; @@ -12,7 +10,7 @@ public class Day5Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day5input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day5Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day6Command.cs b/2024/Advent/Commands/Day6Command.cs index 20c57bc..f162944 100644 --- a/2024/Advent/Commands/Day6Command.cs +++ b/2024/Advent/Commands/Day6Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day6; using Spectre.Console; using Spectre.Console.Cli; @@ -12,7 +10,7 @@ public class Day6Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day6input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day6Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day7Command.cs b/2024/Advent/Commands/Day7Command.cs index 874c7d0..ff818cc 100644 --- a/2024/Advent/Commands/Day7Command.cs +++ b/2024/Advent/Commands/Day7Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day7; using Spectre.Console; using Spectre.Console.Cli; @@ -12,7 +10,7 @@ public class Day7Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day7input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day7Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day8Command.cs b/2024/Advent/Commands/Day8Command.cs index f6b674d..9e3763e 100644 --- a/2024/Advent/Commands/Day8Command.cs +++ b/2024/Advent/Commands/Day8Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day6; using Advent.UseCases.Day8; using Spectre.Console; @@ -13,7 +11,7 @@ public class Day8Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day8input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day6Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Commands/Day9Command.cs b/2024/Advent/Commands/Day9Command.cs index 84a7715..ee57718 100644 --- a/2024/Advent/Commands/Day9Command.cs +++ b/2024/Advent/Commands/Day9Command.cs @@ -1,6 +1,4 @@ -using Advent.Common; using Advent.Common.Commands; -using Advent.Common.Settings; using Advent.UseCases.Day9; using Spectre.Console; using Spectre.Console.Cli; @@ -12,7 +10,7 @@ public class Day9Command(IFileReader reader, IAnsiConsole console) { public override async Task ExecuteAsync(CommandContext context, AdventSettings settings) { - var input = await _reader.ReadInputAsync("../input/day9input.txt"); + var input = await _reader.ReadInputAsync(context.Name); var data = Day9Parser.Parse(input); var choice = settings.PartChoice ?? PromptForPartChoice(); diff --git a/2024/Advent/Common/FileReader.cs b/2024/Advent/Common/FileReader.cs new file mode 100644 index 0000000..4168b4e --- /dev/null +++ b/2024/Advent/Common/FileReader.cs @@ -0,0 +1,32 @@ +using System.Reflection; + +namespace Advent.Common; + +public class FileReader : IFileReader +{ + private readonly Assembly _assembly; + + public FileReader() + { + _assembly = Assembly.GetExecutingAssembly(); + } + + public async Task ReadInputAsync(string day) + { + // Adjust file name to match embedded resource format + var resourceName = _assembly + .GetManifestResourceNames() + .FirstOrDefault(name => name == $"Advent.{day}input.txt"); + + if (resourceName == null) + throw new FileNotFoundException($"Resource {day} not found in embedded resources."); + + using var stream = + _assembly.GetManifestResourceStream(resourceName) + ?? throw new FileNotFoundException( + $"Resource stream for {day} not found in embedded resources." + ); + using var reader = new StreamReader(stream); + return await reader.ReadToEndAsync(); + } +} diff --git a/2024/Advent/Common/IFileReader.cs b/2024/Advent/Common/IFileReader.cs index 1f6bd82..2639ba6 100644 --- a/2024/Advent/Common/IFileReader.cs +++ b/2024/Advent/Common/IFileReader.cs @@ -2,5 +2,5 @@ namespace Advent.Common; public interface IFileReader { - Task ReadInputAsync(string path); + Task ReadInputAsync(string day); // eg. day1, day15, day25 } diff --git a/2024/Advent/UseCases/Day15/Day15Settings.cs b/2024/Advent/Common/Settings/LiveSettings.cs similarity index 65% rename from 2024/Advent/UseCases/Day15/Day15Settings.cs rename to 2024/Advent/Common/Settings/LiveSettings.cs index f27a840..c76a5f0 100644 --- a/2024/Advent/UseCases/Day15/Day15Settings.cs +++ b/2024/Advent/Common/Settings/LiveSettings.cs @@ -1,10 +1,9 @@ using System.ComponentModel; -using Advent.Common.Settings; using Spectre.Console.Cli; -namespace Advent.UseCases.Day15; +namespace Advent.Common.Settings; -public sealed class Day15Settings : AdventSettings +public sealed class LiveSettings : AdventSettings { [CommandOption("-l|--live")] [Description("Process the solution in real time")] diff --git a/2024/Advent/Extensions/GridCellExtensions.cs b/2024/Advent/Extensions/GridCellExtensions.cs index 38e5da6..9d8c87b 100644 --- a/2024/Advent/Extensions/GridCellExtensions.cs +++ b/2024/Advent/Extensions/GridCellExtensions.cs @@ -1,5 +1,3 @@ -using Advent.Common; - namespace Advent.Extensions; public static class GridCellExtensions diff --git a/2024/Advent/Extensions/ServiceCollectionExtensions.cs b/2024/Advent/Extensions/ServiceCollectionExtensions.cs index 8126ca2..7ce969d 100644 --- a/2024/Advent/Extensions/ServiceCollectionExtensions.cs +++ b/2024/Advent/Extensions/ServiceCollectionExtensions.cs @@ -1,5 +1,3 @@ -using Advent.Common; -using Advent.UseCases; using Microsoft.Extensions.DependencyInjection; using Spectre.Console; diff --git a/2024/Advent/Properties/usings.cs b/2024/Advent/Properties/usings.cs new file mode 100644 index 0000000..a33c932 --- /dev/null +++ b/2024/Advent/Properties/usings.cs @@ -0,0 +1,2 @@ +global using Advent.Common; +global using Advent.Common.Settings; diff --git a/2024/Advent/UseCases/Day10/Day10Part1Solver.cs b/2024/Advent/UseCases/Day10/Day10Part1Solver.cs index dc77ced..e01c391 100644 --- a/2024/Advent/UseCases/Day10/Day10Part1Solver.cs +++ b/2024/Advent/UseCases/Day10/Day10Part1Solver.cs @@ -1,5 +1,4 @@ using System.Diagnostics; -using Advent.Common; using Advent.UseCases.Day6; using Spectre.Console; diff --git a/2024/Advent/UseCases/Day10/Day10Part2Solver.cs b/2024/Advent/UseCases/Day10/Day10Part2Solver.cs index 192be3a..eedb688 100644 --- a/2024/Advent/UseCases/Day10/Day10Part2Solver.cs +++ b/2024/Advent/UseCases/Day10/Day10Part2Solver.cs @@ -1,5 +1,4 @@ using System.Diagnostics; -using Advent.Common; using Advent.UseCases.Day6; using Spectre.Console; diff --git a/2024/Advent/UseCases/Day12/Day12Part1Solver.cs b/2024/Advent/UseCases/Day12/Day12Part1Solver.cs index 01838a9..23f87fa 100644 --- a/2024/Advent/UseCases/Day12/Day12Part1Solver.cs +++ b/2024/Advent/UseCases/Day12/Day12Part1Solver.cs @@ -1,5 +1,4 @@ using System.Diagnostics; -using Advent.Common; using Advent.UseCases.Day6; using Spectre.Console; diff --git a/2024/Advent/UseCases/Day12/Day12Part2Solver.cs b/2024/Advent/UseCases/Day12/Day12Part2Solver.cs index 165953a..80df77d 100644 --- a/2024/Advent/UseCases/Day12/Day12Part2Solver.cs +++ b/2024/Advent/UseCases/Day12/Day12Part2Solver.cs @@ -1,5 +1,4 @@ using System.Diagnostics; -using Advent.Common; using Advent.UseCases.Day6; using Spectre.Console; diff --git a/2024/Advent/UseCases/Day14/Day14Data.cs b/2024/Advent/UseCases/Day14/Day14Data.cs index 5a3f4b4..1704204 100644 --- a/2024/Advent/UseCases/Day14/Day14Data.cs +++ b/2024/Advent/UseCases/Day14/Day14Data.cs @@ -1,4 +1,3 @@ -using Advent.Common; using Advent.Extensions; namespace Advent.UseCases.Day14; diff --git a/2024/Advent/UseCases/Day14/Day14Parser.cs b/2024/Advent/UseCases/Day14/Day14Parser.cs index 44e518c..29ea9d9 100644 --- a/2024/Advent/UseCases/Day14/Day14Parser.cs +++ b/2024/Advent/UseCases/Day14/Day14Parser.cs @@ -1,5 +1,3 @@ -using Advent.Common; - namespace Advent.UseCases.Day14; internal static class Day14Parser diff --git a/2024/Advent/UseCases/Day14/Day14Part1Solver.cs b/2024/Advent/UseCases/Day14/Day14Part1Solver.cs index b4f6dff..9c12c17 100644 --- a/2024/Advent/UseCases/Day14/Day14Part1Solver.cs +++ b/2024/Advent/UseCases/Day14/Day14Part1Solver.cs @@ -1,5 +1,4 @@ using System.Diagnostics; -using Advent.Common; using Spectre.Console; namespace Advent.UseCases.Day14; diff --git a/2024/Advent/UseCases/Day14/Day14Settings.cs b/2024/Advent/UseCases/Day14/Day14Settings.cs index 4fe8f94..353113c 100644 --- a/2024/Advent/UseCases/Day14/Day14Settings.cs +++ b/2024/Advent/UseCases/Day14/Day14Settings.cs @@ -1,5 +1,4 @@ using System.ComponentModel; -using Advent.Common.Settings; using Spectre.Console; using Spectre.Console.Cli; diff --git a/2024/Advent/UseCases/Day15/Day15Parser.cs b/2024/Advent/UseCases/Day15/Day15Parser.cs index a964f5d..d3dc8b5 100644 --- a/2024/Advent/UseCases/Day15/Day15Parser.cs +++ b/2024/Advent/UseCases/Day15/Day15Parser.cs @@ -1,5 +1,3 @@ -using Advent.Common; - namespace Advent.UseCases.Day15; internal readonly struct Day15Data diff --git a/2024/Advent/UseCases/Day15/Day15Part1Solver.cs b/2024/Advent/UseCases/Day15/Day15Part1Solver.cs index c3c5ac1..2e2dd2b 100644 --- a/2024/Advent/UseCases/Day15/Day15Part1Solver.cs +++ b/2024/Advent/UseCases/Day15/Day15Part1Solver.cs @@ -1,10 +1,9 @@ using System.Diagnostics; -using Advent.Common; using Spectre.Console; namespace Advent.UseCases.Day15; -internal class Day15Part1Solver(Day15Settings settings, IAnsiConsole console) : IDay15Solver +internal class Day15Part1Solver(LiveSettings settings, IAnsiConsole console) : IDay15Solver { GridCell _currentPosition = new(0, 0); Table? _liveTable = null; diff --git a/2024/Advent/UseCases/Day15/Day15Part2Solver.cs b/2024/Advent/UseCases/Day15/Day15Part2Solver.cs index 2b6b354..2663f7f 100644 --- a/2024/Advent/UseCases/Day15/Day15Part2Solver.cs +++ b/2024/Advent/UseCases/Day15/Day15Part2Solver.cs @@ -1,10 +1,9 @@ using System.Diagnostics; -using Advent.Common; using Spectre.Console; namespace Advent.UseCases.Day15; -internal class Day15Part2Solver(Day15Settings settings, IAnsiConsole console) : IDay15Solver +internal class Day15Part2Solver(LiveSettings settings, IAnsiConsole console) : IDay15Solver { GridCell _currentPosition = new(0, 0); Table? _liveTable = null; diff --git a/2024/Advent/UseCases/Day16/Day16Helpers.cs b/2024/Advent/UseCases/Day16/Day16Helpers.cs index 9f70fdf..91c4f14 100644 --- a/2024/Advent/UseCases/Day16/Day16Helpers.cs +++ b/2024/Advent/UseCases/Day16/Day16Helpers.cs @@ -1,5 +1,3 @@ -using Advent.Common; - namespace Advent.UseCases.Day16; internal class SearchState diff --git a/2024/Advent/UseCases/Day16/Day16Part1Solver.cs b/2024/Advent/UseCases/Day16/Day16Part1Solver.cs index ec6f504..fcd9857 100644 --- a/2024/Advent/UseCases/Day16/Day16Part1Solver.cs +++ b/2024/Advent/UseCases/Day16/Day16Part1Solver.cs @@ -1,5 +1,4 @@ using System.Diagnostics; -using Advent.Common; using Advent.UseCases.Day6; using Spectre.Console; diff --git a/2024/Advent/UseCases/Day16/Day16Part2Solver.cs b/2024/Advent/UseCases/Day16/Day16Part2Solver.cs index 7f97566..bea4642 100644 --- a/2024/Advent/UseCases/Day16/Day16Part2Solver.cs +++ b/2024/Advent/UseCases/Day16/Day16Part2Solver.cs @@ -1,5 +1,4 @@ using System.Diagnostics; -using Advent.Common; using Advent.UseCases.Day6; using Spectre.Console; diff --git a/2024/Advent/UseCases/Day18/Day18Helper.cs b/2024/Advent/UseCases/Day18/Day18Helper.cs index c6f2fc2..3525139 100644 --- a/2024/Advent/UseCases/Day18/Day18Helper.cs +++ b/2024/Advent/UseCases/Day18/Day18Helper.cs @@ -1,5 +1,3 @@ -using Advent.Common; - namespace Advent.UseCases.Day18; internal static class Day18Helper diff --git a/2024/Advent/UseCases/Day18/Day18Parser.cs b/2024/Advent/UseCases/Day18/Day18Parser.cs index db7a6a5..7f98e02 100644 --- a/2024/Advent/UseCases/Day18/Day18Parser.cs +++ b/2024/Advent/UseCases/Day18/Day18Parser.cs @@ -1,5 +1,3 @@ -using Advent.Common; - namespace Advent.UseCases.Day18; internal static class Day18Parser diff --git a/2024/Advent/UseCases/Day18/Day18Part1Solver.cs b/2024/Advent/UseCases/Day18/Day18Part1Solver.cs index 4a0613a..3eca838 100644 --- a/2024/Advent/UseCases/Day18/Day18Part1Solver.cs +++ b/2024/Advent/UseCases/Day18/Day18Part1Solver.cs @@ -1,5 +1,4 @@ using System.Diagnostics; -using Advent.Common; using Spectre.Console; namespace Advent.UseCases.Day18; diff --git a/2024/Advent/UseCases/Day18/Day18Part2Solver.cs b/2024/Advent/UseCases/Day18/Day18Part2Solver.cs index d874b5b..c9d4bc9 100644 --- a/2024/Advent/UseCases/Day18/Day18Part2Solver.cs +++ b/2024/Advent/UseCases/Day18/Day18Part2Solver.cs @@ -1,5 +1,4 @@ using System.Diagnostics; -using Advent.Common; using Spectre.Console; namespace Advent.UseCases.Day18; diff --git a/2024/Advent/UseCases/Day18/Day18Settings.cs b/2024/Advent/UseCases/Day18/Day18Settings.cs index d8ccaed..d705bf0 100644 --- a/2024/Advent/UseCases/Day18/Day18Settings.cs +++ b/2024/Advent/UseCases/Day18/Day18Settings.cs @@ -1,5 +1,4 @@ using System.ComponentModel; -using Advent.Common.Settings; using Spectre.Console; using Spectre.Console.Cli; diff --git a/2024/Advent/UseCases/Day18/IDay18Solver.cs b/2024/Advent/UseCases/Day18/IDay18Solver.cs index c0679d1..6bb2072 100644 --- a/2024/Advent/UseCases/Day18/IDay18Solver.cs +++ b/2024/Advent/UseCases/Day18/IDay18Solver.cs @@ -1,5 +1,3 @@ -using Advent.Common; - namespace Advent.UseCases.Day18; internal interface IDay18Solver diff --git a/2024/Advent/UseCases/Day20/Day20Settings.cs b/2024/Advent/UseCases/Day20/Day20Settings.cs index 499437a..3b3f8c2 100644 --- a/2024/Advent/UseCases/Day20/Day20Settings.cs +++ b/2024/Advent/UseCases/Day20/Day20Settings.cs @@ -1,5 +1,4 @@ using System.ComponentModel; -using Advent.Common.Settings; using Spectre.Console; using Spectre.Console.Cli; diff --git a/2024/Advent/UseCases/Day20/Day20Solver.cs b/2024/Advent/UseCases/Day20/Day20Solver.cs index b40f72d..a3a673a 100644 --- a/2024/Advent/UseCases/Day20/Day20Solver.cs +++ b/2024/Advent/UseCases/Day20/Day20Solver.cs @@ -1,6 +1,5 @@ using System.Collections.Concurrent; using System.Diagnostics; -using Advent.Common; using Advent.UseCases.Day18; using Advent.UseCases.Day6; using Spectre.Console; diff --git a/2024/Advent/UseCases/Day21/Day21Solver.cs b/2024/Advent/UseCases/Day21/Day21Solver.cs index 6673cab..b2b1f41 100644 --- a/2024/Advent/UseCases/Day21/Day21Solver.cs +++ b/2024/Advent/UseCases/Day21/Day21Solver.cs @@ -1,5 +1,4 @@ using System.Diagnostics; -using Advent.Common; using Spectre.Console; using Cache = System.Collections.Generic.Dictionary< (char currentKey, char nextKey, int depth), diff --git a/2024/Advent/UseCases/Day25/Day25Parser.cs b/2024/Advent/UseCases/Day25/Day25Parser.cs index 73e42d6..b7a78ee 100644 --- a/2024/Advent/UseCases/Day25/Day25Parser.cs +++ b/2024/Advent/UseCases/Day25/Day25Parser.cs @@ -1,5 +1,3 @@ -using Advent.Common; - namespace Advent.UseCases.Day25; internal static class Day25Parser diff --git a/2024/Advent/UseCases/Day25/Day25Part1Solver.cs b/2024/Advent/UseCases/Day25/Day25Part1Solver.cs index 2c9e7c5..7f95b14 100644 --- a/2024/Advent/UseCases/Day25/Day25Part1Solver.cs +++ b/2024/Advent/UseCases/Day25/Day25Part1Solver.cs @@ -1,5 +1,4 @@ using System.Diagnostics; -using Advent.Common; using Spectre.Console; namespace Advent.UseCases.Day25; diff --git a/2024/Advent/UseCases/Day25/Day25Part2Solver.cs b/2024/Advent/UseCases/Day25/Day25Part2Solver.cs index 575efba..81eab99 100644 --- a/2024/Advent/UseCases/Day25/Day25Part2Solver.cs +++ b/2024/Advent/UseCases/Day25/Day25Part2Solver.cs @@ -1,5 +1,3 @@ -using Advent.Common; - namespace Advent.UseCases.Day25; public class Day25Part2Solver : IDay25Solver diff --git a/2024/Advent/UseCases/Day25/IDay25Solver.cs b/2024/Advent/UseCases/Day25/IDay25Solver.cs index dc74938..083419e 100644 --- a/2024/Advent/UseCases/Day25/IDay25Solver.cs +++ b/2024/Advent/UseCases/Day25/IDay25Solver.cs @@ -1,5 +1,3 @@ -using Advent.Common; - namespace Advent.UseCases.Day25; internal interface IDay25Solver diff --git a/2024/Advent/UseCases/Day6/Day6Helpers.cs b/2024/Advent/UseCases/Day6/Day6Helpers.cs index 219b9dc..53b6434 100644 --- a/2024/Advent/UseCases/Day6/Day6Helpers.cs +++ b/2024/Advent/UseCases/Day6/Day6Helpers.cs @@ -1,5 +1,3 @@ -using Advent.Common; - namespace Advent.UseCases.Day6; internal static class Day6Helpers diff --git a/2024/Advent/UseCases/Day6/Day6Parser.cs b/2024/Advent/UseCases/Day6/Day6Parser.cs index 78da152..fad5afd 100644 --- a/2024/Advent/UseCases/Day6/Day6Parser.cs +++ b/2024/Advent/UseCases/Day6/Day6Parser.cs @@ -1,5 +1,3 @@ -using Advent.Common; - namespace Advent.UseCases.Day6; internal static class Day6Parser diff --git a/2024/Advent/UseCases/Day6/Day6Part1Solver.cs b/2024/Advent/UseCases/Day6/Day6Part1Solver.cs index 70a26ac..6700861 100644 --- a/2024/Advent/UseCases/Day6/Day6Part1Solver.cs +++ b/2024/Advent/UseCases/Day6/Day6Part1Solver.cs @@ -1,5 +1,4 @@ using System.Diagnostics; -using Advent.Common; using Spectre.Console; namespace Advent.UseCases.Day6; diff --git a/2024/Advent/UseCases/Day6/Day6Part2Solver.cs b/2024/Advent/UseCases/Day6/Day6Part2Solver.cs index 5d25a4c..2a123c2 100644 --- a/2024/Advent/UseCases/Day6/Day6Part2Solver.cs +++ b/2024/Advent/UseCases/Day6/Day6Part2Solver.cs @@ -1,5 +1,4 @@ using System.Diagnostics; -using Advent.Common; using Spectre.Console; namespace Advent.UseCases.Day6; diff --git a/2024/Advent/UseCases/Day6/IDay6Solver.cs b/2024/Advent/UseCases/Day6/IDay6Solver.cs index 1c5f40f..199dfd2 100644 --- a/2024/Advent/UseCases/Day6/IDay6Solver.cs +++ b/2024/Advent/UseCases/Day6/IDay6Solver.cs @@ -1,5 +1,3 @@ -using Advent.Common; - namespace Advent.UseCases.Day6; internal interface IDay6Solver diff --git a/2024/Advent/UseCases/Day8/Day8Part1Solver.cs b/2024/Advent/UseCases/Day8/Day8Part1Solver.cs index 418e851..298473f 100644 --- a/2024/Advent/UseCases/Day8/Day8Part1Solver.cs +++ b/2024/Advent/UseCases/Day8/Day8Part1Solver.cs @@ -1,4 +1,3 @@ -using Advent.Common; using Advent.UseCases.Day6; namespace Advent.UseCases.Day8; diff --git a/2024/Advent/UseCases/Day8/Day8Part2Solver.cs b/2024/Advent/UseCases/Day8/Day8Part2Solver.cs index 06f479d..7772b3c 100644 --- a/2024/Advent/UseCases/Day8/Day8Part2Solver.cs +++ b/2024/Advent/UseCases/Day8/Day8Part2Solver.cs @@ -1,4 +1,3 @@ -using Advent.Common; using Advent.UseCases.Day6; namespace Advent.UseCases.Day8; diff --git a/2024/Advent/UseCases/FileReader.cs b/2024/Advent/UseCases/FileReader.cs deleted file mode 100644 index dc886c3..0000000 --- a/2024/Advent/UseCases/FileReader.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Advent.Common; - -namespace Advent.UseCases; - -public class FileReader : IFileReader -{ - public async Task ReadInputAsync(string path) - { - return await File.ReadAllTextAsync(path); - } -}