blob: 3489c533ed3bb4e05cbcc9e364e616c519fd8dce (
plain)
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
|
#include "aoc.h"
namespace aoc2015 {
bool is_valid_rule1(int* is) {
auto is_valid = [](int* p) -> bool { return (*p + 1 == *(p + 1)) && (*p + 2 == *(p + 2)); };
for (int i = 0; i < 6; i++) {
if (is_valid(is + i)) {
return true;
}
}
return false;
}
bool is_valid_rule3(int* is) {
int* p1 = nullptr;
int* p2 = nullptr;
int* p3 = is + 7;
while (is < p3) {
if (*is == *(is + 1)) {
if (p1 == nullptr) {
p1 = is;
} else {
p2 = is;
}
is += 2;
} else {
is += 1;
}
}
return p1 != nullptr && p2 != nullptr && *p1 != *p2;
}
// int* 0..25
void next(int* is, int* invalids, int n) {
// increatment
for (int x = 7; x >= 0; x--) {
if (is[x] == 'z' - 'a') {
is[x] = 0;
} else {
is[x] += 1;
break;
}
}
auto is_invalid = [invalids, n](int x) -> bool {
for (int j = 0; j < n; j++) {
if (x == invalids[j]) {
return true;
}
}
return false;
};
for (int x = 0; x < 8; x++) {
if (is_invalid(is[x])) { // is[x] = 'i' 'j' 'o'
is[x] = is[x] == 25 ? 0 : is[x] + 1;
for (int k = x + 1; k < 8; k++) {
is[k] = 0;
}
break;
}
}
}
char* day11(const char* pass) {
int invalids[] = {'i' - 'a', 'o' - 'a', 'l' - 'a'};
int indexes[8] = {0};
for (int i = 0; i < 8; i++) {
indexes[i] = pass[i] - 'a';
}
bool b1 = false;
bool b3 = false;
do {
next(indexes, invalids, ARRAY_SIZE(invalids));
b1 = is_valid_rule1(indexes);
b3 = is_valid_rule3(indexes);
} while (!b1 || !b3);
char* password = (char*)malloc(9);
for (int i = 0; i < 8; i++) {
password[i] = 'a' + indexes[i];
}
password[8] = '\0';
return password;
}
} // namespace aoc2015
|