118 lines
2.1 KiB
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);
|
|
}
|