From 5453166f0e40b26c62cc8ee0fb5abcb0bb4446c5 Mon Sep 17 00:00:00 2001 From: Bill Rossi Date: Sun, 30 Nov 2025 21:22:21 -0500 Subject: [PATCH] Cool --- c/2018/1/problem_01.c | 48 + c/2018/2/problem_02.c | 100 ++ c/2018/3/problem_03.c | 83 + c/2018/4/problem_04.c | 210 +++ c/2018/5/problem_05.c | 89 + c/2018/6/problem_06.c | 83 + c/2018/7/problem_07.c | 79 + c/2020/1/input.txt | 200 +++ c/2020/1/main | Bin 0 -> 16664 bytes c/2020/1/main.c | 107 ++ c/2020/10/input.txt | 99 ++ c/2020/10/main | Bin 0 -> 16808 bytes c/2020/10/main.c | 71 + c/2020/2/input.txt | 1000 +++++++++++ c/2020/2/main | Bin 0 -> 16816 bytes c/2020/2/main.c | 72 + c/2020/3/input.txt | 323 ++++ c/2020/3/main | Bin 0 -> 16680 bytes c/2020/3/main.c | 54 + c/2020/4/input.txt | 1159 +++++++++++++ c/2020/4/main | Bin 0 -> 17088 bytes c/2020/4/main.c | 225 +++ c/2020/5/input.txt | 814 +++++++++ c/2020/5/main | Bin 0 -> 16648 bytes c/2020/5/main.c | 54 + c/2020/6/input.txt | 2190 ++++++++++++++++++++++++ c/2020/6/main | Bin 0 -> 16664 bytes c/2020/6/main.c | 89 + c/2020/7/input.txt | 594 +++++++ c/2020/7/main | Bin 0 -> 17176 bytes c/2020/7/main.c | 119 ++ c/2020/8/input.txt | 654 +++++++ c/2020/8/main | Bin 0 -> 17360 bytes c/2020/8/main.c | 177 ++ c/2020/9/input.txt | 1000 +++++++++++ c/2020/9/main | Bin 0 -> 16800 bytes c/2020/9/main.c | 82 + c/2020/lib/util.c | 56 + c/2020/lib/util.h | 12 + ruby/2015/21/problem.rb | 59 + ruby/2016/10/problem.rb | 136 ++ ruby/2016/11/problem.rb | 247 +++ ruby/2016/12/problem.rb | 78 + ruby/2016/13/problem.rb | 14 + ruby/2016/9/problem.rb | 50 + ruby/2017/3/problem.rb | 37 + ruby/2017/4/problem.rb | 26 + ruby/2017/5/problem.rb | 48 + ruby/2019/1/main.rb | 46 + ruby/2019/2/main.rb | 92 + ruby/2025/1/problem.rb | 0 rust/2022/1/problem.rs | 210 +++ rust/2022/1/rucksack_reorganization.rs | 209 +++ 53 files changed, 11095 insertions(+) create mode 100644 c/2018/1/problem_01.c create mode 100644 c/2018/2/problem_02.c create mode 100644 c/2018/3/problem_03.c create mode 100644 c/2018/4/problem_04.c create mode 100644 c/2018/5/problem_05.c create mode 100644 c/2018/6/problem_06.c create mode 100644 c/2018/7/problem_07.c create mode 100644 c/2020/1/input.txt create mode 100755 c/2020/1/main create mode 100644 c/2020/1/main.c create mode 100644 c/2020/10/input.txt create mode 100755 c/2020/10/main create mode 100644 c/2020/10/main.c create mode 100644 c/2020/2/input.txt create mode 100755 c/2020/2/main create mode 100644 c/2020/2/main.c create mode 100644 c/2020/3/input.txt create mode 100755 c/2020/3/main create mode 100644 c/2020/3/main.c create mode 100644 c/2020/4/input.txt create mode 100755 c/2020/4/main create mode 100644 c/2020/4/main.c create mode 100644 c/2020/5/input.txt create mode 100755 c/2020/5/main create mode 100644 c/2020/5/main.c create mode 100644 c/2020/6/input.txt create mode 100755 c/2020/6/main create mode 100644 c/2020/6/main.c create mode 100644 c/2020/7/input.txt create mode 100755 c/2020/7/main create mode 100644 c/2020/7/main.c create mode 100644 c/2020/8/input.txt create mode 100755 c/2020/8/main create mode 100644 c/2020/8/main.c create mode 100644 c/2020/9/input.txt create mode 100755 c/2020/9/main create mode 100644 c/2020/9/main.c create mode 100644 c/2020/lib/util.c create mode 100644 c/2020/lib/util.h create mode 100644 ruby/2015/21/problem.rb create mode 100644 ruby/2016/10/problem.rb create mode 100644 ruby/2016/11/problem.rb create mode 100644 ruby/2016/12/problem.rb create mode 100644 ruby/2016/13/problem.rb create mode 100644 ruby/2016/9/problem.rb create mode 100644 ruby/2017/3/problem.rb create mode 100644 ruby/2017/4/problem.rb create mode 100644 ruby/2017/5/problem.rb create mode 100644 ruby/2019/1/main.rb create mode 100644 ruby/2019/2/main.rb create mode 100644 ruby/2025/1/problem.rb create mode 100644 rust/2022/1/problem.rs create mode 100644 rust/2022/1/rucksack_reorganization.rs 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 0000000000000000000000000000000000000000..33ee21b11a4476e314a0791eb05e396bf6dbac7e GIT binary patch literal 16664 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e5e5ffd43623ebdbb5407e3e7e0f6ac86832bc21 GIT binary patch literal 16808 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4de7a270f9a68c3b636165e59963504278ba0df3 GIT binary patch literal 16816 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..def3f27fe630f107e888ad65f5e90108c8530ce7 GIT binary patch literal 16680 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0d875c09184db94d6875bf9439d9626bc93ead7a GIT binary patch literal 17088 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ff8392381d33dcde7c1fcca64c52dabd8d43b452 GIT binary patch literal 16648 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b0871d1dcfd5e1499545d91e34db41b82fe58d88 GIT binary patch literal 16664 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..61d5acafcd9c93e0885c0e55e4d21d9c78babbfb GIT binary patch literal 17176 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 CjVa6k literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9102f082bd043061bcd9a1b04857159490394308 GIT binary patch literal 17360 zcmeHPe~=W_oqsd1uo7ek6kQQvAXo)KhFwH%qiz^}3^XU`ir|?9Y-e|7cgM`m?9KED z7$A5f%G|nUW1>mEv;Tx#bye_BMKJg1Hq}=RV)} z-nX}>oyp~_yZdV%wf%kH&-cgszHh&N-LHEd-w177=k<65mkHuag1Cn13JGd~??zn# z35q6hF^+S^95D&}M2RVRP!UK~IqNN@wHluQN_O>BDMM!~STN-XiIQEVa`+-8VJduz zC%YP|YTiwsnxgcWvfOUZujIl-59#=sI_)So`6bFO-&{(c(|Hlvp6v)GyFqO?sO@Y@ z0g+r&&L`!B{+hHuH}ykC#V?OSxb5!Hc5b>>>ocV`sND8zEAm;|YteR{e(6TI>5~c; zOu4;VVMlrSV+)_=&APox=b=HL2c|l$Vre|qx?=g#cw|XDmdNZ}va@N$k`>DX>11G; z41waJHfT((zj>?h?i2llu|3r<#UG`WeMZ+rN1Q3A*DV$^3ic&@Ikfd3e{ zpOqYx#!Wdtgq6eZt$^QI0jGYJ^RvAIZdJfv0`AA3yU^uS&i_>vaAdoz{^APwf(m$3 z1-!lj{swSA{@kSzz;rQ791bc8U&m3f^A%Kbyd50r_Xics`XUwG5lciwcg9MK_Ea=V zhj2thcg8Hy-X71SJ4M<`S;?=7_GEW70Va~nSR!mCW1=e@k0;xNY2qSjGt*W$Wtm;! zm{f|UQlh;(6-!v{P-xp3Hrr!~a6EP|TCk$=xM**SC(~fk(dgF%IiQPbg;>9F!|FBW zvcR>=?dr0?b;8`RWs@0+rlK9Ov=vQl*|a8}OhmVYTjNo<@90V00-ysyx2p!1Yuu@w@~7oJ0St1HZ(94?6If4*YOXF*Kji+`^?lsA`1s zd?OK!PXqh{|Hw7h;xW2_pAn3rSDiwJ&95~IHTv~#vM*gQU2zp0QF@)EtsyyBmR1D!fh6w2l z(ow~!hl1q0gObQNXQ*oRSj|8+1Jw*vGf>UI|5*l%>~Cs~o|>1J3SsQ;x4gx?k$tK5 zq}^Wey1#>{c=c;I*3Au~Mtmp9hX#u%SHDO+Jpv5nC4Y=~FY*17f0lT9WEnal`KO7e zM}wimlK(#O^hhw&C;2Ccr$>RIeUg8Kc)E=abxZy)iKkot&|Q-M3*zaPKhz@mdx@u8 z{ZLTyDdOqTXsAK*cN0&y{2{;OTZyMz{g6-cUm>1u@k2uL#{xpM_kowC@!bu%Gj|%f zw~XxDBQ0A(js1ZJ_YOPl`n&7aBEsLZip%Tp!0DbOs8$NdlDWLDX}h^UO{M z+Y>sU?e`c5N!+NM6o46RBSz0wa#t{NXO7WmB8{JZEG>+-yp(wIr+{ncKY)zTS5G=3 zU13KW(2cnR}N&PkD=~}v;(X&(g&53Lgh$nlttM{KO8F-U!Z5e!b;_55Po`F zJcxcU=c6O~j()e`LJSSs{qY&OJu<;YPq3DZtoZC}CtD`koM-0!Ak)0T)`;s^>+@)oM30JUlQ%Z7s+EPTlX_O{+l~2lwq6>qTDozBN2o#Yl-QXbl?7 z=;lD-w7UM0A}Ovrsyt*zJooo!2KqRk+28z+TDs-VbDm!;Hx|gW)HV$pZZ+pjphdt zUftvU!z*L}!%Mka%@0Fh)!FO;uo>Nr8mWt`bXeFC>*S5nK-On%=n2$SOTCxAOakc* zmtVG@#_9;zksd(2r*px`)4vd&}^|KEQTw8eZ^Sj>~Y~sGO>0pfr?%u$Fxc^^sE=rTAqVmq`uixR1@w2b^sf6mL}Ak$UE1Fhau!rg?x!0U znlJ6|$Oq&7eH(SVzp6)bFfQcf^A4Ww5V%4=f}*Ou#q!sk@_%Ca_LK72wB%`&&QG;e zGf>SyH3QWQ{BLA{zH?AXiC6;Pf&$h~`l2Spx>Z|NZM@#UAs&x*gya5L0w04iZB{Iq z@L!#tB3jm5@4q^7jX&JhMwKao{s7}kkiStOvc62!vC6!1!VOQtFMW%6?mvpf5uzi- zVm%(!UIFa~|IGWvVgvZE{OWsB=0T5vj)1PgEyIUy z>;R?jxCcR7K&Rlw)(!e7Xdmc$+(?gr&cv-Y5BeeK2CpoDFr-2%Obx(qsHqoywH^eFP3F#(j8#j&=u~Nd`5>R-t^1D?c*h=><>Vx zig%Whuh;f?n=N_HGnQ+Te@Ax|OH0Xf+}i#BJK^7tyBl7i$H6*HZ`ZV4(|a_1K-0%G z{h_8uH9e*2FExEf)8A`4N&ndGGUt!p5X`=yifH{Byir)VHrg5sC;W}e0?PsoOB$Ci z(p7iV<2>bkqIkbJj;I=)M-L>sb>jV6f!;rq)1L#}i(l~F<%*B&2=8;@*J_-vGqAF3 zz|n)>+rAQ1JdX?db+<>%w67Z_6=F9kJqoV0{%E~AN(H(mfC!`g8nlSuM;WV zu6*YJ(_awo^$DI|+1szQ{!jD-C*OfUNbdy7<)=`g-H)`NKhYE4t-689(odcEHVq7v z#fk`eCqeyk=WUVJKcM|Qq4jU55YH_Y@UZstrta4~?I#J`uj@{-7x;AV74|&9vL3?m zkBug3!4um59z8+JcQ25APviU}<&@T^eKzIt`SS|+zX12)`ppNm15M^@{|$N`n6L4F z)%bCpXZbD-GJ3CAu3azYBl7PaSJQygxV=^1VC6d@__;*mKh-xf`7R20gT!?Z4zjue zzE%4a)N(SBw$;d-Cta(}=!5ueUuk^49#`_6B4qytyxjhV3tImQ-QTCVf!o?rR%0NE%>&`qm}!MO1c0=aX>Sj- ziSdmFrqyL)qe3E@hGrybcEppd;kX&GlBu*A&g>Lz$*%5r)QUy|4dpdx-$Tp{r&8fv zW;9`?c43D_xGQQ#GF@G}VB+9RXj&zzw3`C)nC808t2Twq(9LU2Y;ain<(pS++OP&N zwhNgdLraadn}xZ4<1MRKZ8UFLx9+yk7IVw0)f+>m+}IK1ofUFBg?r0}EycczKeX3E zZU3;f$yZx4kxs^=W-M*CWl|~h5&f_~6PRtuR4UVr1j#)nC6;olNeN;`BVjA7_lA^6 zxRq2UVP+CmEN;e=$!;^5GL!d2Q|l%=j6V)#?pPXd;p7G|EIEvMYfm6tz-Hg5jE`lu9+tn2@ES@h}sn4aIA_Pl;z>Sskw-S&S59G`UPaYq(j2QzKZIIn}< z@rNO&H89)rI+^K0Eua`F&uq`@)fh19GTZaIn<=lep&|?UaF#y@Lu*>L=XEU8fL7-C zS&!*n$Z3ttJg<|Pa{t}&a}2$xP)^yN*Xd08d4St@_y2Kizgj!wbw5*nPeAsRGq?Ts zfKg7^zx{mT1Bk-!6BMUnN1z-ifxIi_2c;Y6Mik#v|Y1IIBw=&LWT0j=fBghBut-F ztbKG}f3HL0wD-+Zs!ShZ$J&Ft{d2&l;ZIK+_WGOmkGu7mXIg-5ox`5rlbu}x5QX&= zH_kJD9s(MB+&-_v?f(yeI)_5n4;8lK^Y{~Bq{8;RpR|7|X=AUrBKDE(nSKn3)1Ke6 z6|{YyZK*13$8-{mo%X!W+}WV?IZk%NcFa$OF<~74;h>Tn(Ds_Jy71dIRhh2ack8kJ zT$et@O2tWCLqy7dtQ{J9Vz>$@EiE{Ho`323;Mk?1K8(`>(JQDm2 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..df89845b7c65e0c84130e8007213cd110e512091 GIT binary patch literal 16800 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 biW}<@a=ENa)6}CPMcwn2#$=CyhZX+@M1A$` literal 0 HcmV?d00001 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' + ); + } +}