-
Notifications
You must be signed in to change notification settings - Fork 10
/
Day11.cs
95 lines (81 loc) · 2.3 KB
/
Day11.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
using AdventOfCode.CSharp.Common;
using System;
using System.Text;
namespace AdventOfCode.CSharp.Y2015.Solvers;
public class Day11 : ISolver
{
public static void Solve(ReadOnlySpan<byte> input, Solution solution)
{
ReadOnlySpan<byte> trimmed = input.TrimEnd((byte)'\n');
Span<char> password = stackalloc char[trimmed.Length];
Encoding.ASCII.GetChars(trimmed, password);
GetNextPassword(password);
solution.SubmitPart1(password);
GetNextPassword(password);
solution.SubmitPart2(password);
}
private static void GetNextPassword(Span<char> password)
{
// increment the password and ensure there are no confusing characters
IncrementPassword(password);
for (int i = 0; i < password.Length; i++)
{
if (password[i] is 'i' or 'o' or 'l')
{
password[i]++;
}
}
while (true)
{
int doubles = 0;
bool hasTriple = false;
bool ignoreDouble = false;
char prev2 = '\0';
char prev = '\0';
foreach (char c in password)
{
if (c == prev && !ignoreDouble)
{
doubles++;
ignoreDouble = true;
}
else
{
ignoreDouble = false;
}
if (prev2 + 2 == c && prev + 1 == c)
{
hasTriple = true;
}
prev2 = prev;
prev = c;
}
if (doubles >= 2 && hasTriple)
{
return;
}
IncrementPassword(password, doubles == 0 ? 3 : 1);
}
}
private static void IncrementPassword(Span<char> password, int minDigits = 1)
{
for (int i = password.Length - 1; i >= 0; i--)
{
ref char cur = ref password[i];
if (cur == 'z' || minDigits > 1)
{
cur = 'a';
minDigits--;
}
else
{
cur++;
if (cur is 'i' or 'o' or 'l')
{
cur++;
}
break;
}
}
}
}