ben
/
aoc
1
0
Fork 0
aoc/AOC2016/Day07.cs

52 lines
1.6 KiB
C#

namespace AOC2016;
/// <summary>
/// Day 7: <a href="https://adventofcode.com/2016/day/7"/>
/// </summary>
public sealed partial class Day07() : Day(2016, 7, "Internet Protocol Version 7")
{
[GeneratedRegex(@"\[[^\]]*\]")]
private static partial Regex BracketsRegex();
[GeneratedRegex(@"\[(\w*)\]")]
private static partial Regex InsideBracketsRegex();
private static bool SupportsTls(string input) =>
!InsideBracketsRegex().Matches(input).Any(m => CheckAbba(m.ValueSpan)) &&
BracketsRegex().Split(input).Any(v => CheckAbba(v));
private static bool CheckAbba(ReadOnlySpan<char> input)
{
for (var i = 0; i < input.Length - 3; i++)
{
if (input[i] == input[i + 3] &&
input[i + 1] == input[i + 2] &&
input[i] != input[i + 1])
return true;
}
return false;
}
private static bool SupportsSsl(string input)
{
foreach (var ip in BracketsRegex().Split(input))
foreach (var aba in CheckAba(ip))
foreach (var m in InsideBracketsRegex().Matches(input).Cast<Match>())
if (m.Value.Contains($"{aba[1]}{aba[0]}{aba[1]}"))
return true;
return false;
}
private static IEnumerable<string> CheckAba(string input)
{
for (var i = 0; i < input.Length - 2; i++)
if (input[i] == input[i + 2] && input[i] != input[i + 1])
yield return input.Substring(i, 3);
}
public override object Part1() => Input.Count(SupportsTls);
public override object Part2() => Input.Count(SupportsSsl);
}