day 22 part 1
[aoc_eblake.git] / 2016 / advent4.c
blob496735fb960166cc59741e046e03b09371699a21
1 #define _GNU_SOURCE 1
2 #include <stdio.h>
3 #include <string.h>
4 #include <stdlib.h>
5 #include <unistd.h>
6 #include <stdbool.h>
7 #include <ctype.h>
9 int main(void)
11 ssize_t nread;
12 size_t len = 0;
13 char *line = NULL;
14 int sum = 0;
15 while ((nread = getline(&line, &len, stdin)) >= 0) {
16 line[nread - 1] = '\0';
17 int freq[26] = { 0 };
18 int count = 0;
19 int id = 0;
20 char *p = line;
21 while (*p != '[') {
22 if (isalpha (*p)) {
23 freq[*p - 'a']++;
24 if (freq[*p - 'a'] > count)
25 count = freq[*p - 'a'];
26 } else if (isdigit (*p))
27 id = id * 10 + *p - '0';
28 p++;
30 p++;
31 for (int i = 0; *p != ']'; i++) {
32 if (i == 26) {
33 count--;
34 i = 0;
36 if (freq[i] == count)
37 if (*p++ != i + 'a') {
38 id = 0;
39 if (getenv ("DEBUG"))
40 printf ("room %s is bogus\n", line);
41 break;
44 if (*p == ']') {
45 if (getenv ("DEBUG"))
46 printf ("room %s is valid\n", line);
47 p = line;
48 while (!isdigit (*p)) {
49 if (*p == '-')
50 *p = ' ';
51 else
52 *p = 'a' + (*p - 'a' + id) % 26;
53 p++;
55 *p = '\0';
56 printf ("valid rooms include %d: %s\n", id, line);
58 sum += id;
60 printf ("sum of ids is %d\n", sum);
61 return 0;