ben
/
aoc
1
0
Fork 0

add some ext methods for Range

This commit is contained in:
Ben Harris 2022-12-04 21:37:27 -05:00
parent 0caf534d83
commit 20c93249bb
2 changed files with 27 additions and 11 deletions

View File

@ -58,6 +58,25 @@ public static class Extensions
public static bool Contains(this Range range, int i) =>
i >= range.Start.Value && i <= range.End.Value;
/// <summary>
/// Does <paramref name="r1"/> contain the entire range of <paramref name="r2"/>?
/// </summary>
/// <param name="r1"></param>
/// <param name="r2"></param>
/// <returns></returns>
public static bool Contains(this Range r1, Range r2) =>
r1.Start.Value <= r2.Start.Value && r1.End.Value >= r2.End.Value;
/// <summary>
/// Do <paramref name="r1"/> and <paramref name="r2"/> overlap?
/// </summary>
/// <param name="r1"></param>
/// <param name="r2"></param>
/// <returns></returns>
public static bool Overlaps(this Range r1, Range r2) =>
r1.Start.Value <= r2.End.Value && r1.End.Value >= r2.Start.Value &&
r2.Start.Value <= r1.End.Value && r2.End.Value >= r1.Start.Value;
/// <summary>
/// Creates a new BigInteger from a binary (Base2) string
/// <see href="https://gist.github.com/mjs3339/73042bc0e717f98796ee9fa131e458d4" />
@ -103,4 +122,4 @@ public static class Extensions
public static IEnumerable<KeyValuePair<TKey, TValue>> WhereValue<TKey, TValue>(
this IEnumerable<KeyValuePair<TKey, TValue>> source, Func<TValue, bool> func) =>
source.Where(pair => func(pair.Value));
}
}

View File

@ -5,22 +5,19 @@ namespace AOC2022;
/// </summary>
public sealed class Day04 : Day
{
private readonly List<List<int>> _ranges = new();
private readonly List<(Range r1, Range r2)> _ranges;
public Day04() : base(2022, 4, "Camp Cleanup")
{
foreach (var line in Input)
_ranges.Add(line.Split(',').SelectMany(q => q.Split('-')).Select(int.Parse).ToList());
_ranges = Input
.Select(line => line.Split(',').SelectMany(q => q.Split('-')).Select(int.Parse).ToList())
.Select(p => (new Range(p[0], p[1]), new Range(p[2], p[3])))
.ToList();
}
public override object Part1() =>
_ranges.Count(r =>
(r[0] >= r[2] && r[0] <= r[3] && r[1] >= r[2] && r[1] <= r[3]) ||
(r[2] >= r[0] && r[2] <= r[1] && r[3] >= r[0] && r[3] <= r[1]));
_ranges.Count(r => r.r1.Contains(r.r2) || r.r2.Contains(r.r1));
public override object Part2() =>
_ranges.Count(r => (r[0] >= r[2] && r[0] <= r[3]) ||
(r[1] >= r[2] && r[1] <= r[3]) ||
(r[2] >= r[0] && r[2] <= r[1]) ||
(r[3] >= r[0] && r[3] <= r[1]));
_ranges.Count(r => r.r1.Overlaps(r.r2));
}