feat: work on day 11 part 1

This commit is contained in:
Stevan Freeborn
2024-12-11 13:29:16 -06:00
parent 9862f894dd
commit 2ed18de263
3 changed files with 133 additions and 3 deletions
@@ -0,0 +1,25 @@
namespace PlutonianPebbles.Tests;
public class ObserverTests
{
private static readonly string[] ExampleInput = ["125", "17"];
[Test]
[MethodDataSource(nameof(BlinkTestCases))]
public async Task Blink_WhenCalled_ItShouldReturnExpectedValue(BlinkTestCase testCase)
{
var stones = testCase.Stones.Select(Stone.From).ToList();
var observer = Observer.Of(stones);
var result = observer.Blink(testCase.NumberOfBlinks);
await Assert.That(result).IsEqualTo(testCase.ExpectedLineOfStones);
}
public static IEnumerable<Func<BlinkTestCase>> BlinkTestCases()
{
yield return () => new(ExampleInput, 0, "125 17");
}
public record BlinkTestCase(string[] Stones, int NumberOfBlinks, string ExpectedLineOfStones);
}
+36
View File
@@ -0,0 +1,36 @@
namespace PlutonianPebbles.Tests;
public class StoneTests
{
[Test]
public async Task ToString_WhenCalled_ItShouldReturnEngravedValue()
{
var engravedValue = "0";
var result = Stone.From(engravedValue).ToString();
await Assert.That(result).IsEqualTo(engravedValue);
}
[Test]
[MethodDataSource(nameof(TransformTestCases))]
public async Task Transform_WhenCalled_ItShouldReturnStonedWithExpectedEngraving(TransformTestCase testCase)
{
var expected = testCase.TransformedValues.Select(Stone.From).ToList();
var result = Stone.From(testCase.EngravedValue).Transform();
await Assert.That(result).IsEquivalentTo(expected);
}
public static IEnumerable<Func<TransformTestCase>> TransformTestCases()
{
yield return () => new("0", ["1"]);
yield return () => new("1", ["2024"]);
yield return () => new("10", ["1", "0"]);
yield return () => new("99", ["9", "9"]);
yield return () => new("999", ["2021976"]);
}
public record TransformTestCase(string EngravedValue, List<string> TransformedValues);
}
+71 -2
View File
@@ -13,12 +13,81 @@ if (File.Exists(args[0]) is false)
}
var isPart2 = args.Length is 2 && args[1] is "part2";
var input = await File.ReadAllLinesAsync(args[0]);
var input = await File.ReadAllTextAsync(args[0]);
var stopwatch = new Stopwatch();
stopwatch.Start();
// TODO: Implement solution
var stones = input
.Split(" ", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)
.Select(Stone.From)
.ToList();
var observer = Observer.Of(stones);
var result = observer.Blink(25);
stopwatch.Stop();
Console.WriteLine($". ({stopwatch.ElapsedMilliseconds}ms)");
class Observer
{
private readonly List<Stone> _stones;
private Observer(List<Stone> stones)
{
_stones = stones;
}
public static Observer Of(List<Stone> stones) => new(stones);
public string Blink(int times)
{
if (times < 1)
{
return string.Join(" ", _stones);
}
return string.Empty;
}
}
record Stone
{
private readonly string _engravedValue;
private Stone(string engravedValue)
{
_engravedValue = engravedValue;
}
public static Stone From(string engraving) => new(engraving);
public List<Stone> Transform()
{
if (_engravedValue is "0")
{
return [new Stone("1")];
}
var hasOddNumberOfDigits = _engravedValue.Length % 2 is not 0;
if (hasOddNumberOfDigits)
{
var engravedNumber = int.Parse(_engravedValue);
var newEngravedValue = engravedNumber * 2024;
return [new(newEngravedValue.ToString())];
}
var middleIndex = _engravedValue.Length / 2;
var leftDigits = _engravedValue[..middleIndex].TrimStart('0');
var rightDigits = _engravedValue[middleIndex..].TrimStart('0');
return [new(leftDigits), new(rightDigits)];
}
public override string ToString()
{
return _engravedValue;
}
}