aboutsummaryrefslogtreecommitdiff
path: root/src/2015/day11/aoc.cpp
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