From 86fda4a81f662eac7876bb72ec0295fc42ee200c Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Sat, 9 Dec 2023 12:17:56 -0600 Subject: [PATCH] feat: start working on part 1 solution --- .../OasisReportTests.cs | 35 +++++++++ 09/MirageMaintenance.Tests/UnitTest1.cs | 10 --- .../ValueHistoryTests.cs | 76 +++++++++++++++++++ 09/MirageMaintenance/Program.cs | 73 +++++++++++++++++- 4 files changed, 182 insertions(+), 12 deletions(-) create mode 100644 09/MirageMaintenance.Tests/OasisReportTests.cs delete mode 100644 09/MirageMaintenance.Tests/UnitTest1.cs create mode 100644 09/MirageMaintenance.Tests/ValueHistoryTests.cs diff --git a/09/MirageMaintenance.Tests/OasisReportTests.cs b/09/MirageMaintenance.Tests/OasisReportTests.cs new file mode 100644 index 0000000..13b68cc --- /dev/null +++ b/09/MirageMaintenance.Tests/OasisReportTests.cs @@ -0,0 +1,35 @@ +namespace MirageMaintenance.Tests; + +public class UnitTest1 +{ + [Theory] + [MemberData(nameof(TestData.OasisReportParseTestData), MemberType = typeof(TestData))] + public void Parse_GivenAReportInput_ItShouldReturnExpectedOasisReportInstance(string[] input, OasisReport expected) + { + OasisReport.Parse(input).Should().BeEquivalentTo(expected); + } + + public static class TestData + { + public static IEnumerable OasisReportParseTestData => + new List + { + new object[] + { + new string[] + { + "0 3 6 9 12 15", + "1 3 6 10 15 21", + "10 13 16 21 30 45", + }, + new OasisReport( + [ + new([0, 3, 6, 9, 12, 15]), + new([1, 3, 6, 10, 15, 21]), + new([10, 13, 16, 21, 30, 45]), + ] + ) + } + }; + } +} \ No newline at end of file diff --git a/09/MirageMaintenance.Tests/UnitTest1.cs b/09/MirageMaintenance.Tests/UnitTest1.cs deleted file mode 100644 index 561193c..0000000 --- a/09/MirageMaintenance.Tests/UnitTest1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MirageMaintenance.Tests; - -public class UnitTest1 -{ - [Fact] - public void Test1() - { - - } -} \ No newline at end of file diff --git a/09/MirageMaintenance.Tests/ValueHistoryTests.cs b/09/MirageMaintenance.Tests/ValueHistoryTests.cs new file mode 100644 index 0000000..e2c2e8f --- /dev/null +++ b/09/MirageMaintenance.Tests/ValueHistoryTests.cs @@ -0,0 +1,76 @@ +namespace MirageMaintenance.Tests; + +public class ValueHistoryTests +{ + [Theory] + [MemberData(nameof(TestData.CalculateDifferencesTestData), MemberType = typeof(TestData))] + public void CalculateDifferences_GivenAListOfValues_ItShouldReturnAListOfDifferences(List values, List expected) + { + new ValueHistory([]).CalculateDifferences(values).Should().BeEquivalentTo(expected); + } + + [Theory] + [MemberData(nameof(TestData.CalculateHistoryTest), MemberType = typeof(TestData))] + public void CalculateHistory_GivenAListOfValues_ItShouldReturnAListOfHistoricalValues(List values, List> expected) + { + new ValueHistory(values).CalculateHistory().Should().BeEquivalentTo(expected); + } + + public static class TestData + { + public static IEnumerable CalculateHistoryTest => + new List + { + new object[] + { + new List { 0, 3, 6, 9, 12, 15 }, + new List> + { + new() { 3, 3, 3, 3, 3 }, + new() { 0, 0, 0, 0 }, + }, + }, + new object[] + { + new List { 1, 3, 6, 10, 15, 21 }, + new List> + { + new() { 2, 3, 4, 5, 6 }, + new() { 1, 1, 1, 1 }, + new() { 0, 0, 0 }, + }, + }, + new object[] + { + new List { 10, 13, 16, 21, 30, 45 }, + new List> + { + new() { 3, 3, 5, 9, 15 }, + new() { 0, 2, 4, 6 }, + new() { 2, 2, 2 }, + new() { 0, 0 }, + }, + }, + }; + + public static IEnumerable CalculateDifferencesTestData => + new List + { + new object[] + { + new List { 0, 3, 6, 9, 12, 15 }, + new List { 3, 3, 3, 3, 3 }, + }, + new object[] + { + new List { 1, 3, 6, 10, 15, 21 }, + new List { 2, 3, 4, 5, 6 }, + }, + new object[] + { + new List { 10, 13, 16, 21, 30, 45 }, + new List { 3, 3, 5, 9, 15 }, + }, + }; + } +} \ No newline at end of file diff --git a/09/MirageMaintenance/Program.cs b/09/MirageMaintenance/Program.cs index 3751555..3a825bd 100644 --- a/09/MirageMaintenance/Program.cs +++ b/09/MirageMaintenance/Program.cs @@ -1,2 +1,71 @@ -// See https://aka.ms/new-console-template for more information -Console.WriteLine("Hello, World!"); +namespace MirageMaintenance; + +class Program +{ + public static async Task Main(string[] args) + { + return await Task.FromResult(0); + } +} + +public class OasisReport( + List valueHistories +) +{ + public List ValueHistories { get; init; } = valueHistories; + + public static OasisReport Parse(string[] oasisReportInput) + { + var valueHistories = new List(); + + foreach (var line in oasisReportInput) + { + var values = line + .Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries) + .Select(long.Parse) + .ToList(); + + var valueHistory = new ValueHistory(values); + valueHistories.Add(valueHistory); + } + + return new OasisReport(valueHistories); + } +} + +public class ValueHistory( + List values +) +{ + List Values { get; init; } = values; + + public List CalculateDifferences(List values) => Enumerable + .Range(0, values.Count - 1) + .Select(i => values[i + 1] - values[i]) + .ToList(); + + public List> CalculateHistory() + { + var allHistoricalValues = new List>(); + var currentValues = Values; + + while ( + allHistoricalValues.Count is 0 || + allHistoricalValues.Last().Sum() is not 0 + ) + { + var historicalValues = CalculateDifferences(currentValues); + allHistoricalValues.Add(historicalValues); + currentValues = historicalValues; + } + + return allHistoricalValues; + } + + public long CalculateNextValue() + { + var historicalValues = CalculateHistory(); + var values = historicalValues.Prepend(Values).ToList(); + return 0; + } +} \ No newline at end of file