add some ext methods for Range
This commit is contained in:
parent
0caf534d83
commit
20c93249bb
|
@ -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));
|
||||
}
|
||||
}
|
|
@ -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));
|
||||
}
|
Loading…
Reference in New Issue