ben
/
aoc
1
0
Fork 0

2023 day 4
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Ben Harris 2023-12-04 00:57:53 -05:00
parent 9e162a4688
commit 7a9d1e2224
2 changed files with 30 additions and 19 deletions

View File

@ -9,7 +9,7 @@ public class Test2023
[DataRow(typeof(Day01), "54331", "54518")]
[DataRow(typeof(Day02), "2476", "54911")]
[DataRow(typeof(Day03), "522726", "81721933")]
[DataRow(typeof(Day04), "20117", "")]
[DataRow(typeof(Day04), "20117", "13768818")]
public void CheckAllDays(Type dayType, string part1, string part2) =>
Common.CheckDay(dayType, part1, part2);
@ -17,7 +17,7 @@ public class Test2023
[DataRow(typeof(Day01), "142", "142")] // unfortunately p2 example is different
[DataRow(typeof(Day02), "8", "2286")]
[DataRow(typeof(Day03), "4361", "467835")]
[DataRow(typeof(Day04), "13", "")]
[DataRow(typeof(Day04), "13", "30")]
public void CheckTestInputs(Type dayType, string part1, string part2) =>
Common.CheckDay(dayType, part1, part2, true);
}

View File

@ -5,33 +5,44 @@ namespace AOC2023;
/// <summary>
/// Day 4: <a href="https://adventofcode.com/2023/day/ 4"/>
/// </summary>
public sealed class Day04() : Day(2023, 4, "Scratchcards")
public sealed class Day04() : Day(2023, 4, "Scratchcards")
{
private IEnumerable<(int id, List<int> winningNums, List<int> drawnNums)> _cards;
private readonly Dictionary<int, Card> _cards = [];
public override void ProcessInput()
{
_cards = Input.Select(line =>
foreach (var line in Input)
{
var s = line.Split(": ");
var s = line.Split(": ", 2);
var id = int.Parse(s[0].Replace("Card ", ""));
var s2 = s[1].Split('|');
var f = s2[0].Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
var g = s2[1].Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
return (id, f.Select(int.Parse).ToList(), g.Select(int.Parse).ToList());
});
var s2 = s[1].Split('|', 2);
var f = s2[0].Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)
.Select(int.Parse).ToList();
var g = s2[1].Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)
.Select(int.Parse).ToList();
_cards[id] = new(f, g);
}
}
public override object Part1() =>
_cards.Sum(c =>
{
var count = c.winningNums.Intersect(c.drawnNums).Count();
if (count == 0) return 0;
return Math.Pow(2, count - 1);
});
public override object Part1() => _cards.Values.Sum(c => c.Score);
public override object Part2()
{
return "";
var current = 1;
while (_cards.ContainsKey(current))
{
for (var matchExtension = 1; matchExtension <= _cards[current].Matches; matchExtension++)
_cards[current + matchExtension].Copies += _cards[current].Copies;
current++;
}
return _cards.Values.Sum(v => v.Copies);
}
private record Card(List<int> WinningNums, List<int> DrawnNums)
{
public int Copies { get; set; } = 1;
public int Matches => WinningNums.Intersect(DrawnNums).Count();
public int Score => (int)Math.Pow(2, Matches - 1);
}
}