You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
1.8 KiB

4 years ago
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#if defined(TEST) && !defined(DEBUG)
#define DEBUG
#endif
static const char* const answers[] = {
#ifdef TEST
#include "input-test.h"
#else
#include "input.h"
#endif
};
#define answers_sz (sizeof(answers) / sizeof(char*))
#define NUM_QUESTIONS 26
4 years ago
typedef struct answer {
bool table[NUM_QUESTIONS];
} answers_t;
4 years ago
inline static char assert_in_bound(char i)
{
register int x=(int)i;
if(x<0 || x>=NUM_QUESTIONS) {
fprintf(stderr, "Fatal error: char '%c' (%d) is not in range 0..%d\n", i, x, NUM_QUESTIONS);
abort();
}
return i;
}
4 years ago
static void populate(const char* from, answers_t * restrict ans) //wtf is this syntax? `bool* restrict a` -> `bool a[restrict N]`????
4 years ago
{
while(*from)
4 years ago
ans->table[(int)assert_in_bound((*from++)-'a')] = true;
4 years ago
}
4 years ago
static size_t count_ans(const answers_t* restrict ans)
4 years ago
{
register size_t j=0;
for(register size_t i=0;i<NUM_QUESTIONS;i++)
4 years ago
j+= ans->table[i] ? 1 : 0;
4 years ago
return j;
}
4 years ago
inline static size_t reset(bool* restrict pop, answers_t * restrict ans, size_t* restrict group_count)
4 years ago
{
register size_t fullcnt=0;
4 years ago
if(*pop) {
fullcnt = (*group_count = count_ans(ans));
4 years ago
#ifdef DEBUG
fprintf(stderr, "Last group: %lu (fcnt %lu)\n" , *group_count, fullcnt);
#endif
}
4 years ago
*pop = false;
memset(ans,0, sizeof(answers_t));
4 years ago
return fullcnt;
}
int main()
{
4 years ago
answers_t answered = {0};
4 years ago
size_t group_counts[answers_sz+1] = {0};
size_t fullcnt=0;
bool pop=false;
for(size_t i=0,j=0;i<answers_sz;i++)
{
const char* current = answers[i];
if(*current) {
4 years ago
populate(current, &answered);
4 years ago
pop=true;
} else {
4 years ago
fullcnt += reset(&pop, &answered, &group_counts[j++]);
4 years ago
}
}
4 years ago
fullcnt+= reset(&pop, &answered, group_counts +answers_sz);
4 years ago
printf("%lu\n", fullcnt);
return 0;
}