advent-of-code/2021/day3/main1.c

118 lines
2.1 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ENTRY_LENGTH 12
FILE *
openInputFile(void)
{
FILE *fp = fopen("input.txt","r");
if (fp == NULL)
{
printf("Could not open file: input.txt\n");
exit(EXIT_FAILURE);
}
return fp;
}
struct list {
size_t used;
size_t size;
int *contents;
};
int
createList(struct list *list, size_t initialSize)
{
list->contents = (int *) malloc(initialSize * sizeof(int));
if (list->contents == NULL)
return 1;
list->used = 0;
list->size = initialSize;
return 0;
}
int
insertIntoList(struct list *list, int item)
{
if (list->used == list->size)
{
list->size *= 2;
list->contents = (int *) realloc(list->contents, list->size * sizeof(int));
if (list->contents == NULL)
return 1;
}
list->contents[list->used++] = item;
return 0;
}
void
freeList(struct list *list)
{
free(list->contents);
}
// Just computes most common value from a set of 1 or 0 because nothing more is
// needed for this challenge
int
mostCommonValue(struct list *list)
{
int numZeros = 0;
int numOnes = 0;
for (int i = 0; i < list->used; i++)
{
if (list->contents[i] == 0)
numZeros++;
else
numOnes++;
}
if (numZeros > numOnes)
return 0;
else
return 1;
}
int
main(void)
{
FILE *fp = openInputFile();
struct list bits[ENTRY_LENGTH];
for (int i = 0; i < ENTRY_LENGTH; i ++)
if (createList(&bits[i], 1) != 0)
exit(EXIT_FAILURE);
char *line = NULL;
size_t len = 0;
ssize_t read;
while ((read = getline(&line, &len, fp)) != -1)
{
for (int i = 0; i < ENTRY_LENGTH; i ++)
insertIntoList(&bits[i], line[i] - '0');
}
int gamma = 0;
for (int i = 0; i < ENTRY_LENGTH; i++)
{
printf("%d: %d\n", i, mostCommonValue(&bits[i]));
if (mostCommonValue(&bits[i]))
gamma = gamma | (1 << (ENTRY_LENGTH - i - 1)) ;
printf("Gamma is: %x\n", gamma);
}
int epsilon = ~gamma & ((1 << ENTRY_LENGTH) - 1);
printf(" Gamma %d\n", gamma);
printf("Epsilon %d\n", epsilon);
printf("Product %d\n", gamma * epsilon);
fclose(fp);
if (line)
free(line);
for (int i = 0; i < ENTRY_LENGTH; i++)
freeList(&bits[i]);
exit(EXIT_SUCCESS);
}