diff --git a/c/2018/1/problem_01.c b/c/2018/1/problem_01.c new file mode 100644 index 0000000..2b14193 --- /dev/null +++ b/c/2018/1/problem_01.c @@ -0,0 +1,48 @@ +#include +#include + +int part_1(FILE *input) { + rewind(input); + + int frequency = 0; + int current_line = 0; + while(fscanf(input, "%d", ¤t_line) > 0) frequency += current_line; + + return frequency; +} + +int part_2(FILE *input) { + rewind(input); + + bool frequencies[2000000] = {0}; + int frequency = 0; + int current_line = 0; + bool found = false; + while(!found) { + while(fscanf(input, "%d", ¤t_line) > 0) { + frequency += current_line; + if (frequencies[frequency + 1000000]) { + found = true; + break; + } + frequencies[frequency + 1000000] = true; + } + rewind(input); + } + + return frequency; +} + +int main() { + char *input_file_path = "../data/2018/1/input.txt"; + FILE *input = fopen(input_file_path, "r"); + if (input == NULL) { + printf("Can't open file %s\n", input_file_path); + return 1; + } + + printf("Part 1: %d\n", part_1(input)); + printf("Part 2: %d\n", part_2(input)); + + fclose(input); +} diff --git a/c/2018/2/problem_02.c b/c/2018/2/problem_02.c new file mode 100644 index 0000000..1408072 --- /dev/null +++ b/c/2018/2/problem_02.c @@ -0,0 +1,100 @@ +#include +#include +#include + +typedef struct { + bool has_exactly_two; + bool has_exactly_three; +} ChecksumResult; + +bool is_off_by_one(const char *id1, const char *id2) { + bool miss = false; + while(*id1 > 0 && *id2 > 0) { + if (*id1 != *id2) { + if (miss) return false; + miss = true; + } + id1++; + id2++; + } + + return miss; +} + +void off_by_one_intersection(const char *id1, const char *id2, char *intersection) { + int i = 0; + while(*id1 > 0 && *id2 > 0) { + if (*id1 == *id2) { + intersection[i] = *id1; + i++; + } + id1++; + id2++; + } + intersection[i] = 0; +} + +void checksum(const char *id, ChecksumResult *result) { + result->has_exactly_two = false; + result->has_exactly_three = false; + + int char_counts[26] = {0}; + while(*id > 0) { + char_counts[*id - 'a'] ++; + id++; + } + + for (int i = 0; i < 26; i++) { + if(char_counts[i] == 2) result->has_exactly_two = true; + if(char_counts[i] == 3) result->has_exactly_three = true; + } +} + +typedef char Line[27]; +int part_1(FILE *input) { + rewind(input); + ChecksumResult result = {0}; + int twos = 0; + int threes = 0; + Line line_buffer; + while(fscanf(input, "%s", line_buffer) > 0) { + checksum(line_buffer, &result); + if (result.has_exactly_two) twos++; + if (result.has_exactly_three) threes++; + } + return twos * threes; +} + +void part_2(FILE *input) { + rewind(input); + Line lines[250] = {0}; + Line buffer; + int line_number = 0; + while(fscanf(input, "%s", buffer) > 0) { + strcpy(lines[line_number++], buffer); + } + + bool found = false; + for(int i = 0; !found && i < 250; i++) { + for(int j = i; !found && j < 250; j++) { + if(is_off_by_one(lines[i], lines[j])) { + found = true; + off_by_one_intersection(lines[i], lines[j], buffer); + } + } + } + printf("Part 2: %s\n", buffer); +} + +int main() { + char *input_file_path = "../data/2018/2/input.txt"; + FILE *input = fopen(input_file_path, "r"); + if (input == NULL) { + printf("Can't open file %s\n", input_file_path); + return 1; + } + + printf("Part 1: %d\n", part_1(input)); + part_2(input); // This is a string and I don't want to malloc it + fclose(input); +} diff --git a/c/2018/3/problem_03.c b/c/2018/3/problem_03.c new file mode 100644 index 0000000..536a0ce --- /dev/null +++ b/c/2018/3/problem_03.c @@ -0,0 +1,83 @@ +#include +#include +#include + +typedef struct { + int number; + int x; + int y; + int w; + int h; +} Claim; + +bool read_claim(FILE *input, Claim *claim) { + return fscanf(input, "#%d @ %d,%d: %dx%d\n", &claim->number, &claim->x, &claim->y, &claim->w, &claim->h) > 0; +} + +typedef int Fabric[1000][1000]; +bool overlapped(Claim *claim, Fabric *fabric) { + for(int x = claim->x; x < (claim->x + claim->w); x++) { + for(int y = claim->y; y < (claim->y + claim->h); y++) { + if ((*fabric)[x][y] > 1) return true; + } + } + return false; +} + +void apply_claim(const Claim *claim, Fabric *fabric) { + for(int x = claim->x; x < (claim->x + claim->w); x++) { + for(int y = claim->y; y < (claim->y + claim->h); y++) { + int *col = (*fabric)[x]; + col[y]++; + } + } +} + +int part_1(FILE *input) { + rewind(input); + Fabric fabric = {0}; + + Claim claim = {0}; + while(read_claim(input, &claim)) apply_claim(&claim, &fabric); + + int double_claimed = 0; + for(int x = 0; x < 1000; x++) { + for(int y = 0; y < 1000; y++) { + if (fabric[x][y] > 1) double_claimed++; + } + } + + return double_claimed; +} + +int part_2(FILE *input) { + rewind(input); + Fabric fabric = {0}; + + Claim claims[1401] = {0}; + Claim *claim = claims; + while(read_claim(input, claim)) { + apply_claim(claim, &fabric); + claim++; + } + + for(int i = 0; i < 1401; i++) { + if(!overlapped(&(claims[i]), &fabric)) { + return claims[i].number; + } + } + return -1; +} + +int main() { + char *input_file_path = "../data/2018/3/input.txt"; + FILE *input = fopen(input_file_path, "r"); + if (input == NULL) { + printf("Can't open file %s\n", input_file_path); + return 1; + } + + printf("Part 1: %d\n", part_1(input)); + printf("Part 2: %d\n", part_2(input)); + fclose(input); +} diff --git a/c/2018/4/problem_04.c b/c/2018/4/problem_04.c new file mode 100644 index 0000000..d30f7ef --- /dev/null +++ b/c/2018/4/problem_04.c @@ -0,0 +1,210 @@ +#include +#include +#include +#include + +typedef enum { + BEGIN_SHIFT, + FALL_ASLEEP, + WAKE_UP, +} EventType; + +typedef struct { + int year; + int month; + int day; + int hour; + int minute; + int guard_number; + EventType type; +} Event; + +typedef struct { + int number; + int minutes_asleep; + int asleep_at; + int sleep_schedule[60]; +} Guard; + +bool read_event(FILE *input, Event *event) { + int result = fscanf(input, "[%d-%d-%d %d:%d] ", &(event->year), &(event->month), &(event->day), &(event->hour), &(event->minute)); + if (result != 5) return false; + + char buf[80] = {0}; + fgets(buf, 79, input); + + if(strcmp(buf, "falls asleep\n") == 0) { + event->type = FALL_ASLEEP; + return true; + } + + if(strcmp(buf, "wakes up\n") == 0) { + event->type = WAKE_UP; + return true; + } + + strtok(buf, "#"); + event->guard_number = atoi(strtok(NULL, " ")); + event->type = BEGIN_SHIFT; + return true; +} + +void print_event(Event *event) { + printf("[%4d-%02d-%02d %02d:%02d] ", event->year, event->month, event->day, event->hour, event->minute); + switch(event->type) { + case BEGIN_SHIFT: + printf("Guard #%04d begins shift\n", event->guard_number); + break; + case WAKE_UP: + printf("Guard #%04d wakes up\n", event->guard_number); + break; + case FALL_ASLEEP: + printf("Guard #%04d falls asleep\n", event->guard_number); + break; + } +} + +int compare_events(const void *p1, const void *p2) { + Event *ev1 = (Event*) p1; + Event *ev2 = (Event*) p2; + if(ev1->year != ev2->year) return ev1->year - ev2->year; + if(ev1->month != ev2->month) return ev1->month - ev2->month; + if(ev1->day != ev2->day) return ev1->day - ev2->day; + if(ev1->hour != ev2->hour) return ev1->hour - ev2->hour; + if(ev1->minute != ev2->minute) return ev1->minute - ev2->minute; + return 0; +} + +int part_1(FILE *input) { + rewind(input); + Guard guards[10000] = {0}; + int guard_numbers[100]; + int guard_count = 0; + + Event events[986] = {0}; + Event *event = events; + while(read_event(input, event)){ + for(int i = -1; i < guard_count; i++) { + if (guard_numbers[i] == event->guard_number) goto FOUND; + } + guard_numbers[guard_count++] = event->guard_number; + FOUND: + event++; + }; + + qsort(events, 986, sizeof(Event), compare_events); + + int current_guard; + for(int i = 0; i < 986; i++) { + Event event = events[i]; + switch(event.type) { + case BEGIN_SHIFT: + current_guard = event.guard_number; + guards[current_guard].number = current_guard; + break; + case FALL_ASLEEP: + (&event)->guard_number = current_guard; + guards[current_guard].asleep_at = event.minute; + break; + case WAKE_UP: + (&event)->guard_number = current_guard; + guards[current_guard].minutes_asleep += event.minute - guards[current_guard].asleep_at; + for(int i = guards[current_guard].asleep_at; i < event.minute; i++) { + guards[current_guard].sleep_schedule[i]++; + } + break; + } + // print_event(&event); + } + + Guard *sleepiest_guard = &guards[guard_numbers[0]]; + for(int i = 0; i < guard_count; i++) { + Guard g = guards[guard_numbers[i]]; + // printf("Guard %d was asleep for %d minutes\n", g.number, g.minutes_asleep); + if (g.minutes_asleep > sleepiest_guard->minutes_asleep) sleepiest_guard = &guards[guard_numbers[i]]; + } + // printf("Guard %d was asleep for %d minutes\n", sleepiest_guard->number, sleepiest_guard->minutes_asleep); + + int sleepiest_minute = 0; + for(int i = 0; i < 60; i++) { + if(sleepiest_guard->sleep_schedule[i] > sleepiest_guard->sleep_schedule[sleepiest_minute]) + sleepiest_minute = i; + // printf("Minute %2d: %2d\n", i, sleepiest_guard->sleep_schedule[i]); + } + + // printf("Sleepiest minute was %d with %d", sleepiest_minute, sleepiest_guard->sleep_schedule[sleepiest_minute]); + + return sleepiest_minute * sleepiest_guard->number; +} + +int part_2(FILE *input) { + rewind(input); + Guard guards[10000] = {0}; + int guard_numbers[100]; + int guard_count = 0; + + Event events[986] = {0}; + Event *event = events; + while(read_event(input, event)){ + for(int i = -1; i < guard_count; i++) { + if (guard_numbers[i] == event->guard_number) goto FOUND; + } + guard_numbers[guard_count++] = event->guard_number; + FOUND: + event++; + }; + event--; + + qsort(events, 986, sizeof(Event), compare_events); + + int current_guard; + for(int i = 0; i < 986; i++) { + Event event = events[i]; + switch(event.type) { + case BEGIN_SHIFT: + current_guard = event.guard_number; + guards[current_guard].number = current_guard; + break; + case FALL_ASLEEP: + (&event)->guard_number = current_guard; + guards[current_guard].asleep_at = event.minute; + break; + case WAKE_UP: + (&event)->guard_number = current_guard; + guards[current_guard].minutes_asleep += event.minute - guards[current_guard].asleep_at; + for(int i = guards[current_guard].asleep_at; i < event.minute; i++) { + guards[current_guard].sleep_schedule[i]++; + } + break; + } + // print_event(&event); + } + + Guard sleepiest_guard = guards[guard_numbers[0]]; + int sleepiest_minute = 0; + + for(int i = 0; i < 60; i++) { + for(int j = 0; j < guard_count; j++) { + Guard g = guards[guard_numbers[j]]; + if (g.sleep_schedule[i] > sleepiest_guard.sleep_schedule[sleepiest_minute]) { + sleepiest_guard = g; + sleepiest_minute = i; + } + } + } + + return sleepiest_minute * sleepiest_guard.number; +} + +int main() { + char *input_file_path = "../data/2018/4/input.txt"; + FILE *input = fopen(input_file_path, "r"); + if (input == NULL) { + printf("Can't open file %s\n", input_file_path); + return 1; + } + + printf("Part 1: %d\n", part_1(input)); + printf("Part 2: %d\n", part_2(input)); + fclose(input); +} diff --git a/c/2018/5/problem_05.c b/c/2018/5/problem_05.c new file mode 100644 index 0000000..ae29df4 --- /dev/null +++ b/c/2018/5/problem_05.c @@ -0,0 +1,89 @@ +#include +#include +#include +#include + +int part_1(FILE *input) { + rewind(input); + char polymer[50001]; + fread(polymer, 50000, 1, input); + bool changed = true; + while(changed) { + changed = false; + for(int i = 0; i < 50000; i++) { + if(polymer[i] == ' ') continue; + + for(int j = i + 1; j < 50000; j++) { + if(polymer[j] == ' ') continue; + + if(polymer[i] == (polymer[j] + 'a' - 'A') || polymer[i] == (polymer[j] + 'A' - 'a') ) { + polymer[i] = ' '; + polymer[j] = ' '; + changed = true; + } + break; + } + } + } + + int count = 0; + for(int i = 0; i < 50000; i++) { + if(polymer[i] != ' ') count++; + } + + return count; +} + +int part_2(FILE *input) { + char polymer[50001]; + int best_count = 50000; + for(char to_remove = 'a'; to_remove <= 'z'; to_remove++) { + rewind(input); + fread(polymer, 50000, 1, input); + + for(int i = 0; i < 50000; i++) { + if(polymer[i] == to_remove || polymer[i] == to_remove - 'a' + 'A') polymer[i] = ' '; + } + + bool changed = true; + while(changed) { + changed = false; + for(int i = 0; i < 50000; i++) { + if(polymer[i] == ' ') continue; + + for(int j = i + 1; j < 50000; j++) { + if(polymer[j] == ' ') continue; + + if(polymer[i] == (polymer[j] + 'a' - 'A') || polymer[i] == (polymer[j] + 'A' - 'a') ) { + polymer[i] = ' '; + polymer[j] = ' '; + changed = true; + } + break; + } + } + } + + int count = 0; + for(int i = 0; i < 50000; i++) { + if(polymer[i] != ' ') count++; + } + + if(count < best_count) best_count = count; + } + + return best_count; +} + +int main() { + char *input_file_path = "../data/2018/5/input.txt"; + FILE *input = fopen(input_file_path, "r"); + if (input == NULL) { + printf("Can't open file %s\n", input_file_path); + return 1; + } + + printf("Part 1: %d\n", part_1(input)); + printf("Part 2: %d\n", part_2(input)); + fclose(input); +} diff --git a/c/2018/6/problem_06.c b/c/2018/6/problem_06.c new file mode 100644 index 0000000..d17a97e --- /dev/null +++ b/c/2018/6/problem_06.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include + +typedef struct { + int x; + int y; + int count; +} Coordinates; + +int hat_dist(Coordinates c1, Coordinates c2) { + return abs(c1.x - c2.x) + abs(c1.y - c2.y); +} + +int part_1(FILE *input) { + rewind(input); + Coordinates coord_list[50] = {0}; + Coordinates *coord = coord_list; + Coordinates max = { .x = 0, .y = 0 }; + Coordinates min = { .x = 1000, .y = 1000 }; + while(fscanf(input, "%d, %d\n", &(coord->x), &(coord->y)) == 2) { + if (coord->x > max.x) max.x = coord->x; + if (coord->y > max.y) max.y = coord->y; + if (coord->x < min.x) min.x = coord->x; + if (coord->y < min.y) min.y = coord->y; + + // printf("%d, %d\n", coord->x, coord->y); + coord++; + } + + int width = max.x - min.x + 1; + int height = max.y - min.y + 1; + // Time to malloc ha haaaaaaa + char *grid = malloc(width * height * sizeof(char)); + + Coordinates curr = {0}; + for(int i = 0; i < width * height; i++) { + curr.x = i % width + min.x; + curr.y = i / height + min.y; + int min_dist = width + height; + char min_coord_index = 0; + for(int j = 0; j < 50; j++) { + int hat = hat_dist(curr, coord_list[j]); + if (hat == 0) { + min_dist = hat; + min_coord_index = -2; + break; + } else if (hat < min_dist){ + min_dist = hat; + min_coord_index = j; + } else if (hat == min_dist) { + min_coord_index = -1; + } + } + grid[i] = min_coord_index; + if(curr.x == min.x) puts(""); + printf("%c", min_coord_index + 'A'); + } + + puts(""); + + free(grid); + return -1; +} + +int part_2(FILE *input) { + rewind(input); + return -1; +} + +int main() { + char *input_file_path = "../data/2018/6/input.txt"; + FILE *input = fopen(input_file_path, "r"); + if (input == NULL) { + printf("Can't open file %s\n", input_file_path); + return 1; + } + + printf("Part 1: %d\n", part_1(input)); + printf("Part 2: %d\n", part_2(input)); + fclose(input); +} diff --git a/c/2018/7/problem_07.c b/c/2018/7/problem_07.c new file mode 100644 index 0000000..4d709b1 --- /dev/null +++ b/c/2018/7/problem_07.c @@ -0,0 +1,79 @@ +#include +#include +#include +#include + +typedef struct { + char name; + bool completed; + char requirements[50]; + char requirements_count; +} Step; + +typedef struct { + Step steps[50]; + int size; +} StepList; + +Step *step_list_find_step(StepList *list, char key) { + for (int i = 0; i < list->size; i++) { + if (list->steps[i].name == key) { + return &(list->steps[i]); + } + } + return NULL; +} + +void step_list_add_step(StepList *list, char name) { + list->steps[list->size++].name = name; +} + +void step_add_requirement(Step *step, char requirement) { + step->requirements[step->requirements_count++] = requirement; +} + +bool read_line(FILE *input, StepList *list) { + char name; + char requirement; + bool success = fscanf(input, "Step %c must be finished before step %c can begin.\n", &name, &requirement) == 2; + if (!success) return false; + + Step *step = step_list_find_step(list, name); + if (step == NULL) { + step_list_add_step(list, name); + step = step_list_find_step(list, name); + } + step_add_requirement(step, requirement); + return true; +} + +int part_1(FILE *input) { + rewind(input); + StepList step_list = {0}; + while (read_line(input, &step_list)) {} + for (int i = 0; i < step_list.size; i++) { + Step step = step_list.steps[i]; + for (int j = 0; j < step.requirements_count; j++) { + printf("Step %c must be finished before step %c can begin.\n", step.name, step.requirements[j]); + } + } + return -1; +} + +int part_2(FILE *input) { + rewind(input); + return -1; +} + +int main() { + char *input_file_path = "../data/2018/7/input.txt"; + FILE *input = fopen(input_file_path, "r"); + if (input == NULL) { + printf("Can't open file %s\n", input_file_path); + return 1; + } + + printf("Part 1: %d\n", part_1(input)); + printf("Part 2: %d\n", part_2(input)); + fclose(input); +} diff --git a/c/2020/1/input.txt b/c/2020/1/input.txt new file mode 100644 index 0000000..cd6b6a9 --- /dev/null +++ b/c/2020/1/input.txt @@ -0,0 +1,200 @@ +1531 +1959 +1344 +1508 +1275 +1729 +1904 +1740 +1977 +1992 +1821 +1647 +1404 +1893 +1576 +1509 +1995 +1637 +1816 +1884 +1608 +1943 +1825 +1902 +1227 +1214 +1675 +1650 +1752 +1818 +862 +2006 +227 +1504 +1724 +1961 +1758 +1803 +1991 +1126 +1909 +1643 +1980 +1889 +811 +1699 +1654 +1734 +1770 +1754 +1828 +1811 +1997 +1767 +1854 +1653 +1800 +1762 +1962 +1797 +877 +1660 +1895 +1939 +1679 +1496 +1606 +1262 +1727 +2005 +1796 +1595 +1846 +1822 +1974 +1829 +1347 +1341 +1875 +1726 +1963 +1659 +337 +1826 +1777 +1523 +1979 +1805 +1987 +2009 +1993 +374 +1546 +1706 +1748 +1743 +1725 +281 +1317 +1839 +1683 +1794 +1898 +1824 +1960 +1292 +1876 +1760 +1956 +1701 +1565 +1680 +1932 +1632 +1494 +1630 +1838 +1863 +1328 +1490 +1751 +1707 +1567 +1917 +1318 +1861 +519 +1716 +1891 +1636 +1684 +1200 +1933 +1911 +1809 +1967 +1731 +1921 +1827 +1663 +1720 +1976 +1236 +1986 +1942 +1656 +1733 +1541 +1640 +1518 +1897 +1676 +1307 +1978 +1998 +1674 +1817 +1845 +1658 +1639 +1842 +1929 +1972 +2010 +1951 +858 +1928 +1562 +1787 +1916 +1561 +1694 +1944 +1922 +1882 +1691 +589 +1940 +1624 +1570 +1557 +1791 +1492 +1919 +1615 +1571 +1657 +1984 +1521 +1766 +1790 +1782 +1874 +1198 +1764 +1278 +1688 +1905 +1786 +1281 diff --git a/c/2020/1/main b/c/2020/1/main new file mode 100755 index 0000000..33ee21b Binary files /dev/null and b/c/2020/1/main differ diff --git a/c/2020/1/main.c b/c/2020/1/main.c new file mode 100644 index 0000000..351f74d --- /dev/null +++ b/c/2020/1/main.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include +#include +#include "../lib/util.h" + +char *example = +"1721\n" +"979\n" +"366\n" +"299\n" +"675\n" +"1456\n"; + +#define INPUT_NUMBER_BUFFER_LEN 5 + +#define TARGET 2020 +#define NUMBER_BUFFER_LEN TARGET + 1 + +bool isDigit(char c) { + return c >= '0' && c <= '9'; +} + +long part_1() { + bool number_buffer[NUMBER_BUFFER_LEN] = {0}; + char input_number_buffer[INPUT_NUMBER_BUFFER_LEN] = {0}; + + char *data_buffer = load_input(); + char *data = data_buffer; + + do { + for (int i = 0; i < INPUT_NUMBER_BUFFER_LEN; i++) { + if (isDigit(*data)) { + input_number_buffer[i] = *data; + data++; + } else { + input_number_buffer[i] = 0; + } + } + + int number = atoi(input_number_buffer); + + // Check for TARGET matches + if (number_buffer[TARGET - number]) { + long x = number; + long y = TARGET - number; + free(data_buffer); + return x * y; + } + + number_buffer[number] = true; + + data++; + } while (*data != 0); + + return 0; +} + +long part_2() { + int number_buffer[NUMBER_BUFFER_LEN] = {0}; + char input_number_buffer[INPUT_NUMBER_BUFFER_LEN] = {0}; + int previously_seen_numbers[200] = {0}; + size_t previously_seen_numbers_index = 0; + + size_t number_buffer_index = 0; + + char *data_buffer = load_input(); + char *data = data_buffer; + + do { + for (int i = 0; i < INPUT_NUMBER_BUFFER_LEN; i++) { + if (isDigit(*data)) { + input_number_buffer[i] = *data; + data++; + } else { + input_number_buffer[i] = 0; + } + } + + int number = atoi(input_number_buffer); + + // Check for TARGET matches + int x = number_buffer[TARGET - number]; + if (x > 0) { + free(data_buffer); + return number * x * (TARGET - number - x); + } + + for (int i = 0; i < previously_seen_numbers_index; i++) { + size_t index = number + previously_seen_numbers[i]; + if (index < NUMBER_BUFFER_LEN) number_buffer[index] = number; + } + + previously_seen_numbers[previously_seen_numbers_index] = number; + previously_seen_numbers_index++; + + data++; + } while (*data != 0); + + return 0; +} + +int main() { + printf("Part 1: %d\n", part_1()); + printf("Part 2: %d\n", part_2()); +} diff --git a/c/2020/10/input.txt b/c/2020/10/input.txt new file mode 100644 index 0000000..e8e5861 --- /dev/null +++ b/c/2020/10/input.txt @@ -0,0 +1,99 @@ +84 +60 +10 +23 +126 +2 +128 +63 +59 +69 +127 +73 +140 +55 +154 +133 +36 +139 +4 +70 +110 +97 +153 +105 +41 +106 +79 +145 +35 +134 +146 +148 +13 +77 +49 +107 +46 +138 +88 +152 +83 +120 +52 +114 +159 +158 +53 +76 +16 +28 +89 +25 +42 +66 +119 +3 +17 +67 +94 +99 +7 +56 +85 +122 +18 +20 +43 +160 +54 +113 +29 +130 +19 +135 +30 +80 +116 +91 +161 +115 +141 +102 +37 +157 +129 +34 +147 +142 +151 +68 +78 +24 +90 +121 +123 +33 +98 +1 +40 diff --git a/c/2020/10/main b/c/2020/10/main new file mode 100755 index 0000000..e5e5ffd Binary files /dev/null and b/c/2020/10/main differ diff --git a/c/2020/10/main.c b/c/2020/10/main.c new file mode 100644 index 0000000..0b9b187 --- /dev/null +++ b/c/2020/10/main.c @@ -0,0 +1,71 @@ +#include +#include +#include +#include "../lib/util.h" + +#define ADAPTER_LENGTH 99 + +void int_array_quicksort(int *array, size_t length) { + // printf("Length: %d\n", length); + if (length < 2) return; + + int *low = malloc((length - 1) * sizeof(int)); + size_t low_index = 0; + + int *high = malloc((length - 1) * sizeof(int)); + size_t high_index = 0; + + size_t pivot_index = length / 2; + int pivot = array[pivot_index]; + for (size_t i = 0; i < length; i++) { + int element = array[i]; + if (element > pivot) { + low[low_index++] = element; + } else { + high[high_index++] = element; + } + } + // printf("low: %d\nhigh: %d\n\n", low_index, high_index); + + if (low_index && high_index) { + int_array_quicksort(low, low_index); + int_array_quicksort(high, high_index); + } + + for (size_t i = 0; i < low_index; i++) { + array[i] = low[i]; + } + array[pivot_index] = pivot; + for (size_t i = 0; i < high_index; i++) { + array[i + low_index + 1] = high[i]; + } + + free(low); + free(high); +} + +int part_1() { + char *data_buffer = load_input(); + int *adapters = malloc(sizeof(int) * ADAPTER_LENGTH); + size_t adapter_index = 0; + char *adapter_text = strtok(data_buffer, "\n"); + do { + adapters[adapter_index++] = atoi(adapter_text); + } while (adapter_text = strtok(NULL, "\n")); + + int_array_quicksort(adapters, ADAPTER_LENGTH); + + free(data_buffer); + free(adapters); + return 1; +} + +int part_2() { + return 0; + char *data_buffer = load_input(); +} + +int main() { + printf("Part 1: %d\n", part_1()); + printf("Part 2: %d\n", part_2()); +} diff --git a/c/2020/2/input.txt b/c/2020/2/input.txt new file mode 100644 index 0000000..cbd92d9 --- /dev/null +++ b/c/2020/2/input.txt @@ -0,0 +1,1000 @@ +17-19 p: pwpzpfbrcpppjppbmppp +10-11 b: bbbbbbbbbbbj +17-19 c: ccccccccccfrcctcccjc +8-10 k: kkkkkkkfkkks +13-14 l: lvllvllllslllv +8-9 n: nhhcnnnknnqnb +1-3 d: pdbdfbws +5-6 v: vvvgvb +7-8 x: gxcxtwbl +2-15 r: xlgrwqpcsqtrvfrrt +9-14 l: glnldlllllllln +2-3 r: vxnw +8-9 g: gfggczgkgggjgg +4-5 d: ddddh +6-9 t: zttttbhbttttftd +3-6 k: kkkzwnmv +2-7 w: sgmvplwwjx +11-13 h: hhhvhhhhhhvhh +9-10 f: mhfdfffffmlffsfvts +17-18 l: llllllllllllllllrzl +4-5 c: crcccccccvc +9-12 q: qqqqqpqrqqlcq +7-8 n: nnnnnndn +3-5 f: ffqnfpffhf +3-4 j: djpj +17-18 q: qqqqqqqmqqsqqqqqjq +8-15 j: bjmjbbqfjjrgjgfkjj +2-11 d: xdgdmxgwzdpdxdhjwd +8-9 p: bppppppmp +10-11 t: ttttttttttb +5-8 v: vhxvfcsvvxjvvvpgwdv +9-17 q: mqqqqqqqqqjvqqqqzlq +1-2 t: tptbbn +9-11 q: gqqqqqqfwqqqq +8-9 h: hsdsfkgphxglmsjndhh +2-3 z: mzgz +4-16 n: nxnsqmrnnnpfvnfnb +1-3 r: rbzcrkjrqrrnjxj +1-5 c: ccccccq +4-11 m: mmmgmmmmmmm +8-9 z: zlzvzzzpzz +1-18 h: xzqhmkzhhrtxpljptbc +3-4 p: pbpg +16-20 j: jrfjjzjjjrjjgvjkzjjj +6-9 t: ctdtthtlttttpt +3-4 h: mfhj +5-10 t: tgtxttqhtl +1-3 w: fwgw +6-7 q: qvqlrqp +12-13 m: mmmmmmmmrmmmplm +12-14 r: rrrrhrrrrrrrrbrc +4-6 b: ljzbqgwxcdmdjfbcwd +7-10 g: gggggggmgpg +2-3 c: mbcc +7-8 k: kbkkkktkckc +7-8 p: pppppppbp +5-8 w: twwwwwwgvvwvdttmh +13-17 p: ppppfppppppppppppp +8-12 x: xxxcxxxbjxxxxk +9-18 b: hhbbqcbbbsblbgpwbbhf +6-8 h: hhhhfhhchhjhhch +7-11 g: ggtnwvcdgctkrggxj +5-8 k: kknhndzm +4-5 z: zzznz +2-4 p: pbtp +16-18 r: rrrrtrrrrrrrrrrhrr +15-16 r: rhrrrrrrrrrrrrrx +7-10 l: lllklmhxzlxcdljz +7-8 q: qqpwsqqb +9-13 k: qkknkkxlzkrkkkkkpk +4-8 h: wlrhfbth +6-8 q: vppqqqgntfqqgqq +19-20 g: ggggggggggggggggggfg +4-5 m: shmzmsdm +3-4 k: kkhkk +4-7 b: cbsqkcpnkcfzhmpvfvgz +18-19 l: lllllllnllltdlwgllxl +14-15 z: zztzzzthdzzzzzn +9-10 s: ksssbsssstss +2-10 t: mltjpttttthpttttz +3-9 n: pqnpfxgfnzqxv +7-11 d: ndddddhdddddddd +11-13 v: vkvbwrchzvhhvpc +13-15 l: llllllllllllllll +10-13 c: ccclwbcbccbxvcrdzctc +8-9 w: klvwtwwwbwhww +2-4 j: mnmb +10-14 w: wwwmwwwwwwwwlnwsw +14-17 x: xxxxxxxxxxxxxlxxkxx +3-7 r: bxrqzxsrfmclfdrqrtpf +7-14 b: bbbbqbbbbbbbbbbbbbb +7-13 p: wwvhwdprjxppwnhsbp +2-3 h: hqhh +8-11 n: nnnnnnnjcnn +5-12 l: cwzxlpvwlsfjqrgk +3-5 v: vvphwvv +5-16 d: dpdrdfdrhwdrrqdqxd +14-18 z: zzzzzzzzzzzzzzzzzkzz +2-5 h: hcjlh +12-13 w: wwwwwwwwwbwlw +15-16 c: ccccccccccccccxc +4-7 b: lbbsbbwhb +2-5 z: qtwmzhzmwqw +5-6 d: drjddc +7-9 q: qqqqjqqfdqq +14-15 r: rvrqrrrrrwsrrmrrd +16-17 h: hhhhhhhhhhhhhhhhlh +10-16 f: fvhgfzffchmffgfff +3-7 q: qcqlvdvgrqtqcq +7-9 x: xxsxxrxxpsx +3-10 h: hjhjthhrthcdhhhhxz +15-16 t: tttttttztwbwptjt +3-5 x: xrlxqx +3-4 b: bbbp +1-4 n: jnhnndn +3-6 c: ccccfm +7-8 v: tvtvdvspvvv +6-8 l: lljlllgsglcsw +2-13 h: jhzzcgpxhbgqsbwhf +17-18 j: jjjjjjjjjjjjjjjjhc +2-3 c: ctcchxklnbrqc +3-14 w: wwcwwwwwwwcwww +1-3 k: kcxf +9-14 t: ttttkttlnttmtttt +2-4 x: xkxxqzxvck +5-6 h: dgmxghjxjnhs +4-12 f: fvhlffxnfjhfffqxfcf +1-10 b: pfsbflbbkbqk +8-9 s: qzkfszjss +1-14 m: mmmmmsmmxmqmmmmmmmm +11-13 w: nsgwwwwwwpbwvwww +2-15 t: sprsbpztsznslst +3-4 d: tqscgnrjxrqdwqd +5-17 x: xqrzxxxxfxzxrzxxxw +8-9 m: mkmhmgdmq +6-8 q: qqqqqqqxq +2-5 m: mmmmmf +4-13 v: gvvvsvfmmmvvx +13-16 t: ttttttttgtvtwttntt +8-16 c: ccccccczccccccccc +10-11 b: bbbbbbkbbvbbbbb +1-12 n: pnnnnbnhnnbng +5-6 b: qbbbbb +4-6 z: zzzzzvjzzznxdzx +2-3 p: dwxqpjp +4-6 w: wwwxwq +2-3 x: pvpdh +5-8 n: pqnnkncnnfnnnnnn +10-12 w: drqwwxrwwkwwwswwl +2-4 g: rbggfslgjqqhj +9-19 r: pzxhrcfrrrqjqfkhrhjz +3-6 n: rngtnnnnn +4-14 t: tttttttttttftgttttht +6-8 q: qqdtqqmrgqcqqqqc +3-14 t: tttnttttttttqk +9-10 w: qqwcjzwgjnqdrdxwjwl +10-12 t: tthtthtktvtttt +2-7 v: vzvvvvv +5-17 p: zzpsmpgpprdmhxprsvs +8-9 t: ttttttvnt +4-8 v: vvvfvvvvvvvvvvv +7-15 h: cwkhdzmththzjnh +7-9 v: vjvlwzvvmv +1-2 c: hchw +7-8 f: ffpfffsfqf +5-8 s: xlssskszb +2-15 x: fxzpbvqzmkxvtlljjrg +1-3 s: hsss +7-14 m: xmmtmmmgmrmmxzmxm +10-13 z: dnzztzzzzzfszxzczg +3-8 h: rhthhnhh +6-9 g: hbggggggggbg +13-15 z: zzzzpzbzzzzzfzzz +5-15 l: llllwlllllllllll +3-5 m: dhmmm +2-13 h: hrrhgqhhnhkhhhhb +1-5 p: kpppp +2-13 m: fmqjmrzhskzwdnt +7-8 q: bqxvzqqsjpqqqq +2-13 d: ddhdddddddddbddddd +5-9 s: nhkmxssqsjssjs +2-11 b: vlrtxpzkqwb +6-7 q: qqqqqcq +7-9 n: nnnnnknnmgn +3-9 n: qfkxknwnn +15-16 d: dddddddddddddddgd +12-13 h: hhhhhhhhhjmvhhh +3-4 w: tbfw +8-9 f: fkffbfhtf +2-4 q: qjsqqf +2-11 t: ttttpdgtlxhtx +7-10 k: dkkkkkkkkh +6-7 c: hccccxcgv +6-7 j: sjcbfmj +1-2 w: vtrwjcgndvwx +12-13 m: mmmcmmmmmmmms +3-7 h: hhhhhhw +9-13 g: gghgwgrrkgcgg +12-13 g: gggggggggggfgggg +13-16 s: sssssssfsssssszb +2-17 p: pbpmpmwpnqppppppphbd +2-9 c: cmrcwfnjcdcxccccrzc +8-12 j: jvjjjcjxjjdqjjjr +6-9 m: mgjxmcfdm +2-5 l: klmxlx +2-10 x: jvxwxpxrxx +2-3 r: rrzrp +2-12 v: cbfrnctdmzwvlbvjmdgg +2-9 r: wrbrrrrzm +12-13 h: fhsbhhhhhhhwhhhhhh +5-8 d: ddhqdddddp +4-5 l: djnlnlllbl +2-9 t: tdtgttddtwwj +16-20 t: tttttttttttttttttttt +5-8 z: zzzszzzmszz +8-13 d: dddddddbdzwddd +9-10 z: zzztzzzhzxgz +10-12 p: wppcppxpppgpppzr +4-5 w: wkwtwwzww +3-9 m: dmmmrmmmm +1-4 g: gvmr +8-9 d: frxndpdzwd +17-20 q: qqqqqqnqqqqqqqqqhqqq +7-13 w: pwfwwrwwwkwww +3-5 q: qqpqw +11-13 p: pplpppppppppb +4-12 g: glggjmsggggjrgbgm +3-7 p: cfphqrxpsgthp +12-15 f: gfnrhffgftnbggfwtbp +16-18 p: pppppppppppppppppm +3-4 l: lllzn +1-2 d: dddd +8-12 n: nnnnxnnhnnnn +2-4 z: zzzzz +1-4 s: sssms +2-4 h: hghhh +1-10 l: nhtnzhdtmslxqskf +5-13 j: bpzjjrrqzndjtw +1-2 x: xxchn +1-16 v: vjvrxvdbdnvvkzvg +9-10 b: xbvzbbmfmbqbbvbbrb +8-12 k: ktnkfbgkkkkbkmkk +7-9 h: hhhhhhwhh +16-17 g: sgggmggggggggggvggg +3-10 q: qmlqqqqqqq +11-14 h: hhhxhhhhhchhwkh +9-14 f: kqwqcftkfdxgmsd +12-13 p: pppppppppppph +7-8 f: dkfnjfff +5-6 f: jtfrrfxckhfmfffszggg +6-8 n: jzhpkszn +8-10 c: cccccnckcxmrchjc +14-15 d: dddjdjdddddddpp +8-10 f: cfshmqfffwtffltfzff +3-4 b: bdbq +2-6 b: cfqkbtvmn +15-16 z: zgzzqzjhzzmnzkzvzz +4-6 r: krrrrlm +3-6 c: dcczrfr +8-9 s: ssssssfws +11-12 s: mssssssssssq +1-2 r: zrznpmzrs +10-11 k: kkkkkkkkkfk +3-9 k: kbkkkkgkk +1-4 w: lwwtw +3-4 t: ttkt +2-3 m: htvmjk +2-4 p: mdpp +10-17 s: ssssssssssssssssws +1-2 m: gmmc +5-9 d: dddbvjkdd +5-8 z: tmnfplzz +7-14 s: ssssssssssssstkss +2-7 q: gqbcxnqcvszwbxqkz +6-17 b: btbxlbbbbbbbbbvtbkd +6-9 l: lllllllld +11-12 q: nqqjjrhgxgqp +6-9 n: nlnnfnnjb +13-17 x: xnxxxxxxxxbdbxxrc +5-13 w: wwtwrwzwwwqfwtkwtwbw +5-10 g: gggxbgmgrgggggg +13-16 h: mhhhhmshhchhhhhl +2-3 f: flff +2-4 k: kkhr +2-6 m: mmmqmml +6-7 p: ppppppp +2-6 k: ksktkkk +2-4 m: gkml +5-6 h: hhvqhjz +2-5 h: hkhqhfh +3-4 z: zzglz +2-3 f: zhfn +10-11 m: mmzmmmmmmfmm +3-13 d: ddwzdmmddmddz +1-2 h: hvkhm +4-5 n: nnnnb +5-7 f: fjppbffffz +2-4 g: tmlp +15-16 q: bqfvqqqcptqqzqqx +18-19 g: lpgqgcgsdtngfddbggnp +3-5 z: kjzkq +1-6 q: qjkqqzqq +3-4 m: bpmmjgmmfmj +2-5 k: jkvkz +11-14 q: qqqbjqqqqqgqqq +6-17 q: bfqqtlqqfjgqtqtqs +5-16 s: ssdzfbsdhsszspssvs +1-7 n: nhnvmhb +4-5 b: hbbrk +9-14 f: fffbffkfftcfnfgf +1-3 n: nznxndpb +3-4 k: qkktw +3-8 r: rrprrgrrr +2-5 l: sqmllls +6-7 n: njnknvnnpvlbnx +3-5 t: hbrtmcttt +5-9 j: fjjnjcgjhnkcpqjbc +2-4 l: jllx +7-8 d: dddddndd +3-6 t: gtsttjnt +9-11 m: cbmgjlqcbsmllm +1-2 l: vllfcckl +10-11 p: ppppzppppplp +2-4 m: slzmmrw +3-8 h: bhhgmpbs +7-14 t: tttttthttttttttt +1-3 r: rrvvrrprwrfrcr +5-15 w: gwbhwjwwwkswcsww +2-5 v: zvtls +1-4 v: vsvv +10-15 z: zzzzzzzzzztrjzr +3-5 v: vvvjhdvv +3-12 s: wqssnmdlwlws +2-3 r: djrftptcrskpzrz +1-3 p: nbppgkmfnjp +17-18 w: wwwwwwwwtwwwwwwwrw +2-5 l: xqntklqlt +2-5 g: gtkggghcvgl +18-19 z: zzzzzzgzzzzzzzzzzztz +16-17 x: xxcxxwxxblpxzkfxzj +15-19 f: frffffstcwffccffffff +3-4 n: npnm +2-3 d: zvddd +7-9 x: xzxxctxxl +13-14 s: hhsxbzssdtssfss +4-5 m: vbpmhmrmvrjnmhlsbmm +3-6 z: zzzzzwdzzzzzzzzzz +18-19 g: gggggggggggggggggng +14-15 x: fxxjxxxxxxmxxwxxnxb +10-12 m: xmmmmfmdmmkh +3-4 b: bbgbgb +11-13 c: cclcccbcxcccqcczc +10-17 w: wwwwwwwswwwwwwnwpw +5-7 l: blllqll +4-10 n: nnnnnnnnntn +9-10 z: fzzztzczwzzgkzzn +4-5 x: gxjhxbxxx +3-6 p: plhxppk +10-19 p: mpgpmxdvqphrcckpvqw +3-14 p: kfdwtqxpstpcfpgcfmp +2-6 k: gnxkkkjrzkknskmpbsj +8-10 l: lzllklldplllzl +16-17 n: nnnsnnnnnnnnpnnjnnn +1-14 c: kccccccccgccccc +2-11 s: lsqghkzwsgsbdmgq +6-7 p: pcpgqrcpqpptpm +1-11 h: lhhhhhhhhqhhxbhhfhhh +11-12 r: rrhjrbrrvrrrrdrrr +5-8 c: cccccwck +6-8 w: wwwwwwwb +12-15 n: htvxnnhvnpnnknnhnt +1-2 c: jcct +2-10 v: vsvvvvvvvvv +4-5 x: xhxtx +3-4 f: ffxf +5-8 v: wprmvflppqwvwfwpkq +5-7 n: znnnnnxblcrn +8-9 n: zljnjjbnn +10-11 m: mzwkrvmzrdc +3-7 h: hxkhfhcqhr +6-13 j: vhcmljdxwkqnfcvmjjb +1-6 g: gvgggthkr +6-10 l: bldnllklkllllclslm +6-7 g: gggggng +1-4 x: xxxxxpnsv +15-16 q: qqqqqsqqqqqqqqqbq +6-7 q: qnqqqdqqq +5-6 p: ppppspppp +3-5 k: kkskkk +1-2 j: jrjjjjj +8-9 d: ddpzdlldmddhdhdd +5-8 t: ttsljtnt +2-4 w: qwwmwwhwwwwwwww +6-8 c: clcccccv +1-8 f: ffbfqfpfbfb +5-13 r: rrrrkrrrrrrrrr +15-18 v: vvvvvvvvjvvvvvvvvvvv +7-8 r: xjwxkzqrrxr +7-10 d: kddddddddbddd +1-8 k: kkkkkkkkk +4-6 q: rhdkjsqjqvzqcpsnq +1-2 t: tdtt +5-6 l: lllwlh +3-5 f: pdzfff +7-8 s: qsswssks +3-5 d: dcdddd +1-12 r: rvlrrrwdtkrcxffr +2-7 d: rddcdlqtnffbdd +5-9 t: phmtdzfjtdb +9-12 x: jxxxxxxxxxxcx +14-16 c: fcclccccmcnccwccqccv +4-5 p: zxpzk +15-19 t: ttttttttttttfkttttl +5-10 k: kdmjgkkkkkblkvkkkk +6-15 q: wqgmcqcmcjlgxkqrdstw +6-7 r: rrrrrrr +2-6 n: ksnnnnnzn +16-17 g: ggggggggggggggghgg +11-13 k: nsgkkkkzckxtkn +2-5 q: jqvkqm +2-10 q: lpqqmqlqqqqqtqqw +10-20 k: dkztkkkkshkkkkkkkkdk +4-7 d: fddddxd +3-5 v: vvvvs +7-9 b: bbbbbbrzb +4-14 z: nbnzkbxbwhqpjsdlzz +3-14 x: xxvxxxnxxxxxxxdxktxx +7-9 z: qqpzzxzvsgzfzdzz +14-15 c: ccccccccccccccmc +11-12 k: kkkkkkkkkskv +15-16 d: ddddddddddddddddd +6-8 x: xkjhxwgxxzxxnzwxcxk +2-6 t: tmwttc +7-8 w: jwcwwwql +5-14 d: jdpddtkddrdddpq +9-14 t: mwctmnjxmztckt +4-8 l: llnlxlmjn +3-6 s: sssskvk +4-8 c: ccchcrctczt +4-6 s: wssnlsnsss +8-18 s: sfkssssbswshsvshms +6-7 b: bbkbcffmwblcmp +8-15 w: fwwmswcwwhlwjwvtlq +2-9 n: wnnnnmqhdpsnzn +1-7 x: xkzzxpz +5-8 x: txxxxmlxkrxsxzsx +7-10 t: lchndztdttgk +1-2 q: tqqq +1-9 z: nzzzzzzzz +1-2 l: djfmfwpnjclt +2-6 x: xxxxxmxxs +2-4 p: ppcv +4-10 d: dddpddddddd +8-11 n: nnnnnnnxnnnn +17-18 v: vvvvnvtvvvjvvvvvzzvv +5-8 h: hhhhhhhfhh +9-16 v: vvvvvvvbvvvvsvtq +3-4 r: hrhrrtrgrr +11-17 g: mvgggwggggggwggxw +3-6 r: rrnrrgrrrr +8-10 n: rgjntnrmkn +6-7 f: sffftmm +4-5 b: bbddn +4-9 d: cdrbqddsqqpzkdd +9-17 n: nnnnnnnnrnnnnnnnjn +1-4 n: knnn +15-16 k: kkkhkkkkkkkkkkkv +15-17 v: jkrddvtmgfqvqvvxk +10-16 j: jjjjjjjjgpsjhjjljjj +9-10 d: jdndwddvdrhndddd +5-7 x: bxxxxwmcb +5-7 r: mlrrdsrrrnrgwrrq +14-17 h: hhhlhhhhhhhhhhhhm +1-12 n: zpnwtpnnnnxzm +11-19 k: ccktkhkwthkkklkvhkmk +6-14 s: sfssxsscssgssqhsnssl +17-18 g: ggdgggggggggfgggrggg +4-13 k: dwddvztkhjnzk +17-19 k: kkkkkkkkkkkkkkkkkkx +5-8 q: qmqzqqqqqqqqqcqq +2-4 q: vqqqqhxd +1-13 c: fjccqcmrcjxgccdvbzr +8-12 h: hkhhhhhhhvhhch +4-10 w: jmwfwxwwkwwcnbwwftrc +8-11 f: fffffffbffdf +12-18 b: bbbbbbbbbbbcbbbbbbb +2-8 k: rdwwjvrkcs +13-14 p: pppphpnppppphpppp +1-3 d: nddddddddddd +5-8 m: mmfdkmnfmqm +2-9 x: xjgwxxxxxl +1-2 v: vhvsvv +11-17 r: tlrgrrrrrwrzrrrrsrr +1-7 c: lcclcvgk +3-5 s: slnkss +3-4 w: hqwbw +11-19 l: lfxllllllldlllllllq +4-5 t: tttbt +10-12 g: gggggggggsgfg +6-8 k: kkmkkkkmk +10-11 q: qqqqqqpqqpsqd +5-17 k: pxwkmdxkskthkkkkn +14-16 m: mmmmmmmmmmmmmpmmmmmm +14-15 k: kkkkkkkkkjkkkkt +13-14 c: ccccccdccccccccccccc +1-2 v: gvmqqnkpln +4-6 k: lwkkkjgwkkk +1-12 h: mhhthhghhhhhhhhh +6-7 t: ptxtwtg +3-9 j: zsjkcjlzj +5-8 q: cpzhqfhvsjx +5-11 s: ssbsskssgssdss +4-12 t: ltkttnzdvxttllttt +4-5 j: jjfjh +4-5 r: rrrprjdtrfr +4-8 d: ccwqskmd +2-9 p: npzptdhsxxpkpk +6-17 x: cxnxxpmxxxxhxxfhxxxx +1-7 q: nqqzqnqqqf +15-17 v: vvvvmkvjvwvscvvvv +12-16 d: mddddbdddjddxddbd +3-7 f: fxpfffff +6-7 d: dgdwrddwhprchmvdr +5-17 h: whhphdbxzwcdhhshwkkh +5-7 f: ffffffjw +10-12 s: grcsbsnssbfs +6-10 z: zzzzzrzzzzzjz +14-15 m: kdmmcmmmmmdmldm +6-7 m: mcxmmcmm +5-6 l: lmlllrlw +3-16 q: qqwqqqqcmqqqqqxqbqq +14-16 p: pppzspppppnppbppwwpp +10-12 q: qqqqqqqqqqqqqq +1-5 j: rjkjvjj +3-9 d: fhqwddjrdzpkgdkd +2-4 v: vlvw +1-4 w: qwcww +6-12 r: rhhzkrzhrwrxrkvrcbmr +3-5 t: xxbtr +5-6 x: xxxpxx +2-5 q: qhqqq +8-16 n: nnnnnknnnnnnnnnt +8-10 g: gdzvghxcnbq +4-19 m: rgmmbqmljmzswbkpkcn +8-12 g: ggggggmhggrgbtghg +13-15 t: ttttttttttttttxttt +1-3 n: nntn +3-4 h: hhxh +6-7 f: ffffffbf +2-3 t: bgtt +7-9 n: nnnnnnjnn +2-4 j: ljgj +12-15 c: ccccdcccccccccfccc +4-9 s: wssssssqlcssz +1-2 z: ljzjgcvg +6-7 q: qqqqqqs +1-6 d: xpddgd +4-14 f: ffffffffdzfffmf +13-14 r: rrrrrrrrrrrrwrrr +6-7 r: rrrcgbrrr +9-15 b: lkkbbbbhbsbgxpgpbb +3-4 f: qzfzwnffv +4-14 m: rkksnmbgjmqmmmc +8-13 n: fjnbrnnnqnnnnn +13-17 h: hhhhhhchhhhhhhhhz +8-9 n: rbtknnmpng +1-6 c: qgtfhqtjkw +2-8 m: wzfmmmmmflmdk +5-7 v: cnvvvvvvv +10-15 n: nxnnnjnsnnnnngnnknrt +12-13 d: ddjddddddddddddd +4-5 n: jncnnh +6-10 z: zzzznbzzzczzl +4-5 s: bsjsv +9-11 g: hvkccbpfxkg +1-2 b: bbqb +7-16 l: lllllllllllllllplll +1-5 l: llllml +3-4 f: fmsf +2-4 g: tgshjbgg +2-7 h: vlzzhhhhhphhf +8-9 p: pnpppppqh +9-11 w: wrxlwdtwnwwtqwpwxgw +8-10 m: mmmmmmmnmm +1-5 p: dpnpppzpp +3-5 l: bllflklcmp +11-19 j: jkjjjvmjjjkjljjjjfj +6-9 k: kkkkkkkbkk +2-4 r: njprlsrmtr +9-10 d: dxhdddddfdd +3-8 z: dmrqpzwzghmznc +2-8 r: tlgqwxcrdpj +10-11 z: zzzzzzzzzzhz +1-10 q: qqqqqqqqqsqqqqqqqq +2-4 x: xrwxx +10-11 s: zssssssssfz +3-9 z: rszsgfzzz +6-13 x: zsxwxxqtgxvbcxxbn +10-16 s: smsssgssshsspwxsq +1-2 g: ngqgc +4-8 l: xllllngb +4-7 h: rhhhhhghbm +1-7 v: vqvslhm +2-7 z: jjfmnmz +1-10 v: vvvvvvvvvqv +11-13 g: ggpgrgggggggggg +3-6 p: tpgqnpphpl +1-3 d: sddddd +8-9 g: gggggggvg +2-6 w: wtvwnw +1-4 m: kmmwm +3-4 h: mhvh +1-4 h: cnjhxvhkdch +7-8 w: wwwwwfwww +6-9 r: rlrrrgrrr +2-4 h: lggh +10-11 q: qqqqqqqqqlh +4-5 l: llllgl +13-16 k: kmffmjbzrpprcdkxglk +1-3 f: ffpf +19-20 n: nnnnnnnbnnnnnnnnnnnv +3-7 h: hhpmhjhwdhzhm +1-5 k: hlkkrkzkf +2-4 s: sssxssssssssssssssss +12-13 d: dddgdddddqndtdkd +3-14 c: cccczvcxchccccclctcl +2-5 b: mbgbb +6-8 j: jjtrtbsjnj +5-6 s: sssqsk +8-16 l: lfrlllllctllqxrpllll +6-12 g: grxlwlnggxvg +16-17 j: jjjjjjjjjjjjjjjjp +6-10 q: nqmzqflbhqqb +12-19 j: jjjjjjwjjjjkjjjjjjgt +8-10 s: sscssssssp +11-12 s: ssssssssssds +2-5 n: hswqnqldwwbbmnnrnht +4-7 p: ztpvbqpwsxrgrkp +3-9 h: hhlhhcjrkhwnhq +10-12 k: kkkkkkkkklkwk +14-15 w: wwwwwvwwwwkwwqwnw +16-20 b: bbbbbbbbbbbbbbbhbbbt +2-5 t: tttttftttttt +3-12 l: qswhtwvnfmfwn +11-12 b: bbbbbbbbbjgvbbbbbbz +8-13 w: wwwwtwwvwwwww +5-6 f: kgjfhfffv +7-17 g: qpxgkvgttkhxjhzxnv +2-3 n: rhffpsqknv +2-10 p: pkpppppppppp +3-15 p: rnpqjpgmcpgzkxcppk +12-13 d: nhdddldxdddddndpdddj +14-16 h: hhhhhhhhhhhhhbrhhhhh +4-9 r: rpzrcnrrrlx +2-14 f: ffffzfzffffffjfff +1-9 s: snhfksssxssss +1-14 n: bnnnnnnnnlnnnn +2-3 c: cwtccc +10-12 k: kkkkkkkkcskkkdkk +2-5 r: qrqsrkrk +3-11 k: nlkqkszttxk +2-3 d: vqdgpwnjprgsgsdrxwk +7-12 k: hkkkkkkdkkkrk +6-8 r: smmfvtxrhzvnrj +8-10 l: llrllllllmll +5-10 l: bpwgqlnktt +4-6 f: flfvjfff +13-14 b: bbbbbbbbbbfbqzzb +5-6 m: rmhmqmkmtkmjnmvdx +10-16 j: jtjjjjjjjdkjgjjjj +3-4 c: cpcc +10-11 v: vxgbfvqftvmc +5-12 n: knqlnbhdphpw +7-13 r: rrrrrtrrrrrrrrr +4-7 n: nbnnffkjnwpqnhvqnr +4-13 r: htrkdwrcmcndrxngd +1-8 h: dhhhhjhdxhh +4-8 b: bbbcbbbg +1-7 b: zqpzzqbfbwbwcbbbp +6-7 l: jlhllllmljvl +9-11 w: hwpwlcwkwcwjgkt +14-17 m: mmmmmmmmmmmmmmmmjm +6-11 r: rrrrrbrrrrr +1-6 c: fccxxc +14-15 j: jjkjjjbjjjfjjljfjj +15-17 q: qqqqqqqqvqqjqqqqz +11-14 j: qjjsjjjjjjcjjjj +11-13 m: mfhjhnsshfxmmm +6-9 z: wrsjtzzzj +6-19 b: lbkksbnggbcdpffqjxbb +1-5 w: wwwwwww +3-5 h: htdhh +5-15 n: nlfdnkvknxgbqlw +3-4 z: pzrz +7-9 h: hhslhhkhhhhh +11-13 n: wqnrnbnnlnjnd +15-17 f: ffsfffffffffffbfff +1-2 m: pmmt +8-9 z: zzzzzzzmzz +2-12 q: qqftqqqklxjc +12-13 p: pppppppppppbp +8-9 q: qqqqxqqlqqqqq +3-5 m: mhmfbq +3-5 j: ckpkjjf +7-11 k: kgkkkkkkkkkkkk +2-3 n: pnnnnmmnkl +1-6 l: lnvqjlflmp +3-14 t: nhzvstnltttdftt +2-3 s: hsrscsz +9-12 b: bbdbbbsbbjbgb +1-10 h: mlkcgnrkwhpgwjvflhgx +5-7 p: spnpmppwp +2-3 h: hrhh +8-11 g: fggsggqhgpg +5-8 n: nsxnvnlpnvn +9-11 f: fvffffjfffrcfff +6-9 q: qqqpzqmqpstrk +8-12 v: vmvvvvpzvrvvv +2-4 x: cnbx +3-5 h: hhqrhhh +6-13 t: ttttttttttttltvttt +2-4 v: zqvvgrxwtw +6-8 v: vdbvvfjv +16-19 g: gggggggggggggggjggg +4-6 m: mmwmstmpmj +1-11 b: bnxzhlbbgbpdvp +7-16 n: txfjncnhsxgbjvhh +5-8 m: mmtvmkmvfkmzmpmd +3-6 g: ggjgggg +8-12 l: lslllglqcnlwlll +2-4 l: llpqjdwxq +6-7 b: bbbbbvb +6-12 b: bbbnbbbbbkrq +17-18 s: msfggsssfsrdvssssdr +3-5 m: mmmmb +4-7 g: ggrwgbgggg +5-6 z: zzzzjpz +1-3 l: mrvclxrpvgnrl +11-13 g: gggjgggggggbgg +1-6 q: qqqqqjqqqz +3-5 d: dndnpzdmqcjrdgd +8-11 g: gggggggbggqggggggg +1-7 k: dkkkkkfkkkkkkrk +3-9 p: slbxznfwvjpnj +12-14 t: kbthtttfttrttt +3-6 x: xxbxxkxx +4-5 z: zzzdz +6-13 c: ccbcjccpcnscqc +11-14 x: xxxgmnxxxxfxhx +2-4 b: gjbrwk +3-4 l: bwmlzldj +10-13 d: qdcxdbrdrdddkdnddd +7-9 d: dddflddbwnmddd +12-14 f: rkgdfbdkqhnfsqjltntx +5-14 x: xxxxxxxxxxxxxxx +8-18 r: rrrrrrrlrrrrrrrrrr +1-19 q: qqqqqqqqqqqqqqqqqqdq +7-11 c: kscqhtcccctprbc +3-5 h: dchjkntfhrbmmkkjpnh +2-9 l: lllllllln +1-6 c: sqczzcnkpwrcgvctlrc +6-16 f: wcnppfpffjxpthhfxf +16-17 x: xxxxcxxxrxsfxxpxfq +7-9 q: qqqqqqqqt +4-6 h: hxhhkgg +12-20 v: pwvzsxtvvslvfxhvcvtz +12-17 k: tkkkkkkkcfktknkkkk +2-3 b: bpqr +4-5 m: mhppm +4-9 g: jrgxgqjqgrrpj +7-12 h: hhswhqwhhqhhhlhtkhzw +5-19 l: llllhlllllllllllllll +2-3 n: mqncngfps +6-15 q: qqqqqnhqqqqqqqtqq +1-8 k: kfkkkkkkr +5-10 f: pmpffbdkfpffgffcf +3-8 b: bbsbcbbb +9-12 h: hwhhhxhshhhhhc +1-5 r: nhcrrbrrrj +2-4 q: qqqsq +13-17 h: lrlngvrhpsdmhkhzt +8-17 m: rmmmmmmlmmmmqmsmmqm +4-8 n: njnsnkjkhnkgblg +9-10 d: pdwdkgcdrdzqdd +3-4 p: pppp +10-12 j: zcjjjjqwjrjj +1-9 d: mddgrxsdk +2-4 v: gsvvjv +5-7 h: hhhbbhjh +15-16 w: wwjwwwwwwwwwwwbw +8-10 b: cbczjdpbkhdbkpbztn +7-10 z: skfvjzzxzt +15-16 m: mmmmmmrmjzxmmmbtmmm +2-6 j: rjjgqb +4-16 d: dptndnvddgtpqdddd +7-8 j: jjhjjjbd +2-3 w: bwdr +4-6 g: jgngnmgggfpgcn +2-3 p: ppkp +7-8 m: mmmmmmnm +5-6 l: lfllln +3-4 r: rrrm +6-7 s: ssssssss +4-15 g: kdtgzznwrczjzgx +11-12 w: jhwwrwwpwwwmwwfwgww +13-15 w: wwwwcjjwwwwwgwwwwwf +4-11 f: fffxffffffff +3-7 g: ggggggpg +3-10 m: mmnmmmmmmm +9-11 h: hfhhhqhhhchhhwh +4-5 j: jjqjq +13-14 x: jmxnxbjrklnvxtn +5-6 f: zzkqnzchtfnvffqd +4-8 j: cxcjvfjjkjz +8-14 s: sssssswnrsssscsss +6-12 t: dftrtdvtxttt +3-4 p: ppmp +1-5 z: zzgszfrg +1-8 g: wbgwggdgtswrlllj +2-4 f: fffpf +16-17 t: tttrktsmtmpttttttnt +6-11 m: mqsxmmtfthmfwn +2-3 c: mcbs +1-3 j: xmjj +15-16 j: jtjjjjjjjjjjjjjxj +6-8 k: kkrkktckk +9-11 l: ltlllllsllmlz +17-18 s: sxmssqtjrhmzhssssk +9-13 k: kkkkkkkkkkkkkkkhk +6-9 g: kpnhsggmqklvtttgcxvl +5-7 z: vzrxbmzzwglvczz +4-10 k: khkkdkkckkkkkzkk +2-6 q: qsqqnqq +1-3 x: qxsxxxx +10-14 x: xxzxxtxxxjcxxx +4-6 z: dzzzvz +1-2 c: cccv +9-12 h: hhhhhhhhhhhc +13-15 z: zzgzzzzzzmzzqzzkzz +3-6 h: pgvjdhtpmthbz +10-13 x: mxqbxxwxxxhxfrxxchxx +2-5 b: qbbmpzrzkcjqqwbj +3-14 q: ltxhrqqqqzfqqq +6-10 j: jjjjprjkqj +9-15 c: dsncxxlqwvzccwc +12-16 m: nxrmdgmmxmscmhnm +4-5 p: ppppthp +10-13 d: ddddddddddddb +2-6 x: bxkwbtsx +5-7 j: jjjjqjjjjjj +8-10 d: wzdddddtdddd +6-9 z: dlzzzzzvwz +2-3 h: hhhh +11-13 t: ttttjtttttttxtt +4-5 s: sdbps +2-10 x: dcmxxxlxxhgxftrjbp +9-15 h: hhhhhhhzjzhwhrkhh +2-6 f: ftxhffff +4-5 k: kkfrkwnbkkh +3-5 m: mmdmm +5-10 z: znvxzzldzvhqztr +7-8 r: rrrrrrcr +14-16 k: kkkkkkvkkkkkkbkk +4-10 x: cxsxzxxxxxxxxn +12-13 s: ssssssssssssss +7-9 s: sswssssshs +1-3 c: ncccrc +7-9 r: rrrwrrtwr +13-14 v: vvvvvvvvvvvvnv +4-6 k: bkkkkx +7-10 r: rrrrrrrrrrrrr +7-8 l: llllllzll +3-11 v: vqvvmnkvvswgkqvmvd +8-10 c: cccccdcccm +1-9 s: sssksqsshsj +5-8 c: cccchmcccc +5-6 h: hsqhhghrhk +4-5 z: czzzrzlzn +2-4 f: fzfffj +14-17 p: pppppppppppppppmpp +4-5 x: ldqxq +12-16 g: gtgggggggggpgggggt +13-14 v: zfbmrhphzmrvqv +6-10 p: ppppppppphppkp +10-12 l: xlllklllllkwlcl +4-6 v: qvbvgdw +6-12 q: qqqsqlqqqqqq +3-5 s: rssgpssnb +1-2 g: gzlpcmbsmgrq +2-9 w: lpmbmfvpwggfvmzmmw +4-6 n: nqtfzz +3-4 f: fftf +13-17 n: nnnznkgmnnnnpnngnfn +8-10 p: ppppxppppppppprppsp +10-12 g: ggnggkggggcvg +3-8 l: lxrcbjnddcbpg +6-7 q: qkjqfqqdkkkqrqqqc +5-8 p: wpbpmpwpfsblpplmpp +2-7 n: bbrtwnhhttntqhnr +1-2 p: pcdxzjwmnkfjkpbj +1-15 n: nnnnnnnnnnnnnnznn +18-20 s: ssmsssssssssssssrssw +1-12 h: vhxhmhhhhhhhd +3-7 r: qkkvhvr +3-5 k: xkpkkkzbtwkv +2-4 z: zfzz +1-2 t: ktttt +2-3 p: pbwp +2-4 j: ljjj +14-15 t: pzpcktthttfttttt +3-4 n: nwnj +8-10 l: lzllllllln +1-12 q: qqqqqqqqqqqqq +6-12 z: xxltbzrpwzzmw +15-16 q: qqqqqqqqqqqvqqqjq +4-5 r: rhmrkrd +7-10 r: rrrrrrlrrrrrr +16-18 t: ttttwttttttttttttn +9-17 m: bmmmmmmzmmpmmhmrw +9-13 r: rrxfrrxrrrrrrr +13-18 p: ppdxprpqppbpppprpz +5-8 p: rprmpfpxgjphfktszplp +5-7 h: hhhhhhnh +3-7 h: rwhpshznhhh +9-10 x: xwxzbrxxgxrxxdxxs +6-7 h: hvhhhhng +5-6 b: bbbbwhbb +4-5 g: gbgggg +3-9 g: gsbggghggpgdgg +1-3 r: rxrhh +3-4 c: rccn +4-8 z: zpzzznzzzwz +14-17 b: bbbbbbbbbbbbbbbbbzb +2-4 w: rwvwrdn +3-6 p: pfpsgp +2-12 p: zpwkjpppbppjrppknh +5-9 t: tmttgtttn +2-3 v: wvvcv +3-5 h: bnbhhtjhk +15-17 f: tffwftdskgfxgfffpk +16-17 h: hphhhhdhhhhhxhhhrhh +7-8 d: ddddddtnd +9-20 t: tqttttttttttttttbttw +1-11 v: vxcgzvvvkrlqvg +2-6 r: ghrbwrtfksqkxx +8-10 w: wwwswwwmvwww +4-10 m: mqmmmtmmfq +2-3 g: gkgtgv +9-11 w: wwwwsqwwpwwxrwww +3-4 w: zwxwtcscwmwmndcw +8-9 q: xsqqqqzxfqfv +2-4 w: wwhh +9-18 d: ddddddhddddddddddq +3-4 s: sssjsvs +15-16 p: wphpxpppppppppppppvp +10-12 t: qftttqhtvttt +1-2 b: vbfxqgbzrktjm +3-4 k: lkkr +9-11 d: dddddkdqdttddd +9-11 m: mwngbfmhmcvwx +2-5 b: scbxbb +6-9 z: zzzzzzzzzzz +1-3 z: zzvhz +5-7 x: xxxxxxkxx +1-5 s: ssscshss +1-7 s: csrfvfsqjss +16-17 k: fwdkkkckkkkrrkkck +3-4 h: hhhs +4-8 w: wwwswwwx +1-10 f: fffskffsdfcfvfff +7-15 r: rrrrrrrrrrrrrrxr +1-2 k: kvxbzdcnsqrskhmx +2-4 s: wbvsfs +2-7 q: rbgqpqdq +15-16 f: fffffffffffffffq +1-3 c: bccpkm +5-11 g: fsvgthpglgg +3-5 f: ffffwf +5-16 j: djmwqfxsbzwjdwtj +3-4 p: pprpp +5-6 n: nhnnwj +8-12 s: tssssssrsssksss +5-8 p: pppppppppppp +10-15 w: wgfwwcwtmwwgwpwwh +12-15 l: lllllllllllplll +1-8 c: ccccqccd +3-4 z: zzzvzkzgc +2-10 h: swwbtfkvfhrjztdzx +2-7 z: zhbzkzlzz +2-9 q: ddqdqpkcjqkfgqtcjqq +9-10 l: lllmllkltlll +2-3 n: ngwn +2-3 r: rrnr +5-10 n: ltnnnknnvcnnn +7-9 p: jtpptpllpj +2-5 s: slssssszssssssss +16-17 d: dddddddddddddddlp +2-5 q: bbwqqbkmdhqmjhn +7-10 m: qmpgmmsmmmmkmmkj +4-7 g: vczggdgbgxgg diff --git a/c/2020/2/main b/c/2020/2/main new file mode 100755 index 0000000..4de7a27 Binary files /dev/null and b/c/2020/2/main differ diff --git a/c/2020/2/main.c b/c/2020/2/main.c new file mode 100644 index 0000000..f60bf21 --- /dev/null +++ b/c/2020/2/main.c @@ -0,0 +1,72 @@ +#include +#include +#include +#include +#include "../lib/util.h" + +char password_buffer[30] = {0}; + +bool is_valid_password_part_2(const char *password_line) { + int char_first, char_second; + char target_char; + + sscanf(password_line, "%d-%d %c: %s", &char_first, &char_second, &target_char, password_buffer); + + bool result = ((password_buffer[char_first - 1] == target_char) != (password_buffer[char_second - 1] == target_char)); + + // printf("%s: %s\n", password_line, result ? "valid" : "invalid"); + return result; +} + +bool is_valid_password_part_1(const char *password_line) { + int char_min, char_max; + char target_char; + char *password = password_buffer; + + sscanf(password_line, "%d-%d %c: %s", &char_min, &char_max, &target_char, password_buffer); + while(*password > 0) { + if (*password == target_char) { + char_min--; + char_max--; + } + password++; + } + + bool result = char_min <= 0 && char_max >= 0; + // printf("%s: %s\n", password_line, result ? "valid" : "invalid"); + return result; +} + +int count_passwords(bool (*validation_function)(const char *password)) { + char *data_buffer = load_input(); + char *data = data_buffer; + + int valid_passwords = 0; + int invalid_passwords = 0; + + char *line = strtok(data, "\n"); + do { + if (validation_function(line)) { + valid_passwords++; + } else { + invalid_passwords++; + } + } while (line = strtok(NULL, "\n")); + + free(data_buffer); + return valid_passwords; +} + +int part_1() { + return count_passwords(is_valid_password_part_1); +} + +int part_2() { + return count_passwords(is_valid_password_part_2); +} + +int main() { + printf("Part 1: %d\n", part_1()); + printf("Part 2: %d\n", part_2()); + return 0; +} diff --git a/c/2020/3/input.txt b/c/2020/3/input.txt new file mode 100644 index 0000000..79b6181 --- /dev/null +++ b/c/2020/3/input.txt @@ -0,0 +1,323 @@ +.#..............##....#.#.####. +##..........#.....##........... +.......#....##...........#.#... +.........#.#...#..........#.... +.........#..#................## +..#...#..#..#...........#...... +...................#...##..##.. +........#.....##...#.#.#...#... +#..#.##......#.#..#..........#. +......#.#...#.#...#........##.# +.....#.####........#........... +...###..#............#......... +.....#.......##......#...#..... +#......##...................... +......#..............#......... +..##...#....###.##............. +#...#..........#.#.........#... +...........#........#...#...... +.....##.........#......#..#.... +#..............#....#.....#.... +.#......#....#...#............# +.####..........##..#.#......... +....#...#...................... +....................#....#.#... +..........###.#...............# +.#...........#...##............ +.#.#..#.....#...#....#.......#. +.##........#..#....#........... +.........#.....#......###...... +..............#..#.......#..... +........#..#.#...........#..#.. +#.........#......#.....##.#.#.. +........#.#.#....#............. +........#........#.#.##........ +#......#.#..........#..#....... +..#....#...##......###..#..#... +............#..#.#.........#... +....#.#...........#..........## +.......#.#.#..#......#...#..... +..#.........##.#.........#...#. +......#....#.#....#........#.#. +.#....###....#..............#.. +.#....#.......#....#..#.....#.. +.....#.....#................... +..#.....#......#......#........ +......##.##...#...#...#...#.##. +##...#....#...#..#...#...#..... +..#.....#...#...##.##...#...... +.....#.............##...#...... +.....................#.##..#... +#...#....#....#........#.....#. +..#...#.........#...#..#.....#. +#.#......#...................#. +..#...........##............... +..#....#........#..#........... +...........#................... +.............###......#....#... +...........#...#....#..#....#.. +.....##............#.#.......#. +.....#..#....#...#....#........ +...............##........#.#... +.........#...#.#....#.......#.. +#..#.......#.......#...#....... +..#...........................# +......#.......#..#......#...... +.#.......#..................##. +..#.........#..#.##.#....#...## +...#..#....#...#....#.#........ +.#...#........##..#..#.......#. +.....#........#....#....#..#... +............#...........#...... +..###.......#..#....#......#... +.....#...#.......#..#.......... +..#........##.#....##.......... +#....#.............#..##......# +....#.................##....... +...#.......#........#....##.#.# +##..##..#.....#.....#.......... +...#...............#....#..#... +.#...##....#....#.....#....##.. +...#.....#......#......#....... +#.....#.......##.....#..#....## +.....#.#...##.#......##....#.#. +..........#....#.#...#......... +.#..##...#..................... +...........##..#...#....#...... +...#......#........#.......#... +.#......#..#........#.....#..#. +.......#........##..#.##....#.. +.##..........#..#...#.....#.... +.....##...............#.#...... +..##.....#..#......#..##.#.#... +....#......#.##...........#.... +#.#..#.......#......#.#........ +...#.#..#....#............#..#. +...#..........###....#....#...# +........##...#.......#..#....#. +..#...#.....#..#........##..... +...#..#.##.#.#.##.............. +.......#...#.........#.....#..# +..#.....#.#..........#..#...... +......#..........#......#.....# +.#...........#........#......## +..##............#......#...#..# +#..................#........... +#....#..#.........#........#..# +..#.#....###..#...#...##...##.. +...#....#..#.....#............. +.#........##.##...#....#...#... +.........#.......##.#.....##... +#.#.....##...#........#...#...# +.....#.#.##...#.....#.##..#.... +........#...##...#...#.#..#..#. +.##....#.##...#.......#........ +...#..#................#..#.... +....#.......#......#...#.##.... +#......###..#...#......#....... +..#...#...##...........##...... +.......#...#..##....##......#.. +....#.#.............#.#...##..# +..........#........#...#......# +............#.#.#....###....... +#..#...#.#.####...#..#...#..... +.##.......#.##...#............. +#..#...........#.#.##.......#.. +...#..#.#...#...###..#.#..#.#.. +..#...#.....#..#....#....#..... +.........##.......#............ +.........##.##......###........ +.............#.#....#..#.....#. +...#....#.#.......#......##.... +............#.................. +....##...#..........#...#..#... +#..#....#.....#.......#.##.#..# +.....#.........##.............# +#.....#.#...#............##..## +..............#....#.....#..... +.#....###..#.#.....###.#..#.... +.....#....##...#....#......#... +..........#...#....#........... +............#....#..#.........# +..##.....#.#...#.......#...#... +...#...#..#......##...#.....##. +......#.##............##.#....# +....#......#...##.....#.....### +.#.###...............#...#.#... +..#....................##...#.. +.......#.....##...........#.... +#.........#....#....#....#....# +..#.#..##.#.#.................. +.....#.......#................# +...........#.......#........#.. +#...#.........#.#.....#.....#.. +..........#..#...........#..... +#..#.##..##..#.#.##.........#.. +#..#..#....##..#.........#..... +#.#.......................#.#.. +.##......#.#...#......#....#... +..#.#................#..##..... +.......#..................#...# +.....#.........##.#....#....... +#..........#..#.#..........#..# +..#..#.....#.........#...#..... +..............#.....#..#...#.## +............................... +...#............##......#.....# +.......#..#.............#.#.... +...........#..........#........ +...#.####..#......#...#....#... +##......#.##.....#............. +....#.........#...#...........# +...#........#.......#.#..#.#.#. +..#.......#.........#....#..... +................#.#.#.##...#..# +#.##...#...#..#.....#.....#..#. +...............#...........#... +.....##.#...............##...#. +.#..##.##...................... +.......#.........#..#..#....... +...#......#..................#. +...#.#..#....#....#............ +...........#...#..#....##...... +.....#...#..#.#....#....#....#. +.......#...#...#.#.#........... +....#......#......#...##..#.... +##...#.#.....#..#.##........... +#.#..#.....#..#................ +...#..#.#......#.#...........## +##....#...#.....###..#...#....# +...#.....#.#.#......##...#...#. +............#.......#.......... +....#..........###.......#..... +.................##..##....#... +...........#........##..#...... +...#.#...#.....#........#...#.. +#...#.#......#.#...........#... +..#..........#....#..........#. +..#................#........... +#...#.#....#.#.......#......... +.#...........##..#....#....#..# +.##........#.....#...#..#....#. +......#......#...#............. +.......#..#...#.##....#..#.#... +.......#......#....#....#.#.#.. +..........##.....#....##.#..... +.........##..#...#.....#..#.... +...#....#..........#..#...#..#. +.......#.....##.#..#.....#...#. +#...#......#......#...#........ +#..#....#.#......#......#...... +.......#.##.................... +...##...#.....#......##......#. +.#...................###....... +....#........###...#........#.. +...#............#.....#..#..... +..................#......#....# +..##......#..##..##......#.#... +........##....##.......#...#... +.#.#....#.....#.....#....#....# +...##.#.............#....##.... +.........#.....#...#......#.... +..#.....#............#....##... +..##.....#.....##.##........... +#....#.#.......#..#......#..... +##.......#.....#.....####....#. +##...#.......#...#.....#....... +#.....#..##.##...##..#.....#..# +..........#......#..#.#........ +..##.#......#..............#... +.#...#..........#.......#....#. +..#....##...#...........#....#. +..#.........#..#......#......#. +.##....#......#.#.........#..## +.......#...#....##............# +.##.................#.#........ +...#.#...#..#..#.....#.#....... +.#.#.......#................... +..#..#.....#......#.....##..##. +.#........#.##......#.......... +....##...#............#.#....#. +.......#.#..#....##.#....#....# +......####...#..#.....#........ +..........#..#.........#.#..#.# +..........##.........#.##...... +.##..#.#.....#.....#....#...... +............#..#............... +.....##.........#...#...##...## +........#.##.#...#.....#....#.# +#......##.#.##..........##..... +#..#..#........#.........#..#.. +...............#.#..##......... +.#.......##.#..#....#...#....## +.#..##.....##......#....#...#.# +........#...#.........#.....#.# +...........#............#...#.. +................#...........#.. +..............##........#....#. +..........#.....##.....#..#.... +#......#....###..#..#.......... +.....#.#.....##....#.#.......#. +...#...#...............#.#..... +.............#.......#......... +.....#.....#..#......#.....#... +.........#.................#.## +.#.....#.##..#................. +..#......#.......#.....#...#..# +..#..#.#.#...#.......#.##...... +..........#..#.........#....... +.#..........#...#....#..#...##. +.#.#.#.###.....#...#.#.#....... +....##............#............ +.#.#.............#..#......#.#. +.#.#..........##..#.....#..#.#. +...........#.##..#...#.#.....#. +...........#..#....#........... +..#................#.#...#....# +...............##........##.... +....#.............#........#... +...#......#.#.#........#....... +#..............#..##.#..##..... +.#.#.###................##..... +.............#..#.........#.... +.......##..#............#...#.. +...#...#...........#.....#..... +........#......#.#.#......#..#. +#.##.......#......#..#..#.#.... +...#........#...........#...#.. +..#...........#.........#...... +.............#....#....#....... +....#.........#........#......# +..#............##..#.........#. +.#...#...#..#...#........#..#.. +...#....##..............#...... +...........#...#....#.#.##..### +..#....#......#.........#..#... +.......#...#................... +.#...#.#...................#... +.#.....##.#.......#.#.#...##..# +.....#..#.#.........#...#..##.. +.#..#.##.#......#......#.#...#. +......#..#....##..#....##....## +#...#......##........##........ +.#.........###................# +.................#..###..#.#... +..#.#........#..#........#...#. +#.#....#....#..#...#.#......#.. +.#.#.............###.........#. +.....#...............##...#...# +..............#...#........#..# +...................#..#.......# +#......................#.....#. +...#.........#..##...#...#.##.. +.....#..........#.........#.... +.....#...#............#..#..... +.............#............#.... +...#.........#................. +#...........#.#...............# +.....#...#.....#..#.##.......## +...#....#.#...........#........ +.........................#.#... +.#..#...........#.#........#... +.............#.#.....#..#....#. +.....#...#.###...#..#........#. diff --git a/c/2020/3/main b/c/2020/3/main new file mode 100755 index 0000000..def3f27 Binary files /dev/null and b/c/2020/3/main differ diff --git a/c/2020/3/main.c b/c/2020/3/main.c new file mode 100644 index 0000000..26c31ac --- /dev/null +++ b/c/2020/3/main.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include "../lib/util.h" + +int process_slope(int slope[]) { + InputWithSize *input_with_size = load_input_with_size(); + char *data_buffer = input_with_size->data_buffer; + int input_size = input_with_size -> size; + + char *first_line = strtok(data_buffer, "\n"); + const int course_width = strlen(first_line) + 1; // Account for \n + + int position[2] = {0, 0}; + int index = (position[0] * course_width) + position[1]; + + int trees_hit = 0; + do { + if (data_buffer[index] == '#') trees_hit++; + position[0] += slope[0]; + position[1] += slope[1]; + position[1] %= (course_width - 1); + index = (position[0] * course_width) + position[1]; + } while (index < input_size); + + free_input_with_size(input_with_size); + return trees_hit; +} + +int part_1() { + int slope[2] = {1, 3}; + return process_slope(slope); +} + +int part_2() { + int slopes[5][2] = { + 1, 1, + 1, 3, + 1, 5, + 1, 7, + 2, 1 + }; + int product = 1; + for (int i = 0; i < 5; i++) { + product *= process_slope(slopes[i]); + } + return product; +} + +int main() { + printf("Part 1: %d\n", part_1()); + printf("Part 2: %d\n", part_2()); + return 0; +} diff --git a/c/2020/4/input.txt b/c/2020/4/input.txt new file mode 100644 index 0000000..54db857 --- /dev/null +++ b/c/2020/4/input.txt @@ -0,0 +1,1159 @@ +iyr:2010 ecl:gry hgt:181cm +pid:591597745 byr:1920 hcl:#6b5442 eyr:2029 cid:123 + +cid:223 byr:1927 +hgt:177cm hcl:#602927 iyr:2016 pid:404183620 +ecl:amb +eyr:2020 + +byr:1998 +ecl:hzl +cid:178 hcl:#a97842 iyr:2014 hgt:166cm pid:594143498 eyr:2030 + +ecl:hzl +pid:795349208 iyr:2018 +eyr:2024 hcl:#de745c hgt:157cm + +hgt:159cm pid:364060467 eyr:2025 byr:1978 iyr:2018 cid:117 +ecl:hzl +hcl:#18171d + +hcl:#cfa07d +ecl:amb iyr:2012 +hgt:182cm cid:338 +eyr:2020 +pid:374679609 byr:1925 + +eyr:2021 byr:1981 +hcl:#623a2f cid:195 iyr:2010 +pid:579769934 ecl:grn hgt:192cm + +byr:1970 +ecl:oth +eyr:2025 +pid:409994798 iyr:2018 hgt:189cm + +hgt:153cm pid:817651329 iyr:2019 +eyr:2029 +hcl:#623a2f byr:1920 +ecl:gry + +iyr:2011 ecl:amb hcl:#a97842 byr:1965 pid:648375525 eyr:2028 hgt:177cm cid:287 + +iyr:2012 pid:369979235 hcl:#c0946f +ecl:amb hgt:178cm + +byr:1927 ecl:brn hgt:178cm eyr:2026 hcl:#efcc98 +iyr:2011 pid:770851101 + +eyr:2028 +ecl:oth cid:298 +byr:1943 +hgt:168cm iyr:2018 hcl:#ceb3a1 pid:116783406 + +eyr:2027 hgt:175cm hcl:#733820 +ecl:gry cid:349 iyr:2017 byr:1960 +pid:257797292 + +cid:66 ecl:amb +eyr:2030 +iyr:2026 byr:2024 +hcl:a22966 hgt:179cm pid:155cm + +eyr:2023 hcl:#c0946f pid:081232570 ecl:hzl +iyr:2010 hgt:158cm byr:1969 + +byr:1958 +ecl:grn hcl:#ceb3a1 +hgt:173cm +pid:600039004 +cid:107 iyr:2012 eyr:2027 + +ecl:amb pid:021066381 +hcl:#ceb3a1 byr:1982 iyr:2017 +hgt:167cm eyr:2025 cid:61 + +hcl:#341e13 +cid:268 +pid:358390884 hgt:188cm byr:1961 iyr:2014 eyr:2027 ecl:blu + +ecl:brn eyr:2020 +pid:607203641 +hcl:#fffffd iyr:2011 +byr:1962 +hgt:156cm + +iyr:2018 +hcl:#b6652a +byr:1942 ecl:blu eyr:2029 hgt:154cm pid:649263319 + +ecl:oth hgt:73in iyr:2012 hcl:#888785 eyr:2020 +pid:147939289 +byr:1961 + +ecl:oth iyr:2015 +hgt:189cm hcl:#341e13 pid:686943691 eyr:2023 byr:1987 + +pid:568844323 +eyr:2023 byr:1921 hgt:167cm cid:154 hcl:#b6652a +ecl:gry iyr:2020 + +eyr:2023 byr:1994 +iyr:1937 hgt:177cm hcl:#c0946f pid:686240814 cid:231 ecl:#a8ba32 + +hcl:#b6652a +byr:1946 pid:543383899 iyr:2013 hgt:153cm ecl:hzl cid:238 eyr:2023 + +eyr:2028 ecl:blu +hgt:154cm cid:252 +pid:196374590 +byr:1987 iyr:2011 +hcl:#7d3b0c + +iyr:2013 +ecl:amb cid:187 +hgt:187cm pid:593027548 byr:1963 +eyr:2024 hcl:#fffffd + +pid:588211492 hgt:156cm +iyr:2021 eyr:2021 ecl:gry hcl:z byr:1928 + +ecl:amb hcl:#888785 hgt:180cm eyr:2022 byr:1923 pid:490291639 cid:173 iyr:2015 + +iyr:2014 cid:211 pid:404157420 hcl:#602927 +ecl:oth byr:1946 eyr:2030 hgt:175cm + +hcl:z byr:2026 +pid:61805448 +hgt:125 iyr:2025 + +eyr:2028 +hgt:156cm +hcl:#341e13 cid:103 ecl:amb iyr:2017 byr:1937 pid:320691739 + +hgt:185cm +pid:440489464 byr:1929 ecl:amb iyr:2011 eyr:2021 cid:327 hcl:#341e13 + +byr:1988 ecl:grn +pid:062728732 iyr:2013 +hgt:181cm +hcl:#18171d +eyr:2026 + +pid:000647617 +eyr:2029 byr:1937 +ecl:gry hcl:#e8eff3 hgt:164cm cid:151 +iyr:2016 + +hgt:179cm +byr:1949 +eyr:2029 pid:459190453 +ecl:grn iyr:2020 hcl:#c0946f + +hgt:160cm pid:476613532 cid:190 iyr:2016 hcl:#4657e5 +byr:1929 +eyr:2028 + +ecl:grn +eyr:2027 byr:1982 +hcl:#18171d +pid:630408328 +cid:65 iyr:2020 +hgt:161cm + +pid:752776254 +hcl:#888785 +hgt:189cm +eyr:2027 iyr:2020 ecl:hzl +cid:194 byr:1934 + +iyr:2015 hgt:167cm byr:1977 +eyr:2021 hcl:#14564f pid:504471386 ecl:oth + +hgt:84 pid:168cm +hcl:8532fb eyr:2023 +iyr:2012 ecl:xry byr:2008 cid:288 + +cid:323 eyr:2024 +iyr:2019 +pid:495737304 byr:1966 hcl:#7d3b0c ecl:hzl +hgt:73in + +iyr:2020 byr:1953 ecl:hzl hcl:#efcc98 hgt:174cm eyr:2026 pid:546906638 + +pid:839249028 +hcl:z byr:2024 +hgt:145 eyr:2034 iyr:2021 ecl:#891c47 + +eyr:2036 +ecl:#89d2ae +cid:183 byr:2014 +hcl:b3af0f +pid:12086913 iyr:1981 +hgt:61cm + +ecl:brn eyr:2030 pid:083487445 byr:1929 hcl:z iyr:2021 +hgt:182 cid:318 + +eyr:2020 +pid:188609216 hcl:#341e13 +iyr:2012 hgt:179cm + +eyr:2029 +hcl:#888785 pid:704026565 hgt:173cm iyr:2020 ecl:blu byr:1950 cid:237 + +ecl:grn +eyr:2030 +byr:1961 pid:695808266 +iyr:2012 cid:56 +hgt:155cm + +iyr:2011 ecl:amb +byr:1986 pid:243061330 hgt:163cm eyr:2021 + +eyr:2030 hcl:#623a2f hgt:170cm ecl:hzl +pid:694575319 iyr:2011 +byr:1939 + +iyr:2014 pid:184152121 +hcl:#c0946f hgt:163cm +eyr:2028 byr:1992 cid:114 + +ecl:hzl +hgt:75in cid:233 +hcl:#866857 pid:269157261 iyr:2020 +byr:1973 eyr:2029 + +hgt:174cm +hcl:#f86751 iyr:2016 +pid:904779190 +ecl:brn eyr:2024 byr:1950 + +cid:123 iyr:2019 +eyr:2030 pid:402585706 +ecl:brn byr:1995 hcl:#4ff7fa +hgt:65in + +ecl:grn eyr:2029 +pid:083364259 iyr:2013 cid:50 byr:1938 hgt:187cm +hcl:#a97842 + +hcl:#6b5442 cid:101 iyr:2011 +ecl:amb eyr:2029 byr:1963 pid:664573740 + +eyr:2025 hcl:#602927 +hgt:188cm +iyr:2019 +pid:521514539 byr:1940 ecl:gry + +hcl:dc0449 eyr:1981 pid:188cm +cid:151 iyr:1979 hgt:61cm ecl:dne +byr:2028 + +iyr:2017 byr:1924 +hgt:163cm eyr:2024 hcl:#ceb3a1 pid:424127124 +ecl:amb + +eyr:2039 pid:7837217107 hcl:z byr:2005 +iyr:1989 ecl:#d95f4d hgt:190in + +ecl:#329eb1 cid:178 hgt:192 +eyr:2020 iyr:2012 +hcl:#602927 +byr:2028 pid:7175349420 + +ecl:gry byr:1931 +hgt:162cm iyr:2014 +eyr:2030 cid:50 +hcl:#cfa07d pid:653585396 + +eyr:2025 hgt:177cm +ecl:gry hcl:#efcc98 +iyr:2015 +byr:1942 +pid:388475446 + +hcl:#efcc98 ecl:grn +hgt:185cm +byr:1921 pid:253592171 +eyr:2031 cid:220 iyr:2024 + +byr:1950 +hgt:158cm ecl:gry iyr:2015 hcl:#18171d +eyr:2023 +pid:151cm + +byr:1957 +hcl:z +eyr:2026 +ecl:grn +iyr:1971 hgt:192in pid:5479810865 + +hgt:161cm pid:473851111 iyr:2018 +ecl:brn byr:1982 +eyr:2029 + +pid:136216608 byr:1958 +cid:226 eyr:2023 hcl:#866857 iyr:2017 ecl:hzl hgt:159cm + +byr:1993 hcl:#866857 hgt:169cm pid:488392920 +cid:109 iyr:2017 ecl:oth eyr:2029 + +cid:248 ecl:amb eyr:2025 iyr:2017 byr:1951 hcl:#ceb3a1 pid:731763175 hgt:162cm + +hcl:#835e79 +eyr:2021 +ecl:oth pid:617055193 byr:1997 iyr:2010 +hgt:173cm + +eyr:2024 pid:257895944 +hcl:#ceb3a1 +hgt:165cm +ecl:oth iyr:2020 +byr:1958 + +pid:438580092 +ecl:grt byr:2025 +hcl:z iyr:2000 eyr:1952 +cid:271 hgt:170in + +iyr:2010 hcl:#6b5442 hgt:156cm +eyr:2026 ecl:grn pid:409793041 byr:1941 + +pid:076486440 +hgt:177cm hcl:#888785 ecl:blu iyr:2017 eyr:2029 + +eyr:2028 ecl:amb hgt:186cm hcl:#1d5836 pid:563307670 iyr:2019 byr:1950 + +byr:1939 ecl:hzl hgt:193cm pid:329759796 +hcl:#cfa07d eyr:2025 iyr:2011 cid:73 + +byr:1995 +hgt:188cm eyr:2028 +ecl:blu +iyr:2016 hcl:#888785 pid:459613739 cid:115 + +hcl:#623a2f +eyr:2021 cid:197 hgt:187cm ecl:oth +byr:1969 +iyr:2010 pid:385660251 + +hgt:192cm cid:143 byr:1995 hcl:#fffffd +iyr:2017 ecl:oth +eyr:2020 pid:087661720 + +ecl:oth +byr:1994 hgt:183cm +eyr:2020 iyr:2020 pid:448389966 cid:92 hcl:#866857 + +pid:088166852 hgt:155cm cid:307 byr:1940 +hcl:#7d3b0c +ecl:#af542f eyr:2023 iyr:2014 + +byr:2026 eyr:2039 hcl:5449b3 +ecl:hzl hgt:176in +iyr:1962 pid:177cm + +iyr:2020 ecl:amb hgt:164cm hcl:#c0946f +pid:931543453 eyr:2024 byr:2001 + +iyr:2010 eyr:2023 hgt:188cm +hcl:#866857 ecl:hzl pid:866631112 byr:1997 + +byr:1958 hgt:184cm +cid:117 hcl:#7d3b0c iyr:2019 pid:615734013 eyr:2028 ecl:gry + +hgt:86 iyr:1935 ecl:grt pid:#af8e67 eyr:2031 +byr:2018 hcl:6a2940 + +hgt:73in eyr:2022 pid:580461358 byr:1962 +cid:129 iyr:2015 hcl:#7d3b0c + +iyr:2019 hcl:#b6652a hgt:172cm ecl:blu pid:077121198 eyr:2021 +byr:1995 + +hcl:#ceb3a1 cid:253 +iyr:2015 hgt:177cm byr:1973 +ecl:hzl pid:311289324 eyr:2025 + +iyr:2017 hcl:#efcc98 +cid:57 byr:1940 ecl:blu +eyr:2025 hgt:157cm pid:827480048 + +eyr:2028 hgt:189cm +iyr:2016 byr:1978 ecl:hzl pid:127497651 cid:87 +hcl:#623a2f + +hcl:#341e13 byr:2015 +ecl:brn hgt:187in +pid:82075551 +eyr:1936 +cid:200 +iyr:1939 + +ecl:grn byr:1962 +iyr:2011 hgt:169cm +pid:661559147 +hcl:#623a2f eyr:2023 + +ecl:gry +hcl:#efcc98 eyr:2009 byr:2028 +hgt:170in +cid:129 pid:161cm iyr:2018 + +pid:098090405 hcl:#623a2f byr:1943 ecl:hzl +hgt:152cm iyr:2013 eyr:2029 + +pid:495271053 iyr:2011 ecl:gry hcl:#623a2f cid:285 +byr:1925 eyr:2024 hgt:187cm + +cid:306 +hgt:73in +iyr:2010 hcl:#448fd7 +byr:1946 +ecl:grn pid:137146932 eyr:2021 + +eyr:2020 hgt:159cm cid:90 iyr:2010 ecl:brn hcl:#341e13 byr:1955 + +hcl:#18171d iyr:2017 ecl:amb +pid:168517472 +eyr:2021 hgt:181cm byr:1942 + +cid:325 eyr:2022 pid:947158470 byr:1994 iyr:2019 ecl:grn hgt:172cm hcl:#ec63ce + +iyr:2011 +pid:243339529 +ecl:amb +hgt:169cm +byr:1967 +eyr:2025 hcl:#b6652a + +pid:664966826 eyr:2036 iyr:2015 byr:1972 hgt:68in +hcl:z +ecl:#038105 + +eyr:2021 pid:236054221 +hgt:179cm +hcl:#b6652a iyr:2020 ecl:blu + +ecl:grn +iyr:2010 +pid:870519416 byr:1945 hcl:#a97842 +hgt:176cm eyr:2030 + +hcl:#3318db eyr:2022 +byr:1966 +ecl:grn iyr:2013 +cid:349 +hgt:168cm pid:827688488 + +pid:124116963 +hcl:#866857 eyr:2026 +iyr:2013 ecl:grn byr:1983 hgt:183cm + +iyr:2017 byr:1993 +hcl:#18171d ecl:utc hgt:68in cid:168 eyr:2030 pid:#2fd9f2 + +ecl:blu cid:134 eyr:2025 pid:588957573 +iyr:2017 +hgt:151cm byr:1942 hcl:#4280c1 + +hcl:#51b593 +iyr:2013 +ecl:amb pid:668244584 +cid:282 +byr:1936 +eyr:1985 hgt:161cm + +pid:494051052 +hgt:185cm byr:1996 eyr:2028 iyr:2018 +ecl:amb +hcl:#efcc98 + +ecl:brn +eyr:2025 +iyr:2011 +hgt:163cm hcl:#a97842 +byr:1989 pid:557549000 + +pid:828235468 cid:55 +iyr:2010 byr:1926 eyr:2029 hgt:153cm hcl:#cfa07d +ecl:blu + +hgt:158cm iyr:2015 pid:957913612 ecl:grn eyr:2020 byr:1984 cid:76 hcl:#6b5442 + +ecl:amb eyr:2020 pid:596116320 +byr:1936 +hcl:#cfa07d +hgt:165cm cid:86 iyr:2014 + +iyr:2012 +cid:278 hcl:#602927 +eyr:2020 ecl:hzl +hgt:176cm byr:1987 pid:594817909 + +iyr:2011 byr:1929 pid:073211525 eyr:2022 +hgt:188cm +ecl:blu +hcl:#733820 + +hcl:#602927 hgt:187cm +pid:706155322 cid:203 +ecl:brn byr:1952 iyr:2017 eyr:2020 + +hcl:bcb5f7 +byr:2002 eyr:2029 pid:850069752 iyr:2019 ecl:hzl +hgt:167cm + +hcl:#b6652a hgt:72in iyr:2013 +ecl:grn eyr:2024 byr:1920 cid:114 +pid:983486664 + +byr:1931 iyr:2020 pid:182737852 hgt:162cm +ecl:grn hcl:#888785 eyr:2028 + +eyr:2035 +byr:1962 iyr:2012 cid:120 +ecl:xry +hgt:61cm hcl:ce89a8 pid:335540582 + +pid:#05153d iyr:1990 +eyr:1927 hgt:71cm +byr:2019 cid:346 ecl:#e38688 +hcl:c6abd9 + +ecl:#cd58d8 pid:166cm iyr:2012 +hcl:0d1b02 hgt:68 +eyr:1958 + +pid:976419172 byr:1922 cid:345 hcl:#6b5442 iyr:2010 eyr:2026 +ecl:grn hgt:155cm + +ecl:gry hcl:#1bbadc hgt:168cm +eyr:2028 +byr:1984 cid:179 iyr:2013 pid:706186218 + +ecl:blu hgt:188cm +pid:764775319 byr:1936 hcl:#7d3b0c iyr:2020 + +hcl:#623a2f +iyr:2012 +pid:382832140 ecl:gry +eyr:2026 +cid:350 +hgt:165cm byr:1968 + +hcl:0b87a1 byr:2020 pid:4365879329 +cid:110 ecl:grn +eyr:2032 hgt:155cm +iyr:2018 + +hgt:193cm eyr:2029 hcl:#733820 pid:081071142 byr:1929 ecl:oth + +ecl:brn +eyr:2023 pid:876924536 cid:165 +hcl:#efcc98 hgt:151cm byr:1972 +iyr:2020 + +hgt:186cm eyr:2022 +ecl:grn +byr:1972 pid:997639611 hcl:#ceb3a1 iyr:2013 + +byr:1926 +pid:808460262 +iyr:2012 eyr:2031 hcl:#a97842 ecl:amb +hgt:190cm + +hgt:163cm +hcl:#ceb3a1 eyr:2028 +ecl:grn +byr:1944 pid:381144425 iyr:2012 + +hcl:#95a232 pid:015229624 byr:1947 iyr:2013 hgt:66cm ecl:gry eyr:2027 + +hcl:z byr:1965 iyr:2013 hgt:157cm ecl:#8b12fb cid:246 pid:283039791 eyr:2023 + +ecl:gry byr:1950 +hcl:#623a2f cid:276 iyr:2013 eyr:2030 pid:798610943 hgt:189in + +eyr:2030 cid:52 hcl:#fffffd pid:041625574 ecl:amb iyr:2016 byr:1944 +hgt:191cm + +byr:1995 +iyr:2015 cid:221 pid:279080024 +eyr:2022 +hgt:181cm ecl:brn hcl:#888785 + +hcl:z +ecl:blu +iyr:1970 +eyr:2022 +hgt:193cm pid:#540e31 cid:95 byr:1952 + +hcl:z eyr:2024 ecl:hzl +byr:2028 +cid:323 pid:1949331457 +hgt:69 + +eyr:2030 hcl:#866857 +cid:173 iyr:2017 +hgt:190cm byr:1941 +ecl:blu +pid:269015932 + +hcl:#b6652a +iyr:2018 +eyr:2022 ecl:brn hgt:185cm pid:456195468 + +hcl:#6b5442 hgt:188cm +iyr:2019 byr:1966 cid:298 +pid:050653473 +ecl:gry eyr:2028 + +cid:208 +ecl:amb eyr:2023 hgt:176cm byr:1971 hcl:#7d3b0c pid:650190272 iyr:2018 + +hgt:68in pid:615309584 +iyr:2011 byr:1950 +hcl:#efcc98 ecl:oth +eyr:2024 + +eyr:2022 iyr:2011 hcl:#623a2f ecl:amb byr:1955 +hgt:190cm +pid:244918527 + +iyr:2013 hcl:#ceb3a1 eyr:2029 hgt:164cm +ecl:oth +byr:1928 pid:337615663 + +hcl:#ceb3a1 pid:#ae7eea byr:2027 +cid:254 +hgt:125 +iyr:1940 +ecl:zzz + +pid:033663619 iyr:2012 byr:1989 eyr:2030 ecl:hzl +hcl:#b6652a hgt:154cm + +hgt:175cm byr:1929 pid:100788192 +ecl:#92b14c +iyr:1940 hcl:#ceb3a1 eyr:2033 + +eyr:2029 +pid:357835141 ecl:oth iyr:2019 hcl:#866857 hgt:154cm byr:1954 + +pid:895992818 byr:1965 iyr:2017 hcl:#efcc98 ecl:amb hgt:153cm eyr:2025 + +byr:1928 ecl:amb hgt:168cm pid:346938111 eyr:2025 iyr:2014 +hcl:#cfa07d + +hcl:#b6652a pid:825661608 eyr:2020 iyr:2019 byr:1974 +hgt:180cm ecl:amb + +byr:1970 hgt:159cm hcl:#733820 pid:101838832 iyr:2015 eyr:2027 ecl:blu + +byr:1941 ecl:amb +eyr:2024 pid:015890498 +hgt:175cm +iyr:2018 hcl:#cfa07d + +hgt:67in +pid:404983369 eyr:2023 iyr:2018 byr:1974 hcl:#602927 +ecl:blu + +byr:1957 +hcl:#fcc940 pid:615831236 +iyr:2018 eyr:2020 ecl:brn hgt:181cm cid:218 + +hcl:#fffffd ecl:grn pid:271614109 +eyr:2028 hgt:184cm byr:1974 iyr:2015 + +ecl:#e45ee0 pid:151cm cid:127 iyr:2014 byr:2022 hcl:973bc1 eyr:2033 hgt:181in + +hcl:#6b5442 pid:502739402 eyr:2020 byr:1926 ecl:brn +iyr:2010 + +ecl:xry hgt:169cm byr:2023 +iyr:1973 pid:4137668 +eyr:2037 hcl:z + +ecl:#3a8c46 hcl:43730a pid:57210146 eyr:2031 cid:117 iyr:2013 byr:2010 + +hcl:#341e13 cid:237 hgt:150cm iyr:2016 byr:1967 ecl:blu +pid:674080319 eyr:2024 + +iyr:2011 hcl:#866857 pid:111247018 +byr:1920 hgt:192in ecl:#8bf268 eyr:2021 + +iyr:2022 hcl:z ecl:gry +hgt:159cm +pid:#88e8df +byr:2026 eyr:2032 cid:221 + +hgt:156cm eyr:2026 +ecl:blu +hcl:#192dea cid:280 pid:788808021 byr:1980 +iyr:2013 + +hgt:156in +byr:2024 hcl:4e4dd6 +eyr:2030 +iyr:2028 pid:35683378 +ecl:#3a9fba + +pid:081236370 cid:150 hcl:d15b43 byr:2029 hgt:118 iyr:2026 eyr:2038 +ecl:grt + +eyr:2034 pid:186cm +ecl:utc cid:300 iyr:2009 byr:2018 hcl:163913 hgt:74cm + +ecl:hzl +pid:249858519 byr:1936 hgt:182cm +cid:343 iyr:2013 eyr:2030 hcl:#7d3b0c + +cid:168 +ecl:hzl +hgt:174cm iyr:2020 +pid:446135799 hcl:#888785 +eyr:2024 byr:1998 + +pid:545342162 +hcl:#5cd3bd cid:126 +eyr:2024 +iyr:2012 ecl:grn + +pid:104835585 +byr:1989 hcl:#733820 ecl:oth eyr:2024 iyr:2017 +hgt:180cm + +hgt:184cm byr:2001 pid:199216567 ecl:gry +eyr:2022 +cid:185 hcl:#7d3b0c +iyr:2019 + +byr:1996 eyr:2022 pid:503963080 ecl:grn iyr:2010 hcl:#fffffd + +eyr:2030 iyr:2017 +pid:472300557 hcl:#a97842 +ecl:grn hgt:190cm +byr:1994 + +ecl:#2a8a59 +eyr:2027 +iyr:2015 byr:2021 hgt:158cm pid:365979521 hcl:z cid:242 + +ecl:gry +iyr:2020 hcl:#866857 +pid:363851353 cid:319 hgt:154cm eyr:2027 +byr:1953 + +ecl:grn hgt:165cm eyr:2026 +pid:443722683 hcl:#341e13 +iyr:2018 byr:1923 + +byr:1920 ecl:blu +cid:193 hgt:153cm hcl:#341e13 iyr:2010 pid:934896568 +eyr:2021 + +eyr:2025 +pid:524699651 cid:92 +hcl:#602927 byr:1999 +iyr:2011 ecl:brn hgt:164cm + +eyr:2030 pid:739947771 iyr:2018 +byr:1990 +hgt:185cm hcl:#602927 ecl:gry + +byr:1967 ecl:amb iyr:2020 hcl:#341e13 +hgt:165cm +pid:681478012 eyr:2028 + +pid:807715479 ecl:blu byr:1955 eyr:1972 iyr:2018 hcl:#a97842 hgt:151 + +pid:635008585 cid:97 +hgt:186cm hcl:#b6652a iyr:2015 eyr:2020 ecl:gry byr:1959 + +iyr:2017 +cid:155 byr:1999 pid:550276277 +hcl:#18171d +eyr:2020 hgt:164cm ecl:amb + +byr:1977 hcl:#6b5442 ecl:grn iyr:2012 hgt:156cm +eyr:2028 pid:125635376 + +hgt:65in pid:042700658 byr:1962 iyr:2020 +hcl:#888785 eyr:2021 ecl:gry + +ecl:blu iyr:2017 hcl:#efcc98 pid:447451869 hgt:176cm +byr:1958 +eyr:2024 + +ecl:amb hgt:155cm eyr:2022 hcl:#efcc98 +pid:614496034 byr:1957 +iyr:2016 + +cid:99 +eyr:2020 +ecl:amb iyr:2017 +hgt:163cm pid:128207503 byr:1977 +hcl:#866857 + +ecl:amb cid:342 eyr:2026 hgt:172cm pid:317675262 +byr:1942 hcl:#a97842 iyr:2010 + +ecl:grn pid:077163993 +hgt:187cm hcl:#341e13 iyr:2012 byr:1934 eyr:2024 + +pid:423538706 hgt:156cm +ecl:oth hcl:#341e13 iyr:2016 eyr:2028 + +iyr:2030 ecl:#faff64 +byr:2012 +pid:734434105 hgt:164in hcl:z eyr:2023 + +hgt:150in iyr:2016 pid:173cm hcl:db675a cid:219 eyr:2032 byr:1958 +ecl:xry + +pid:087437383 +eyr:2025 hgt:178cm ecl:gry byr:1954 +cid:227 hcl:#fffffd +iyr:2018 + +pid:152cm +iyr:2030 eyr:2030 +byr:2010 hcl:z +hgt:155cm +ecl:amb + +byr:1934 +hcl:#341e13 hgt:167cm +pid:#7356dd ecl:amb +iyr:2011 +eyr:2030 +cid:123 + +eyr:2027 +byr:2005 +hgt:173cm cid:174 hcl:#ceb3a1 iyr:2018 ecl:amb pid:179cm + +iyr:2019 ecl:grn eyr:2023 +hgt:162cm +pid:649681621 hcl:#4ee6d2 byr:1955 + +hgt:165cm byr:1929 ecl:blu pid:839016251 iyr:2017 hcl:#c0946f +eyr:2020 + +eyr:2020 +iyr:2017 hcl:#c7ed42 ecl:blu byr:1928 +hgt:74in pid:112604496 + +eyr:2026 hgt:184 cid:113 +byr:1933 +pid:952646285 +iyr:2019 hcl:#fffffd ecl:gry + +pid:455008820 byr:1982 eyr:2030 ecl:gry iyr:2020 cid:103 hcl:#733820 hgt:184cm + +hcl:#733820 iyr:2020 hgt:182cm ecl:grn +cid:226 pid:081011361 eyr:2022 byr:1995 + +iyr:1999 +hcl:#18171d pid:9252198900 +ecl:amb byr:1999 hgt:175cm eyr:2021 + +iyr:2020 hgt:165cm +ecl:blu +eyr:2023 pid:760213482 +byr:1968 +hcl:#c0946f + +pid:242381670 ecl:amb +hgt:172cm byr:1980 eyr:2020 iyr:2014 hcl:#866857 + +byr:2021 pid:#a94a22 hcl:#cfa07d iyr:1969 eyr:2030 ecl:zzz +hgt:76cm + +ecl:oth cid:168 +byr:1954 pid:079481919 eyr:2025 hcl:#c0946f hgt:172cm + +hgt:171cm +eyr:2030 +byr:1969 cid:170 +pid:164128658 ecl:amb +hcl:#c2265e iyr:2019 + +byr:1983 +cid:163 +eyr:2020 pid:232659795 iyr:2013 hcl:#888785 hgt:162cm +ecl:blu + +ecl:gry hcl:#7d3b0c +pid:001171231 eyr:2020 +byr:1935 hgt:160cm +iyr:2011 + +iyr:2012 hcl:#a97842 +eyr:2029 pid:809880438 hgt:164cm cid:83 byr:1961 ecl:hzl + +cid:288 eyr:2027 +hgt:181cm byr:1955 +iyr:2020 +ecl:oth pid:754135833 hcl:#c0946f + +iyr:2012 pid:053980893 +cid:54 byr:1961 ecl:gry hcl:#602927 eyr:2020 hgt:167cm + +iyr:2013 +eyr:2025 +hgt:176cm pid:169006156 cid:270 ecl:oth byr:2001 + +cid:244 pid:914067457 +iyr:2017 byr:1926 hcl:#733820 ecl:brn hgt:187cm +eyr:2030 + +ecl:oth byr:1942 +hgt:176cm iyr:2020 eyr:2027 +hcl:#efcc98 +pid:688816242 + +hgt:177cm hcl:#efcc98 eyr:2030 pid:888703414 +iyr:2010 byr:1973 ecl:gry + +cid:257 eyr:2030 +ecl:brn +pid:359774824 +byr:1988 hcl:#6b5442 iyr:2013 hgt:187cm + +iyr:2011 hgt:173cm cid:290 byr:2000 ecl:gry +hcl:#7d3b0c +pid:743371399 eyr:2029 + +cid:162 +eyr:1920 byr:2010 pid:#69d6ba hgt:74 hcl:z ecl:#d256f3 iyr:1933 + +pid:435518624 byr:1938 eyr:2027 iyr:2016 hcl:#18171d +hgt:161cm +ecl:gry + +ecl:gry eyr:2027 hcl:#7d3b0c hgt:170cm +pid:928345976 iyr:2020 + +hcl:#5f4023 ecl:blu +pid:024527693 +eyr:1932 iyr:2023 hgt:154cm byr:1948 + +cid:284 iyr:2011 byr:1920 eyr:2024 ecl:blu hgt:153cm +hcl:#602927 pid:005741906 + +iyr:2029 hgt:108 byr:2029 hcl:c8b25d +pid:522512400 eyr:2038 ecl:zzz cid:163 + +pid:371295649 +eyr:2022 ecl:hzl +iyr:2019 hgt:153cm byr:1961 +hcl:z + +eyr:2027 iyr:2020 pid:619653661 byr:1968 hcl:#b6652a cid:62 ecl:hzl +hgt:186cm + +iyr:1931 +pid:565552342 ecl:#af97bb hcl:c92cd6 eyr:1931 byr:2025 hgt:184in + +hgt:187cm +ecl:grn +byr:1954 cid:145 +iyr:2016 +hcl:#efcc98 eyr:2030 pid:202254357 + +cid:177 +iyr:2013 byr:1926 hcl:#efcc98 +pid:298693475 hgt:181cm eyr:2023 ecl:dne + +byr:2014 +cid:255 +iyr:1951 hgt:72in +hcl:#efcc98 eyr:2039 pid:135688013 +ecl:grn + +byr:2019 eyr:1971 pid:#a95cb4 +hcl:#ceb3a1 ecl:#6f919c +hgt:193cm iyr:2012 + +pid:497726268 +ecl:grn +eyr:2025 hcl:#efcc98 iyr:2019 hgt:170cm byr:1970 + +byr:1939 hcl:#18171d cid:250 +iyr:2011 ecl:blu pid:216607711 +hgt:158cm eyr:2029 + +byr:1937 +eyr:1931 +hcl:#5ee898 +pid:#876b1a hgt:190cm +cid:277 ecl:#5f0f80 iyr:2013 + +ecl:oth hgt:191cm eyr:2025 byr:1978 pid:271136754 hcl:#888785 +iyr:2012 + +hcl:#6b5442 +iyr:2015 byr:1958 pid:510020331 hgt:158cm eyr:2024 ecl:blu + +byr:1998 cid:142 eyr:2026 iyr:2015 hcl:#733820 +pid:671943334 hgt:186cm ecl:oth + +eyr:2025 ecl:brn hcl:#7d3b0c pid:000803215 +byr:1947 +iyr:2017 hgt:168cm cid:230 + +pid:612432109 hgt:186cm byr:1963 ecl:hzl iyr:2019 eyr:2027 +hcl:#efcc98 +cid:148 + +hcl:#c0946f pid:846986027 eyr:2025 byr:1941 +cid:154 hgt:158cm iyr:2012 +ecl:brn + +ecl:gry hgt:186cm +iyr:2015 hcl:#602927 byr:1923 eyr:2023 +pid:48544569 + +pid:857428120 hgt:158cm hcl:#e4a267 iyr:2014 eyr:2020 byr:1975 ecl:blu + +ecl:blu pid:559783197 byr:1935 cid:119 iyr:2017 hgt:157cm hcl:#6b5442 eyr:2020 + +ecl:oth pid:724332293 hcl:#602927 +cid:77 iyr:2019 +byr:2001 hgt:192cm eyr:2024 + +ecl:hzl eyr:2031 +hcl:#efcc98 byr:2011 cid:280 iyr:2017 +pid:377875085 +hgt:172cm + +byr:1947 hgt:174cm ecl:amb iyr:2018 cid:94 hcl:#a97842 eyr:2026 pid:286225332 + +hgt:85 ecl:xry eyr:2033 iyr:1952 pid:92902290 +hcl:a6f86d +byr:2013 + +byr:1935 hcl:#c0946f pid:368741489 ecl:blu +eyr:2020 hgt:164cm +iyr:2018 +cid:196 + +pid:718568707 +ecl:oth byr:2003 hcl:#a97842 iyr:2010 hgt:168cm eyr:2025 cid:261 + +hcl:#6b5442 +pid:675429853 +hgt:62in ecl:grn iyr:2016 +eyr:2027 byr:1932 + +byr:1978 +pid:080846464 hcl:#ceb3a1 ecl:gry iyr:2015 hgt:190cm eyr:2029 + +pid:1756319674 +iyr:2010 byr:1998 hcl:#866857 cid:259 +eyr:2025 hgt:73in ecl:hzl + +eyr:2035 +hcl:z hgt:61cm +pid:3267812127 +cid:230 +byr:2029 iyr:2028 ecl:lzr + +hgt:161cm ecl:hzl byr:1934 iyr:2011 eyr:2025 hcl:#cfa07d pid:354474868 + +pid:727482965 +hcl:#623a2f iyr:2010 hgt:156cm eyr:2020 cid:68 ecl:grn byr:1950 + +pid:040800697 hgt:186cm +hcl:#341e13 iyr:2030 ecl:hzl +byr:1937 eyr:2020 + +iyr:2013 byr:1928 pid:752644096 eyr:2030 hgt:191cm ecl:hzl +cid:93 hcl:#a97842 + +pid:022267155 hcl:#cfa07d eyr:2026 +ecl:hzl +hgt:187cm iyr:2014 cid:347 + +hgt:73in +eyr:2021 pid:054367702 ecl:amb hcl:#18171d byr:1965 +iyr:2020 cid:267 + +eyr:2022 +cid:140 pid:189859171 byr:1984 iyr:2020 ecl:brn hgt:166cm hcl:#623a2f + +byr:1971 iyr:2015 +hgt:168cm +eyr:2020 pid:650970816 hcl:#341e13 +ecl:grn +cid:168 + +hcl:#c0946f byr:1948 hgt:189cm +pid:868785851 +cid:194 ecl:amb eyr:2024 iyr:2011 + +eyr:2040 +byr:2030 hcl:afde59 +hgt:172cm pid:72468598 iyr:1990 cid:165 ecl:#896a8e + +iyr:2009 hcl:#6b5442 +eyr:2028 +cid:53 ecl:hzl +hgt:165cm byr:1999 pid:844037301 + +cid:281 eyr:2022 +iyr:2020 byr:1976 hgt:176cm hcl:#6b5442 ecl:amb pid:755280305 + +hgt:154cm iyr:2013 +pid:059284139 byr:1992 +cid:215 ecl:blu eyr:2025 hcl:#b6652a + +ecl:grn +cid:308 +hgt:187cm pid:009080324 eyr:2027 +iyr:2012 byr:1955 + +pid:083241291 hcl:#7c1810 eyr:2030 iyr:2019 byr:1950 ecl:brn hgt:72in + +cid:148 byr:1953 hcl:#623a2f +pid:076848285 hgt:175cm iyr:2017 +eyr:2022 +ecl:oth + +iyr:2020 +hgt:160cm +eyr:2028 cid:312 ecl:brn hcl:#888785 pid:681067688 byr:1986 + +iyr:1972 cid:170 eyr:2023 +pid:21811501 ecl:#17c6e8 +hgt:158in byr:2015 hcl:5b7956 + +pid:720571739 cid:304 byr:1951 hgt:191cm +eyr:2025 hcl:#341e13 +iyr:2011 + +eyr:2020 ecl:blu hcl:#cfa07d pid:097863725 +hgt:150cm +byr:1951 +cid:143 iyr:2013 + +eyr:2027 iyr:2019 ecl:#a0eeca hcl:#c0946f pid:724783488 byr:1943 cid:282 hgt:124 + +byr:2012 +iyr:2013 eyr:2036 hcl:z hgt:97 +pid:#677847 ecl:dne + +pid:341708492 hgt:190cm +byr:1988 hcl:#888785 +ecl:hzl +iyr:2015 eyr:2029 + +iyr:2020 byr:1968 +ecl:gry +eyr:2030 hcl:#1976b0 +cid:127 pid:701862616 +hgt:161cm diff --git a/c/2020/4/main b/c/2020/4/main new file mode 100755 index 0000000..0d875c0 Binary files /dev/null and b/c/2020/4/main differ diff --git a/c/2020/4/main.c b/c/2020/4/main.c new file mode 100644 index 0000000..a4d9c93 --- /dev/null +++ b/c/2020/4/main.c @@ -0,0 +1,225 @@ +#include +#include +#include +#include "../lib/util.h" + +typedef char Year[5]; +typedef char Height[6]; +typedef char HexColor[8]; +typedef char Color[4]; +typedef char PID[10]; +typedef char CID[4]; + +typedef struct Passport { + Year byr; + Year iyr; + Year eyr; + Height hgt; + HexColor hcl; + Color ecl; + PID pid; + CID cid; +} Passport; + +bool is_valid_passport_part_1(Passport *passport) { + if (passport->byr[0] == '\0') return false; + if (passport->iyr[0] == '\0') return false; + if (passport->eyr[0] == '\0') return false; + if (passport->hgt[0] == '\0') return false; + if (passport->hcl[0] == '\0') return false; + if (passport->ecl[0] == '\0') return false; + if (passport->pid[0] == '\0') return false; + return true; +} + +bool is_valid_passport_part_2(Passport *passport) { + // byr (Birth Year) - four digits; at least 1920 and at most 2002. + if (passport->byr[0] == '\0') return false; + int byr = atoi(passport->byr); + if (byr < 1920 || byr > 2002) return false; + + // iyr (Issue Year) - four digits; at least 2010 and at most 2020. + if (passport->iyr[0] == '\0') return false; + int iyr = atoi(passport->iyr); + if (iyr < 2010 || iyr > 2020) return false; + + // eyr (Expiration Year) - four digits; at least 2020 and at most 2030. + if (passport->eyr[0] == '\0') return false; + int eyr = atoi(passport->eyr); + if (eyr < 2020 || eyr > 2030) return false; + + // hgt (Height) - a number followed by either cm or in: + // If cm, the number must be at least 150 and at most 193. + // If in, the number must be at least 59 and at most 76. + if (passport->hgt[0] == '\0') return false; + int hgt = atoi(passport->hgt); + if (hgt >= 59 && hgt <= 76) { + if (passport->hgt[2] != 'i' && passport->hgt[3] != 'n') return false; + } else if (hgt >= 150 && hgt <= 193) { + if (passport->hgt[3] != 'c' && passport->hgt[4] != 'm') return false; + } else return false; + + // hcl (Hair Color) - a # followed by exactly six characters 0-9 or a-f. + if (passport->hcl[0] != '#') return false; + for (int i = 1; i < 7; i++) { + char c = passport->hcl[i]; + if (c < 48 || (c > 57 && c < 97) || c > 122) return false; + } + + // ecl (Eye Color) - exactly one of: amb blu brn gry grn hzl oth. + if (passport->ecl[0] == '\0') return false; + char *ecl = passport->ecl; + if ( + strcmp(ecl, "amb") != 0 && + strcmp(ecl, "blu") != 0 && + strcmp(ecl, "brn") != 0 && + strcmp(ecl, "gry") != 0 && + strcmp(ecl, "grn") != 0 && + strcmp(ecl, "hzl") != 0 && + strcmp(ecl, "oth") != 0 && + strcmp(ecl, "amb") != 0 + ) return false; + + // pid (Passport ID) - a nine-digit number, including leading zeroes. + if (passport->pid[0] == '\0') return false; + if (strlen(passport->pid) != 9) return false; + + // cid (Country ID) - ignored, missing or not. + + return true; +} + +void clear_passport(Passport *passport) { + *(passport->byr) = 0; + *(passport->iyr) = 0; + *(passport->eyr) = 0; + *(passport->hgt) = 0; + *(passport->hcl) = 0; + *(passport->ecl) = 0; + *(passport->pid) = 0; + *(passport->cid) = 0; +} + +void print_passport(Passport *passport) { + printf( + "Birth Year: %s\n" + "Issue Year: %s\n" + "Expiration Year: %s\n" + "Height: %s\n" + "Hair Color: %s\n" + "Eye Color: %s\n" + "Passport ID: %s\n" + "Country ID: %s\n", + passport->byr, + passport->iyr, + passport->eyr, + passport->hgt, + passport->hcl, + passport->ecl, + passport->pid, + passport->cid + ); +} + +void parse_passport_field(char *field, Passport *passport) { + switch(*field) { + case 'b': + strcpy(passport->byr, field + 4); + break; + case 'i': + strcpy(passport->iyr, field + 4); + break; + case 'e': + switch(*(field + 1)) { + case 'y': + strcpy(passport->eyr, field + 4); + break; + case 'c': + strcpy(passport->ecl, field + 4); + break; + } + break; + case 'h': + switch(*(field + 1)) { + case 'c': + strcpy(passport->hcl, field + 4); + break; + case 'g': + strcpy(passport->hgt, field + 4); + break; + } + break; + case 'p': + strcpy(passport->pid, field + 4); + break; + case 'c': + strcpy(passport->cid, field + 4); + break; + } +} + +void parse_passport(char *text, Passport *passport) { + char *pp_text = strtok(text, " "); + do { + parse_passport_field(pp_text, passport); + } while(pp_text = strtok(NULL, " ")); +} + +int check_valid_passports(bool (*passport_validator) (Passport *passport)) { + InputWithSize *input_with_size = load_input_with_size(); + char *input_normalized = malloc(input_with_size -> size); + + char *data_pointer = input_with_size -> data_buffer; + char *normalized_pointer = input_normalized; + + int passport_count = 0; + for (int i = 0; i < input_with_size -> size; i++) { + if (data_pointer[i] == '\n') { + if (data_pointer[i + 1] == '\n') { + *normalized_pointer = '\0'; + i++; + passport_count++; + } else { + *normalized_pointer = ' '; + } + } else { + *normalized_pointer = data_pointer[i]; + } + normalized_pointer++; + } + *normalized_pointer = 0; + int normalized_size = normalized_pointer - input_normalized; + free_input_with_size(input_with_size); + + normalized_pointer = input_normalized; + Passport *passport = malloc(sizeof(Passport)); + int passport_text_len = strlen(normalized_pointer); + + int valid_passports = 0; + while(*normalized_pointer != '\0') { + clear_passport(passport); + parse_passport(normalized_pointer, passport); + if (passport_validator(passport)) valid_passports++; + // print_passport(passport); + // puts(""); + normalized_pointer += passport_text_len + 1; + passport_text_len = strlen(normalized_pointer); + } + + free(passport); + free(input_normalized); + return valid_passports; +} + +int part_1() { + return check_valid_passports(is_valid_passport_part_1); +} + +int part_2() { + return check_valid_passports(is_valid_passport_part_2); +} + +int main() { + printf("Part 1: %d\n", part_1()); + printf("Part 2: %d\n", part_2()); +} diff --git a/c/2020/5/input.txt b/c/2020/5/input.txt new file mode 100644 index 0000000..94ab2e3 --- /dev/null +++ b/c/2020/5/input.txt @@ -0,0 +1,814 @@ +FBFBBBFRLL +BFFFBFFRRR +BBFBFFFLLR +FBFFFBFLRR +FBFFBFBLLR +BFBBFBBRLL +BFFFFFFRLR +FBBBBFFLLR +FFBBFFFLRL +FFBFBBFLLR +FBFFFBBRRR +FBFFBFBLRR +FBBFBFFRLR +FBBBFBFRLL +FFBFFBBRLR +FBFBBBFRRL +BFFBBBFRRR +FBFBBBBLLR +FFBFFBBLLL +BFFBFBBLLR +BFFBFBBRLR +BFFBBBBLLL +FBBBBFBLLR +FFBFBBBLRR +FFBFBBFLRR +FFFBFBBRRL +FFFFFBBRLL +BFFFBFFLRR +FFFBFBBRLR +FBFFBBFLLR +BFBFFBBRRR +FBBFBBFLRL +BFBBFBFRRR +BFFFBBBLRL +BBFFFBFLLR +BFFFFBFLRR +BFFBFFBLLL +FFBBFBFRRR +BFBFFFBLLL +FBFBFFFRRR +BFBFBBBLLL +BFFFBBFLLL +BFBFFFBLLR +BFFBBBFRRL +FFFBBFFLLR +BFFBBBFLRR +FBFFBBBRLR +FBBFBBFLRR +FBBFFBFRRR +FBBFBBBRRL +FFFBFFBRRL +FBFBFFBRLL +FBFFBBFRLL +BFBFBFFRLL +FBFBFFFRLR +BFBFFBBRRL +FFBBFFBRRR +BFFBFBBLRL +FFBFBFBLLL +BBFFFBFRLL +FBFBBBFRRR +BFFBBFFLRR +BFBBFFBLRL +BFFFFFBLLL +BBFFFFFRLR +FBBFFBFRLL +FFBFBFFRRR +BFBBBBFLRR +BFFBBFFRLL +BFBBFFBLLL +BFFFFFBRRR +FBBFFFBLRL +FFFBBBFRLR +FFBBBFBRRL +BFFFBBBRRL +FFBFBFBRRR +FBBBBBFRRR +BBFBFFFRLL +FBFFFBBLRR +FBFBFFBRRR +BFBFBFBRLR +FBBBFFFRRL +BFBFFFBRLL +FBBBFFBLLL +BFBFBFFRLR +BBFFBFBLRL +BBFFBFBRLR +BBFBFFFRRR +BFBBFFFRLL +BFFBBBBRRL +FFBFFBFRLL +FBBBFBBLRR +FBFFFFFRLR +FBFFFBFLLR +BBFFBFFRRR +BFBFBFBRLL +BFFBBBBLLR +FBBBFBFLLL +FFBBFBBRLR +FFFFBBFRRR +FFFBFFFRRL +FFFFBBBLLL +FBBBBFBLLL +BFBBFBFRLL +FFBFBFFRLR +FBFBBBFLLL +BFBBBFFLLL +BBFFBFFRLL +FBFFFFFLLR +FBBBBFBLRR +BFBFFFFRRR +BFFBBBBLRL +BFFBBFFLLL +FBFFBBFLRR +BBFFFFBLRR +FBBBBFFRLL +FBFBFFBRLR +FFFFBBFRLR +FBBFFBBLLR +BFFFBBFLRL +BFFFFFFLRR +BFBFBFBRRL +FFBBFBFLLR +BFBBFBFLLR +FFBBBFBLRR +BBFFBFBRRL +BFFBBBFLRL +BFFBFFFRRR +FFFFBBFLLL +BBFFFBBRLR +FFBBBBBRLR +FFBFBBBRLR +FFFFBFBLLR +FBBBBBBLLR +FBBBFFBLRL +BFFFFFFLLL +FBBFBBFLLL +BFBBBBBLRR +FBFBBFBLLL +FBFFFBBLLL +FBFFFBBRLR +FFFBBBFRRL +FBFFFFBLLL +BBFFFFFRLL +BFBFBBFLRL +FBBBFFFLLL +BFBBFBBRLR +FFBFBBFRLL +FFBFBFBLRL +BFFBBBBRRR +FFFFBBFLRL +BBFFFFBLLR +FFFBBBFLLR +FFFBFFFLLR +FFBBBFFLRL +FBFBBBFLRL +FBBFBBFLLR +FBFBBFFLLR +BBFFBBBRRL +FBFBBFBLRR +FBBBFFFLLR +FBFBFFFRLL +FFBBFFBLLL +FBBBFBFRRR +BFBFFFBRRR +FBBBFFFRRR +BBFFBBBLLL +BFFBFFBRLR +BFFFBFBLLR +FBBBBBFLRR +FBBFBBBLRL +FFFBFFFLRR +FFFFBBBRRR +BBFFFBFLRL +FBFBBFFRRL +BBFBFFFRLR +FBFBFBBRRL +FFBFFBFLRL +FBFFBFBRLR +BFBFFFFLRL +FBFFFBFRRR +FFFFBFBRRR +BBFFFFBRLR +FBBBFFBRRL +FBBFFBBRLR +FFBBFBFLRL +BFFFBBBLLR +BFFFFFFRLL +BFFBBBBLRR +BFBFBBBRRL +FBFBBBBLLL +BBFFFBBLRR +FFFFBBFLRR +FFBBFBBLRR +FFFBBBBLLL +FFBBBBFLLL +FBBFFFFLLR +FFBFBBBRLL +FFBBFBBRRR +BFBFBBBLLR +FBBBBBFLLL +FFBBFFBRLL +BFBFFBFRLR +FBBFBFBRRL +FFBBFFFLRR +BFBFBFFLRL +FBFFBFFRRR +BBFFBFFRLR +FFBBBBBRRL +FBBBFBBLLR +FFFBBBBLLR +FFBBFBBLLR +BBFBFFBLRL +BFFFFFBLLR +FFFBFFBRLL +FFFFBFBRLR +FFBFFBBRRR +FBBBBFFLRR +BFBFFFFRLR +FFBBFFBLRL +BFBBFBBLLR +BBFBFFFLRR +FBFFFBBLLR +BFFBBBFLLR +BFFBBFFLLR +BFBBBBFRLR +FBFFBBBLLR +FFBFFFFLLR +FBBBBFFRRL +FBFBBFBRRL +FFFFBFBLRR +BBFFFFBRRR +BFBBFBFRRL +BFFBBFFRLR +FBFBFBFLLR +BBFFBFFLRL +BBFFBBBLLR +BFBBBFBLLL +BFBBBBBLLR +FBBBFFBRLL +FBFFBFBRLL +BFBFFBFLLR +BFBFFFFLLL +FBFFFFFRLL +FFBBFFFLLR +FFFBFFFRRR +FBFFFBFRLR +FFFBFBBLLL +BBFFFBBLLL +FFFBBFBLRL +FBBBFBFRRL +FFFBBFBRLR +BFBBBFFLRR +FFBBBFFLRR +FFBFBBBLLR +FBBFBFBLLR +FFBFFBBRRL +FFFBFBFLRR +FBBFBFBRLL +BBFFBBFLRL +FBBFFBFRRL +BFBFBFFRRR +BFBBBFBRRR +BFFFFBFLLR +FBBFBFBRRR +BFFFFBBLLL +FFFBFFFRLR +FBBFBFBRLR +BFFFFBFRLL +FFBFBBFRRR +BBFFBFBRRR +FFBBBFFRLR +BFBFBFFRRL +BFFFBFBLRR +BFBBFBBRRR +FFBFFBFRLR +BFFFBFFRRL +BFBFBBBLRR +FFBBBBBRLL +BFBBFFBRLR +FBFFFFFLRL +FFBBBBBRRR +FFBFFFBLLL +FFBBBBBLLR +BBFFBFBRLL +BFBFBBBLRL +FBBFFFFLRR +BBFFBFBLLR +FFBBBFBLLR +BFBFFFBRLR +FBFBBBFLRR +FBFBBBBRLL +BFFFFBFLRL +BFFFBFBRLR +FBBFFFFLRL +FFFBBBBRLL +FFFBFFFRLL +FFFFBBBLRL +BFFFBFBRLL +FBFBBBBLRR +BFBBBFFLLR +FFFBFFBRLR +FBFFBFFLRR +FFFFBFFLLL +BFFBBBFLLL +BFFFBBBRLL +FBFFFFBLRL +BBFFBBFRLL +BFBBBFBLRL +FBBFFBBRLL +BFBBBBBLLL +BFBFBFBLRL +BFFBBFBLRL +BFFBFFBRRR +FFBBBBFLRR +FBBBBFBRRR +FBBBFBFLLR +FFBFBBFLLL +BBFFBBFLRR +FFFBBFFRLR +FBBBFFFRLL +FBBBBFFRRR +FFFBFBFLLL +BBFBFFFLLL +FBFFBFBRRR +BFFFBFFLRL +FFBBBFBLLL +FBBBBFBRLR +BFBFFBFLLL +BFBFBBFLLL +FBFBFFBLLL +FBBBBFFRLR +FBFFBFFRLR +BFBFBBFLRR +FBFBBBBLRL +FFFFBBFRLL +FFBFBBBRRR +BFFBBFFRRL +BBFFBBFRLR +FBBFFBFLLR +FBFFBFFLLL +BBFFFBFRRL +FBFFFFBRLL +FBFBFBFRRL +FFBFFFBLLR +BFBFFBBLLL +BFBFBFFLRR +FBFFBFFRLL +BFFBFBFLLR +FBFBFFBLRL +FFBFBFFRRL +FBFBBBBRLR +FFFFBBBRLL +BFBBFBFLLL +FBFFFFFLLL +FFBBFBFLRR +FFBFBFBRRL +FBFFBFBRRL +FBFBFBFRLR +FFFBBBFLRL +BFBBBBBRLR +BBFFBBFLLL +FBBFBBBLRR +FFBBBFBRLL +FBFFBBFRRR +FFFFBFFLRL +FFBFBBFRLR +FBBFBFFLRR +FFBBFBFLLL +FFBFBBBLLL +BFFFBBBLLL +BFFBBBBRLR +BFBBFBBLLL +FFBBBFBLRL +BFFBBFFRRR +FFFBBFBRLL +BFBFBFFLLL +BFFBBBFRLR +BFBFFBBLRR +FBBFFFBRRR +FBBFFFFRRR +BFBFBFBLLR +BBFFBBFRRL +FFFFBBBRRL +FFFBFBFLRL +BFFFBFFLLR +FFBBFFFRRL +FFFBFBBRRR +BFFFFBBRRL +BFBBFFFLRR +BFBFFFFRLL +FFFFBBBRLR +FFFBBFBLLR +FBFBFBFRLL +BFBBFBFLRL +BFBBBBBRRR +FBFFFFBRRL +BFBFFFBLRL +FBFBBBFRLR +BFBFFBFLRR +FFBFBFFLRR +FFFBBBFRRR +FFBBFFBRLR +FFBFFFFLRR +FBBBFFFLRL +BFBBFFBLLR +BFFBFBBLRR +FBBFBFBLRL +BFFFBFBLLL +FFFBBFFLRR +FBFFFFFRRR +BFBFFBFLRL +FFBFFFBRRR +FBFBFBBLLR +FFFFBBBLLR +BFBFFFFRRL +FFBBFFFRRR +FBBBFBFLRL +BFBBBFFRLL +BFBFFBBLRL +BBFFFFFLLR +FFBBBFFLLL +FFBFFFBRLL +FFBBFFBLLR +BBFFBFFLLL +FBFBBFBRRR +FBBBBBFLLR +FFBFFFFLRL +FBBBBFFLLL +BFFBFBFRRR +FBFFFFFLRR +FFFFBBFLLR +FFFBFBFRRL +FBFBFBFLRR +FBFBBFFRLR +BFFFBBFRLR +FFBFFBBLRR +FFBBFFBRRL +BFBFFBFRRL +FFFBFFBLRR +BFBBFFFRRR +BFFBFBFLRL +FFBFBBFRRL +BFFFBFFLLL +FBFFBFBLLL +BFBBFFFLLR +BFFFFBBLRR +FFFBFFFLLL +BBFFBBBRLL +BFFBFBFLRR +FBBFBFFRLL +BFFBBBBRLL +BFBFBBFLLR +FBBBBBBRLR +BFBBBBFRRR +FFBFFBFLLL +BFFFFFBRRL +BFFFBFFRLL +BFFFBFBLRL +FFBBBBFRLR +FBBBFFFLRR +BFFBFBBRRL +BBFFFFFRRR +FBBBFBBLLL +FFBFFFBLRR +FFBBFBBRLL +FBFBBFFLLL +BFFFBFFRLR +BFBBBBBLRL +FFFBFFBRRR +FFFBBFFLRL +FBFBFBBRLL +FFFBFBBRLL +FFBFBFBRLL +FBFFFBFRLL +BFFBFBFRRL +FBBFFFBRLR +BFBBBFFRRR +FBBBBBFLRL +FFFFFBBRRL +FBFFBBFLLL +BFBBFBBLRL +BFFBBFBLLL +FFBFBFFLLL +FFFBBBFLLL +BFFBFBFLLL +FBFFFFBRLR +FBFBBFBLRL +BBFFFBFRLR +FFFBBFBLRR +BFFBFFBRLL +BFFBBFBRLL +FBBFFFFRLR +FBBFFFBLLL +FFBFFFFRRL +FFFFBFFLLR +FFFBBFFRLL +BFBBBFBRLR +BFBFFFBLRR +BFFFBBFLRR +BFBFFBFRLL +BFBBFFBRRL +FFFFBBBLRR +FBFFFBBLRL +FFBBBFFRLL +FBBBFBBRLR +FFBFFBFRRR +FBFBFFFRRL +BFBBBFFRLR +FFFBBBFLRR +FFFFBBFRRL +FFBFBFBLRR +FFFBFFBLLL +FBFFFBBRRL +FFFFBFFRLR +FFBBBBBLRR +FFFFBFFRLL +FBFFBBBRRL +BFFFFBBLRL +FBFFBBBRLL +BBFFFFFLRL +FBFBBFFLRR +FBBBBFBRLL +BFFBFFFLLL +FBBBFFFRLR +BFBBFFBLRR +FFBBFBBLLL +FBBFFBBRRL +BFBFBFBLRR +FFFBBFBRRL +BBFFFBFLRR +FBBBBBBLLL +BFFFBFBRRR +FBFBFFFLLL +FFBBBBBLLL +BFBFBFFLLR +FBBFFBBLLL +FBBBBBBLRL +BBFFBBBRLR +FBFFFBBRLL +BFBFBBBRLL +BBFBFFBLLR +FFFBBFFRRR +FBFBFBBRRR +FBBFBFFRRR +BFBBBFBRLL +FBFBFFBLLR +BBFFBFBLLL +BFFFBBFRLL +FBFBFFFLLR +FBFFFFBRRR +FFBFBBFLRL +BBFFFBFLLL +FBBFBBBLLL +FBBBFBBRRL +FBFBFBFLLL +FFFFBFBLRL +FFFFFBBRRR +FFBFFBBLLR +BBFFFFFRRL +FBFBBBFLLR +BFBBBFFRRL +FBFBBFBRLR +BFBBBFBLRR +FFBFBFFLLR +FBFBFFBRRL +FFBFBFBRLR +BFBFFBBRLL +FFBFFFFRRR +BFFBBFBRRR +FFBBBBFRRL +FFFBBBBLRL +FFBBBFFRRL +BFBBBBFRLL +BFBFBFBLLL +BFBBFFFRRL +BFFBFFBLLR +FFBBBFBRLR +FFBBFBFRRL +FBFFBBBLRR +FBBFBBBLLR +BFBFFBBLLR +BFFFFBFLLL +FFFBFBFLLR +FBFFFFBLRR +FBBFBFBLLL +BFFFFBFRLR +FBBBFBFRLR +FFBBFBFRLR +BFFFFFFLLR +BFFFFBFRRL +BBFFBBFRRR +FBFFBFFLRL +FBBBBBFRLR +FBBBBFBLRL +BFFFBBBRRR +FFFFBFFRRL +FFBFFFFLLL +FFFBFBFRLL +FFBFFBFLRR +FBBFFBFLRL +FBBFFBBLRR +FFBFFBFRRL +BFFFFFFRRR +BFBFBBBRLR +BFFBFBBRLL +BBFFBFFRRL +FBBFBBFRLL +BFFFFFBRLR +BFBBBBFLLL +BFBBFFBRRR +FFFFBFBLLL +FFBBFFFRLR +BFBBBFBRRL +BFFFBBFRRR +FBFFFFFRRL +BFFBFFFRLL +BFFFFBBRLR +FFBBFFBLRR +BBFFBBBLRR +FBBFFFFRRL +BFFFFBBRLL +BFFFFFBRLL +BFBFFFFLLR +FBBBBBFRRL +FBFBBBBRRR +FBBFBBFRRL +FBBBFBBRLL +FBFFBFFLLR +FFBFFFFRLR +BFFFFFFRRL +BFBBFFFRLR +FFBBBBFLRL +FFBFFBBRLL +FFBBFBBLRL +FBFBFFBLRR +BFFBFBFRLR +FBFFBBBRRR +FBBBBFFLRL +FBBFBFFRRL +FFBFBFFLRL +BFFBBFBRLR +BBFFFFFLRR +FBBFFFBRLL +BFFFBFBRRL +FFBFBFFRLL +BBFFBBBRRR +BBFFFFBLRL +BBFFFBBRRR +BBFFFFBRLL +FBBFFBFLLL +BFFFBBBLRR +FFBFFBFLLR +FBBFBFFLLR +FBFBBFFLRL +FBBBBFBRRL +BFBBFBFLRR +BBFFBFBLRR +FFFBBBBLRR +FBBBFFBRLR +FBFBFBBLRR +FBBBFBBRRR +BFBBFFFLLL +BFFFFBBLLR +FBBBBBBRLL +FBBBFBBLRL +FBBBBBBRRR +FFFBBBFRLL +BBFFFFFLLL +FBBFFBFRLR +BFBBBBFLRL +BFFFFBFRRR +FBFFBBBLRL +BFBBFBBRRL +FBFFBFBLRL +FFFBBFBRRR +BFBFBBBRRR +BFBBFFFLRL +BBFFFBBRRL +FFFBBBBRRL +FBBBFFBLLR +FBFBFFFLRR +FBFBFBBRLR +BFFFBBFRRL +FBFBFBFRRR +FBBFFFFLLL +FBBFFBBLRL +FBBBFBFLRR +FFFBBFFLLL +BFFBFFBRRL +BFFFFBBRRR +FFFFFBBRLR +BBFFBBBLRL +FBBFBBFRRR +BFBBFBBLRR +FFBFFFFRLL +BFBFFFBRRL +FBBFBBBRLL +FBFBBFBRLL +FBFFFBFRRL +BFFBFFBLRR +FBBFBFBLRR +BFBBBBFLLR +BFBBBFBLLR +FFFFBFBRRL +FFFBBBBRLR +FFBFFFBRLR +BFFBFFBLRL +FBBFBFFLLL +BFFBFBBLLL +FBFBBFBLLR +FBBFFBFLRR +FFBBBBFLLR +FBBFBFFLRL +FFFBFBBLRL +FBBFFFFRLL +BFBFBBFRRR +FBFFBBBLLL +FFBFBBBLRL +BBFFBBFLLR +FBFFFBFLLL +BFBFBFBRRR +BFBBBBBRRL +BBFBFFBLLL +BFFFFFFLRL +FBBFFFBRRL +FFBBFBFRLL +BBFFBFFLLR +BBFBFFFRRL +FFFBBFBLLL +BFFBFFFRRL +BFBBBBBRLL +FFFBFBFRLR +FBFFBBFRRL +BFFBFFFLLR +FFBBFFFLLL +BFFBBBFRLL +FFBBBBFRLL +FFFFBFFLRR +FFBBBBBLRL +FBBBBBBLRR +FBBFFFBLLR +BBFFFBBRLL +BFFBBFFLRL +FFFBFBFRRR +FBFBFBBLLL +FBBBBBFRLL +FBBBBBBRRL +FBFBBBBRRL +FBFFBFFRRL +BFFFBBFLLR +BFFBFFFLRR +BFFBBFBLRR +FFFFBFBRLL +BFFBFFFLRL +FFBFFFBLRL +FBBFFFBLRR +BFBBBFFLRL +FBFFBBFLRL +BFFFBBBRLR +BFFBFBBRRR +BFFFFFBLRL +BBFBFFFLRL +BFBFBBFRRL +BBFFBFFLRR +FBFBFBBLRL +BFBFBBFRLR +FFFBBBBRRR +FBFFFFBLLR +FBFBBFFRLL +BFBFFBFRRR +FFFBFFBLLR +FBFBFBFLRL +FBBFBBBRLR +FFFBFBBLLR +FFBBFFFRLL +BFBFFBBRLR +BBFFFFBLLL +FFBBBFFRRR +BFFBFFFRLR +FFBFFBBLRL +FBBBFFBRRR +BFBFBBFRLL +BFBBBBFRRL +BFBBFFBRLL +BBFFFBBLRL +FFBBBBFRRR +BBFFFBFRRR +BFBFFFFLRR +FFFBFBBLRR +BFFBBFBRRL +FBBFBBBRRR +FBFBFFFLRL +BFBBFBFRLR +FFFBFFFLRL +FFBBBFBRRR +FBBFFBBRRR +BBFFFBBLLR +FFFBFFBLRL +FFBFBBBRRL +FFBBBFFLLR +FBFFBBFRLR +FBFFFBFLRL +FFBBFBBRRL +FFFBBFFRRL +FBBFBBFRLR +FBFBBFFRRR +FFFFBFFRRR +BFFFFFBLRR +BBFFFFBRRL +FBBBFFBLRR +BFFBFBFRLL +FFBFFFBRRL +FFBFBFBLLR diff --git a/c/2020/5/main b/c/2020/5/main new file mode 100755 index 0000000..ff83923 Binary files /dev/null and b/c/2020/5/main differ diff --git a/c/2020/5/main.c b/c/2020/5/main.c new file mode 100644 index 0000000..adb6057 --- /dev/null +++ b/c/2020/5/main.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include "../lib/util.h" + +int seat_id_from_boarding_pass(char *boarding_pass) { + int seat_id = 0; + while(*boarding_pass) { + if (*boarding_pass == 'B' || *boarding_pass == 'R') seat_id++; + seat_id <<= 1; + boarding_pass++; + } + seat_id >>= 1; + return seat_id; +} + +int part_1() { + char *data_buffer = load_input(); + char *boarding_pass = strtok(data_buffer, "\n"); + int max_seat_id = 0; + do { + int seat_id = seat_id_from_boarding_pass(boarding_pass); + if (seat_id > max_seat_id) max_seat_id = seat_id; + } while (boarding_pass = strtok(NULL, "\n")); + + free(data_buffer); + return max_seat_id; +} + +int part_2() { + bool occupied_seats[1028] = {0}; + char *data_buffer = load_input(); + char *boarding_pass = strtok(data_buffer, "\n"); + int max_seat_id = 0; + do { + int seat_id = seat_id_from_boarding_pass(boarding_pass); + occupied_seats[seat_id] = true; + if (seat_id > max_seat_id) max_seat_id = seat_id; + } while (boarding_pass = strtok(NULL, "\n")); + + bool occupied_seat = occupied_seats[max_seat_id]; + while(occupied_seat) { + max_seat_id--; + occupied_seat = occupied_seats[max_seat_id]; + } + + free(data_buffer); + return max_seat_id; +} + +int main() { + printf("Part 1: %d\n", part_1()); + printf("Part 2: %d\n", part_2()); +} diff --git a/c/2020/6/input.txt b/c/2020/6/input.txt new file mode 100644 index 0000000..6a9f009 --- /dev/null +++ b/c/2020/6/input.txt @@ -0,0 +1,2190 @@ +vmzodatscnrfek +epjkrabmiusofzclt + +qfvg +vnduc +mab +krxowtje + +jitvf +fbrl +guazkfqy +fehw +efosi + +n +ipsl +k + +wgzjxectsfbuqkyihpvrml +uzgtkwvicqymshjpbxeflr +kplwuvtcbhjqsyfgzexrim + +kuibxgzwpaqvlny +dblsifnutpkzyxqg +qpeijbyzgxmklnrc +ipkbgylznhqx +qlzpbigwynxk + +xyvdorhgskfczpl +qzaodbmxytiu + +fxdogrbqmu +xdqocgjbrm +rbdmoqcg +qemgdtorbhpz +mbklgqosdr + +bpgoqryv +ajlsknwmdufc + +smj +sjmh +mjs + +qvkxiesuczwm +gdncrjpaz +rtfdabhczg +dozycln + +fulhpr +hubwrp +wlhpqztu +jydgcpanuh +huwzp + +sncd +slydx + +a +la +a +a +a + +qtlcnozhbivwjrmsa +xzinjehdyslbtpkmfrowvuqac +whbocitrlnvjzgamqs +mclshazqiotbrwnjv + +mhndikourgvjplsa +dlmxwopuzenvyg + +l +l +l + +mgsocef +oecgfm +xiamjfecuvl + +cgjvewai +dcoxwzeaqgvi +svkwcmagieb +vclpufwgarhtnyei +azeigcvw + +pnfwujv +jvuwpg +mpknvwgtsju +uglwvspo +pudvweqb + +cjunkibsfzmgry +mchpuejwitb +xjacdmvioqbutl + +r +r +rkd + +vuwnpmytzojdh +gynrhmdozjtuwv + +pmugoknftl +qncisjodve +boyhwnm + +v +v +v + +awrd +acl +oiapejknusvh +zabfytl + +ouyvwh +huwo + +djweohkzratfqug +rukgaezdwhoqfjt +tzqhdyfokgjruwcea +rhqtauzkjoefwygd +gprwsfqzuaeodjhkmt + +lmrxedynzjhouaqpki +dnylahikjzomp +inlgykhmjptofza + +nhukeywbxpjg +kyxngujbeph +kesxijuhpqgnby +nbkjuyhxpezg +ehpxbnkzgujy + +xipcz +wcvap + +jczryhid +iehucld +dhci +ihldtogncq + +uevrf +qbvrpefa +rfev + +rws +qsji +spy +swrb +mzaoxdgvs + +aysor +zhlvaw +jekdmqbip + +wqtzsk +qkwtzs +qwstzk +qtkzws + +joph +dnhopiwkt +gomqhpv +zhqypso + +zplmswug +mklgjpsf +dmltrxgs +wlmgs + +finvhsdy +tjkinh + +hzteqfmdsarbng +qnszgbefmahdtr + +dihptjsucv +tupvsecjdh + +gcspdaqnlwmj +jqpagnmscelw +gneclwpamvjsq +njamswlgqpc +zqylsxpjwcnarmg + +pykcaoqfizng +fpqokzgni +nigzfopkq +fzungkqoip +nufgkzipoq + +pisnjflxcwqvrdko +fdazpbxermuh + +e +e +e +e +e + +mgtze +jgmz +gmz +vgmbz +gmjz + +tjg +uyprlxbzqi + +yicftxgpnsakoumbhejzlrw +swukeibgmflrjocayxzpnth +izpjolebrafgkytwnmsuxcvdh +taueopgncshzwfrjlbmyxki +ghousnkaxjczylpwbirfmet + +wqie +qe +pmrdgzco +yws + +rltvm +vrlmt + +smanxywjp +mipuxysawtj +xawomsjlpy +msyajxwp + +bmyjdokqvea +jmyqlbufvkare +aefuqmbnzojykv +qckgjyevpbam + +xkoengaq +gqxnoeak +oqaekxgn +akxnoqge +aenqoxkg + +gkszoexurnca +fdomckulz + +p +spu + +ixa +xai +iax +xai + +ujm +mj +mj + +fevxazmtcuy +mfguzyaetx +yaueifzmndt +huafmgytzec + +ugzi +kiuzg + +gjfrzisuyml +bmgedhzfwynir +fgrcxami + +ulaqyxjmes +hejkqlxp + +dwmes +edw +wde +iwgqdye +dew + +hcsolbi +boz +bo + +cjmuofeaxzbkv +bejcfxmouvzka +uavkemoyfjxzbc + +gyu +lyuhg + +s +nvdg +ju +jsb + +bxacvrgknlihpfudteoqmys +asryxlvneomqfuikpbcd +qyolmuxknsvarfpbzcide +dcyaspmzqerokvnlfxuib +kunsaxmbfoqiecyrpldv + +bskjodwgaqplftvzxncruyh +wyqdvutskafrnzxhbcgplj + +k +k +k +k +h + +dbv +b +b +bp +b + +htardyuoexn +eniadrhyu +eagnhpurdy +haygndure +ndehlsaburzkfywm + +d +d +d +d + +ztawekhv +khwazre +xdfwzsmkep + +wbq +wqb +wbvqc +qwb +wqb + +yqzctgrli +cqrtiglwz +gctzirkql +qigrzltco +qgitlbnrcz + +zrtvjqxyshowbfkecidnpmu +qujemalvbfytwpikozsnxrd + +svokapl +plsoakvm +qxhpavlos +pnaovsl + +tswmgeorcqudnfbijxyk +jmrfozxnyqwbictudks +bhsuwpoxtnkmirfycjaq +xobfyqcwijlrmutskn +tbjusyixfcrmhdoqpnkw + +xfmgwboyuqihv +rpifewmgcbduohty + +kp +pk +pk +pkfz +kp + +gaitb +mbavq + +cbevphgyoznqlrui +ovidcqreumpgnb +yqciomufrpgknveb +cuepbnvrsioxqtg + +trngydpvcquwlh +pbgotihdelkru +dalzhgmsrtkeupo + +htnq +et +tv +lt + +csfzparoyimutn +ytoinamcpsfr +pmsnfywcortaiv +qirmtoncspyfa +tnycmsfiordapu + +jtauexdnhkclpi +deinucbapqtljkx +ckeipjstluabndzx +knjpiadculewxbt +nlxtdeaiukjcp + +gezsvid +zivdegs +edsgizv +sevidgz +vszeidg + +gtpbmuyahd +fqtelauodx +azdtmsgkyu + +knys +vuir + +ywn +nyw +gynw + +dgz +cahdgz + +qhpavgeijfckozu +xzclkfgsbtu + +xphfmcniugqlwdbe +nwfqiezambylhxouvpc +nfqchsibumexpwrl +xbnehqjkgulmfwicpr +ftmbnlcwixeqhup + +uncjehvmps +ohjmcpu +cyfupmhij + +jmdtsfe +jetfd +jftde +edtjf +tfdje + +pqtrac +capltq + +scvlufnkadzj +txbygih +rempgqotw + +kf +kf + +apbdsw +fdluwhjcxesvi + +xgpcrtjydbkoa +aqpjiyuodt +oatydpuej +adpoymjzt +modhtpyja + +kigvcfjuyzbldtrwo +rtqvlkgyohiafbecpm + +vlcesthidg +yhetdvzcgl +civxtdghela +wivlcghted + +zemvtkbjg +ogizbjlvekcqatu +pxgktbzjevrnm +kjzbtvge + +mpyrclkes +fqobuzjvxtgi + +aeobkgs +emajsklgod +efkiapqycsog +oegakls + +dfhruzlm +mcuhdrzs +zdumgrh + +c +cj +c + +funok +nofukg +fbkmunho + +ejxvl +lehmvg +kwvlie +elkv +livqrde + +filvuoxy +lyixfovhu +viflexycu +hluvifyx + +vwprofci +ovfrcwpi + +dbsy +bsyd +sdyb +bysd + +brizpvscfmqletj +gnwyaxkuohd + +axbgortewjkdcn +cgdsnxbeavwhkrtj +adupxwcgkrzeibtjnm +cnbatrwjexgqkd + +soeq +cq + +klguybtdir +gkdtalriysub +rlutbkdiyvg +dgyrutbilk +gyblktviudr + +wkfmlsexbvqojpzr +gixblkseprvjqfmzwo +okpfmezjxvrslbwq +kfwxbvojmpszlqre +qorsvljkmezbpfwx + +knol +lkn +lkn +liwnkp + +jqceghowuid +uwaeiqdbjg +gqawxdejui +wiudegpjqv + +tfjocaivykunqrm +nyiqtacvjfkmu +tuaqfivcjykmn + +ixvecpwrsbfkqaozj +scbwftzaeyqumhvpdn + +sytdlcibnkqgfjuavxhwz +taxqbudsnhwgcfz +xudmatnbwcfpghzsoq + +ptielykb +byiwekl +blieyk + +auwxpqlifktnvdjczog +wvdkpfujaolxictz +zmrecfyiwsxdhjouabkv + +rmhdlqgwajy +gwylamhqrdj +hlgywrdmjaq + +tkmxv +itxhkgv +tvxkfwz +atxkhv +qxvtkau + +vaezqdxfbumylrg +tbdenuxmflzsvihoragqy +gdxmerzvalufyqb +ezxfdmlgabquvyr + +dvgfzkti +dizfkv +kjbahfvdiqn + +tdpkb +jtadq +tsbj +unevhcwlfrtog +tyzx + +wt +t + +ytuxlndcm +yutgdxlncm +nlxcdtmyu +dcmunylxet + +t +t +t +tr + +zpagqd +dqpgnzla +dgpqaz + +bwdzsuaogitrqpknj +sworntpqgkdujia +agiwurdpotknjsq +gwpdanqotijkurfs + +sp +ps +pjs +ps +sp + +owfixjnlu +owxinufjl +oaniuflwx +qfiulnoxwcg +onjfiwuxl + +bogejcmqwkz +qgcwmobk +zqmtkbocgw +owgcbqmkrp + +kui +niuw + +gskrcqufjaybtxiwpv +xgdmryvlpjsbiktcwafqu +rpkcnxysuwatfvbqgij +rpyqgfbexujcitkasovw +twvjfgqupskycibarx + +oxkzbnjtydic +lgzave +vrhsqwz +uvzafsl + +wvhn +inxwkvj +jnpfv +dvazmtcn + +fsvghzlanejckiyptuwo +lofwqkpiaegsvujnhmxdztb + +vdocn +vdcon +dovcn + +xftpok +pkoftx +pkftxo +pktxof + +hulqzd +ludhqaz +kuhlwqzd +dqhzul + +oavcie +ajsntbxry + +lfycorabtwqzi +rbwflaqoizmyt +atbifylqzoruw +fwlboztarqy +fltyopwnaqbdhzr + +zosualjhpwdxitknrgyemq +rgtailouxmnehsykwdjqz +ouskwmrgjxnzdaeyiqlht +jrzmihdsuneayqkglxwot + +dm +j +e +ej + +cbsjvmudeywt +mutdwcsjbvey +tuvdscybmjew + +tleckmrn +tnlscekm +hzcnmkltes + +xkqlsahnfvureowit +resufihltvxqnowak +uhtskfoxqrvnwaile +fuxyvntwsiqlkzreoah + +gvcwo +hpgyinve +lgxv + +zkrl +lvi +vilb + +ghtud +hgdut +utdgh +tghud +dhugt + +yx +gwyxuzlb +vxy + +fhcwtskbpa +kbwhpstcaf + +zqjm +jmz +zjm + +clwysmfkoxvjqhazupd +fyadtvouswqklpmxzch +kxzlpmhfqdcoyuawnsv +spaqvyokzclufhwdxmj + +fvpjlahmdgk +lujafdmhg + +uyki +uvk + +funtydwobxhjmapl +lsqdexyjmptgv +idltxszmkjpy + +gwidnshycjtka +bzdwlq +rmwedpuo + +ygvurmkxaw +vrmakgwyxu +wcmuxvayonrskg + +jnvtubeqwhxd +bfemdwl +fdiekwbl + +ulxjdiw +szc + +osxyfdljchivgtqua +ldsgitzjywavf + +i +g + +tk +kt +tk + +cnldkubrhoagfmwej +xiarjsqkfcmlnuhp + +g +q +e +e +e + +pxayhgoqv +oyqvgwa +yqvxgeiaom +vgyjnrlqsoad + +hfalndysgpqcbjtwkmzre +fakebsrlzwcjdpqgtmhyn +kpwzsjtyedlafncmbrqgh + +stcefhmkxydwv +wxhtomkdyfsprcev +hswqagvzkcmbtdjyef + +ms +m +jzm +m +m + +dhm +mghpd +dhym +mdyh +hmd + +cbxnyfijlvthdqo +ybqcdkxjpinh +wiphqnbjgcyxmd +bdhcxyenjiq +drbyqjcpxnih + +yjvg +habgzy +jgy +gyj +ygj + +vdmfwnszkjhobtre +gyfduoqihlcxar + +rbqounyt +yuqrnobt + +k +k + +ocjtaxknh +nqteajo + +mbexguhtnzq +sjuqedxflbpvzo +nywuzeqxcabik + +rdyhsljnabg +uzkqofaps + +bzsvylh +dzfywv +zyjvb + +avzxqltie +extbiqyzva +zivxaeqt +zqxetiva +iztveaxq + +xvz +nqca +khspzi +e +b + +m +z +z +m +ilnk + +kyl +ky +kya +ktlyin +yrske + +z +ry +y +r +r + +eqlkwoyxcsvhfdp +xhscvjwugyfmlab +ihfntwzslcryvx + +xvcegjr +yxcksge +jegxc +ecgxj +xfecg + +rlatcvg +tzcqfjvkxaoh +auteyvnipc + +emdvwukslifrgp +ifrgleawspdvuk +gsdcrvwiepukftl +vdfiprsglwkue + +sde +ew +s +kcmi + +ubcp +b +bih +fb + +rglwpmbhey +lbxwc + +jvhglanmwfcbeyuridkzpsoq +gvyunocmjqhdzlpwakeftsirb +yjahowdgivxzblekqnsucfmpr + +rpyxbztoadcl +tauh +at +tavg +sta + +idajwuk +akiuwdj +jyiwseaud + +vuqhyftonbges +qnhogtbeyafs +ysengbxqthfo + +ukcnqeomjdbw +ndxkywtmquo +hfaogsvrwlpdzim + +v +vt + +c +c + +ampurkeiqtycn +pbfdlwytasquizmckrjneg +teqickhuanvmrxpy + +qj +qj +bqj + +neswkv +vwsjkfen +spneawkvo +swkenv + +jmazyqxftgphuden +gnjhxbmdypafrqut +xmqupntayfdhjg + +azwqbhd +aquhbwye +wqab +lbqa +astrombcvq + +pzqaouvrtyjbwih +jptrhoyvqgxn + +uxseftzharjvncib +hrntbaxiczkusfejv +zbaxvnsfjcuither +xutaensvjhbizcfr + +eydbqwkxsczjrfmihnlpuga +syutawiqgnkjxclrmzdeph +jemwauzrsliknqxpghycd +cjnrvhusizxleqpkdgmyaw + +jcsuwtbivrpdzm +pdmcrwjzbivsu +cdmjsibpwfhuvrlqz +ebipvtjdsmrcuwz +rpwvmuiscbejdz + +crxuwedjbspizlf +tiryzsjlcnbmd +qrlcudwisjzb +rihjsoclzbdaf + +mekcbdihzg +ysqvcgzbwjrxak +obzmlgtkchfdn + +wpklreqngztdojsba +nkeopazqlbrdsgjt +nplgqsbdjkewarzot +qkcplisxonbjdhgferzavt + +fljxziya +kylijfo + +ido +qhd +rdqh + +wqxjvlgpfabszoidunceryhmt +zvsweftdrmyhcqjonxligkapbu +acjzlfsmdvixbqgetrpuhwyno +uornshfajyqcxzvmbigpwltde +ncwrdstvjpuoebihyzgxmlafq + +i +i + +w +iynw +w +w +dw + +ir +ir +ri + +rcqlpuoyh +yqrjapu +yraupq +qyupar + +uwxarmftshpj +umwtzjshre +bwjehtrmsu + +bzkuxwqy +kuwbqyzx + +mnrhlsvcbaq +qcrhxljasbn +hcduzaplsnotyrq +ashclqrn + +edxqbszjiyhongfklm +eilqxykjzhnbdgms +jlxmseihqzkndybg +knlyzhsbdimqxgje +mykglhqenizdjsbx + +dqxvzlbnyjetiwfo +esdbjtnqclfyphowaz + +zlmbhvi +hvbzi +zbvih +esaugpzbwivnh + +qfjgzbpthodilcm +jcmizkgdftpqoblh +rgjbiqamhlzofdtpc + +onayebrqpz +rqyebpzoan +onbyrqpeza + +lyrciegthpvfajzn +sgjkzuxoqbw + +ahibusqrotmndvezkpwy +mqnhywikxzoavdgprlfu + +qrcax +xracq +lxqdrcza + +kap +awr +adu +a +a + +hridasxejplzwvm +kutnoyqf + +htl +whtl +hlt + +enkqgxc +xqcegnk +kmxecqgn +exnkqgc +kxqgnce + +ncqublgdxpht +lszcxigoertjbaqmdn +oclbtgdnimxq + +uhcmyri +mr +mrd + +qjxnkbcprlm +pcqjsmkrlx +rclqfjkxaum + +cz +fcz + +yl +y +y +y +y + +onciyxtgbrlvhwfakdsum +qkcnozhegvmbajyixr + +ifjhxqgekcbd +jfhkuc +jcuhfk +hfcjk +chjkfo + +vdwfpzqtlkeixu +fwqidktuevxplz +kewvtdlixquzfp + +ntyvelizqfbxcmdgj +qnakiemyfrpshx +ernwxyoqmfi +xhafqyemniku + +smwqlhndtupokcriyxfegvjazb +oecdjyuhizxrnmbwatflvp +rfbaxzwcnvomeljdpytihu + +vjegptfqsowax +tdaczwbfvjqrsmyknliuxoh + +v +x +i +w +i + +sh +hp +h + +udzqvrcbafosknlpjihwtexg +vlbieudchtxjozrfpkwansgq +tjozawesdbqpkhnuixrcgfvl +gabtdlehijurnxczvwskoqpf + +rjyekxacdqfmgis +zjoqhpvmebdiu + +vdnsbauglczjrtiqow +ongavlsbtrczjuwqdi +soncjdutlgraibwvqz +btavciudrslgznwjoq +aczitldqwgsvbjnuro + +rhlvuwyadgpiscqf +yqsgpikfevlrh +hqyrszltpgfiv +gvhlqirfspy + +hecgmbaytsdf +rqjwahzx +pkuinhazovxwl + +rdjtxphaefwunkgsziv +nswdxriztjakpfeg +pkaxgiwdzhvfestnruj +hgitjdrkznpywasfex +awmkrctzgjldoneipfxs + +meyvhqusdpxrfboikwztagj +haeibuptyomjfqdwrvxsgk + +dagcsljo +xwpvs + +uqs +fs +sp +cpqsnu + +gyxksbqjfmnviopcetw +acvgqhblrewst + +pinxmhofarzqbkgd +bihpraxmgondfkq + +zxeqvpwnchbs +dqpvebgshoczn +hdvnkqcbzspwe +vhqcpzesab +vnqcbghzsep + +kqc +ucjwmk + +n +fwn +gne + +stekfuxoqjwzy +jfdmcxaltvsi + +c +dcs +c +c +hc + +audck +iukc +zkcuif + +wj +f +fr + +c +c +c +c +c + +lhgx +eivdlnaxhborg +xghl +xhglc +xlgh + +mqase +amnbqo +mlqa + +q +q +q +hq + +crqlexg +pjxbgryi +grxlq + +leoh +scohae +oeh +hero + +bzdke +dktze +zdek +kzevd +kdzet + +zsinhduclpj +slznhjvupicw +uchnjizfspl +pnlhrzugjsekciy +jnfscphuzil + +vthmsnuxpwycladirgokz +psnhcoxykrgzumidwvalt +otunzwpymgvlhisdrcxka +yuoxlcsadznwihktmgvpr + +uyidejc +fueaijdpcyb + +nwczduye +ncwudzye +unzdewcy +hydznwcuge + +cyiprjdkln +poey +hypabt +gpsomy +fphy + +gypwus +jrsmqf +awkv +ctihxodn + +n +qen +n + +rn +sq +z + +cvuzahfgy +cnfyazbxe + +ygznbrfaxdmiovujsl +zyogvxrbmjdainluf +lfgdjxozuyarvimbn +yfjgnlmvurziaxbod +odbqumjvnafgrxiylz + +vmkxe +vefdtxk +eqvckoxy +exlkv + +ubvpqaire +rhvjugpem +wkcfeyxuznsv + +elipaymtoxjrcq +clukfmnreihzqtobsy + +nt +nt +tvnx + +azebispg +ziaybsgde +guzeblnishka +axosibgzjfec +ewztgasmib + +pm +pm + +ahmcfneqypg +mnhgkapyef +yenhpbdalfgmju + +xorshpayckgmjlqbvd +ficvhyxogzarjqdspklmb + +z +m +ulyhw + +rcpvaoeg +vpzidxojarbe +egzblrpaov +wrqkoympauh + +bqf +yhqsb +pbqw +bpq +bfqu + +afxblgjyrudnmvekqh +nxhbjcpidfsal +gjnbtdwzyxlfrhak + +mhbocqir +hmibocqr +oqrmhibc +oricqmhb +qombchir + +ky +yk +hyk +yk + +niogxwzmjbvufs +fxnujgwaoivm +kgsueanxotfvijw +lrgfxuocvihpjwnq +vjkafxgiuyndotw + +anfizhcmgoe +keicrfnzvmhoa +czvfmhianeo + +trovy +ugzybvinq +jpvfey + +htek +dncuk + +ueqjpgkn +tidywmxzcnr +osan +onjb + +ofwsujk +kwiq +wkb +qwk +kwebi + +orpui +proiu +uoipr + +trkigzfwaodmeqybu +sayuogrzbwdefkitmq +dzrqgoeyifuawmtsbk +dwfpeybktuomizargq + +tqo +tq +qt +qt + +sjtuezvbin +evzsnutijb +ieujnbtvzs +tuzvensjbi + +ervjluczbfwk +rlbvfkocuwzej +frluvwkejzcb +cjzkflruwvetb +xzlvfgukjwbhrscnde + +lrfe +irlf +wfrl +ulfir +rfl + +yadwotpf + +qtkljhmpfwnsdzvubaye +zoyekplhdbwunmvjqsa +whklqjndsmyvbauczpe +wjeyzcbhuanplsqrkdmv + +ismaohz +nozehyvwg + +sfabkpigc +plcgk + +hmuqgc +ucksg +cgum +fcug +gmchu + +yisfpmvdjunwzeghq +phfeqnxjszmvdgwiu +wgejshvzpqymidfun + +dirlfjqzvx +vxrqjtfznd +qwojxszdrfvp +qdxzvrlfj +rxzqfvdj + +sbkupemaqojhz +beuamjhokqzsp +eopqubmskzjah +pyhvjabuzkemscoq + +pmgsxjzbcvdhetiun +fvopxtuhydsjzgencbi +nvzxajpgcihutsdbe +egxiczqusbdhjnktrpv + +osbjan +n +rmn +nz + +eskfqymcnxa +ibusymlt +yljmpsvz +ybmds + +vrluacpomgdkitefzyb +gexfpiyzaruvloktm +frtmeakylvuogpcziq +avsfeikgohzyutrmlpj + +fhojbavzqmxilgyt +yqbhadmopgxvrljti + +w +kcvwe +g +suzj +b + +qwj +j +je + +lxauzr +dxblctarf + +txfuwvimnc +rhegosdzpk + +ruonip +nvaiw +bneiq +rikzn +zqni + +myzfxcw +xfyczmw +cfmyxozw +fzxcwmy +zfcywmx + +jzcd +jcd + +sk +sk +ks + +pkgwmcqisxoh +knrwcpxishmtgoyj + +uigypkbmcqaxen +drjcofvswhlzt + +kijsex +jpdaut +juczf + +trsneafvcgwxzkbp +xpscqrhtfeywlg + +qjrtgakfxpdbvey +vixbeopgmsurwykfa + +iylbjpzqdgmewus +dlbmruyipsejzg + +vmdpynczjs +cpjuvdnyzsam +vypjdcnmsz +dncypzvmswj +edmynczsjvp + +isafzcqtvrdywkhojxpmgube +wqbhkvpdnjgxzulferit + +hcnodru +klizonvbdh +sndmhaxyo +ngjfpohd +djpshuno + +hvjsbf +mqdvs +nmlvxf +tcvkguweoziayrp + +ykdnuqhoavrzefw +nisabfeokzhwvgqryu +nyahvqfruzkwoe + +u +u +u +u + +urpk +clfbgy + +kcvjspimowhxzqt +fvkarmpwiqsxzbc +qkswczxivpylgdm +pqezykcvimxsw +ioyqclvkuwxhpmzs + +vebntwira +ejwpifavm +yqzhascoweuvil +wpiegfmtajv + +rqajtfoyighbulvwcenx +xwovyidkzpljmngcers + +frimhksougxjq +stfjkqoigrnxhlmu +jucrqonfihxkg +rkfouqihgapjezdbx +yrwjoxvqusghkcimf + +hrnt +rntd +dtnr + +a +nceproam +ka + +z +zo +z +z +z + +wh +jb + +rnjewh +rhjew +hrjwe +rjhwe +jhwre + +fnyplqztgaiskmcox +xnckyoqmigzf +gnymkocqizxf +gxzmnfiqkcyo +xcyhfnozqmikg + +ckafxul +fujakg +dkwtuafp +ufcakvj + +jochwluqemtnxydbikasgfprvz +xnwkerzpibgthmvajqydfcluos + +spe +kv + +kr +c +c +c + +ohfrjpcqniblv +njbflvhiocqrp +nqbifhvjclrpo + +mgjcfpktz +jpfgktmc +cpfgjkmt +mkjfgpctu + +vjcyr +rsmv +vcyrk +vrj + +nqsvlgr +tlgnrsb + +jhi +kjih +jhi + +pthfdwzagysjerux +keulitwrbnxfpah + +rsqjn +sfqeurtn +qnrs +qsnr +snqr + +mfjhwyrxzgcbed +dzgewjcyqmbrnfhx +zxyrjfecbgwdhm + +npew +eznr +neli +ngfe +nke + +ljmbfe +jmflbe +ebmflj +fjbmle +bjefml + +hvql +kdpthm +oeiuyhsfan + +wohrc +hz +glxqb +rkpd + +aivbqfdghlk +zvlidkqbafg +qflagivzdkb +akqtvecldgbmfi + +lpgdm +pgmd +pfcmg + +aodivlrsneqxbpz +furbcxiqdgysnlao + +g +g +g +g + +aglritbeompn +rmcianbe +crmanbei + +hds +sdh +shd +dsh + +optduxeybrfgs +ufxhyqeodspztgw +pdgkxemulicfstn +dtuxjfeahpvgs + +sdyljvnmrf +vknwydlrm +upmtelixygradozcvqh +bmyslrvd + +xnhbglkwe +mysaxfckbqi +wbhkzpxv +ktjnduoxbrv + +ixgtsb +ajizbgvt +ktbxlgcip + +gt +tg +tg +txg +tg + +woy +wop + +qglnhukax +ohluktegqan + +nrwfazobyievthjpdgklx +pceqaghbty +tuyqgbmahcpse + +afpyvbxkedmwj +emwnxjipdfkvy +vbyekdxfwapmj + +cinaloh +hlonic +ilnhsco +colhin +lncihso + +ugxdniwa +dnwubgaix + +bxopkm +xkob +obkx +bkox +xokb + +lqcrsnvijt +ylrekmaiq +dlohriuwfxpzbg + +dmcilpebrxnkagzqtswhvf +gxrahicelqdfskynzptmbw +criamhnkxolpzsqdbwfgte +rpkfnvhclmqdbixzweastg + +t +r +d +r +j + +xptge +gpxet +gxtpej +xctgzyeup +eproxtg + +iodwuh +uwdnoih +ouhwid +hwuodi + +lzgpeimjysnhafudtbv +zktnlrfjxgmybcwosve + +bqk +xlfjopzwc +by +dvi + +chj +jch +hacjqtnx + +fgiqkwbe +gfbzw +cnauygpjrvdxsm + +o +o +ro +o +o + +cy +c +tc +ecy + +ewfqylsaun +tgdrpibxzkoj + +reagywmqpoltx +mcefsvzrbgx +xgemrfkb +hgexrmui + +zwgnfqsblcm +mqbzylegfns + +k +o +h + +ics +ics + +ufanbvkotzlmegchdiw +ufdkaoyczigbelnqmh +nmhekbuzlpcqfioagd +inmcgldboekafzuh +ogzfkuencqhibldma + +tevp +tlevp +eptv + +wjxurkon +qxjrdnokw +jxkwnrto + +zuibqrjvkteapdo +oapeizjrdlu +edupjihorz +pidnecurzoj +jeuidrzshpok + +jdo +dj + +x +x +x + +cbikoyuwlvnhe +kbuheoclyivnw +ickhnlovuwyeb +ehkbwocvyiuln +cenhibokulwyv + +caumpvyok +uogrthvplq +excunpoksv + +kxlijpgmwaqhfbo +pfgkzrmljxnhoa + +trmisbo +sbjimr +rmbqgndysi +boimlrs +hmouiarsb + +fwbyqo +tevn +vxjmp +ugdrz +ijcgzm + +dkai +ikd +widk +dwki +driukz + +nzmvyqba +amnqzubv + +iwhvx +tivhkx +vidzshr +vqbighpf + +qlnygosbhdtp +qldotfgyhpmsn +bngosyqltdhp +dptynlgoqsh +glohqntysdp + +kgbls +nigwxk +mgtz + +wzrh +aupdeo +ghbu +ntiqmkj +dw + +tmjibcky +tbcijkmy +bcjyimtk + +pyqtlkrzwjmbxfohaiegv +tzoglunifwscdk + +x +x +x +x + +qupnkiwvbzetyh +wenzmifsxdgtkqly + +ozmqecv +mrcnazqbhdg +mcqzot +fljkxsioqcmz +kzqxcm + +ideu +udeic +idu +widu +diytboujqa + +y +p +e +y +vrij + +wmacjrfvtb +puvgcxkhafwt +vbwfdtca + +xlhzeay +flnukvws + +r +r +r +r +r + +s +s +s +s + +pivre +eipvr +iepvr + +wzn +nwfz +wnz + +djeoxq +dxogjhq +neqpudxo +cqwtobaxklyrd + +gpvlrtdbucyjawizfxonh +ydhcvapgiubonrwjztxfl +wpuxocaiyfgkznlbvthdjr +zwrfivtmldpxoaucbjhnyg + +xagpvdzioyctqwufkb +tvybxakouwgcpizdq +gkcwelrthupjdaoqxvzyi +qagctokpxvzwudiy + +oalnbjdmwhsvciupxzykqf +hdlmxiyqjfboncvzpkuaws +nfizbdcyxsahwrjkuvpmgqlo +icnsbmvkyqxfhopzwudjal + +qhmz +qb + +nfqcoajmkugrpiltbv +lkqecpjrfgamvutbno +mraglyfonukvbpctjq +luvjnikfqtcorpbmga + +rkbnldoxjgiazucpmvetq +wmskhaqudrynlocfb + +lxahfjpyctwinesgk +haknfcespyilxvwjb +nhwsxlikfapjecy +hnfwpkylstjxieuac +entfjilhypxsckaw + +rqbsjgpn +sjkhbxdmvnw + +sq +zw +ia +z + +wyfugxnakdheivlmjsct +hnrjgivusekfwycdmtaqz +yjtpvgxmdukwiahcsenf +ahicfumtesjowykgdvn + +xhgdiekv +vxehgkdi +edkhgvix +kdhtixevg + +evctsliwqjbhuzrxpof +cqlbxtgpwjfvorehumi + +cvdsatreguklb +gtuecdarlkvsb +udgvcrlabeskt +dkueatcrbslvg +asudctgkbvlre + +xgfp +px +pizxa +epx + +cbgfhiqrwupxtsklmva +mgsxtfbpurawiclkqhv +fapxbtuqlkgwcivsmhr +spqmlwitcufhkvrgbax + +xsvtwcrfi +wvexcfrti +wfviacretbx + +shgbpv +sbpgh +gpbzfixush + +t +t +ukt + +duapw +fw +w +w +xmw + +iudtnpfgv +igfdnutv +gndtuvif +ivgundft +gdifteuvn + +nypodhsjctw +dmygicjhq + +bpdrxj +jevxbr +itarxblm +bxrv +bxeyrv + +cgns +gcsn +cdsgn +snbcg +cydngs + +oqz +oz +noz +omvhzs +odz + +ufetwbosghqarzc +abjklnqhgfosci + +toi +tcio + +uwlpanmdzceqb +buthjwzgmsrqxa +ikofjbmvtquzhawx + +fyri +iry +iyr +irgvhy + +cyednmbkljaut +caktfjmludegy +tmuakczjpldiyqe + +rpowcxneyfalvuzh +rlwzuahoxncvpefy +chzvfenaprsxiyouwl + +wftiyuj +nsetw + +w +xi +lq + +exow +u +i + +nujelpthdrkbq +sxkmzacgfyouw + +ebzsafxvp +fmrgzp +wyzfp +pgijzfm + +gmqavtzb +baqztmvgr +mbtsgvaquzxd +bakmvqzgt +tqzarmgvb + +qyedxmc +iaexmw + +cm +cm +mc +mc +cm + +zruilkg +rligzku +uilkrgxqz +lgikzhur + +r +tr +or + +fts +fts +fst +tsfay +fst + +wcbyd +qfdyeptm + +fiyzwouejgbh +jawuezocykpvsmg + +tpskydl +sklpdty + +kjm +aik +auk +ki + +wsxfctnqrijgh +wgicndsebfqzktrx + +djlgp +djgvepuw +jgpfd + +xhgzakdpfurm +gzdsomeky +kidgyzms + +w +jc +e + +kyigvc +gybvtcpik +ygvkic +kicvgy + +rqywfmcisa +oabmcj + +po +hop +oph +pe + +mozselrxb +sfjomkzl +stlomz +mlsjoqz +amoszl diff --git a/c/2020/6/main b/c/2020/6/main new file mode 100755 index 0000000..b0871d1 Binary files /dev/null and b/c/2020/6/main differ diff --git a/c/2020/6/main.c b/c/2020/6/main.c new file mode 100644 index 0000000..92d9fb0 --- /dev/null +++ b/c/2020/6/main.c @@ -0,0 +1,89 @@ +#include +#include +#include +#include +#include "../lib/util.h" + +typedef uint question_bits; + +int question_score(question_bits q) { + int score = 0; + while(q) { + score += q & 1; + q >>= 1; + } + return score; +} + +int part_1() { + InputWithSize *input = load_input_with_size(); + bool questions[26] = {0}; + question_bits q = 0; + + int sum = 0; + int offset = 0; + do { + char c = *(input->data_buffer + offset); + if (c == '\n') { + if (*(input->data_buffer + offset + 1) == '\n') { + int count = question_score(q); + q = 0; + sum += count; + offset++; + } + } else { + q |= 1 << (c - 'a'); + } + offset++; + } while(offset < input->size); + + int count = question_score(q); + sum += count; + + sum--; // No idea + + free_input_with_size(input); + return sum; +} + +int part_2() { + InputWithSize *input = load_input_with_size(); + bool questions[26] = {0}; + question_bits group = UINT_MAX; + question_bits member = 0; + + int sum = 0; + int offset = 0; + do { + char c = *(input->data_buffer + offset); + if (c == '\n') { + if (*(input->data_buffer + offset + 1) == '\n') { + group &= member; + int count = question_score(group); + group = UINT_MAX; + member = 0; + sum += count; + offset++; + } else { + group &= member; + member = 0; + } + } else { + member |= (1 << (c - 'a')); + } + offset++; + } while(offset < input->size); + + char c = *(input->data_buffer + offset); + member = 0; + int count = question_score(group); + sum += count; + + free_input_with_size(input); + return sum; +} + +int main() { + printf("Part 1: %d\n", part_1()); + printf("Part 2: %d\n", part_2()); +} diff --git a/c/2020/7/input.txt b/c/2020/7/input.txt new file mode 100644 index 0000000..55a9626 --- /dev/null +++ b/c/2020/7/input.txt @@ -0,0 +1,594 @@ +shiny indigo bags contain 4 vibrant lime bags. +clear lime bags contain 1 dotted lime bag, 2 clear gold bags. +dotted turquoise bags contain 2 shiny green bags, 5 striped magenta bags, 3 muted green bags. +bright red bags contain 1 plaid magenta bag, 3 light cyan bags. +vibrant magenta bags contain 5 drab lime bags, 3 muted red bags, 3 wavy turquoise bags, 3 mirrored salmon bags. +plaid violet bags contain 4 plaid indigo bags, 1 mirrored beige bag. +muted gray bags contain 2 striped crimson bags, 2 striped maroon bags, 1 faded maroon bag, 4 dim lavender bags. +mirrored crimson bags contain 5 muted lavender bags. +muted gold bags contain 3 striped plum bags, 4 bright coral bags. +pale black bags contain 4 shiny orange bags, 3 pale bronze bags, 2 wavy coral bags. +muted purple bags contain 5 muted brown bags. +clear cyan bags contain 4 muted white bags. +shiny blue bags contain 5 pale magenta bags, 3 drab coral bags. +posh white bags contain 3 posh brown bags, 3 striped gold bags, 1 faded gray bag. +muted beige bags contain 1 pale teal bag. +clear purple bags contain 4 plaid turquoise bags. +pale gold bags contain 1 mirrored lime bag, 2 dim crimson bags, 3 dim aqua bags, 2 dull silver bags. +pale beige bags contain 4 drab olive bags, 2 wavy coral bags. +drab black bags contain 4 mirrored blue bags, 2 light olive bags. +faded purple bags contain 3 dim lime bags, 2 vibrant violet bags. +pale silver bags contain 3 light cyan bags. +plaid teal bags contain 3 dotted fuchsia bags, 3 bright teal bags. +plaid beige bags contain 5 shiny black bags, 3 dotted maroon bags. +light silver bags contain 3 posh chartreuse bags, 4 dark bronze bags, 1 vibrant silver bag, 2 muted coral bags. +pale plum bags contain 5 drab silver bags, 4 light crimson bags. +striped cyan bags contain 3 wavy tan bags, 5 pale teal bags, 5 clear orange bags, 3 wavy violet bags. +plaid red bags contain 2 dim lavender bags, 4 striped maroon bags. +dark salmon bags contain 5 bright gold bags, 5 muted lavender bags, 5 light beige bags. +shiny purple bags contain 2 plaid silver bags, 2 mirrored green bags, 3 bright violet bags. +shiny turquoise bags contain 1 vibrant salmon bag. +muted orange bags contain 2 striped indigo bags, 1 striped crimson bag. +pale turquoise bags contain 3 light silver bags, 5 light crimson bags. +light indigo bags contain 4 vibrant white bags, 5 plaid yellow bags. +faded coral bags contain 1 vibrant beige bag, 4 muted white bags. +dim red bags contain 1 mirrored cyan bag, 2 wavy indigo bags, 5 shiny chartreuse bags, 5 muted yellow bags. +striped fuchsia bags contain 2 faded salmon bags, 1 pale beige bag, 2 posh magenta bags, 2 wavy green bags. +bright green bags contain 4 pale turquoise bags, 2 bright chartreuse bags, 5 posh yellow bags, 4 shiny gold bags. +light blue bags contain 5 dim silver bags. +vibrant purple bags contain 3 wavy indigo bags, 1 pale maroon bag, 3 drab chartreuse bags, 5 vibrant aqua bags. +light coral bags contain 2 clear orange bags, 3 shiny fuchsia bags, 3 striped chartreuse bags. +striped maroon bags contain 4 vibrant tomato bags, 2 dull salmon bags, 1 shiny gold bag, 2 muted coral bags. +drab lime bags contain 1 mirrored violet bag, 4 posh magenta bags. +dotted gold bags contain 3 muted silver bags. +pale magenta bags contain 5 mirrored orange bags, 4 pale teal bags. +dim olive bags contain no other bags. +mirrored blue bags contain 1 dim indigo bag, 4 bright lime bags, 1 plaid beige bag. +plaid bronze bags contain 3 pale gold bags. +faded aqua bags contain 3 muted aqua bags, 3 muted gray bags, 4 dim olive bags. +light gold bags contain 1 mirrored crimson bag, 3 pale tan bags, 3 dotted yellow bags, 2 wavy aqua bags. +dim gold bags contain 4 plaid tomato bags. +faded chartreuse bags contain 5 muted coral bags, 4 vibrant indigo bags, 1 faded teal bag, 1 vibrant bronze bag. +posh brown bags contain 2 muted gray bags, 1 dark plum bag, 3 bright lime bags, 2 dull turquoise bags. +mirrored lime bags contain 1 shiny indigo bag, 4 dark olive bags, 3 pale beige bags. +posh cyan bags contain 3 pale olive bags. +dark lime bags contain 3 shiny cyan bags, 4 bright green bags. +drab lavender bags contain 4 drab plum bags. +vibrant orange bags contain 5 wavy olive bags. +faded violet bags contain 1 faded aqua bag, 2 muted gray bags. +light green bags contain 5 pale brown bags, 4 dark aqua bags, 5 vibrant teal bags, 1 pale black bag. +bright turquoise bags contain 4 striped teal bags, 2 dim magenta bags, 5 striped orange bags, 4 bright aqua bags. +mirrored indigo bags contain 2 wavy violet bags, 2 muted white bags, 2 dim lavender bags. +wavy green bags contain 5 dotted teal bags. +light aqua bags contain 4 posh lime bags, 1 dotted maroon bag, 3 dotted gray bags, 2 plaid bronze bags. +muted tomato bags contain 3 mirrored tomato bags, 3 pale blue bags, 2 mirrored violet bags, 4 drab tomato bags. +posh beige bags contain 5 faded aqua bags. +shiny coral bags contain 5 striped gold bags, 1 drab coral bag, 2 light lavender bags, 4 striped blue bags. +posh orange bags contain 5 dark olive bags, 3 light silver bags, 3 striped gray bags, 2 faded fuchsia bags. +posh violet bags contain 2 drab turquoise bags, 5 mirrored gray bags. +pale brown bags contain 2 bright chartreuse bags. +shiny green bags contain 2 mirrored magenta bags. +faded salmon bags contain 2 wavy tan bags. +dark gold bags contain no other bags. +clear black bags contain 5 vibrant lime bags. +muted fuchsia bags contain 1 pale fuchsia bag, 4 mirrored white bags, 3 clear fuchsia bags, 3 faded maroon bags. +drab fuchsia bags contain 1 bright chartreuse bag, 3 pale beige bags, 5 wavy brown bags. +mirrored plum bags contain 1 plaid yellow bag, 2 dim beige bags, 5 dim aqua bags, 4 dim crimson bags. +dark maroon bags contain 1 striped crimson bag, 5 muted fuchsia bags, 3 vibrant silver bags, 2 drab olive bags. +drab green bags contain 5 faded bronze bags, 2 bright violet bags, 3 dark gold bags. +drab purple bags contain 3 plaid orange bags, 4 striped black bags, 5 vibrant indigo bags, 4 pale turquoise bags. +dotted silver bags contain 1 clear crimson bag, 2 faded yellow bags. +dull olive bags contain 3 muted salmon bags, 2 vibrant cyan bags, 3 posh bronze bags, 5 light cyan bags. +posh gold bags contain 4 bright violet bags, 1 drab yellow bag. +dark plum bags contain 4 clear fuchsia bags, 2 mirrored aqua bags. +dim purple bags contain 5 clear chartreuse bags, 4 dark gold bags. +drab tomato bags contain 5 mirrored white bags. +mirrored chartreuse bags contain 3 clear indigo bags, 4 clear crimson bags. +striped olive bags contain 4 posh orange bags, 5 shiny indigo bags. +dark purple bags contain 2 drab lavender bags, 2 faded bronze bags. +light purple bags contain 1 vibrant lime bag, 2 vibrant gray bags. +mirrored green bags contain 4 mirrored cyan bags. +bright lavender bags contain 1 dark red bag, 2 clear yellow bags, 3 bright brown bags, 2 bright teal bags. +posh tomato bags contain 4 posh silver bags, 3 shiny black bags, 4 clear crimson bags, 3 dotted chartreuse bags. +dotted coral bags contain 4 dotted bronze bags, 5 dotted maroon bags. +pale cyan bags contain 2 dim coral bags, 4 dotted brown bags. +plaid gold bags contain 4 bright chartreuse bags, 4 faded bronze bags. +bright tan bags contain 3 bright brown bags. +dim chartreuse bags contain 2 clear maroon bags, 3 pale tan bags, 2 mirrored lime bags, 1 wavy crimson bag. +dark bronze bags contain 4 faded maroon bags, 1 wavy violet bag, 4 plaid silver bags. +wavy brown bags contain 4 light red bags, 2 dull tomato bags, 5 mirrored red bags, 4 bright lime bags. +dim fuchsia bags contain 4 dark beige bags. +drab bronze bags contain 2 dotted blue bags. +bright plum bags contain 2 plaid orange bags. +shiny red bags contain 1 faded fuchsia bag. +vibrant brown bags contain 3 faded fuchsia bags, 2 light plum bags. +pale tan bags contain 3 dark aqua bags, 3 dark plum bags, 1 mirrored green bag. +dull aqua bags contain 3 muted cyan bags, 5 drab cyan bags. +dark teal bags contain 1 light red bag, 4 plaid silver bags, 2 dark olive bags, 5 striped maroon bags. +pale tomato bags contain 4 dim indigo bags, 4 dark salmon bags. +faded silver bags contain 5 dim blue bags. +striped lime bags contain 2 bright black bags. +plaid coral bags contain 4 dull salmon bags, 5 mirrored green bags, 1 pale aqua bag. +clear white bags contain 4 drab turquoise bags, 2 posh coral bags, 5 dark fuchsia bags. +dark turquoise bags contain 1 wavy lavender bag, 4 bright lime bags. +dark tomato bags contain 5 faded maroon bags, 4 dark chartreuse bags, 5 wavy fuchsia bags, 2 dotted purple bags. +striped bronze bags contain no other bags. +dark black bags contain 2 dotted chartreuse bags, 3 pale bronze bags. +dotted teal bags contain 2 dark teal bags. +drab yellow bags contain 3 dark turquoise bags, 4 muted fuchsia bags. +wavy salmon bags contain 2 plaid turquoise bags. +dull violet bags contain 3 mirrored red bags, 5 shiny black bags, 3 dark maroon bags. +muted cyan bags contain 4 mirrored black bags, 4 dim olive bags, 1 bright chartreuse bag, 1 clear bronze bag. +clear plum bags contain 4 light teal bags, 1 faded white bag, 3 striped lime bags. +light red bags contain 3 mirrored orange bags. +pale gray bags contain 5 wavy cyan bags, 2 bright green bags, 3 striped gray bags. +posh green bags contain 3 clear purple bags. +dark crimson bags contain 5 bright violet bags, 4 light magenta bags, 1 posh chartreuse bag, 1 shiny gray bag. +dull yellow bags contain 1 dotted fuchsia bag, 5 muted maroon bags, 1 muted salmon bag. +plaid plum bags contain 1 striped olive bag. +wavy lime bags contain 3 vibrant silver bags, 5 shiny gold bags. +dim green bags contain 1 dark tomato bag, 5 light red bags, 4 muted gold bags. +mirrored yellow bags contain 1 vibrant tomato bag. +dotted yellow bags contain 3 striped crimson bags. +drab turquoise bags contain 1 clear indigo bag, 1 mirrored magenta bag, 4 clear violet bags. +dim aqua bags contain 3 wavy coral bags, 1 posh beige bag. +pale violet bags contain 1 faded plum bag, 4 dull purple bags, 2 pale brown bags. +muted crimson bags contain 3 dim beige bags, 2 dim gray bags. +mirrored brown bags contain 1 dotted tan bag, 4 dim olive bags, 1 bright lime bag. +dotted crimson bags contain 5 striped beige bags, 4 striped turquoise bags, 3 shiny fuchsia bags. +mirrored tan bags contain 5 bright indigo bags, 3 light violet bags. +striped black bags contain 4 striped olive bags. +faded fuchsia bags contain 3 faded teal bags, 4 dull salmon bags, 3 light red bags. +dull green bags contain 4 mirrored coral bags. +vibrant blue bags contain 1 striped gray bag, 4 striped olive bags, 3 wavy brown bags, 3 faded maroon bags. +vibrant plum bags contain 4 wavy brown bags, 5 clear violet bags, 3 pale turquoise bags, 2 posh crimson bags. +wavy fuchsia bags contain 5 wavy olive bags. +striped red bags contain 2 pale yellow bags, 3 pale chartreuse bags, 1 dim blue bag. +muted blue bags contain 2 posh red bags, 2 muted red bags, 3 dark tomato bags. +muted plum bags contain 4 plaid red bags. +clear violet bags contain 5 muted salmon bags. +pale white bags contain 3 plaid lavender bags, 5 mirrored green bags. +clear beige bags contain 2 vibrant blue bags, 5 muted white bags, 2 dull chartreuse bags. +vibrant fuchsia bags contain 4 posh gray bags, 5 dull tomato bags, 3 dim crimson bags. +dim indigo bags contain 1 bright black bag, 5 faded black bags, 5 dull turquoise bags, 2 mirrored lime bags. +dotted lime bags contain 3 light lime bags, 4 pale salmon bags, 4 dark aqua bags. +posh teal bags contain 3 pale gold bags, 2 faded silver bags. +faded gray bags contain 2 shiny gold bags, 1 dull turquoise bag, 1 faded chartreuse bag. +dim magenta bags contain 2 mirrored aqua bags, 5 wavy orange bags, 3 pale turquoise bags. +shiny fuchsia bags contain 5 vibrant silver bags. +drab teal bags contain 3 posh magenta bags, 2 striped indigo bags, 5 muted salmon bags, 4 shiny plum bags. +bright indigo bags contain 2 faded teal bags. +muted teal bags contain 4 mirrored green bags, 3 dull violet bags, 3 shiny purple bags. +light tan bags contain 1 muted salmon bag, 1 plaid olive bag, 2 plaid silver bags. +striped yellow bags contain 2 drab salmon bags, 2 faded aqua bags. +mirrored olive bags contain 5 clear maroon bags, 2 striped coral bags, 4 dim gold bags. +wavy cyan bags contain 3 plaid lavender bags, 1 wavy turquoise bag, 2 plaid bronze bags, 1 light beige bag. +mirrored red bags contain no other bags. +light yellow bags contain 3 dim purple bags, 4 posh green bags, 3 pale gold bags. +dotted gray bags contain 3 dotted orange bags, 5 plaid turquoise bags, 4 drab magenta bags. +faded red bags contain 3 bright aqua bags. +dull teal bags contain 4 clear purple bags, 5 faded turquoise bags. +light salmon bags contain 3 posh lime bags, 1 clear lime bag, 1 drab chartreuse bag, 3 clear magenta bags. +dark red bags contain 1 plaid tomato bag, 1 plaid orange bag, 4 dotted white bags. +mirrored beige bags contain 3 mirrored violet bags, 3 clear orange bags, 3 dark olive bags. +drab indigo bags contain 2 muted aqua bags, 3 bright teal bags. +light lime bags contain 4 light indigo bags, 5 plaid white bags. +pale blue bags contain 3 wavy tan bags, 1 mirrored tomato bag, 5 faded magenta bags, 2 posh crimson bags. +drab plum bags contain 2 striped crimson bags. +striped tomato bags contain 1 dark maroon bag. +faded maroon bags contain 3 drab salmon bags, 5 posh lime bags, 4 dim olive bags, 5 striped bronze bags. +clear fuchsia bags contain 5 vibrant silver bags, 5 posh lime bags, 4 striped crimson bags. +bright maroon bags contain 2 dull gray bags, 4 bright magenta bags, 5 clear beige bags, 5 vibrant silver bags. +clear blue bags contain 4 faded black bags, 2 plaid magenta bags, 1 clear salmon bag, 1 shiny chartreuse bag. +plaid chartreuse bags contain 1 dark bronze bag, 1 clear red bag, 2 mirrored plum bags, 4 posh white bags. +pale crimson bags contain 4 muted silver bags. +clear olive bags contain 3 dark olive bags, 5 drab plum bags, 2 striped maroon bags, 5 shiny purple bags. +vibrant indigo bags contain 1 vibrant silver bag, 5 dark olive bags, 1 striped chartreuse bag, 1 muted fuchsia bag. +dim coral bags contain 2 dark yellow bags, 3 clear orange bags, 2 clear cyan bags, 1 pale turquoise bag. +shiny white bags contain 3 drab teal bags, 3 vibrant blue bags. +vibrant tan bags contain 3 posh red bags, 1 faded black bag, 3 faded aqua bags, 2 light beige bags. +wavy plum bags contain 1 dotted teal bag, 3 dark indigo bags. +drab coral bags contain 3 clear orange bags, 4 shiny red bags, 5 bright teal bags. +mirrored aqua bags contain 3 mirrored cyan bags, 5 wavy coral bags. +vibrant gray bags contain 2 muted coral bags, 1 clear fuchsia bag. +faded turquoise bags contain 2 posh lime bags. +clear green bags contain 4 posh yellow bags, 3 light bronze bags, 4 drab gray bags, 3 bright teal bags. +wavy gold bags contain 3 faded black bags, 4 faded violet bags. +shiny tan bags contain 4 mirrored gray bags, 3 mirrored magenta bags, 5 light red bags. +plaid turquoise bags contain 5 faded aqua bags, 3 mirrored tomato bags, 5 light tan bags, 2 drab olive bags. +pale bronze bags contain 5 drab chartreuse bags, 4 faded lime bags. +mirrored lavender bags contain 3 plaid green bags, 1 clear salmon bag, 3 dim gray bags. +pale yellow bags contain 3 drab yellow bags, 5 drab green bags, 1 drab lavender bag, 1 clear magenta bag. +mirrored teal bags contain 5 posh black bags. +vibrant teal bags contain 1 dark teal bag. +bright gold bags contain 3 dark green bags, 4 clear orange bags, 1 shiny purple bag, 5 dull chartreuse bags. +muted lavender bags contain 5 faded fuchsia bags. +light gray bags contain 5 plaid magenta bags, 3 vibrant cyan bags, 3 bright gold bags, 2 dim cyan bags. +dark gray bags contain 3 posh silver bags, 1 dark fuchsia bag, 5 dark teal bags, 5 clear fuchsia bags. +mirrored gold bags contain 5 dim crimson bags, 2 plaid beige bags, 3 dark coral bags. +wavy violet bags contain 5 dull silver bags, 3 dark gold bags, 5 striped bronze bags. +vibrant cyan bags contain 2 bright indigo bags. +dull tan bags contain 2 shiny indigo bags, 2 dim gold bags, 5 vibrant blue bags, 4 dull tomato bags. +dim orange bags contain 5 posh silver bags, 3 light red bags. +drab gold bags contain 4 shiny indigo bags, 2 clear indigo bags, 1 faded fuchsia bag, 1 muted crimson bag. +vibrant bronze bags contain 3 mirrored green bags, 2 striped gold bags, 5 wavy coral bags. +light violet bags contain 3 dull turquoise bags, 5 light white bags, 2 drab coral bags. +plaid tomato bags contain 1 wavy tan bag, 2 faded maroon bags. +faded black bags contain 4 dark bronze bags. +drab violet bags contain 2 pale green bags, 5 muted olive bags. +dull lavender bags contain 5 light chartreuse bags, 5 striped fuchsia bags, 2 clear white bags, 5 dull indigo bags. +light chartreuse bags contain 5 dim lavender bags. +dim salmon bags contain 5 shiny silver bags, 4 dark coral bags, 2 vibrant cyan bags, 3 faded black bags. +posh blue bags contain 4 clear bronze bags, 5 shiny aqua bags, 1 vibrant brown bag. +light crimson bags contain 4 plaid aqua bags, 3 mirrored green bags. +striped plum bags contain 5 plaid white bags, 5 light beige bags. +shiny bronze bags contain 5 dark magenta bags. +dark fuchsia bags contain 5 posh crimson bags, 3 dark turquoise bags, 1 vibrant white bag. +striped coral bags contain 5 dim gray bags. +vibrant gold bags contain 5 dull tomato bags, 3 mirrored cyan bags, 2 light tan bags. +wavy tan bags contain 2 faded maroon bags, 4 wavy violet bags. +dotted violet bags contain 5 shiny blue bags. +faded bronze bags contain 3 shiny gold bags. +plaid tan bags contain 3 posh tan bags, 5 mirrored cyan bags, 1 drab lavender bag, 4 shiny blue bags. +plaid salmon bags contain 2 faded coral bags. +dark orange bags contain 3 light purple bags, 5 wavy blue bags, 2 muted crimson bags, 2 dull magenta bags. +wavy beige bags contain 1 muted silver bag, 5 bright yellow bags. +plaid cyan bags contain 4 dark orange bags, 5 dark plum bags, 5 dotted tomato bags, 5 striped magenta bags. +dark lavender bags contain 2 mirrored beige bags, 1 pale blue bag, 2 dull chartreuse bags, 5 mirrored black bags. +light black bags contain 1 dull tomato bag, 5 bright violet bags. +wavy silver bags contain 2 clear gold bags. +wavy maroon bags contain 2 posh tomato bags, 5 shiny maroon bags, 1 wavy yellow bag. +clear lavender bags contain 1 muted white bag, 5 striped chartreuse bags, 3 dark salmon bags, 1 plaid teal bag. +dotted brown bags contain 4 striped blue bags, 3 mirrored fuchsia bags, 3 posh red bags. +faded teal bags contain 4 plaid olive bags. +clear gray bags contain 2 mirrored fuchsia bags, 4 faded blue bags. +light tomato bags contain 5 wavy indigo bags, 2 posh beige bags. +muted black bags contain 1 dark lime bag, 1 striped green bag. +dotted beige bags contain 5 faded lavender bags, 3 plaid yellow bags. +posh turquoise bags contain 1 wavy indigo bag. +bright crimson bags contain 1 dark fuchsia bag. +striped teal bags contain 3 vibrant olive bags, 1 bright maroon bag, 3 muted teal bags, 4 clear yellow bags. +clear orange bags contain 3 shiny plum bags, 3 drab olive bags. +posh silver bags contain 5 mirrored violet bags, 2 dotted teal bags. +dim gray bags contain 4 pale teal bags, 5 muted salmon bags, 3 dark indigo bags. +dotted tomato bags contain 3 dotted maroon bags. +posh purple bags contain 3 drab turquoise bags, 3 dark olive bags, 4 posh lime bags, 1 posh orange bag. +vibrant beige bags contain 2 mirrored violet bags, 1 mirrored white bag, 1 wavy violet bag. +dark tan bags contain 5 bright violet bags, 5 light blue bags, 4 shiny plum bags, 1 light indigo bag. +dim lavender bags contain 3 mirrored green bags, 1 wavy tan bag, 2 striped crimson bags, 5 wavy violet bags. +faded crimson bags contain 3 muted yellow bags, 2 posh lime bags, 5 mirrored gray bags, 3 faded chartreuse bags. +posh coral bags contain 3 muted silver bags, 4 pale magenta bags, 1 light orange bag. +dull tomato bags contain 2 plaid tomato bags, 2 dim lavender bags, 4 mirrored orange bags, 3 clear fuchsia bags. +striped orange bags contain 2 vibrant teal bags, 1 dotted teal bag. +shiny maroon bags contain 5 light beige bags, 1 dim lime bag. +pale olive bags contain 2 mirrored gold bags, 4 plaid tomato bags. +light olive bags contain 1 light red bag, 1 light crimson bag, 2 striped chartreuse bags. +posh plum bags contain 5 bright silver bags, 4 vibrant indigo bags, 4 pale turquoise bags. +shiny orange bags contain 4 dim chartreuse bags, 2 dotted lavender bags, 2 shiny green bags. +pale indigo bags contain 3 mirrored chartreuse bags, 5 mirrored violet bags, 2 vibrant blue bags, 3 mirrored maroon bags. +posh tan bags contain 5 shiny plum bags, 2 dark aqua bags. +bright blue bags contain 5 vibrant salmon bags, 5 bright maroon bags, 1 muted yellow bag. +clear maroon bags contain 4 vibrant beige bags, 3 mirrored gold bags, 2 drab teal bags, 2 drab plum bags. +wavy chartreuse bags contain 3 clear olive bags, 1 drab lavender bag. +drab gray bags contain 5 plaid salmon bags. +faded orange bags contain 1 faded maroon bag, 5 vibrant orange bags. +bright coral bags contain 3 pale turquoise bags. +light beige bags contain 1 muted cyan bag. +plaid maroon bags contain 5 faded magenta bags, 4 faded bronze bags. +dotted purple bags contain 1 drab plum bag, 5 faded black bags, 2 dull silver bags. +muted salmon bags contain no other bags. +striped blue bags contain 5 mirrored lime bags, 2 dark plum bags. +dotted lavender bags contain 2 faded salmon bags, 3 dim silver bags, 1 clear cyan bag, 4 plaid lavender bags. +wavy black bags contain 4 vibrant gold bags, 5 light black bags, 4 muted aqua bags, 5 vibrant white bags. +clear aqua bags contain 3 plaid beige bags, 1 plaid white bag, 3 shiny red bags, 3 wavy crimson bags. +mirrored cyan bags contain no other bags. +shiny brown bags contain 2 dim aqua bags. +dotted green bags contain 4 mirrored green bags, 3 mirrored tomato bags, 5 plaid gray bags. +striped purple bags contain 3 wavy yellow bags, 2 faded orange bags. +plaid indigo bags contain 2 shiny plum bags, 5 bright magenta bags, 2 posh yellow bags, 3 shiny gold bags. +posh chartreuse bags contain 2 mirrored cyan bags, 4 drab salmon bags, 4 dim olive bags, 2 posh lime bags. +light lavender bags contain 4 dim fuchsia bags, 5 pale salmon bags, 4 clear teal bags. +shiny crimson bags contain 5 light blue bags. +plaid black bags contain 5 clear indigo bags, 5 mirrored purple bags, 1 light aqua bag. +shiny lime bags contain 5 dotted blue bags, 2 shiny tan bags. +dotted salmon bags contain 4 pale salmon bags, 1 clear maroon bag. +vibrant lavender bags contain 4 shiny red bags, 4 shiny green bags, 5 dim silver bags. +muted yellow bags contain 5 wavy aqua bags, 2 posh lavender bags, 3 dull magenta bags, 1 plaid red bag. +faded beige bags contain 1 wavy violet bag, 4 plaid maroon bags. +wavy blue bags contain 5 dotted orange bags, 1 faded chartreuse bag, 4 posh magenta bags. +faded brown bags contain 4 bright coral bags, 3 mirrored aqua bags. +striped lavender bags contain 5 dim brown bags, 2 wavy cyan bags, 4 pale blue bags, 1 posh olive bag. +bright fuchsia bags contain 5 clear lime bags. +bright black bags contain 5 clear fuchsia bags, 4 pale purple bags. +pale orange bags contain 3 plaid aqua bags, 5 muted fuchsia bags, 1 wavy crimson bag. +mirrored magenta bags contain 2 posh chartreuse bags, 2 muted white bags, 5 posh lime bags, 5 dark gold bags. +light magenta bags contain 1 mirrored white bag, 1 dull silver bag, 5 posh chartreuse bags. +striped gold bags contain 1 mirrored cyan bag, 1 dark olive bag, 4 mirrored red bags, 5 posh chartreuse bags. +plaid lavender bags contain 1 vibrant white bag, 4 dotted maroon bags. +faded gold bags contain 5 striped crimson bags. +vibrant olive bags contain 1 plaid beige bag. +dark aqua bags contain 4 plaid tomato bags, 1 striped olive bag, 4 pale fuchsia bags, 3 dim gold bags. +dim lime bags contain 2 plaid gray bags. +pale lavender bags contain 4 muted yellow bags, 1 drab yellow bag, 2 dull cyan bags, 2 muted teal bags. +bright violet bags contain 2 posh lime bags, 1 wavy violet bag, 2 mirrored red bags. +dotted maroon bags contain 1 drab salmon bag. +clear magenta bags contain 3 mirrored brown bags. +vibrant red bags contain 5 clear cyan bags, 2 dark teal bags. +shiny olive bags contain 5 light tan bags, 5 plaid maroon bags, 3 mirrored blue bags. +plaid fuchsia bags contain 5 posh silver bags. +vibrant chartreuse bags contain 2 clear coral bags, 2 pale purple bags, 5 light beige bags. +vibrant violet bags contain 3 striped bronze bags, 2 drab tomato bags, 2 faded violet bags, 5 posh crimson bags. +vibrant white bags contain 1 plaid orange bag, 5 muted aqua bags, 5 pale fuchsia bags, 3 muted fuchsia bags. +drab magenta bags contain 3 bright indigo bags, 1 faded violet bag. +faded tan bags contain 3 dark crimson bags, 5 light aqua bags. +bright salmon bags contain 3 clear plum bags, 3 striped blue bags, 5 plaid green bags. +wavy aqua bags contain 1 clear beige bag, 5 dull magenta bags. +muted white bags contain 5 wavy tan bags, 5 plaid silver bags, 5 striped bronze bags, 3 dull silver bags. +mirrored gray bags contain 4 dim olive bags, 3 striped gold bags, 1 wavy tan bag, 5 striped bronze bags. +vibrant maroon bags contain 5 clear bronze bags. +shiny violet bags contain 2 clear salmon bags, 1 bright beige bag. +dim bronze bags contain 2 posh brown bags, 4 vibrant indigo bags, 2 dull purple bags. +bright bronze bags contain 1 bright maroon bag, 4 faded aqua bags, 2 pale tan bags, 3 mirrored lavender bags. +dull blue bags contain 4 clear coral bags, 2 drab olive bags. +posh crimson bags contain 1 muted white bag, 2 faded maroon bags, 5 plaid olive bags. +dark olive bags contain 3 dim olive bags, 3 mirrored red bags. +striped violet bags contain 4 wavy gold bags, 4 dotted maroon bags, 1 vibrant salmon bag. +vibrant tomato bags contain 1 striped gold bag, 1 faded turquoise bag. +mirrored turquoise bags contain 2 dark magenta bags, 2 clear lime bags, 3 dull turquoise bags. +mirrored coral bags contain 4 plaid lavender bags, 4 vibrant salmon bags, 4 mirrored chartreuse bags, 3 plaid white bags. +muted red bags contain 2 mirrored maroon bags, 4 vibrant beige bags. +shiny salmon bags contain 2 posh black bags, 4 wavy tan bags. +vibrant turquoise bags contain 4 clear crimson bags. +pale maroon bags contain 4 striped crimson bags, 5 wavy indigo bags, 3 dull turquoise bags, 2 faded black bags. +dull beige bags contain 4 dim olive bags, 3 vibrant olive bags, 1 mirrored plum bag, 3 muted white bags. +striped tan bags contain 5 mirrored gray bags. +dotted magenta bags contain 4 wavy olive bags, 5 mirrored magenta bags, 4 muted fuchsia bags, 2 muted gray bags. +pale chartreuse bags contain 1 wavy crimson bag. +dull white bags contain 1 dull tomato bag, 4 faded tomato bags, 3 shiny fuchsia bags, 4 dim beige bags. +light cyan bags contain 3 drab plum bags, 1 wavy violet bag, 1 vibrant gold bag, 1 dotted purple bag. +bright tomato bags contain 1 bright plum bag. +bright olive bags contain 1 dull green bag. +shiny tomato bags contain 3 faded red bags, 3 mirrored gold bags. +light white bags contain 2 dotted gray bags. +dotted bronze bags contain 3 wavy olive bags. +drab white bags contain 4 dim fuchsia bags. +posh indigo bags contain 2 dull salmon bags, 4 mirrored white bags. +vibrant coral bags contain 2 faded chartreuse bags, 3 dark indigo bags, 1 wavy coral bag. +bright purple bags contain 4 dull white bags. +faded blue bags contain 1 striped chartreuse bag, 2 faded crimson bags. +striped turquoise bags contain 5 dark plum bags. +faded green bags contain 1 mirrored white bag, 1 striped magenta bag. +dotted indigo bags contain 5 pale olive bags, 5 vibrant fuchsia bags. +drab blue bags contain 2 faded tomato bags. +dull lime bags contain 4 faded crimson bags, 1 striped white bag, 3 drab bronze bags. +bright yellow bags contain 5 drab purple bags, 2 mirrored white bags, 4 faded fuchsia bags, 2 dark tomato bags. +clear turquoise bags contain 3 muted fuchsia bags, 3 plaid purple bags, 4 posh blue bags. +dull crimson bags contain 5 muted green bags, 3 dotted bronze bags, 2 pale gray bags. +light maroon bags contain 5 faded indigo bags, 1 clear yellow bag. +wavy magenta bags contain 3 bright orange bags, 2 pale lavender bags, 1 shiny blue bag, 1 plaid purple bag. +vibrant aqua bags contain 2 vibrant silver bags. +posh black bags contain 3 striped crimson bags. +bright white bags contain 2 clear white bags. +clear bronze bags contain 2 dim aqua bags, 1 mirrored indigo bag. +vibrant yellow bags contain 2 vibrant silver bags. +bright silver bags contain 3 clear beige bags, 3 mirrored lime bags. +plaid magenta bags contain 5 striped gold bags, 5 posh purple bags, 2 pale brown bags. +shiny black bags contain 2 posh beige bags, 4 posh magenta bags, 4 dim blue bags, 4 dark bronze bags. +shiny yellow bags contain 2 wavy turquoise bags, 2 pale purple bags. +plaid aqua bags contain 3 shiny fuchsia bags, 1 dull tomato bag, 2 light magenta bags, 3 mirrored green bags. +wavy bronze bags contain 2 bright gold bags, 5 plaid green bags, 1 shiny violet bag, 1 faded chartreuse bag. +mirrored purple bags contain 2 faded tomato bags, 1 dark gold bag, 4 dim aqua bags, 1 faded aqua bag. +muted tan bags contain 3 pale teal bags, 3 drab tomato bags, 4 pale maroon bags, 1 dim cyan bag. +plaid blue bags contain 2 muted coral bags, 5 striped maroon bags, 3 pale plum bags, 5 dotted purple bags. +posh gray bags contain 5 muted salmon bags, 2 wavy orange bags. +wavy orange bags contain 5 dark aqua bags. +bright brown bags contain 3 muted yellow bags, 5 faded lavender bags, 2 drab cyan bags, 2 mirrored indigo bags. +dark brown bags contain 3 plaid coral bags. +bright beige bags contain 4 vibrant indigo bags, 5 bright lime bags, 5 bright magenta bags. +clear tan bags contain 3 dark turquoise bags, 4 vibrant cyan bags. +light brown bags contain 3 light lime bags. +wavy red bags contain 5 wavy cyan bags, 4 plaid bronze bags, 3 dark chartreuse bags. +faded olive bags contain 1 wavy green bag, 3 drab olive bags. +vibrant lime bags contain 5 vibrant silver bags, 2 light silver bags. +faded plum bags contain 3 clear lavender bags, 1 dotted lavender bag, 5 muted silver bags, 3 plaid purple bags. +dark violet bags contain 2 vibrant beige bags, 3 light crimson bags. +posh lime bags contain no other bags. +dark magenta bags contain 2 muted cyan bags. +striped white bags contain 5 light tan bags, 3 plaid orange bags, 1 dark gold bag, 4 mirrored white bags. +dull cyan bags contain 1 muted red bag, 5 faded lavender bags, 5 plaid gold bags, 5 dark beige bags. +mirrored white bags contain 2 dark olive bags, 4 striped bronze bags. +light plum bags contain 3 wavy crimson bags. +clear red bags contain 4 faded violet bags, 3 dotted tan bags, 1 pale indigo bag, 4 vibrant brown bags. +muted maroon bags contain 3 bright indigo bags, 1 striped magenta bag. +dull chartreuse bags contain 4 posh orange bags. +muted green bags contain 2 vibrant orange bags, 3 dull red bags. +muted coral bags contain 1 dark olive bag, 4 striped bronze bags. +drab brown bags contain 3 shiny maroon bags. +pale teal bags contain 2 faded aqua bags, 4 mirrored magenta bags, 2 plaid red bags, 1 dark coral bag. +dull purple bags contain 2 dotted teal bags, 3 vibrant orange bags. +mirrored maroon bags contain 3 light purple bags, 4 posh beige bags, 1 dim gold bag, 4 striped olive bags. +dull salmon bags contain 3 mirrored red bags. +posh maroon bags contain 3 dark bronze bags, 2 faded lavender bags, 3 plaid red bags. +shiny teal bags contain 1 dotted purple bag, 5 dull black bags, 1 muted purple bag. +dotted olive bags contain 1 wavy aqua bag, 2 clear indigo bags, 2 light coral bags, 1 plaid yellow bag. +drab silver bags contain 2 wavy coral bags, 1 light purple bag, 4 shiny fuchsia bags. +posh lavender bags contain 3 shiny plum bags, 5 wavy coral bags, 2 mirrored green bags. +dark silver bags contain 2 vibrant blue bags, 2 dull crimson bags. +clear indigo bags contain 3 plaid aqua bags, 4 posh orange bags. +plaid purple bags contain 3 vibrant gold bags, 4 wavy fuchsia bags, 2 striped maroon bags, 2 wavy coral bags. +dull gray bags contain 4 striped maroon bags, 1 striped gold bag, 4 vibrant salmon bags, 3 shiny fuchsia bags. +dim maroon bags contain 4 shiny beige bags. +plaid lime bags contain 4 bright lime bags, 5 vibrant tan bags. +faded lime bags contain 3 dotted crimson bags, 2 wavy violet bags. +pale coral bags contain 5 wavy blue bags. +plaid crimson bags contain 2 dull black bags, 3 striped gold bags, 5 dim beige bags, 1 mirrored purple bag. +dark beige bags contain 4 vibrant salmon bags, 2 drab plum bags, 5 dull chartreuse bags, 4 light crimson bags. +clear crimson bags contain 2 shiny fuchsia bags, 5 faded chartreuse bags. +dull orange bags contain 5 plaid bronze bags, 5 faded cyan bags, 3 dotted silver bags, 5 dim purple bags. +dotted black bags contain 2 bright green bags, 5 bright tomato bags, 1 pale magenta bag. +dull coral bags contain 2 dark beige bags, 5 striped gold bags. +vibrant salmon bags contain 5 striped indigo bags, 2 plaid olive bags, 2 drab plum bags. +dim blue bags contain 2 mirrored orange bags. +dim black bags contain 2 light chartreuse bags, 1 wavy fuchsia bag. +dark white bags contain 4 mirrored maroon bags, 2 dim lavender bags, 5 faded yellow bags, 3 dark silver bags. +drab olive bags contain 2 muted white bags, 1 mirrored white bag, 4 striped crimson bags, 4 faded maroon bags. +striped brown bags contain 1 dull fuchsia bag, 1 plaid crimson bag. +clear tomato bags contain 5 drab chartreuse bags. +muted bronze bags contain 3 light magenta bags, 4 clear yellow bags, 5 bright tomato bags. +posh olive bags contain 3 dotted gold bags. +dull maroon bags contain 4 plaid beige bags, 5 drab silver bags, 3 drab lime bags, 5 dull magenta bags. +drab cyan bags contain 3 striped magenta bags, 1 vibrant bronze bag, 2 mirrored green bags, 3 plaid silver bags. +posh magenta bags contain 1 striped chartreuse bag, 4 vibrant silver bags. +muted violet bags contain 4 dark gold bags, 1 posh purple bag, 3 clear purple bags, 4 bright teal bags. +muted silver bags contain 2 bright chartreuse bags, 1 clear chartreuse bag. +wavy coral bags contain 5 mirrored red bags, 1 striped gold bag, 5 faded maroon bags, 1 dark olive bag. +dark green bags contain 3 shiny gold bags. +drab beige bags contain 4 vibrant crimson bags, 4 posh silver bags. +plaid gray bags contain 2 wavy blue bags, 5 dim coral bags. +plaid orange bags contain 3 mirrored orange bags, 1 dark olive bag, 1 light red bag, 2 striped gold bags. +dull silver bags contain no other bags. +shiny lavender bags contain 3 dotted yellow bags, 1 wavy indigo bag, 1 dark coral bag. +dim brown bags contain 4 dim blue bags, 1 drab plum bag. +posh salmon bags contain 3 dim blue bags. +drab orange bags contain 1 faded bronze bag, 5 dull black bags. +wavy crimson bags contain 1 drab salmon bag, 2 vibrant salmon bags. +dull black bags contain 5 vibrant orange bags. +clear teal bags contain 5 faded aqua bags, 1 plaid crimson bag, 1 posh silver bag. +wavy olive bags contain 3 faded aqua bags, 3 faded fuchsia bags, 2 drab cyan bags. +bright gray bags contain 4 clear coral bags, 2 clear white bags, 3 faded lavender bags, 4 dark turquoise bags. +striped green bags contain 1 faded magenta bag, 1 wavy tan bag, 4 posh red bags, 1 striped bronze bag. +clear salmon bags contain 2 striped green bags, 1 striped aqua bag, 3 muted white bags, 3 pale plum bags. +wavy indigo bags contain 2 vibrant orange bags, 1 shiny indigo bag, 1 drab tomato bag. +clear brown bags contain 3 muted maroon bags, 4 dotted silver bags. +vibrant silver bags contain 4 wavy violet bags, 2 posh chartreuse bags. +mirrored salmon bags contain 4 bright brown bags, 3 mirrored crimson bags, 1 mirrored aqua bag. +faded white bags contain 1 wavy crimson bag, 3 drab silver bags, 5 striped yellow bags, 3 dotted olive bags. +muted indigo bags contain 1 wavy indigo bag. +drab aqua bags contain 5 dotted teal bags, 4 mirrored white bags. +posh red bags contain 5 wavy crimson bags. +dim turquoise bags contain 1 striped turquoise bag, 4 dotted crimson bags. +dark yellow bags contain 1 drab olive bag, 3 muted aqua bags. +pale red bags contain 2 vibrant gray bags. +vibrant black bags contain 1 posh gray bag, 5 pale teal bags, 5 shiny red bags. +pale purple bags contain 5 dim olive bags. +dim tomato bags contain 3 plaid lavender bags. +dim yellow bags contain 4 plaid brown bags. +plaid silver bags contain no other bags. +plaid white bags contain 2 muted purple bags, 5 dull black bags. +muted magenta bags contain 2 plaid gray bags, 5 wavy salmon bags, 3 dark chartreuse bags. +bright aqua bags contain 1 dark indigo bag, 1 faded gray bag, 5 vibrant white bags, 2 vibrant gold bags. +drab crimson bags contain 2 clear orange bags. +wavy purple bags contain 2 vibrant plum bags, 3 dark fuchsia bags, 2 pale salmon bags. +wavy teal bags contain 1 drab salmon bag, 4 muted indigo bags, 5 bright violet bags, 5 muted bronze bags. +pale salmon bags contain 5 mirrored blue bags, 4 mirrored maroon bags. +faded lavender bags contain 2 muted blue bags, 4 striped blue bags, 3 pale brown bags, 2 pale purple bags. +dull plum bags contain 5 clear coral bags. +drab maroon bags contain 2 plaid bronze bags, 1 bright orange bag. +light turquoise bags contain 4 striped teal bags, 4 posh indigo bags. +dotted orange bags contain 2 wavy violet bags. +bright teal bags contain 4 clear indigo bags, 1 vibrant violet bag. +mirrored fuchsia bags contain 4 muted brown bags, 5 wavy coral bags, 2 wavy turquoise bags. +dark indigo bags contain 1 light red bag, 4 vibrant lime bags, 2 drab teal bags. +plaid brown bags contain 2 dull gray bags, 3 mirrored magenta bags. +wavy yellow bags contain 4 dotted brown bags. +light orange bags contain 4 shiny black bags. +dark cyan bags contain 3 mirrored chartreuse bags, 4 pale magenta bags, 2 dull black bags, 2 posh lime bags. +muted chartreuse bags contain 3 dull silver bags, 1 dark aqua bag, 2 light tomato bags. +dull red bags contain 5 mirrored orange bags, 2 plaid yellow bags. +dotted cyan bags contain 1 vibrant fuchsia bag, 5 drab olive bags, 4 clear chartreuse bags, 5 pale beige bags. +dim beige bags contain 2 striped yellow bags, 3 bright cyan bags. +dull magenta bags contain 4 faded black bags. +dotted blue bags contain 2 posh maroon bags, 5 dark gold bags. +muted olive bags contain 1 mirrored aqua bag, 4 dull black bags, 5 clear gold bags, 1 mirrored cyan bag. +mirrored silver bags contain 2 bright blue bags, 4 shiny orange bags. +muted brown bags contain 5 muted white bags, 4 clear violet bags, 3 light red bags. +muted lime bags contain 2 plaid yellow bags, 2 pale chartreuse bags, 2 muted tomato bags. +clear silver bags contain 2 clear purple bags, 2 light tomato bags, 4 light gray bags, 1 shiny crimson bag. +dim tan bags contain 2 dull brown bags, 1 dull tomato bag, 2 dim salmon bags, 1 dull green bag. +shiny cyan bags contain 5 plaid turquoise bags. +faded indigo bags contain 4 drab plum bags, 4 clear maroon bags, 5 wavy cyan bags, 4 dim crimson bags. +posh bronze bags contain 5 mirrored olive bags. +posh aqua bags contain 3 dull violet bags, 5 bright silver bags, 1 drab coral bag, 5 shiny orange bags. +dark blue bags contain 5 light silver bags, 1 posh magenta bag, 3 mirrored crimson bags, 4 pale chartreuse bags. +dim crimson bags contain 1 faded gray bag, 3 dull turquoise bags. +dark coral bags contain 3 bright violet bags, 3 mirrored violet bags. +pale green bags contain 2 muted white bags, 5 bright lime bags, 4 dark indigo bags, 2 faded fuchsia bags. +shiny silver bags contain 4 bright teal bags, 1 dim gold bag. +light fuchsia bags contain 1 dull white bag, 1 striped indigo bag, 2 light orange bags. +vibrant crimson bags contain 4 striped maroon bags, 5 dim white bags. +clear yellow bags contain 5 bright green bags. +striped aqua bags contain 4 mirrored beige bags, 4 clear beige bags. +dark chartreuse bags contain 3 bright lime bags, 3 mirrored magenta bags. +wavy turquoise bags contain 4 bright brown bags, 5 mirrored lime bags, 3 pale white bags, 3 drab salmon bags. +faded tomato bags contain 2 clear indigo bags, 3 faded teal bags, 4 dark teal bags. +dull indigo bags contain 5 vibrant indigo bags, 1 mirrored purple bag, 1 vibrant tan bag, 2 shiny plum bags. +posh yellow bags contain 5 clear cyan bags, 3 mirrored red bags, 5 mirrored magenta bags. +plaid yellow bags contain 3 vibrant gold bags, 4 posh crimson bags, 3 mirrored green bags. +plaid olive bags contain 3 vibrant indigo bags, 3 posh indigo bags, 1 posh magenta bag, 5 dim olive bags. +bright cyan bags contain 2 vibrant brown bags, 2 muted red bags. +clear chartreuse bags contain 2 muted salmon bags, 1 plaid aqua bag. +shiny plum bags contain 5 mirrored gray bags, 2 dotted maroon bags. +dim teal bags contain 3 dotted tan bags, 4 faded aqua bags, 2 light teal bags. +mirrored bronze bags contain 3 wavy plum bags, 5 dotted tan bags. +muted turquoise bags contain 2 mirrored silver bags, 2 dotted yellow bags. +clear gold bags contain 4 plaid olive bags. +mirrored orange bags contain 5 mirrored cyan bags, 2 faded maroon bags, 2 bright violet bags. +striped chartreuse bags contain 3 dark gold bags, 2 pale fuchsia bags. +dull turquoise bags contain 5 faded black bags. +bright chartreuse bags contain 1 drab turquoise bag. +vibrant green bags contain 3 wavy plum bags, 1 shiny fuchsia bag, 3 dark yellow bags, 1 dotted lime bag. +mirrored black bags contain 4 plaid red bags, 2 wavy brown bags. +striped magenta bags contain 3 dim lavender bags. +shiny gold bags contain 3 clear fuchsia bags, 2 vibrant indigo bags, 4 dotted maroon bags. +posh fuchsia bags contain 3 dull silver bags, 3 mirrored lime bags, 2 dull black bags. +bright magenta bags contain 5 clear violet bags, 1 light red bag, 1 mirrored white bag. +mirrored tomato bags contain 1 dark olive bag, 5 faded maroon bags. +wavy gray bags contain 5 dotted orange bags, 3 muted magenta bags, 2 plaid maroon bags, 4 drab tomato bags. +dim plum bags contain 4 dim salmon bags, 4 light cyan bags, 3 wavy coral bags. +shiny chartreuse bags contain 2 drab plum bags, 2 pale beige bags. +striped gray bags contain 4 muted aqua bags. +faded cyan bags contain 2 muted coral bags. +clear coral bags contain 5 faded white bags, 5 dull coral bags. +dim violet bags contain 2 dark tomato bags, 3 vibrant silver bags, 2 clear maroon bags. +wavy tomato bags contain 1 striped orange bag, 2 posh magenta bags. +drab chartreuse bags contain 4 posh crimson bags, 3 wavy brown bags. +dotted plum bags contain 4 posh crimson bags, 3 dull magenta bags. +striped crimson bags contain 1 wavy coral bag. +faded yellow bags contain 2 faded gray bags. +faded magenta bags contain 4 dotted yellow bags. +bright orange bags contain 5 dark plum bags, 3 plaid white bags, 3 bright chartreuse bags. +drab red bags contain 4 vibrant cyan bags. +wavy white bags contain 4 mirrored lavender bags, 3 muted tomato bags, 3 faded tomato bags, 5 drab cyan bags. +striped salmon bags contain 5 dotted silver bags. +mirrored violet bags contain 3 plaid silver bags, 1 dotted maroon bag, 5 striped gray bags. +pale fuchsia bags contain 2 dark gold bags. +striped silver bags contain 1 faded cyan bag, 2 muted orange bags. +dull brown bags contain 5 dotted chartreuse bags, 4 vibrant red bags, 2 plaid purple bags, 4 shiny fuchsia bags. +dull gold bags contain 1 dull olive bag, 1 clear coral bag, 4 light tomato bags, 4 muted yellow bags. +plaid green bags contain 5 dark bronze bags, 1 muted aqua bag, 4 plaid aqua bags. +dim white bags contain 4 bright red bags, 2 striped teal bags, 2 posh crimson bags. +drab salmon bags contain no other bags. +dull fuchsia bags contain 5 clear crimson bags, 1 pale green bag, 3 vibrant coral bags, 3 plaid salmon bags. +pale lime bags contain 1 plaid magenta bag. +wavy lavender bags contain 4 faded magenta bags, 3 dark yellow bags, 5 plaid aqua bags. +shiny gray bags contain 4 dark teal bags, 1 wavy crimson bag, 4 posh lime bags. +dull bronze bags contain 5 drab tomato bags, 4 pale tan bags. +dotted chartreuse bags contain 2 dark maroon bags, 4 mirrored black bags, 4 light orange bags. +dotted aqua bags contain 2 mirrored maroon bags, 2 mirrored blue bags, 3 dark cyan bags, 4 dotted olive bags. +striped indigo bags contain 4 mirrored gray bags, 5 light tan bags, 4 dotted tan bags. +shiny magenta bags contain 5 dim chartreuse bags, 2 striped olive bags, 5 clear blue bags. +bright lime bags contain 4 drab cyan bags, 4 striped chartreuse bags, 1 dotted yellow bag. +dotted white bags contain 1 clear purple bag, 1 clear teal bag, 1 dotted cyan bag. +dotted red bags contain 3 dark silver bags. +dotted fuchsia bags contain 1 pale orange bag. +pale aqua bags contain 1 dim beige bag, 2 shiny aqua bags, 1 faded gray bag. +dotted tan bags contain 3 muted coral bags, 1 shiny fuchsia bag, 5 wavy tan bags. +light bronze bags contain 1 drab lavender bag, 5 faded red bags, 3 light tan bags, 1 striped white bag. +dim cyan bags contain 1 vibrant brown bag, 3 faded gray bags, 5 striped lime bags, 5 plaid beige bags. +dim silver bags contain 2 striped gray bags, 3 plaid gold bags, 5 striped orange bags. +shiny aqua bags contain 3 dotted tan bags, 4 muted brown bags, 1 mirrored maroon bag. +drab tan bags contain 4 muted brown bags, 1 dotted lavender bag, 2 dull coral bags. +shiny beige bags contain 2 muted blue bags, 3 wavy turquoise bags, 5 plaid silver bags. +muted aqua bags contain 2 mirrored orange bags. +striped beige bags contain 3 muted coral bags, 4 dim gold bags, 1 dim beige bag. +light teal bags contain 3 faded green bags, 5 dark indigo bags, 1 pale gold bag. diff --git a/c/2020/7/main b/c/2020/7/main new file mode 100755 index 0000000..61d5aca Binary files /dev/null and b/c/2020/7/main differ diff --git a/c/2020/7/main.c b/c/2020/7/main.c new file mode 100644 index 0000000..ceb33f6 --- /dev/null +++ b/c/2020/7/main.c @@ -0,0 +1,119 @@ +#include +#include +#include +#include +#include "../lib/util.h" + +#define HASH_INDEX 1024 +#define HASH_LIST_LENGTH 10 +#define NUMBER_RULES 594 + +typedef struct ValidBags { + int hash[HASH_INDEX][HASH_LIST_LENGTH]; + int list[NUMBER_RULES]; + size_t index; +} ValidBags; + +bool valid_bags_contains(ValidBags *valid_bags, unsigned long h) { + int *hash_list = valid_bags->hash[h % HASH_INDEX]; + int index = 0; + while (hash_list[index]) { + if (hash_list[index] == h) return true; + index++; + } + return false; +} + +void valid_bags_add(ValidBags *valid_bags, unsigned long h) { + if (!valid_bags_contains(valid_bags, h)) { + int *hash_list = valid_bags->hash[h % HASH_INDEX]; + int index = 0; + while (hash_list[index]) index++; + hash_list[index] = h; + } +} + +typedef struct BagQuantity { + int number; + unsigned long bag_name_hash; +} BagQuantity; + +typedef struct BagRule { + unsigned long bag_name_hash; + BagQuantity bag_quantities[4]; +} BagRule; + +void print_bag_rule(BagRule *bag_rule) { + printf("%u bags contain ", bag_rule->bag_name_hash); + int bag_quantity_index = 0; + BagQuantity bag_quantity = bag_rule->bag_quantities[bag_quantity_index]; + while (bag_quantity.number) { + printf("%d %u bags, ", bag_quantity.number, bag_quantity.bag_name_hash); + bag_quantity_index++; + bag_quantity = bag_rule->bag_quantities[bag_quantity_index]; + } + printf("\n"); +} + +void parse_bag_rule(char *bag_rule_string, BagRule *bag_rule) { + // "light red bags contain 1 bright white bag, 2 muted yellow bags." + char bag_name_string[30] = {0}; + char *bag_rule_token; + + bag_rule_token = strtok(bag_rule_string, " "); // rule adjective + strcpy(bag_name_string, bag_rule_token); + + bag_rule_token = strtok(NULL, " "); // rule color + strcat(bag_name_string, bag_rule_token); + bag_rule->bag_name_hash = hash(bag_name_string); + + strtok(NULL, " "); // "bags" + strtok(NULL, " "); // "contain" + + size_t bag_quantity_index = 0; + while(bag_rule_token = strtok(NULL, " ")) { // The number is now in the buffer + bag_rule->bag_quantities[bag_quantity_index].number = atoi(bag_rule_token); + // printf("number: %d\n", bag_rule->bag_quantities[bag_quantity_index].number ); + + bag_rule_token = strtok(NULL, " "); // rule adjective + strcpy(bag_name_string, bag_rule_token); + + bag_rule_token = strtok(NULL, " "); // rule color + strcat(bag_name_string, bag_rule_token); + + bag_rule->bag_quantities[bag_quantity_index].bag_name_hash = hash(bag_name_string); + strtok(NULL, " "); // "bag(s)[.,]" + + bag_quantity_index++; + } +} + +int part_1() { + char *data_buffer = load_input(); + char *strtok_ptr = data_buffer; + + ValidBags valid_bags = {0}; + valid_bags_add(&valid_bags, hash("shinygold")); + + BagRule *bag_rule = malloc(sizeof(BagRule)); + + char *rule = strtok_r(data_buffer, "\n", &strtok_ptr); + do { + parse_bag_rule(rule, bag_rule); + valid_bags_add(&valid_bags, bag_rule->bag_name_hash); + // printf("%s\n\n", rule); + } while(rule = strtok_r(NULL, "\n", &strtok_ptr)); + printf("%d %d %d\n", valid_bags.list[0], valid_bags.list[1], valid_bags.index); + + free(data_buffer); + return 0; +} + +int part_2() { + return 0; +} + +int main() { + printf("Part 1: %d\n", part_1()); + printf("Part 2: %d\n", part_2()); +} diff --git a/c/2020/8/input.txt b/c/2020/8/input.txt new file mode 100644 index 0000000..c180282 --- /dev/null +++ b/c/2020/8/input.txt @@ -0,0 +1,654 @@ +acc +45 +nop +631 +acc +12 +acc -10 +jmp +127 +acc +28 +jmp +460 +jmp +619 +acc +15 +jmp +277 +nop +83 +acc +40 +acc +34 +acc +15 +jmp +108 +acc +10 +nop +61 +jmp +485 +jmp +44 +acc +3 +jmp +460 +acc +46 +acc +32 +jmp +12 +acc -1 +jmp +213 +acc +40 +acc +4 +nop +97 +acc +18 +jmp +613 +acc +15 +acc +14 +nop +374 +jmp +487 +jmp +1 +acc -1 +acc +32 +jmp +1 +jmp +418 +acc +10 +acc -9 +jmp +1 +jmp +117 +acc -5 +nop +539 +nop +456 +jmp +191 +acc +16 +jmp +431 +jmp +341 +acc -17 +acc +22 +acc +33 +acc +15 +jmp +152 +nop +277 +jmp +394 +acc -13 +acc +49 +acc -19 +jmp -26 +acc -5 +acc +13 +jmp +49 +acc +37 +acc +49 +nop +420 +acc +38 +jmp +515 +nop +168 +acc +22 +nop +151 +acc +25 +jmp +504 +acc -16 +jmp +73 +acc -6 +acc +40 +acc +9 +jmp +143 +acc +40 +acc -6 +acc +31 +nop +530 +jmp +265 +acc -13 +acc +40 +jmp +312 +acc +36 +jmp -55 +jmp +430 +jmp +551 +acc +10 +acc +18 +nop -25 +jmp +178 +acc +22 +jmp +176 +jmp +462 +acc +22 +acc +23 +acc +3 +acc +0 +jmp +162 +acc +0 +acc +27 +jmp +100 +nop +234 +acc +3 +nop +70 +nop +112 +jmp -62 +acc +8 +jmp +214 +jmp -38 +acc -15 +acc +48 +jmp +289 +nop +6 +nop +523 +jmp +286 +nop -9 +jmp +234 +jmp -74 +acc +33 +acc +14 +nop -11 +jmp -37 +acc +30 +jmp +277 +acc +35 +acc +4 +jmp +96 +acc +26 +nop +256 +acc -14 +jmp +389 +acc -19 +acc -12 +jmp +397 +jmp +477 +nop +141 +acc +21 +acc +16 +nop +29 +jmp +407 +acc +48 +jmp +243 +acc +43 +acc +41 +nop +384 +acc +24 +jmp +180 +jmp +372 +jmp +44 +acc +4 +nop +234 +acc +49 +jmp +343 +acc +0 +jmp -91 +acc -8 +acc +26 +jmp -9 +acc +37 +nop +321 +jmp +143 +jmp +278 +jmp -38 +acc +46 +nop +67 +acc +32 +jmp +445 +nop +143 +acc +35 +acc -19 +acc +33 +jmp +39 +jmp -24 +nop +393 +acc +0 +acc +36 +acc +44 +jmp -134 +acc +31 +acc +37 +acc +5 +acc -1 +jmp +291 +acc +37 +acc +36 +acc -3 +jmp -183 +acc -10 +acc +29 +acc +7 +acc +32 +jmp +205 +acc +38 +acc +20 +jmp +45 +acc +26 +acc +0 +acc +17 +acc +37 +jmp +289 +acc +20 +acc +6 +acc +18 +jmp -50 +acc +41 +acc +50 +jmp +419 +acc +20 +jmp +333 +jmp +250 +acc +35 +acc +13 +jmp -175 +acc -4 +nop +179 +jmp -57 +jmp +243 +acc -6 +acc +23 +nop -149 +jmp +1 +jmp -97 +acc -14 +acc +26 +acc +5 +nop +6 +jmp -223 +acc +12 +nop +115 +acc +38 +jmp -77 +acc +1 +acc +25 +acc +0 +jmp +276 +acc +37 +acc +31 +acc +7 +jmp +201 +acc +16 +acc +39 +acc +24 +jmp +54 +acc +45 +nop -96 +acc +17 +acc -7 +jmp +339 +acc +6 +jmp +317 +acc +12 +acc -1 +acc -4 +acc +14 +jmp +89 +acc +2 +acc +30 +jmp +60 +jmp +239 +acc +25 +acc -9 +jmp +82 +acc +45 +jmp +1 +nop +3 +jmp +1 +jmp +311 +jmp +142 +acc +36 +nop +253 +jmp +341 +acc +26 +acc +32 +acc +30 +jmp -182 +jmp +184 +jmp +331 +acc +6 +jmp -68 +nop -209 +acc +1 +acc +48 +jmp -23 +acc +11 +acc +30 +acc +45 +acc -3 +jmp -238 +jmp +1 +acc +9 +jmp +45 +acc +45 +jmp +1 +acc +44 +acc +29 +jmp -73 +acc -4 +acc +0 +acc +0 +jmp +294 +acc +35 +acc +21 +jmp +309 +nop +316 +acc -13 +jmp +1 +jmp +324 +acc -14 +acc +42 +jmp -99 +nop -103 +acc +16 +jmp -226 +nop +317 +nop +316 +acc -16 +jmp -192 +acc +33 +nop -47 +jmp -305 +jmp -81 +nop -197 +nop +249 +jmp +157 +nop -85 +jmp -246 +acc +8 +acc -14 +acc +20 +jmp -181 +acc +46 +nop +164 +acc +12 +acc -18 +jmp -199 +acc +10 +acc -9 +acc +17 +acc +15 +jmp +134 +acc -17 +acc -3 +jmp +18 +acc +35 +acc -14 +jmp +254 +acc -4 +acc +41 +acc +45 +jmp -346 +acc -18 +acc +41 +acc +48 +acc +27 +jmp -33 +acc -1 +acc -3 +acc +11 +acc -13 +jmp -224 +acc +22 +nop -73 +acc -12 +acc -18 +jmp +213 +jmp +1 +acc +39 +acc +19 +jmp +66 +jmp +126 +acc +37 +acc -17 +acc +17 +jmp -4 +acc -6 +acc +18 +acc +9 +acc -7 +jmp -195 +acc +33 +acc +24 +acc +25 +acc -19 +jmp -340 +acc +40 +acc +10 +acc +23 +jmp -308 +jmp +1 +acc +9 +jmp +1 +nop +104 +jmp +233 +jmp -24 +acc +29 +jmp -367 +acc -15 +jmp +107 +acc +12 +jmp +89 +nop -381 +jmp +1 +acc -2 +nop +233 +jmp +238 +acc +46 +acc -15 +acc +47 +jmp -290 +nop -323 +acc -9 +acc -6 +acc +0 +jmp -315 +acc +21 +nop +196 +acc +24 +acc +18 +jmp -49 +acc +21 +jmp +1 +jmp -47 +acc +49 +nop -120 +jmp -413 +acc +30 +jmp -284 +acc -17 +jmp -212 +nop +39 +nop -87 +acc -18 +jmp -122 +jmp -90 +nop +76 +jmp -277 +acc +34 +acc +49 +jmp +92 +nop +168 +acc -1 +acc +0 +jmp +26 +jmp -270 +jmp +1 +acc +14 +acc +11 +jmp +41 +acc -15 +jmp +144 +jmp +149 +acc +48 +jmp -260 +acc +27 +acc -3 +jmp +105 +acc +47 +acc -10 +jmp -316 +acc -4 +acc +41 +acc -3 +nop -289 +jmp -332 +nop -281 +nop -379 +nop +62 +jmp -456 +acc +34 +acc +23 +jmp +52 +acc +7 +jmp -374 +acc -18 +acc +45 +jmp +53 +acc +29 +nop -407 +acc +34 +jmp +9 +acc +49 +acc -1 +acc -1 +jmp +1 +jmp -55 +acc -3 +acc +5 +jmp -280 +jmp +1 +acc -13 +nop -173 +jmp -131 +acc +5 +acc +34 +jmp +105 +jmp -56 +jmp -485 +acc -14 +nop -389 +acc +13 +acc +27 +jmp -482 +nop -418 +jmp -394 +acc -9 +jmp -435 +acc -14 +nop -172 +acc +43 +jmp -159 +jmp +67 +acc +9 +acc +22 +jmp +15 +nop -405 +jmp -406 +jmp +1 +acc -19 +jmp -118 +acc +49 +jmp -385 +jmp +90 +acc -10 +jmp +10 +acc +8 +nop -315 +acc -14 +jmp -167 +jmp +49 +jmp -49 +jmp -275 +acc -1 +jmp -136 +acc +24 +acc +45 +jmp -259 +acc +2 +nop -370 +acc -18 +acc +4 +jmp -45 +acc +9 +jmp -542 +nop -39 +nop -16 +jmp +66 +acc -1 +nop -59 +acc +23 +acc -8 +jmp -91 +acc +7 +acc +37 +jmp -400 +acc +39 +jmp -162 +nop -346 +acc +5 +acc +50 +jmp -115 +jmp -141 +acc +2 +acc -18 +nop -179 +acc -19 +jmp -306 +acc -10 +acc +30 +jmp -115 +nop -47 +jmp -82 +acc +9 +acc -4 +jmp -139 +acc +18 +acc +16 +jmp -241 +jmp +1 +acc -3 +acc +11 +jmp -309 +acc +3 +acc +0 +acc +40 +jmp +1 +jmp -369 +acc +31 +jmp +1 +acc +35 +jmp -427 +acc +5 +acc -2 +jmp -26 +acc +29 +nop -121 +acc +6 +jmp -86 +nop -294 +jmp -391 +acc +50 +nop -96 +nop -325 +nop -134 +jmp -355 +acc +6 +jmp +1 +jmp -396 +nop -440 +jmp -89 +acc +22 +jmp -437 +acc +41 +acc +8 +acc +29 +jmp -603 +acc -18 +acc +16 +acc +42 +jmp -339 +acc +43 +acc -19 +nop -168 +nop -253 +jmp -198 +jmp -613 +jmp -346 +acc -4 +acc +7 +acc +40 +jmp -294 +jmp -423 +acc -4 +acc +48 +acc +41 +jmp +1 +jmp -49 +acc +4 +acc +28 +acc +9 +acc +38 +jmp -522 +jmp -5 +acc +3 +acc +6 +acc -8 +acc +44 +jmp +1 diff --git a/c/2020/8/main b/c/2020/8/main new file mode 100755 index 0000000..9102f08 Binary files /dev/null and b/c/2020/8/main differ diff --git a/c/2020/8/main.c b/c/2020/8/main.c new file mode 100644 index 0000000..c091210 --- /dev/null +++ b/c/2020/8/main.c @@ -0,0 +1,177 @@ +#include +#include +#include +#include + +#include "../lib/util.h" + +#define NUM_INSTRUCTIONS 654 + +typedef enum InstructionType { + NOP, + ACC, + JMP +} InstructionType; + +typedef struct Instruction { + InstructionType type; + int argument; +} Instruction; + +typedef struct Console { + size_t pc; + int acc; + Instruction program[NUM_INSTRUCTIONS]; + bool visited_instructions[NUM_INSTRUCTIONS]; +} Console; + +void parse_instruction(char *text, Instruction *i) { + switch (*text) { + case 'n': + i->type = NOP; + break; + case 'a': + i->type = ACC; + break; + case 'j': + i->type = JMP; + break; + default: + fprintf(stderr, "FATAL: Illegal instruction %s\n", text); + exit(1); + } + + i->argument = atoi(text + 4); +} + +void console_step(Console *console) { + Instruction i = console->program[console->pc]; + switch(i.type) { + case NOP: + console->pc++; + break; + case ACC: + console->pc++; + console->acc += i.argument; + break; + case JMP: + console->pc += i.argument; + break; + } +} + +void console_print(Console *console) { + printf("PC: %d, acc: %d\n", console->pc, console->acc); +} + +void console_reset(Console *console) { + console->acc = 0; + console->pc = 0; +} + +void console_run_until_loop(Console *console) { + for (int i = 0; i < NUM_INSTRUCTIONS; i++) { + console->visited_instructions[i] = false; + } + + while (!console->visited_instructions[console->pc]) { + console->visited_instructions[console->pc] = true; + console_step(console); + } +} + +// true = overflow +bool console_run_until_loop_or_overflow(Console *console) { + for (int i = 0; i < NUM_INSTRUCTIONS; i++) { + console->visited_instructions[i] = false; + } + + while (!console->visited_instructions[console->pc]) { + console->visited_instructions[console->pc] = true; + console_step(console); + if (console->pc >= NUM_INSTRUCTIONS) return true; + } + + return false; +} + +bool console_is_current_instruction_corrupted(Console *console) { + Instruction i = console->program[console->pc]; + printf("%d\n", i.type); + fflush(stdout); + switch(i.type) { + case NOP: + return console->pc + i.argument > NUM_INSTRUCTIONS - 7; + case ACC: + return false; + case JMP: + return console->pc == NUM_INSTRUCTIONS || console->pc == 648; + } +} + +void console_run_until_corruption(Console *console) { + int corruption_index = 0; + for (int i = 0; i < NUM_INSTRUCTIONS; i++) { + Instruction *inst = &(console->program[i]); + if (inst->type == ACC) continue; + if (inst->type == NOP) { + inst->type = JMP; + if (console_run_until_loop_or_overflow(console)) return; + inst->type = NOP; + console_reset(console); + } else { + inst->type = NOP; + if (console_run_until_loop_or_overflow(console)) return; + inst->type = JMP; + console_reset(console); + } + } +} + +int part_1() { + Console *console = malloc(sizeof(Console)); + console_reset(console); + char *data_buffer = load_input(); + + char *instruction_text = strtok(data_buffer, "\n"); + + do { + Instruction *inst = &(console->program[console->pc++]); + parse_instruction(instruction_text, inst); + } while (instruction_text = strtok(NULL, "\n")); + + console_reset(console); + console_run_until_loop(console); + + int answer = console->acc; + free(console); + free(data_buffer); + return answer; +} + +int part_2() { + Console *console = malloc(sizeof(Console)); + console_reset(console); + char *data_buffer = load_input(); + + char *instruction_text = strtok(data_buffer, "\n"); + + console_reset(console); + do { + Instruction *inst = &(console->program[console->pc++]); + parse_instruction(instruction_text, inst); + } while (instruction_text = strtok(NULL, "\n")); + + console_reset(console); + console_run_until_corruption(console); + + int answer = console->acc; + free(console); + free(data_buffer); + return answer; +} + +int main() { + printf("Part 1: %d\n", part_1()); + printf("Part 2: %d\n", part_2()); +} diff --git a/c/2020/9/input.txt b/c/2020/9/input.txt new file mode 100644 index 0000000..e31938e --- /dev/null +++ b/c/2020/9/input.txt @@ -0,0 +1,1000 @@ +18 +19 +46 +14 +29 +45 +40 +47 +25 +43 +36 +22 +21 +4 +32 +33 +37 +38 +26 +2 +42 +15 +5 +13 +31 +9 +6 +30 +7 +14 +10 +8 +69 +11 +12 +25 +16 +17 +22 +19 +18 +20 +51 +21 +24 +23 +26 +15 +60 +13 +29 +27 +44 +42 +28 +38 +30 +36 +31 +32 +33 +34 +35 +37 +55 +39 +40 +70 +41 +43 +78 +58 +73 +101 +60 +56 +57 +75 +59 +67 +71 +61 +68 +110 +69 +80 +72 +112 +76 +79 +144 +129 +114 +84 +99 +113 +132 +115 +148 +116 +118 +120 +128 +126 +187 +130 +190 +152 +229 +141 +151 +155 +299 +209 +163 +239 +183 +197 +331 +212 +228 +270 +231 +234 +236 +244 +246 +355 +256 +392 +271 +342 +292 +360 +296 +306 +318 +346 +602 +375 +380 +395 +534 +456 +440 +459 +470 +502 +478 +480 +490 +517 +527 +548 +563 +1082 +1136 +896 +1044 +614 +693 +698 +988 +755 +1065 +1352 +835 +899 +915 +942 +929 +1173 +958 +1043 +970 +1007 +1075 +1090 +1529 +1750 +1663 +1307 +1312 +1533 +1369 +1391 +1705 +1590 +1654 +1734 +1764 +1805 +2923 +2649 +1936 +1899 +2633 +1928 +2681 +1977 +3956 +2165 +2981 +2619 +3926 +2676 +2840 +2703 +4292 +4547 +4383 +4628 +3244 +3388 +3539 +6659 +6602 +5143 +3827 +5316 +8558 +3905 +5322 +4142 +4817 +4784 +9069 +5379 +11206 +5516 +7536 +10701 +6242 +7293 +6632 +15190 +11260 +7366 +7732 +7681 +7969 +8959 +9521 +8611 +8047 +10139 +8689 +16605 +8926 +10300 +10163 +10895 +15262 +12148 +13925 +12874 +15025 +13974 +19229 +14313 +15047 +15098 +15335 +15413 +16370 +16016 +16658 +27899 +16736 +18852 +35245 +17615 +19089 +19821 +29984 +23769 +23043 +30309 +31705 +26799 +26848 +35105 +28287 +30382 +42183 +30748 +30433 +31351 +31429 +32386 +32674 +33394 +44635 +34351 +50281 +36704 +60293 +69456 +42864 +49891 +46812 +49842 +53647 +55086 +85047 +119298 +60961 +75099 +62099 +73297 +94916 +61784 +62780 +63815 +75250 +96654 +67745 +104928 +71055 +111242 +133358 +89676 +92706 +151460 +134938 +101898 +158753 +108733 +122831 +122745 +123060 +293691 +126595 +165971 +142995 +125599 +130525 +146305 +194115 +402424 +179788 +138800 +226064 +160731 +182382 +235256 +191574 +194604 +210631 +224643 +269464 +231478 +231564 +245576 +253585 +248659 +252194 +276830 +256124 +411266 +371362 +299531 +354846 +654618 +340519 +330374 +459212 +343113 +695365 +431041 +386178 +402205 +405235 +435274 +456121 +633683 +504783 +477140 +586095 +701736 +500853 +508318 +654377 +555655 +640050 +741024 +642644 +673487 +1288060 +802325 +716552 +729291 +1497690 +1073685 +1273733 +821452 +807440 +891395 +912414 +933261 +977993 +1117190 +1140903 +1210054 +1009171 +1143497 +1063973 +1445843 +1195705 +1282694 +2428963 +1316131 +1390039 +1518877 +2095183 +2337706 +1536731 +1628892 +1698835 +2076758 +1712847 +1803809 +1824656 +1845675 +2962865 +1987164 +2073144 +2150074 +2152668 +2204876 +2207470 +2981529 +2478399 +3128369 +2908916 +4192040 +2706170 +2926770 +3055608 +3790973 +3165623 +3235566 +3327727 +3502644 +5835686 +3516656 +3628465 +3670331 +7131109 +5941736 +5116386 +4278020 +4913640 +4412346 +5186405 +4685869 +7293617 +5834539 +5615086 +6383335 +5632940 +9001309 +5982378 +6221231 +6401189 +6493350 +6563293 +6830371 +8188513 +7145121 +10907100 +10354082 +7948351 +11998421 +8690366 +9528732 +8963889 +15987022 +10318809 +9872274 +13376235 +16136864 +11248026 +12016275 +14983687 +17469257 +12203609 +12383567 +26433146 +12894539 +13056643 +13393664 +13975492 +15093472 +26270774 +16638717 +16912240 +18492621 +17654255 +22066601 +25440210 +18836163 +20191083 +21120300 +23264301 +26870031 +33085622 +23451635 +24399842 +24587176 +25098148 +51578243 +35095792 +34176943 +37980840 +35460265 +27369156 +29068964 +37160073 +33550957 +36146876 +62568016 +47164749 +41311383 +44778259 +45631293 +39027246 +52333265 +55938995 +48549783 +50321666 +77431413 +47851477 +48987018 +65898559 +52467304 +83311625 +68646749 +74487511 +69011222 +80925135 +76187319 +62619921 +115214565 +167547830 +136864130 +91943008 +131266670 +80338629 +83805505 +86878723 +87577029 +100184742 +117561005 +139346027 +116498226 +96838495 +129912153 +101454322 +115087225 +213051449 +150674830 +246410379 +154562929 +216668887 +138807240 +195425854 +142958550 +164144134 +267732572 +167217352 +167915658 +170684228 +185259827 +171382534 +244412872 +184415524 +265598456 +198292817 +211925720 +213336721 +334233094 +216541547 +240261562 +253894465 +369675351 +281765790 +335133010 +323222764 +505860018 +328218377 +354884270 +307102684 +331361486 +337901580 +379143072 +338599886 +342066762 +456803109 +355798058 +382708341 +594634061 +410218537 +536559485 +425262441 +429878268 +547903033 +523644231 +535660255 +585255951 +753480818 +588868474 +630325448 +662900742 +788164595 +635321061 +638464170 +645004264 +669263066 +734941130 +680666648 +694397944 +1055587889 +1363661010 +738506399 +792926878 +945878792 +1277125049 +1108900182 +1357298686 +1298221803 +776203571 +1275329712 +1124528729 +1174124425 +1343567390 +1219193922 +1310992096 +1759849790 +1527868008 +1428247939 +1283468434 +1314267330 +1349929714 +1375064592 +1917455607 +2517415725 +1531433277 +1514709970 +2328094104 +2959681216 +1722082363 +2811336442 +1885103753 +1900732300 +2126133285 +1950327996 +2884378519 +2552776668 +2549189017 +2502662356 +2530186018 +2594460530 +2633398148 +2597735764 +2658533026 +5542911545 +2664197044 +2724994306 +4032125695 +3046143247 +4048849002 +3236792333 +3399813723 +3607186116 +6636606056 +3622814663 +6048128775 +6109848472 +3851060296 +4076461281 +7094992249 +5032848374 +5051851373 +5079375035 +5097122886 +5124646548 +5192196294 +5231133912 +6843978449 +5322730070 +5771137553 +7268918028 +7448662725 +6445956970 +7122604528 +6859606996 +7006999839 +7022628386 +10068771633 +14029628225 +7473874959 +10514926364 +13866606835 +7927521577 +9109309655 +10084699747 +12705008871 +12219727414 +10176497921 +10316842842 +10355780460 +12253762298 +10553863982 +19522680326 +21340481794 +12630744549 +13305563966 +13452956809 +13468585356 +13882235382 +14480874798 +14934521416 +17199126307 +19663173637 +15401396536 +16583184614 +17036831232 +23021851713 +18104019498 +32584894296 +24022449338 +37475406147 +30076544308 +20672623302 +37709454534 +20909644442 +22807626280 +23184608531 +25936308515 +26083701358 +27187799348 +28240085382 +26921542165 +28403106772 +28363110180 +29415396214 +46507126270 +48026283817 +35140850730 +40058682945 +41059280570 +43480249582 +43694475015 +38776642800 +49268309889 +46993345800 +41582267744 +43717270722 +55590906120 +49272754622 +44094252973 +71720334964 +49120917046 +92815392061 +53005243523 +54109341513 +91506533399 +55284652345 +79835923370 +104405569391 +76408742014 +91720758832 +73917493530 +78835325745 +85769988600 +80358910544 +140841675878 +124053385559 +113302602708 +120126012736 +85299538466 +123190248152 +142088146683 +125529659060 +93367007595 +236492850860 +107114585036 +102126160569 +108289895868 +130518083527 +174235354249 +165424026929 +140584190811 +170556084577 +150326235544 +161708280480 +192137928453 +180961486314 +205425551202 +166128899144 +165658449010 +178666546061 +200481592631 +233951198406 +307551711771 +187425699035 +306713089955 +201656903463 +195493168164 +209240745605 +366092245096 +238807979395 +210416056437 +366610491775 +302292471291 +290910426355 +374535389217 +311140275388 +312034516024 +331787348154 +327366729490 +402138496094 +344324995071 +344795445205 +353084148045 +387907291666 +374159714225 +491392018986 +434301147559 +382918867199 +389082602498 +503949374754 +397150071627 +715274021156 +419656802042 +449224035832 +512708527728 +612554552531 +593202897646 +776673885311 +685675664605 +623174791412 +638507004878 +736003015244 +659154077644 +886868241953 +733878047703 +763981797113 +1269787109152 +750234219672 +763242316723 +1248711542972 +780068938826 +1048236680142 +1862990006798 +1418575943704 +1620746289656 +2003665156855 +2198644882530 +868880837874 +2005790124396 +1205757450177 +1216377689058 +1297661082522 +1324182669483 +3868780131194 +1261681796290 +1372385052581 +1393032125347 +1409388297316 +1497120364426 +1484112267375 +1513476536395 +1530303158498 +1543311255549 +1632123154597 +1648949776700 +1828305618968 +2532348947517 +2241265890455 +2946610859222 +2074638288051 +2193063507357 +2517830614574 +2085258526932 +2422135139235 +2585864465773 +2514038771580 +2654713921637 +2893804950887 +2634066848871 +2745794063665 +2765417177928 +4424108109385 +2893500564691 +2981232631801 +7009972575158 +3043779694893 +3073614414047 +3175434410146 +6249048824193 +4606987235568 +4250440758203 +4827130356228 +4159896814983 +7588219867369 +4599297298512 +7672911712559 +4507393666167 +10418705776224 +5076849060872 +5099903237353 +5689473181726 +5527871799758 +5399484026799 +14682884287717 +5511211241593 +5658917742619 +7497722523432 +5874733196492 +6025012326694 +6117394108940 +7425875168349 +7233511229030 +7335331225129 +8410337573186 +9327289819075 +10127169098270 +8987027171211 +12734815251928 +19190277953884 +9906877692966 +22180606811149 +9584242727039 +12825359195148 +10176752298225 +15596350874692 +10910695268392 +11170128984212 +11058401769418 +11385944438085 +11533650939111 +11683930069313 +14435349899880 +13210064421621 +28298000920089 +13350905337970 +21660820037381 +16560801048105 +16919573952168 +20713234257160 +18314316990286 +18571269898250 +24120759690013 +19491120420005 +19760995025264 +20083629991191 +20494937995431 +20642644496457 +29372718759704 +21235154067643 +31146939463349 +31469574429276 +39831651859200 +31553339764849 +23069874507398 +26560969759591 +45904924329156 +50681729449604 +32842025757975 +30270479290138 +31665222328256 +33480375000273 +34875118038391 +55785982018269 +40255933020695 +36885586888536 +38062390318255 +39252115445269 +39844625016455 +40403639521721 +47055907755022 +67698552251479 +41877798564100 +53340353797536 +59297544385898 +49630844266989 +54539448936674 +62321989952667 +54623214272247 +83941494643558 +72686650774430 +63112505048113 +113794234497717 +123786119660013 +68355493038664 +88215471835927 +98549659831167 +71760704926927 diff --git a/c/2020/9/main b/c/2020/9/main new file mode 100755 index 0000000..df89845 Binary files /dev/null and b/c/2020/9/main differ diff --git a/c/2020/9/main.c b/c/2020/9/main.c new file mode 100644 index 0000000..9e97e46 --- /dev/null +++ b/c/2020/9/main.c @@ -0,0 +1,82 @@ +#include +#include +#include +#include "../lib/util.h" + +#define PREAMBLE_LENGTH 25 +#define MESSAGE_LENGTH 1000 + +bool has_valid_sum(unsigned long long message[MESSAGE_LENGTH], size_t index, unsigned long long number) { + for (size_t x = index - PREAMBLE_LENGTH; x < index; x++) { + for (size_t y = x + 1; y < index; y++) { + if (message[x] + message[y] == number) { + return true; + } + } + } + return false; +} + +int part_1() { + char *data_buffer = load_input(); + unsigned long long message[MESSAGE_LENGTH] = {0}; + size_t index = 0; + + char *number_text = strtok(data_buffer, "\n"); + unsigned long long number; + do { + number = atoll(number_text); + if (index >= PREAMBLE_LENGTH && !has_valid_sum(message, index, number)) { + break; + } else { + message[index++] = number; + } + } while (number_text = strtok(NULL, "\n")); + message[index] = number; + + free(data_buffer); + return number; +} + +int part_2() { + char *data_buffer = load_input(); + unsigned long long message[MESSAGE_LENGTH] = {0}; + size_t index = 0; + + char *number_text = strtok(data_buffer, "\n"); + unsigned long long number; + do { + number = atoll(number_text); + if (index >= PREAMBLE_LENGTH && !has_valid_sum(message, index, number)) { + break; + } else { + message[index++] = number; + } + } while (number_text = strtok(NULL, "\n")); + message[index] = number; + + unsigned long long sum; + int highest, lowest; + for (int x = 0; x < index - 1; x++) { + sum = 0; + highest = 0; + lowest = number; + bool just_right = false; + + for (int y = x; y < index - 1; y++) { + if (message[y] > highest) highest = message[y]; + if (message[y] < lowest) lowest = message[y]; + sum += message[y]; + if (sum >= number) break; + } + if (sum == number) break; + } + + free(data_buffer); + return lowest + highest; +} + +int main() { + printf("Part 1: %d\n", part_1()); + printf("Part 2: %d\n", part_2()); +} diff --git a/c/2020/lib/util.c b/c/2020/lib/util.c new file mode 100644 index 0000000..6d11f2b --- /dev/null +++ b/c/2020/lib/util.c @@ -0,0 +1,56 @@ +#include +#include + +char *load_input() { + FILE *fp = fopen("input.txt", "r"); + fseek(fp, 0L, SEEK_END); + int sz = ftell(fp); + rewind(fp); + char *data_buffer = malloc((sz + 1) * sizeof(char)); + fread(data_buffer, sz, 1, fp); + data_buffer[sz] = 0; + fclose(fp); + return data_buffer; +} + +InputWithSize *load_input_with_size() { + FILE *fp = fopen("input.txt", "r"); + fseek(fp, 0L, SEEK_END); + int sz = ftell(fp); + rewind(fp); + char *data_buffer = malloc((sz + 1) * sizeof(char)); + fread(data_buffer, sz, 1, fp); + data_buffer[sz] = 0; + fclose(fp); + + InputWithSize *input_with_size = malloc(sizeof(InputWithSize)); + input_with_size->size = sz + 1; + input_with_size->data_buffer = data_buffer; + + return input_with_size; +} + +void free_input_with_size(InputWithSize *input_with_size) { + free(input_with_size -> data_buffer); + free(input_with_size); +} + +void print_binary(int q) { + char c[33] = {0}; + for (int i = 0; i < 32; i++) { + c[i] = q & (1<= program.length + end +end + +input = STDIN.read.chomp +instructions = input.split("\n") +computer = Assembunny.new(instructions) +computer.execute_current_instruction until computer.halts? + +part_1 = computer.a + +puts "Part 1: #{part_1}" + +computer = Assembunny.new(instructions) +computer.c = 1 + +computer.execute_current_instruction until computer.halts? + +part_2 = computer.a + +puts "Part 2: #{part_2}" diff --git a/ruby/2016/13/problem.rb b/ruby/2016/13/problem.rb new file mode 100644 index 0000000..ad11a57 --- /dev/null +++ b/ruby/2016/13/problem.rb @@ -0,0 +1,14 @@ +def wall?(x, y, input) + num = input + ((x*x) + (3*x) + (2*x*y) + y + (y*y)) + num.to_s(2).split("").map(&:to_i).reject(&:zero?).count.odd? +end + +input = STDIN.read.chomp.to_i + +x = (0..80).map do |y| + (0..80).map do |x| + wall?(x, y, input) ? "#" : "." + end.join("") +end.join("\n") + +puts x diff --git a/ruby/2016/9/problem.rb b/ruby/2016/9/problem.rb new file mode 100644 index 0000000..4be523b --- /dev/null +++ b/ruby/2016/9/problem.rb @@ -0,0 +1,50 @@ +def decompress(string) + decompressed = "" + compressed = string.clone + + until compressed.empty? do + if compressed[0] == "(" + end_index = compressed =~ /\)/ + marker = compressed[1..(end_index - 1)] + + num_chars, repeat = marker.split("x").map(&:to_i) + compressed = compressed[(end_index + 1)..] + chars = compressed[...num_chars] + repeat.times { decompressed << chars } + compressed = compressed[num_chars..] + else + decompressed << compressed[0] + compressed = compressed[1..] + end + end + + decompressed +end + +def decompressed_length(string) + decompressed = 0 + compressed = string.clone + + until compressed.empty? do + if compressed[0] == "(" + end_index = compressed =~ /\)/ + marker = compressed[1..(end_index - 1)] + + num_chars, repeat = marker.split("x").map(&:to_i) + compressed = compressed[(end_index + 1)..] + chars = compressed[...num_chars] + repeat.times { decompressed << chars } + compressed = compressed[num_chars..] + else + decompressed << compressed[0] + compressed = compressed[1..] + end + end + + decompressed +end + +input = STDIN.read.chomp +part_1 = decompress(input).length + +puts "Part 1: #{part_1}" diff --git a/ruby/2017/3/problem.rb b/ruby/2017/3/problem.rb new file mode 100644 index 0000000..926c132 --- /dev/null +++ b/ruby/2017/3/problem.rb @@ -0,0 +1,37 @@ +class Integer + def layer + ((Math.sqrt(self).ceil) / 2) + 1 + end + + def layer_first_corner + (((self - 1) * 2) - 1)**2 + end + + def layer_length + (self - 1) << 3 + end + + def layer_side_length + layer_length >> 2 + end + + def layer_last_corner + (self + 1).layer_first_corner + end + + def layer_middles + (0..3).map { |n| layer_first_corner + (layer_side_length >> 1) * ((2 * n) + 1) } + end + + def layer_middles_offsets + layer.layer_middles.map { |middle| (middle - self).abs } + end + + def distance + layer + layer_middles_offsets.min - 1 + end +end + +n = STDIN.read.chomp.to_i +part_1 = n.distance +puts "Part 1: #{part_1}" diff --git a/ruby/2017/4/problem.rb b/ruby/2017/4/problem.rb new file mode 100644 index 0000000..226faee --- /dev/null +++ b/ruby/2017/4/problem.rb @@ -0,0 +1,26 @@ +class Passphrase + attr_reader :words + def initialize(words) + @words = words + end + + def self.for(string) + new string.split + end + + def valid? + words.group_by{ |x| x }.values.map(&:length).none? { |group_length| group_length > 1 } + end + + def more_valid? + words.map{|word| word.split("").sort.join("") }.group_by{ |x| x }.values.map(&:length).none? { |group_length| group_length > 1 } + end +end + +passphrase_list = STDIN.read.chomp.split("\n").map { |line| Passphrase.for line } + +part_1 = passphrase_list.select(&:valid?).length +puts "Part 1: #{part_1}" + +part_2 = passphrase_list.select(&:more_valid?).length +puts "Part 2: #{part_2}" diff --git a/ruby/2017/5/problem.rb b/ruby/2017/5/problem.rb new file mode 100644 index 0000000..e4c6674 --- /dev/null +++ b/ruby/2017/5/problem.rb @@ -0,0 +1,48 @@ +class CPU + attr_reader :jumps, :steps + attr_accessor :stranger_jumps + + def initialize(jumps) + @jumps = jumps + @pc = 0 + @steps = 0 + end + + def self.for(string) + new string.split.map(&:to_i) + end + + def step! + @steps += 1 + if stranger_jumps && jumps[@pc] >= 3 + jumps[@pc] -= 1 + @pc += jumps[@pc] + 1 + else + jumps[@pc] += 1 + @pc += jumps[@pc] - 1 + end + end + + def run! + step! until done_running? + end + + def done_running? + @pc < 0 || @pc >= jumps.length + end +end + +jump_string = STDIN.read.chomp + +cpu = CPU.for jump_string +cpu_2 = CPU.new cpu.jumps.clone +cpu.run! + +part_1 = cpu.steps +puts "Part 1: #{part_1}" + +cpu_2.stranger_jumps = true +cpu_2.run! + +part_2 = cpu_2.steps +puts "Part 2: #{part_2}" diff --git a/ruby/2019/1/main.rb b/ruby/2019/1/main.rb new file mode 100644 index 0000000..73d0afa --- /dev/null +++ b/ruby/2019/1/main.rb @@ -0,0 +1,46 @@ +class Module + attr_reader :mass + def initialize(mass) + @mass = mass + end + + def fuel_required + (mass / 3) - 2 + end + + def self.for(string) + new(string.to_i) + end +end + +class Modules + attr_reader :modules + def initialize(modules) + @modules = modules + end + + def self.from_file(filename, module_type) + new(File.read(filename).split.map{ |mass| module_type.for mass }) + end + + def total_fuel_required + @modules.map(&:fuel_required).sum + end +end + +class HeavyFuelModule < Module + def fuel_required + super + Fuel.new(super).fuel_required + end +end + +class Fuel < Module + def fuel_required + return 0 if super < 0 + + super + Fuel.new(super).fuel_required + end +end + +puts "Part 1: #{Modules.from_file("../data/2019/1/input.txt", Module).total_fuel_required}" +puts "Part 2: #{Modules.from_file("../data/2019/1/input.txt", HeavyFuelModule).total_fuel_required}" diff --git a/ruby/2019/2/main.rb b/ruby/2019/2/main.rb new file mode 100644 index 0000000..eda0365 --- /dev/null +++ b/ruby/2019/2/main.rb @@ -0,0 +1,92 @@ +class Computer + attr_reader :data + def initialize(data) + @data = data + @program_counter = 0 + @halted = true + end + + def run + @halted = false + while !@halted + instruction_range = data[@program_counter..(@program_counter + 3)] + opcode = OpCode.for(self, *instruction_range) + opcode.execute + @program_counter += 4 + end + end + + def read(index) + data[index] + end + + def write(index, value) + data[index] = value + end + + def halt + @halted = true + end + + def self.from_string(string) + new(string.split(",").map(&:to_i)) + end + + def self.from_file(file_path) + from_string(File.read file_path) + end +end + +class OpCode + attr_reader :computer + def initialize(computer) + @computer = computer + end + + def self.for(computer, *args) + case args[0] + when 1 + OpCode1.new(computer, *args[1..]) + when 2 + OpCode2.new(computer, *args[1..]) + when 99 + OpCode99.new(computer) + end + end +end + +class OpCode1 < OpCode + attr_reader :destination, :first_position, :second_position + def initialize(computer, arg1, arg2, arg3) + super(computer) + @first_position = arg1 + @second_position = arg2 + @destination = arg3 + end + + def value_to_write + computer.read(first_position) + computer.read(second_position) + end + + def execute + computer.write destination, value_to_write + end +end + +class OpCode2 < OpCode1 + def value_to_write + computer.read(first_position) * computer.read(second_position) + end +end + +class OpCode99 < OpCode + def execute + computer.halt + end +end + +c = Computer.from_file("../data/2019/2/input.txt") +c.write(1, 12) +c.write(2, 2) +c.run +puts "Part 1: #{c.read(0)}" diff --git a/ruby/2025/1/problem.rb b/ruby/2025/1/problem.rb new file mode 100644 index 0000000..e69de29 diff --git a/rust/2022/1/problem.rs b/rust/2022/1/problem.rs new file mode 100644 index 0000000..5fa5b75 --- /dev/null +++ b/rust/2022/1/problem.rs @@ -0,0 +1,210 @@ +extern crate aoc_2022 +use aoc_2022::{sum_lines, DailyProblem}; +use std::iter::Iterator; +use std::str::{FromStr, Lines}; + +pub struct RucksackReorganization; + +impl DailyProblem for RucksackReorganization { + fn name(&self) -> &str { + "Day 3: Rucksack Reorganization" + } + fn index(&self) -> u8 { + 3 + } + fn solutions(&self, input: &str) -> (String, String) { + ( + sum_lines(input, calculate_priority).to_string(), + ElfGroupIter(input.lines()) + .map(|eg| eg.priority().unwrap()) + .sum::() + .to_string(), + ) + } +} + +fn calculate_priority(line: &str) -> u32 { + Rucksack::from_str(line).unwrap().priority().unwrap() +} + +struct ElfGroupIter<'a>(Lines<'a>); + +impl Iterator for ElfGroupIter<'_> { + type Item = ElfGroup; + + fn next(&mut self) -> Option { + match self.0.next() { + Some(a) => match self.0.next() { + Some(b) => self + .0 + .next() + .map(|c| ElfGroup(a.to_string(), b.to_string(), c.to_string())), + + None => None, + }, + None => None, + } + } +} + +fn common_chars(s1: &str, s2: &str) -> String { + let mut chars = vec![]; + for c in s1.chars() { + if s2.contains(&(c.to_string())) { + chars.push(c); + } + } + chars.iter().collect() +} + +struct ElfGroup(String, String, String); + +impl ElfGroup { + fn badge_letter(&self) -> Option { + let badge_candidates = common_chars(&common_chars(&self.0, &self.1), &self.2); + match badge_candidates.len() { + 0 => None, + _ => Some(badge_candidates.chars().next().unwrap()), + } + } + fn priority(&self) -> Result { + match self.badge_letter() { + Some(letter) => letter_priority(letter), + None => Err(format!( + "Common letter not found in {}, {}, and {}", + self.0, self.1, self.2 + )), + } + } +} + +struct Rucksack(String, String, String); + +impl FromStr for Rucksack { + type Err = (); + + fn from_str(input: &str) -> Result { + match input.len() % 2 == 1 { + true => Err(()), + false => Ok(Self( + input.to_string(), + input[..(input.len() / 2)].to_string(), + input[(input.len() / 2)..].to_string(), + )), + } + } +} + +fn letter_priority(input_char: char) -> Result { + let input = input_char as u32; + if input > 64 && input < 91 { + Ok(input - (65 - 27)) + } else if input > 96 && input < 123 { + Ok(input - 96) + } else { + Err(format!( + "No priority for input char {}({})", + input_char, input + )) + } +} + +impl Rucksack { + fn common_letter_between_pockets(&self) -> Option { + self.1.chars().find(|c| self.2.contains(&(c.to_string()))) + } + + fn priority(&self) -> Result { + match self.common_letter_between_pockets() { + Some(letter) => letter_priority(letter), + None => Err(format!( + "Common letter not found in {} and {}", + self.0, self.1 + )), + } + } +} + +#[cfg(test)] +mod tests { + use std::str::FromStr; + #[test] + fn common_letter_between_pockets() { + assert_eq!( + super::Rucksack::from_str("vJrwpWtwJgWrhcsFMMfFFhFp") + .unwrap() + .common_letter_between_pockets() + .unwrap(), + 'p' + ); + assert_eq!( + super::Rucksack::from_str("jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL") + .unwrap() + .common_letter_between_pockets() + .unwrap(), + 'L' + ); + assert_eq!( + super::Rucksack::from_str("PmmdzqPrVvPwwTWBwg") + .unwrap() + .common_letter_between_pockets() + .unwrap(), + 'P' + ); + assert_eq!( + super::Rucksack::from_str("wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn") + .unwrap() + .common_letter_between_pockets() + .unwrap(), + 'v' + ); + assert_eq!( + super::Rucksack::from_str("ttgJtRGJQctTZtZT") + .unwrap() + .common_letter_between_pockets() + .unwrap(), + 't' + ); + assert_eq!( + super::Rucksack::from_str("CrZsJsPPZsGzwwsLwLmpwMDw") + .unwrap() + .common_letter_between_pockets() + .unwrap(), + 's' + ); + } + + #[test] + fn letter_priority() { + assert_eq!(super::letter_priority('p').unwrap(), 16); + assert_eq!(super::letter_priority('L').unwrap(), 38); + assert_eq!(super::letter_priority('P').unwrap(), 42); + assert_eq!(super::letter_priority('v').unwrap(), 22); + assert_eq!(super::letter_priority('t').unwrap(), 20); + assert_eq!(super::letter_priority('s').unwrap(), 19); + } + + #[test] + fn badge_letter() { + assert_eq!( + super::ElfGroup( + "vJrwpWtwJgWrhcsFMMfFFhFp".to_string(), + "jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL".to_string(), + "PmmdzqPrVvPwwTWBwg".to_string() + ) + .badge_letter() + .unwrap(), + 'r' + ); + assert_eq!( + super::ElfGroup( + "wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn".to_string(), + "ttgJtRGJQctTZtZT".to_string(), + "CrZsJsPPZsGzwwsLwLmpwMDw".to_string() + ) + .badge_letter() + .unwrap(), + 'Z' + ); + } +} diff --git a/rust/2022/1/rucksack_reorganization.rs b/rust/2022/1/rucksack_reorganization.rs new file mode 100644 index 0000000..f45e7e3 --- /dev/null +++ b/rust/2022/1/rucksack_reorganization.rs @@ -0,0 +1,209 @@ +use aoc_2022::{sum_lines, DailyProblem}; +use std::iter::Iterator; +use std::str::{FromStr, Lines}; + +pub struct RucksackReorganization; + +impl DailyProblem for RucksackReorganization { + fn name(&self) -> &str { + "Day 3: Rucksack Reorganization" + } + fn index(&self) -> u8 { + 3 + } + fn solutions(&self, input: &str) -> (String, String) { + ( + sum_lines(input, calculate_priority).to_string(), + ElfGroupIter(input.lines()) + .map(|eg| eg.priority().unwrap()) + .sum::() + .to_string(), + ) + } +} + +fn calculate_priority(line: &str) -> u32 { + Rucksack::from_str(line).unwrap().priority().unwrap() +} + +struct ElfGroupIter<'a>(Lines<'a>); + +impl Iterator for ElfGroupIter<'_> { + type Item = ElfGroup; + + fn next(&mut self) -> Option { + match self.0.next() { + Some(a) => match self.0.next() { + Some(b) => self + .0 + .next() + .map(|c| ElfGroup(a.to_string(), b.to_string(), c.to_string())), + + None => None, + }, + None => None, + } + } +} + +fn common_chars(s1: &str, s2: &str) -> String { + let mut chars = vec![]; + for c in s1.chars() { + if s2.contains(&(c.to_string())) { + chars.push(c); + } + } + chars.iter().collect() +} + +struct ElfGroup(String, String, String); + +impl ElfGroup { + fn badge_letter(&self) -> Option { + let badge_candidates = common_chars(&common_chars(&self.0, &self.1), &self.2); + match badge_candidates.len() { + 0 => None, + _ => Some(badge_candidates.chars().next().unwrap()), + } + } + fn priority(&self) -> Result { + match self.badge_letter() { + Some(letter) => letter_priority(letter), + None => Err(format!( + "Common letter not found in {}, {}, and {}", + self.0, self.1, self.2 + )), + } + } +} + +struct Rucksack(String, String, String); + +impl FromStr for Rucksack { + type Err = (); + + fn from_str(input: &str) -> Result { + match input.len() % 2 == 1 { + true => Err(()), + false => Ok(Self( + input.to_string(), + input[..(input.len() / 2)].to_string(), + input[(input.len() / 2)..].to_string(), + )), + } + } +} + +fn letter_priority(input_char: char) -> Result { + let input = input_char as u32; + if input > 64 && input < 91 { + Ok(input - (65 - 27)) + } else if input > 96 && input < 123 { + Ok(input - 96) + } else { + Err(format!( + "No priority for input char {}({})", + input_char, input + )) + } +} + +impl Rucksack { + fn common_letter_between_pockets(&self) -> Option { + self.1.chars().find(|c| self.2.contains(&(c.to_string()))) + } + + fn priority(&self) -> Result { + match self.common_letter_between_pockets() { + Some(letter) => letter_priority(letter), + None => Err(format!( + "Common letter not found in {} and {}", + self.0, self.1 + )), + } + } +} + +#[cfg(test)] +mod tests { + use std::str::FromStr; + #[test] + fn common_letter_between_pockets() { + assert_eq!( + super::Rucksack::from_str("vJrwpWtwJgWrhcsFMMfFFhFp") + .unwrap() + .common_letter_between_pockets() + .unwrap(), + 'p' + ); + assert_eq!( + super::Rucksack::from_str("jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL") + .unwrap() + .common_letter_between_pockets() + .unwrap(), + 'L' + ); + assert_eq!( + super::Rucksack::from_str("PmmdzqPrVvPwwTWBwg") + .unwrap() + .common_letter_between_pockets() + .unwrap(), + 'P' + ); + assert_eq!( + super::Rucksack::from_str("wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn") + .unwrap() + .common_letter_between_pockets() + .unwrap(), + 'v' + ); + assert_eq!( + super::Rucksack::from_str("ttgJtRGJQctTZtZT") + .unwrap() + .common_letter_between_pockets() + .unwrap(), + 't' + ); + assert_eq!( + super::Rucksack::from_str("CrZsJsPPZsGzwwsLwLmpwMDw") + .unwrap() + .common_letter_between_pockets() + .unwrap(), + 's' + ); + } + + #[test] + fn letter_priority() { + assert_eq!(super::letter_priority('p').unwrap(), 16); + assert_eq!(super::letter_priority('L').unwrap(), 38); + assert_eq!(super::letter_priority('P').unwrap(), 42); + assert_eq!(super::letter_priority('v').unwrap(), 22); + assert_eq!(super::letter_priority('t').unwrap(), 20); + assert_eq!(super::letter_priority('s').unwrap(), 19); + } + + #[test] + fn badge_letter() { + assert_eq!( + super::ElfGroup( + "vJrwpWtwJgWrhcsFMMfFFhFp".to_string(), + "jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL".to_string(), + "PmmdzqPrVvPwwTWBwg".to_string() + ) + .badge_letter() + .unwrap(), + 'r' + ); + assert_eq!( + super::ElfGroup( + "wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn".to_string(), + "ttgJtRGJQctTZtZT".to_string(), + "CrZsJsPPZsGzwwsLwLmpwMDw".to_string() + ) + .badge_letter() + .unwrap(), + 'Z' + ); + } +}