From baf4910870a6e8999802b9a4a22eabd4142a34e3 Mon Sep 17 00:00:00 2001 From: Bond_009 Date: Thu, 1 Dec 2022 22:30:22 +0100 Subject: Move all Advent of Codes into one repo --- .gitignore | 7 +- 1/input | 200 ----- 1/part1.c | 38 - 1/part1.f90 | 25 - 1/part2.c | 40 - 1/part2.f90 | 27 - 1/part2_fast.c | 127 --- 1/repair_avx.asm | 21 - 10/input | 102 --- 10/part1.c | 70 -- 10/part2.c | 87 -- 10/possible_seq.asm | 30 - 11/input | 90 -- 11/part1.c | 123 --- 11/part2.c | 202 ----- 11/testinput | 10 - 12/input | 793 ----------------- 12/part1.c | 78 -- 12/part2.c | 66 -- 12/testinput | 5 - 13/input | 2 - 13/part1.c | 48 - 13/testinput | 2 - 2/input | 1000 --------------------- 2/part1.c | 41 - 2/part2.c | 34 - 2020/01/part1.c | 38 + 2020/01/part1.f90 | 25 + 2020/01/part2.c | 40 + 2020/01/part2.f90 | 27 + 2020/01/part2_fast.c | 127 +++ 2020/01/repair_avx.asm | 21 + 2020/02/part1.c | 41 + 2020/02/part2.c | 34 + 2020/03/part1.c | 37 + 2020/03/part2.c | 41 + 2020/04/part1.c | 68 ++ 2020/04/part2.c | 135 +++ 2020/05/part1.c | 82 ++ 2020/05/part2.c | 95 ++ 2020/05/part2_fast.c | 90 ++ 2020/05/seat_id.asm | 25 + 2020/05/seat_id_ssse3.asm | 23 + 2020/06/part1.c | 37 + 2020/06/part2.c | 44 + 2020/07/part1.c | 158 ++++ 2020/07/part2.c | 129 +++ 2020/08/part1.c | 74 ++ 2020/08/part2.c | 109 +++ 2020/09/part1.c | 54 ++ 2020/09/part1.f90 | 45 + 2020/09/part2.c | 78 ++ 2020/09/part2.f90 | 60 ++ 2020/09/part2_fast.c | 98 ++ 2020/10/part1.c | 70 ++ 2020/10/part2.c | 87 ++ 2020/10/possible_seq.asm | 30 + 2020/11/part1.c | 123 +++ 2020/11/part2.c | 202 +++++ 2020/12/part1.c | 78 ++ 2020/12/part2.c | 66 ++ 2020/13/part1.c | 48 + 2020/prepare | 11 + 2021/Cargo.toml | 11 + 2021/asm/day01.asm | 65 ++ 2021/build.rs | 29 + 2021/prepare | 7 + 2021/src/day01.rs | 39 + 2021/src/day02.rs | 67 ++ 2021/src/main.rs | 22 + 2022/01/part2.asm | 82 ++ 2022/prepare | 7 + 3/input | 323 ------- 3/part1.c | 37 - 3/part2.c | 41 - 4/input | 953 -------------------- 4/part1.c | 68 -- 4/part2.c | 135 --- 5/input | 781 ---------------- 5/part1.c | 82 -- 5/part2.c | 95 -- 5/part2_fast.c | 90 -- 5/seat_id.asm | 25 - 5/seat_id_ssse3.asm | 23 - 6/input | 2172 --------------------------------------------- 6/part1.c | 37 - 6/part2.c | 44 - 7/input | 594 ------------- 7/part1.c | 158 ---- 7/part2.c | 129 --- 8/input | 636 ------------- 8/part1.c | 74 -- 8/part2.c | 109 --- 9/input | 1000 --------------------- 9/part1.c | 54 -- 9/part1.f90 | 45 - 9/part2.c | 78 -- 9/part2.f90 | 60 -- 9/part2_fast.c | 98 -- prepare | 14 +- utils.h | 9 - utils/unistd.asm | 382 ++++++++ utils/utils.asm | 43 + utils/utils.h | 9 + 104 files changed, 3324 insertions(+), 11221 deletions(-) delete mode 100644 1/input delete mode 100644 1/part1.c delete mode 100644 1/part1.f90 delete mode 100644 1/part2.c delete mode 100644 1/part2.f90 delete mode 100644 1/part2_fast.c delete mode 100644 1/repair_avx.asm delete mode 100644 10/input delete mode 100644 10/part1.c delete mode 100644 10/part2.c delete mode 100644 10/possible_seq.asm delete mode 100644 11/input delete mode 100644 11/part1.c delete mode 100644 11/part2.c delete mode 100644 11/testinput delete mode 100644 12/input delete mode 100644 12/part1.c delete mode 100644 12/part2.c delete mode 100644 12/testinput delete mode 100644 13/input delete mode 100644 13/part1.c delete mode 100644 13/testinput delete mode 100644 2/input delete mode 100644 2/part1.c delete mode 100644 2/part2.c create mode 100644 2020/01/part1.c create mode 100644 2020/01/part1.f90 create mode 100644 2020/01/part2.c create mode 100644 2020/01/part2.f90 create mode 100644 2020/01/part2_fast.c create mode 100644 2020/01/repair_avx.asm create mode 100644 2020/02/part1.c create mode 100644 2020/02/part2.c create mode 100644 2020/03/part1.c create mode 100644 2020/03/part2.c create mode 100644 2020/04/part1.c create mode 100644 2020/04/part2.c create mode 100644 2020/05/part1.c create mode 100644 2020/05/part2.c create mode 100644 2020/05/part2_fast.c create mode 100644 2020/05/seat_id.asm create mode 100644 2020/05/seat_id_ssse3.asm create mode 100644 2020/06/part1.c create mode 100644 2020/06/part2.c create mode 100644 2020/07/part1.c create mode 100644 2020/07/part2.c create mode 100644 2020/08/part1.c create mode 100644 2020/08/part2.c create mode 100644 2020/09/part1.c create mode 100644 2020/09/part1.f90 create mode 100644 2020/09/part2.c create mode 100644 2020/09/part2.f90 create mode 100644 2020/09/part2_fast.c create mode 100644 2020/10/part1.c create mode 100644 2020/10/part2.c create mode 100644 2020/10/possible_seq.asm create mode 100644 2020/11/part1.c create mode 100644 2020/11/part2.c create mode 100644 2020/12/part1.c create mode 100644 2020/12/part2.c create mode 100644 2020/13/part1.c create mode 100755 2020/prepare create mode 100644 2021/Cargo.toml create mode 100644 2021/asm/day01.asm create mode 100644 2021/build.rs create mode 100755 2021/prepare create mode 100644 2021/src/day01.rs create mode 100644 2021/src/day02.rs create mode 100644 2021/src/main.rs create mode 100644 2022/01/part2.asm create mode 100755 2022/prepare delete mode 100644 3/input delete mode 100644 3/part1.c delete mode 100644 3/part2.c delete mode 100644 4/input delete mode 100644 4/part1.c delete mode 100644 4/part2.c delete mode 100644 5/input delete mode 100644 5/part1.c delete mode 100644 5/part2.c delete mode 100644 5/part2_fast.c delete mode 100644 5/seat_id.asm delete mode 100644 5/seat_id_ssse3.asm delete mode 100644 6/input delete mode 100644 6/part1.c delete mode 100644 6/part2.c delete mode 100644 7/input delete mode 100644 7/part1.c delete mode 100644 7/part2.c delete mode 100644 8/input delete mode 100644 8/part1.c delete mode 100644 8/part2.c delete mode 100644 9/input delete mode 100644 9/part1.c delete mode 100644 9/part1.f90 delete mode 100644 9/part2.c delete mode 100644 9/part2.f90 delete mode 100644 9/part2_fast.c delete mode 100644 utils.h create mode 100644 utils/unistd.asm create mode 100644 utils/utils.asm create mode 100644 utils/utils.h diff --git a/.gitignore b/.gitignore index 3707b49..0efc1eb 100644 --- a/.gitignore +++ b/.gitignore @@ -55,8 +55,8 @@ dkms.conf [Rr]elease [Dd]ebug -# Intel VTune project dir -aoc2020 +target/ +Cargo.lock # Executables part1 @@ -66,3 +66,6 @@ part2_fast fpart1 fpart2 run + +# inputs +inputs/ diff --git a/1/input b/1/input deleted file mode 100644 index 2de45cc..0000000 --- a/1/input +++ /dev/null @@ -1,200 +0,0 @@ -1779 -1737 -1537 -1167 -1804 -1873 -1894 -1446 -1262 -1608 -1430 -1421 -1826 -1718 -1888 -1314 -1844 -248 -1812 -1627 -1605 -1641 -1126 -1051 -1839 -1067 -1685 -1800 -1383 -1415 -1781 -1372 -1711 -1687 -1357 -1603 -1899 -1856 -1240 -1872 -1483 -1624 -1358 -1168 -1238 -1585 -1159 -1409 -1615 -1258 -1412 -1468 -1912 -1840 -1681 -1700 -1031 -1757 -1911 -1096 -1239 -1331 -1881 -1304 -1694 -1705 -1680 -820 -1744 -1245 -1922 -1545 -1335 -1852 -1318 -1565 -1505 -1535 -1536 -1758 -1508 -1453 -1957 -1375 -1647 -1531 -1261 -1202 -1701 -1562 -1933 -1293 -1828 -334 -1714 -1931 -1385 -1294 -1469 -1629 -1842 -1730 -1534 -1544 -1946 -1805 -1188 -1684 -1875 -1623 -1248 -1347 -2006 -1191 -1037 -1387 -1903 -1746 -16 -952 -1246 -384 -1518 -1738 -1269 -1747 -1423 -1764 -1666 -1999 -1776 -1673 -1350 -1698 -2004 -1235 -1719 -1131 -1671 -1334 -1556 -1299 -1569 -1523 -1655 -1189 -1023 -1264 -1821 -1639 -1114 -1391 -1154 -1225 -1906 -1481 -1728 -1309 -1682 -1662 -1017 -1952 -1948 -2010 -1809 -1394 -1039 -1493 -1509 -1628 -1401 -1515 -1497 -1164 -1829 -1452 -1706 -1919 -1831 -1643 -1849 -1558 -1162 -1328 -1432 -680 -1169 -1393 -1646 -1161 -1104 -1678 -1477 -1824 -1353 -1260 -1736 -1777 -1658 -1715 diff --git a/1/part1.c b/1/part1.c deleted file mode 100644 index 1b825df..0000000 --- a/1/part1.c +++ /dev/null @@ -1,38 +0,0 @@ -#include -#include -#include -#include - -#define INPUT_LEN 200 - -int repair(const int * arr) -{ - for (int i = 0; i < INPUT_LEN; i++) { - for (int j = 0; j < INPUT_LEN; j++) { - if (arr[i] + arr[j] == 2020) { - return arr[i] * arr[j]; - } - } - } - - return 0; -} - -int main(int argc, char *argv[]) -{ - FILE *file = fopen(argv[argc - 1], "r"); - if (!file) { - return 1; - } - - char buffer[8] = { 0 }; - int input[INPUT_LEN] = { 0 }; - for (int i = 0; i < 200; i++) { - fgets(buffer, 8, file); - input[i] = atoi(buffer); - } - - fclose(file); - - printf("%i", repair(input)); -} diff --git a/1/part1.f90 b/1/part1.f90 deleted file mode 100644 index a7c09c8..0000000 --- a/1/part1.f90 +++ /dev/null @@ -1,25 +0,0 @@ -program day1 - implicit none - - integer, parameter :: input_len = 200 - integer, parameter :: search = 2020 - - integer :: i, j - integer, dimension(input_len) :: input - - open(10, file='input', status='old') - do i = 1, input_len - read(10, *) input(i) - end do - close(10) - - do i = 1, input_len - do j = 1, input_len - if (input(i) + input(j) == search) then - print *, input(i) * input(j) - stop - end if - end do - end do - -end program day1 diff --git a/1/part2.c b/1/part2.c deleted file mode 100644 index 9c10b61..0000000 --- a/1/part2.c +++ /dev/null @@ -1,40 +0,0 @@ -#include -#include -#include -#include - -#define INPUT_LEN 200 - -int repair(const int *arr) -{ - for (int i = 0; i < INPUT_LEN; i++) { - for (int j = 0; j < INPUT_LEN; j++) { - for (int k = 0; k < INPUT_LEN; k++) { - if (arr[i] + arr[j] + arr[k] == 2020) { - return arr[i] * arr[j] * arr[k]; - } - } - } - } - - return 0; -} - -int main(int argc, char *argv[]) -{ - FILE *file = fopen(argv[argc - 1], "r"); - if (!file) { - return 1; - } - - char buffer[8] = { 0 }; - int input[INPUT_LEN] = { 0 }; - for (int i = 0; i < 200; i++) { - fgets(buffer, 8, file); - input[i] = atoi(buffer); - } - - fclose(file); - - printf("%i", repair(input)); -} diff --git a/1/part2.f90 b/1/part2.f90 deleted file mode 100644 index b3d6bd2..0000000 --- a/1/part2.f90 +++ /dev/null @@ -1,27 +0,0 @@ -program day1 - implicit none - - integer, parameter :: input_len = 200 - integer, parameter :: search = 2020 - - integer :: i, j, k - integer, dimension(input_len) :: input - - open(10, file='input', status='old') - do i = 1, input_len - read(10, *) input(i) - end do - close(10) - - do i = 1, input_len - do j = 1, input_len - do k = 1, input_len - if (input(i) + input(j) + input(k) == search) then - print *, input(i) * input(j) * input(k) - stop - end if - end do - end do - end do - -end program day1 diff --git a/1/part2_fast.c b/1/part2_fast.c deleted file mode 100644 index c32f881..0000000 --- a/1/part2_fast.c +++ /dev/null @@ -1,127 +0,0 @@ -#include -#include -#include -#include - -#define INPUT_LEN 200 -#define SEARCH 2020 - -#ifdef USE_ASM -int repair_avx_inner(const int *arr, __m256i search); -#else -int repair_avx_inner(const int *arr, __m256i search) -{ - for (int k = 0; k < INPUT_LEN; k += 8) { - __m256i new = _mm256_loadu_si256((__m256i *)(&arr[k])); - if (_mm256_movemask_epi8(_mm256_cmpeq_epi32(new, search))) { - return _mm256_extract_epi32(search, 0); - } - } - - return 0; -} -#endif - -int repair_avx(const int *arr) -{ - __m256i search = _mm256_set1_epi32(SEARCH); - for (int i = 0; i < INPUT_LEN; i++) { - __m256i start = _mm256_set1_epi32(arr[i]); - for (int j = 0; j < INPUT_LEN; j += 8) { - __m256i new = _mm256_loadu_si256((__m256i *)(&arr[j])); - new = _mm256_add_epi32(start, new); - unsigned int mask = (unsigned int)_mm256_movemask_epi8(_mm256_cmpgt_epi32(new, search)); - if (mask == 0xffffffff) { - continue; - } - - switch (__lzcnt32(mask) / 4) { - case 0: - { - __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(7))); - int tmp = repair_avx_inner(arr, cmp); - if (tmp) { - return tmp * arr[i] * arr[j + 7]; - } - } - case 1: - if ((mask & 0x0f000000) == 0) { - __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(6))); - int tmp = repair_avx_inner(arr, cmp); - if (tmp) { - return tmp * arr[i] * arr[j + 6]; - } - } - case 2: - if ((mask & 0x00f00000) == 0 ){ - __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(5))); - int tmp = repair_avx_inner(arr, cmp); - if (tmp) { - return tmp * arr[i] * arr[j + 5]; - } - } - case 3: - if ((mask & 0x000f0000) == 0) { - __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(4))); - int tmp = repair_avx_inner(arr, cmp); - if (tmp) { - return tmp * arr[i] * arr[j + 4]; - } - } - case 4: - if ((mask & 0x0000f000) == 0) { - __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(3))); - int tmp = repair_avx_inner(arr, cmp); - if (tmp) { - return tmp * arr[i] * arr[j + 3]; - } - } - case 5: - if ((mask & 0x00000f00) == 0) { - __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(2))); - int tmp = repair_avx_inner(arr, cmp); - if (tmp) { - return tmp * arr[i] * arr[j + 2]; - } - } - case 6: - if ((mask & 0x000000f0) == 0) { - __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(1))); - int tmp = repair_avx_inner(arr, cmp); - if (tmp) { - return tmp * arr[i] * arr[j + 1]; - } - } - case 7: - if ((mask & 0x0000000f) == 0) { - __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_setzero_si256())); - int tmp = repair_avx_inner(arr, cmp); - if (tmp) { - return tmp * arr[i] * arr[j]; - } - } - } - } - } - - return 0; -} - -int main(int argc, char *argv[]) -{ - FILE *file = fopen(argv[argc - 1], "r"); - if (!file) { - return 1; - } - - char buffer[8] = { 0 }; - int input[INPUT_LEN] = { 0 }; - for (int i = 0; i < 200; i++) { - fgets(buffer, 8, file); - input[i] = atoi(buffer); - } - - fclose(file); - - printf("%i\n", repair_avx(input)); -} diff --git a/1/repair_avx.asm b/1/repair_avx.asm deleted file mode 100644 index 4f128f6..0000000 --- a/1/repair_avx.asm +++ /dev/null @@ -1,21 +0,0 @@ -global repair_avx_inner - -section .text - -repair_avx_inner: -%assign i 0 -%rep 25 - vpcmpeqd ymm1, ymm0, [rdi + i] -; vptest ymm1, ymm1 ; slower then vpmovmskb + test - vpmovmskb eax, ymm1 - test eax, eax - jne .found -%assign i i+32 -%endrep - xor eax, eax ; not found, return 0 - vzeroupper ; eliminate performance penalties caused by false dependencies when transitioning between AVX and legacy SSE instructions - ret -.found: - vzeroupper ; eliminate performance penalties caused by false dependencies when transitioning between AVX and legacy SSE instructions - movd eax, xmm0 ; smaller then putting a vmovd before the vzeroupper and no measurable performance difference - ret diff --git a/10/input b/10/input deleted file mode 100644 index 5746f73..0000000 --- a/10/input +++ /dev/null @@ -1,102 +0,0 @@ -103 -131 -121 -151 -118 -12 -7 -2 -90 -74 -160 -58 -15 -83 -153 -140 -166 -1 -148 -33 -165 -39 -100 -135 -68 -77 -25 -9 -54 -94 -101 -55 -141 -22 -97 -35 -57 -117 -102 -64 -109 -114 -56 -51 -125 -82 -154 -142 -155 -45 -75 -158 -120 -5 -19 -61 -34 -128 -106 -88 -84 -137 -96 -136 -27 -6 -21 -89 -69 -162 -112 -127 -119 -161 -38 -42 -134 -20 -81 -48 -73 -87 -26 -95 -146 -113 -76 -32 -70 -8 -18 -67 -124 -80 -93 -29 -126 -147 -28 -152 -145 -159 diff --git a/10/part1.c b/10/part1.c deleted file mode 100644 index f5a700e..0000000 --- a/10/part1.c +++ /dev/null @@ -1,70 +0,0 @@ -#include -#include -#include -#include -#include - -#define MAX_INPUT_LEN 128 - -void insert_value_sorted(int *list, size_t *size, int value) -{ - long long low = 0, high = *size; - while (low < high) { - int m = low + (high - low) / 2; - if (list[m] < value) { - low = m + 1; - } - else if (list[m] > value) { - high = m; - } - else { - // Value already exists in the list - return; - } - } - - for (long long i = *size - 1; i >= low; i--) { - list[i + 1] = list[i]; - } - - (*size)++; - list[low] = value; -} - -int solve(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[128] = { 0 }; - - int input[MAX_INPUT_LEN] = { 0 }; - size_t input_size = 1; // 0 is our start value - - while (fgets(buffer, 128, file)) { - insert_value_sorted(input, &input_size, atoi(buffer)); - } - - fclose(file); - - int diff1 = 0; - int diff3 = 1; // Diff with adapter - - for (size_t i = 1; i < input_size; i++) - { - int diff = input[i] - input[i - 1]; - if (diff == 1) { - diff1++; - } - else if (diff == 3) { - diff3++; - } - } - - return diff1 * diff3; -} - -int main(int argc, char *argv[]) -{ - printf("%i\n", solve(argv[argc - 1])); -} diff --git a/10/part2.c b/10/part2.c deleted file mode 100644 index 5e766d4..0000000 --- a/10/part2.c +++ /dev/null @@ -1,87 +0,0 @@ -#include -#include -#include -#include -#include - -#include "../utils.h" - -#define MAX_INPUT_LEN 128 - -void insert_value_sorted(int *list, size_t *size, int value) -{ - long long low = 0, high = *size; - while (low < high) { - int m = low + (high - low) / 2; - if (list[m] < value) { - low = m + 1; - } - else if (list[m] > value) { - high = m; - } - else { - // Value already exists in the list - return; - } - } - - for (long long i = *size - 1; i >= low; i--) { - list[i + 1] = list[i]; - } - - (*size)++; - list[low] = value; -} - -#ifdef USE_ASM -uint64_t possible_seq(const int *input, size_t input_size); -#else -uint64_t possible_seq(const int *input, size_t input_size) -{ - // Use char to optimize for size - const static char TRIB[] = { 1, 1, 2, 4, 7 }; - int con = 0; - uint64_t res = 1; - const int *prev = input; - const int *cur = input + 1; - do { - if (likely(*cur - *prev == 1)) { - con++; - } - else { - res *= TRIB[con]; - con = 0; - } - } while (++prev && ++cur < input + input_size); - - return res; -} -#endif - -uint64_t solve(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[16] = { 0 }; - - int input[MAX_INPUT_LEN] = { 0 }; - size_t input_size = 1; // 0 is our start value - - while (fgets(buffer, 16, file)) { - insert_value_sorted(input, &input_size, atoi(buffer)); - } - - // Add our device's built-in joltage adapter - input[input_size] = input[input_size - 1] + 3; - input_size++; - - fclose(file); - - return possible_seq(input, input_size); -} - -int main(int argc, char *argv[]) -{ - printf("%lu\n", solve(argv[argc - 1])); -} diff --git a/10/possible_seq.asm b/10/possible_seq.asm deleted file mode 100644 index b737d13..0000000 --- a/10/possible_seq.asm +++ /dev/null @@ -1,30 +0,0 @@ -global possible_seq - -section .rodata - TRIB: dq 1, 1, 2, 4, 7 ; tribonacci sequence (without first 2 zeroes) - -section .text - -possible_seq: - mov eax, 1 ; set up return value - xor ecx, ecx ; # of connected elements counter - lea rdx, [rdi + 4 * rsi - 4] ; pointer to the last element - lea r8, [rel TRIB] - jmp .loop -.ncon: - imul rax, qword [r8 + 8 * rcx] - xor ecx, ecx - add rdi, 4 - cmp rdi, rdx - jae .return -.loop: - mov esi, dword [rdi + 4] - sub esi, dword [rdi] - cmp esi, 1 - jne .ncon - inc ecx - add rdi, 4 - cmp rdi, rdx - jb .loop -.return: - ret diff --git a/11/input b/11/input deleted file mode 100644 index c367ad5..0000000 --- a/11/input +++ /dev/null @@ -1,90 +0,0 @@ -LLLLLLLL.LLLL.LLLLLLLLL.LLLLLL..L.LLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLL.L.LLLLLLLLLL -LLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LL.LLLLLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL -LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL -LLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL -LLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL -LLLLLLLL..LLLL.LLLLLLLLLLLLLLLL.L.LLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLL -...L..LLL.L...........L....LL........LLL....L..L.......LLLLL.LL.....LL.LL...L..LLL.L......L.... -LLLLLLLL.LLLL..LLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLL -LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL -LLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLLL.L.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL -LLLLLLLL.LLL..LLLLLLLLLLL.LLLLLLL.LLL.L.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL -LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLL..LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL -LLLLLLLL.LLLLLLLLLLLLLL..LLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLL -..LL.......L.L..L.LL......L.L....L...L...L.L........L.....L......LL...LL.LL.L........LLL.LL.... -LLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLL.L.L.LLLLL.LLLLLLLLLL -LLLLLLLL.LLLL..LLLLLLLL.LLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLL.LLLL.LLLLLLL.LLLLLLLLLL -LLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLL.LLLLL.LLLLLLL..LLLLLLLLLLLLLLLL.LLLLLLLLLL -LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.L.LLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL -.L..LLL...L.LLL..L..L....L....LL..LL...LL..LLLL.L.....L.L...........LL........L....L.L...L..LL. -LLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL -LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLL.L.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL -LLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL -LLLLL.LL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLL..LLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLL -LLLLLLLL.L.LLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLLL.L.LLLLLLLLLL -LLLLLLLL.L.LL.L.LLLLLLL.LLLLLLLLL.LLLLL.LLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLL -L.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.L.LLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL -LLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLL.LL.LLLLLLLLLLLLLLLLLL -.LL.L....L.L..LL..L..L..LL.L...L.....L...LL......LLL...L...LL....L.L.......L.....L...L.L......L -LLLLLLLLLLLLLLLLLLLLLLL.LL.LLLLLL.LLLLL.L.LL..LL.LLL.LLLLL.L.LLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLL -LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLL.LLLLLL.LLLLL.LLLLLLLLLLLLL.LLLLLLL.LLL.LLLLLLLLLL -LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLL.LLL.LLLLLLL.LL -LLLLLL.LLLLLL.LLLLLLLL..L.LLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLL.L.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL -LLLLLLLLLLLL..LLLLL.LLL.LLLLLLLLLLL.LLL.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLL.LLL -LLLLLLLL.L.L..LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLL.LLL.L...LLLL.LLLLL.LL.LLLLLLLL.LLLLLLL.LLLLLLLLLL -LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLL.LLL.LLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL -LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LL.LLLLLLLL.LLLLLLL.LLL.LLLLLL -LLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LL.LLLLLL.LLLLLLLLLL -L.L..L...LL.L..L..L..L.L.L..L......................L...L..LLLL..LLLL..LL....L...LL..L.....L.... -LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLL.LLLL.LLLLLLLLLLLL.LLLLLLL.LLLLLLLLLL -LLLLLLLL.LLLL.LLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LL.LLLLL..LL.LLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL -LLLLLLLLLLLLL..LLLL.LL..L.LLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLL -LLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LL.LLLLLLLLLLLLLLL -LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLLL.LLLLLLLLLL -LL.LL...L...LL.LLL...L...LL.LL..L.L.L...L.L.......L..L..L.LLL..LL...LLLLL..L..LL..L.....L...LL. -LLLLLLLL.LLLLLLLLLLLLLL..LL.L.LLL.LLLLL.LLLLLLLLLLLL.LLLL..LLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL -LLLLLLLL.LL.LLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LL.L.LLL.LLLLLLLLLLLLLLLLL.LLLLLL..LLLLLLLLLL -LLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL -LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLL.LLLLLLLL.LLLLL.LL.LLLLLLL.LLLLLLLLLL -LLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLL.LLLL.LLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL -LLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLL -LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LL.LLLLLLLLLL -LLLLLLLLLLLLL.LLLLLLLLL..LLLLLLLLLLLLLLLLLLLL.LLLLL.LLL.LL.LLLLLLLL.LLL.LLLLLLLLLLLLLLLLLLLLLLL -L.L................L..L.L.LL..L..L..L.L..L.LLLL..........L..LL.LL.L...LL...L....L...LL..L.L.L.L -.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLL.LLL -.LLLLLLLLLLLL.L.LLLLLLL.LLLLLLLL.LLLLLL.LLLLL.LLLL.L.LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL -LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLL..LLLLLLLLLLLL.LLLLLLLL.L.LLLLLL.LLLLLLL.LLLLLLLLLL -LLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL -LLLL.LLLLLL.L..LLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLL.LLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL -LLLLLLLLLLL.L.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LL.LLL.LLLLL.LLLLLL.L.LLLLLLLL.LLLLLLLLLL.LLLLLLL -LLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLL.LLLLLLLL.LLL.LLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLL -LLLLLLLL..LLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL -LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.L.LLLLL.LLLLLLLLLL -L..LL...L...L...L.LL..LL......LL..LL....L.L...........L.L...L....LL.LL.L..LL....L..L.........LL -L.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLL -LLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLL.LLLLLLL.LL.LLLLLL.LLLLLLL.LLLLLLLLLL -LLLLLLL.LL.LL.LLLLLLLLL.LLLLLLLLLLLL.LL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL -LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLL.LL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLL..LL -LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLL..LLLLLL.LLLLL.LLLL.LLL.LLLLLLLLL.LLLLLLLLLLLLLL.LL -LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL -LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.L.LLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL -.L.LL..L...L........L.......L.....L.L.L....L......L.LL......L...LL.L.LLLL...LLL.L...L..L.LLLL.. -LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.L.LLLLLLLLLLLLLLLLLL -L.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLL.LLL.L.L.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LL -LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL..LLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL -L.LLLLLLLLLLLLLLLLLLLLL.L.LLLLLLL.LLLLL.LLLL..LLLLLL.LLL.L.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL -LLLLLLLL.LLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLL.LL.LLLLL.LLLL -LLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLL.L.LLLLLL.LLL -LLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLL..LLLLL.LLLLL.LL.LLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL -....LLL.L...LL.L.LLLLLL...L........L.L...L.L.L..L....LL..LL.L..LL...L.L.LLL.LL...LL..L.L..LL... -LLLLLLLLLLLLL.LLLLLLLLL.LLLL.LLLL..LLLLLLLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.L.LLLLL.LLLLLLLLLL -LLLLLLLL..LLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLL -LLLLLLLLL.LLL.LLLLLLLLL.LLLLLLLLL.LLLLL..LLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLL.L.LLLLLLLL -LLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLL..LLLLLL.LLLLL.LLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL.L -LLLLLLL.LLLL..LLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL..LLLLL.LL.LL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL -LLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLL -L.LL.LLL.LLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLL.L.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LL.LLLLLLL.LLLLLL.LLL -LLLLLLLLLL.LL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LL -LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLL.L.LLLL.LLLLL.LLLLLLLLLLLLLLLLL.LLL.LLLLLLLLLLLLLL -LLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLL.LLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLL.L.LLLLL.LL -LLLLLLLL.LLLL.LLLLLLLLL.LLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL diff --git a/11/part1.c b/11/part1.c deleted file mode 100644 index 459befe..0000000 --- a/11/part1.c +++ /dev/null @@ -1,123 +0,0 @@ -#include -#include -#include -#include -#include - -#define MAX_INPUT_WIDTH 128 -#define MAX_INPUT_HEIGTH 128 -#define MAX_INPUT MAX_INPUT_WIDTH * MAX_INPUT_HEIGTH - -int count_char(const char *source, char search) -{ - int oc = 0; - do { - oc += *source == search; - } while (*++source); - - return oc; -} - -void replace_char(char *destination, const char *source, char original, char replace) -{ - do { - if (*source == original) { - *destination = replace; - } - else { - *destination = *source; - } - } while (++destination && *++source); - *destination = 0; -} - -int sur_oc_seats(const char *source, size_t width, size_t height, size_t index_y, size_t index_x) -{ - int num = 0; - // Check 3 seats on the line above - if (index_y > 0) { - size_t x = index_x == 0 ? index_x : index_x - 1; - size_t end_x = index_x < width - 1 ? index_x + 2 : index_x + 1; - for (; x < end_x; x++) { - num += source[(index_y - 1) * width + x] == '#'; - } - } - - // Check sides - if (index_x > 0) { - num += source[index_y * width + index_x - 1] == '#'; - } - - if (index_x < width - 1) { - num += source[index_y * width + index_x + 1] == '#'; - } - - // Check 3 seats on the line above - if (index_y < height - 1) { - size_t x = index_x == 0 ? index_x : index_x - 1; - size_t end_x = index_x < width - 1 ? index_x + 2 : index_x + 1; - for (; x < end_x; x++) { - num += source[(index_y + 1) * width + x] == '#'; - } - } - - return num; -} - -int solve(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[128] = { 0 }; - - char input[MAX_INPUT] = { 0 }; - size_t height = 1; - fgets(buffer, 128, file); - size_t width = strchr(buffer, '\n') - buffer; - replace_char(input, buffer, 'L', '#'); - - while (fgets(buffer, 128, file)) { - // Round 1 - replace_char(&input[height++ * width], buffer, 'L', '#'); - } - - fclose(file); - - size_t size = height * width; - - // Zero terminate - input[size] = 0; - - char input2[MAX_INPUT] = { 0 }; - do { - for (size_t i = 0; i < size; i++) { - if (input[i] == '.') { - input2[i] = '.'; - } - else if (input[i] == 'L') { - if (sur_oc_seats(input, width, height, i / width, i % width) == 0) { - input2[i] = '#'; - } - else { - input2[i] = 'L'; - } - } - else if (input[i] == '#') { - if (sur_oc_seats(input, width, height, i / width, i % width) >= 4) { - input2[i] = 'L'; - } - else { - input2[i] = '#'; - } - } - } - } while (memcmp(input, input2, size) && memcpy(input, input2, size)); - - return count_char(input, '#'); -} - -int main(int argc, char *argv[]) -{ - printf("%i\n", solve(argv[argc - 1])); -} diff --git a/11/part2.c b/11/part2.c deleted file mode 100644 index 2443ddd..0000000 --- a/11/part2.c +++ /dev/null @@ -1,202 +0,0 @@ -#include -#include -#include -#include -#include - -#define MAX_INPUT_WIDTH 128 -#define MAX_INPUT_HEIGTH 128 -#define MAX_INPUT MAX_INPUT_WIDTH * MAX_INPUT_HEIGTH - -int count_char(const char *source, char search) -{ - int oc = 0; - do { - oc += *source == search; - } while (*++source); - - return oc; -} - -void replace_char(char *destination, const char *source, char original, char replace) -{ - do { - if (*source == original) { - *destination = replace; - } - else { - *destination = *source; - } - } while (++destination && *++source); - *destination = 0; -} - -char get_char(const char *source, size_t width, size_t y, size_t x) { - return source[y * width + x]; -} - -int sur_oc_seats(const char *source, size_t width, size_t height, size_t index_y, size_t index_x) -{ - int num = 0; - // Check upwards - size_t y = index_y; - size_t x = index_x; - while (--y < height) { - char c = get_char(source, width, y, x); - if (c == '.') { - continue; - } - - num += c == '#'; - break; - } - - // Check downwards - y = index_y; - while (++y < height) { - char c = get_char(source, width, y, x); - if (c == '.') { - continue; - } - - num += c == '#'; - break; - } - - // Check left - y = index_y; - x = index_x; - while (--x < width) { - char c = get_char(source, width, y, x); - if (c == '.') { - continue; - } - - num += c == '#'; - break; - } - - // Check right - x = index_x; - while (++x < width) { - char c = get_char(source, width, y, x); - if (c == '.') { - continue; - } - - num += c == '#'; - break; - } - - // Check left upwards - y = index_y; - x = index_x; - while (--y < height && --x < width) { - char c = get_char(source, width, y, x); - if (c == '.') { - continue; - } - - num += c == '#'; - break; - } - - // Check left downwards - y = index_y; - x = index_x; - while (++y < height && --x < width) { - char c = get_char(source, width, y, x); - if (c == '.') { - continue; - } - - num += c == '#'; - break; - } - - // Check right upwards - y = index_y; - x = index_x; - while (--y < height && ++x < width) { - char c = get_char(source, width, y, x); - if (c == '.') { - continue; - } - - num += c == '#'; - break; - } - - // Check right downwards - y = index_y; - x = index_x; - while (++y < height && ++x < width ) { - char c = get_char(source, width, y, x); - if (c == '.') { - continue; - } - - num += c == '#'; - break; - } - - return num; -} - -int solve(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[128] = { 0 }; - - char input[MAX_INPUT] = { 0 }; - size_t height = 1; - fgets(buffer, 128, file); - size_t width = strchr(buffer, '\n') - buffer; - replace_char(input, buffer, 'L', '#'); - - while (fgets(buffer, 128, file)) { - // Round 1 - replace_char(&input[height++ * width], buffer, 'L', '#'); - } - - fclose(file); - - size_t size = height * width; - - // Zero terminate - input[size] = 0; - - char input2[MAX_INPUT] = { 0 }; - do { - for (size_t i = 0; i < size; i++) { - if (input[i] == '.') { - input2[i] = '.'; - } - else if (input[i] == 'L') { - if (sur_oc_seats(input, width, height, i / width, i % width) == 0) { - input2[i] = '#'; - } - else { - input2[i] = 'L'; - } - } - else if (input[i] == '#') { - if (sur_oc_seats(input, width, height, i / width, i % width) >= 5) { - input2[i] = 'L'; - } - else { - input2[i] = '#'; - } - } - } - } while (memcmp(input, input2, size) && memcpy(input, input2, size)); - - return count_char(input, '#'); -} - -int main(int argc, char *argv[]) -{ - printf("%i\n", solve(argv[argc - 1])); -} diff --git a/11/testinput b/11/testinput deleted file mode 100644 index cdea6b5..0000000 --- a/11/testinput +++ /dev/null @@ -1,10 +0,0 @@ -#.##.##.## -#######.## -#.#.#..#.. -####.##.## -#.##.##.## -#.#####.## -..#.#..... -########## -#.######.# -#.#####.## diff --git a/12/input b/12/input deleted file mode 100644 index 0abcff3..0000000 --- a/12/input +++ /dev/null @@ -1,793 +0,0 @@ -F20 -L90 -E5 -S1 -R180 -F67 -S3 -F75 -L180 -W4 -N4 -F88 -L90 -S2 -E2 -L180 -S4 -F3 -L90 -N3 -L180 -N5 -E2 -N1 -W5 -L180 -E3 -F50 -E1 -F84 -S4 -W3 -L90 -W1 -N1 -L90 -F7 -L90 -N5 -R90 -F35 -E2 -F100 -E5 -R90 -W1 -F85 -R90 -W4 -S4 -R180 -F20 -R90 -N5 -W1 -S3 -F77 -R90 -N1 -W2 -R90 -N5 -F25 -E2 -R90 -E5 -W5 -S3 -F59 -N3 -L90 -F1 -N5 -F31 -R90 -S5 -R90 -E1 -F81 -S3 -L90 -F79 -S3 -W1 -F25 -E2 -N4 -R90 -F16 -R180 -F29 -S5 -W1 -L90 -F50 -E5 -L90 -W2 -L90 -N2 -W1 -R90 -F65 -E3 -F21 -W3 -S5 -L90 -N4 -R180 -N4 -F37 -W1 -F40 -W1 -F78 -S1 -L90 -E2 -F12 -L90 -W3 -F16 -N1 -L90 -R90 -N2 -R90 -N2 -F5 -R90 -F43 -L90 -E5 -F89 -N3 -E3 -S3 -W1 -F48 -E2 -N2 -L180 -F78 -N5 -L90 -F14 -N3 -R180 -E4 -F27 -N5 -R90 -F68 -L270 -W5 -F59 -W1 -F98 -E3 -F47 -R270 -F43 -L90 -F79 -L90 -F94 -W1 -F40 -R90 -W4 -S3 -F13 -E3 -S5 -L180 -S3 -L270 -W4 -R90 -N3 -F64 -E2 -R90 -F4 -E5 -S3 -R90 -W1 -E3 -R90 -E5 -S1 -R180 -W1 -F36 -E1 -F45 -L90 -F92 -W3 -N3 -W2 -R90 -W2 -F79 -E2 -R90 -S4 -N4 -E1 -N4 -R90 -F71 -E3 -S4 -L90 -E1 -F10 -N3 -F53 -E5 -S5 -R90 -F85 -N2 -W4 -R90 -F64 -W1 -S2 -L90 -N1 -W1 -F40 -F7 -S3 -F20 -S3 -F63 -F97 -N5 -F23 -N3 -F20 -L90 -S3 -E3 -F54 -N5 -F79 -N1 -F50 -L90 -F10 -R90 -W3 -S1 -R180 -F93 -E1 -F73 -L90 -E3 -N3 -L180 -F1 -E1 -N2 -W2 -L90 -W2 -L90 -N4 -F97 -W2 -S1 -F89 -E3 -L90 -S5 -R90 -N3 -E2 -L90 -F59 -R90 -S4 -F53 -W3 -S3 -R90 -F35 -R180 -W1 -F32 -N2 -W3 -L90 -F55 -N3 -E3 -R90 -F50 -N5 -L90 -S3 -E3 -R90 -E4 -S2 -R90 -N4 -W1 -R90 -F44 -R90 -F56 -W3 -S3 -L90 -S2 -E4 -F91 -S2 -R90 -N3 -R90 -W1 -S1 -F4 -L90 -E3 -L180 -N5 -F67 -F50 -S3 -F71 -L90 -F81 -R90 -E1 -F27 -W2 -N5 -E5 -F99 -R90 -F30 -F98 -L90 -F20 -S2 -E2 -N2 -E4 -R180 -W2 -S5 -L90 -N5 -F59 -E1 -N3 -F42 -E2 -N4 -W1 -R90 -E4 -L180 -F92 -R90 -N4 -W3 -L180 -S3 -W2 -N2 -L90 -F26 -S1 -E5 -R90 -E2 -L90 -W4 -F96 -E5 -F4 -F98 -E3 -F77 -R180 -E4 -F28 -E3 -W2 -N3 -F23 -N3 -L90 -W5 -R90 -L90 -N3 -W3 -F97 -R90 -E3 -F22 -L180 -S2 -F22 -W2 -S5 -W5 -F40 -E3 -L90 -E1 -S3 -L90 -W3 -E5 -F69 -L90 -W5 -N4 -L90 -N3 -F49 -S2 -E2 -F41 -W2 -F61 -E3 -R90 -W5 -L180 -E4 -F52 -E2 -F86 -R270 -F27 -W5 -R90 -E1 -S4 -F3 -R90 -E3 -F28 -F31 -S4 -F81 -S5 -F89 -E5 -N2 -F21 -E5 -L180 -S4 -L180 -S3 -E3 -R180 -F58 -E5 -F8 -W2 -R90 -N3 -L270 -S1 -F67 -W4 -N2 -L180 -L90 -E5 -L180 -S3 -W2 -R180 -F70 -R90 -S5 -F40 -S1 -R90 -N1 -R90 -S3 -R90 -E2 -R90 -F86 -R90 -F33 -W2 -N5 -R180 -W5 -S4 -F1 -E2 -L90 -S3 -F68 -E3 -R90 -S4 -R90 -W2 -F51 -L90 -W1 -N2 -L90 -F40 -N1 -R90 -W1 -S5 -F39 -L90 -F61 -L90 -N4 -W5 -F5 -E2 -N3 -F67 -S4 -F44 -R180 -F4 -L180 -N2 -L90 -E5 -L270 -E1 -L90 -F99 -R90 -N2 -E4 -R90 -F96 -E1 -N4 -L90 -W5 -R270 -E2 -L90 -F33 -R90 -F11 -N1 -R90 -E5 -R90 -W1 -F61 -R90 -F98 -R180 -F86 -N5 -L180 -W4 -S3 -R180 -F98 -E5 -S4 -F33 -N2 -E4 -L90 -F36 -S1 -E1 -F92 -F48 -W3 -N4 -F2 -E4 -F98 -W5 -F67 -S3 -F60 -N5 -R90 -S2 -L90 -N5 -L180 -W2 -N4 -L90 -N4 -L90 -F90 -E5 -L90 -S1 -W1 -N2 -F76 -S4 -E5 -F5 -S4 -R90 -F41 -E5 -N5 -R90 -N5 -E2 -F13 -W2 -N5 -L180 -N5 -L90 -S3 -W1 -S1 -E1 -E3 -S5 -R90 -S1 -W3 -R90 -E2 -F37 -L90 -N3 -E4 -F85 -S1 -F27 -S5 -F10 -S2 -L90 -E1 -S3 -F6 -N5 -E5 -R90 -W2 -F2 -N4 -F73 -R90 -S5 -L90 -F87 -L90 -F100 -L90 -N3 -E3 -F90 -R90 -N5 -N3 -F80 -N2 -F88 -R90 -S5 -L90 -F88 -R90 -W2 -S4 -N2 -F9 -S3 -E4 -R180 -F60 -W2 -F93 -E2 -F4 -L90 -F20 -R180 -F87 -W2 -F75 -S3 -L180 -W3 -R180 -W1 -R90 -E1 -R90 -N4 -W2 -R90 -W1 -F74 -S1 -W4 -S3 -F59 -R270 -W1 -N5 -F42 -F34 -W3 -R270 -E1 -L90 -W3 -R270 -F57 -N2 -E3 -L270 -F57 -R90 -F68 -E1 -L90 -E2 -F4 -N2 -F28 -N4 -L90 -N4 -E5 -N2 -R90 -F89 -R270 -N4 -L90 -W4 -L90 -W4 -F92 -S1 -F77 -N2 -E1 -R90 -F72 -N5 -R90 -W1 -W3 -F25 -E1 -S4 -E3 -F95 -W3 -F72 -S3 -E5 -N4 -E1 -R180 -F73 -N1 -W2 -S5 -E3 -R180 -F68 -F4 diff --git a/12/part1.c b/12/part1.c deleted file mode 100644 index 7ee0f4a..0000000 --- a/12/part1.c +++ /dev/null @@ -1,78 +0,0 @@ -#include -#include -#include -#include -#include - -#define MAX_INPUT_WIDTH 128 -#define MAX_INPUT_HEIGTH 128 -#define MAX_INPUT MAX_INPUT_WIDTH * MAX_INPUT_HEIGTH - -enum direction { - North, - East, - South, - West -}; - -int solve(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[8] = { 0 }; - - enum direction dir = East; - int hor = 0; - int ver = 0; - while (fgets(buffer, 8, file)) { - int n = atoi(buffer + 1); - switch (buffer[0]) { - case 'N': - ver += n; - break; - case 'E': - hor += n; - break; - case 'S': - ver -= n; - break; - case 'W': - hor -= n; - break; - case 'F': - switch (dir) { - case North: - ver += n; - break; - case East: - hor += n; - break; - case South: - ver -= n; - break; - case West: - hor -= n; - break; - } - break; - case 'R': - dir = (enum direction)(((int)dir + (n / 90)) % 4); - break; - case 'L': - dir = (enum direction)((abs(4 + ((int)dir - (n / 90))) % 4)); - break; - default: - break; - } - } - - fclose(file); - - return abs(ver) + abs(hor); -} - -int main(int argc, char *argv[]) -{ - printf("%i\n", solve(argv[argc - 1])); -} diff --git a/12/part2.c b/12/part2.c deleted file mode 100644 index 745b56c..0000000 --- a/12/part2.c +++ /dev/null @@ -1,66 +0,0 @@ -#include -#include -#include -#include -#include - -#include "../utils.h" - -int solve(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[8] = { 0 }; - - int w_x = 10; - int w_y = 1; - int y = 0; - int x = 0; - while (fgets(buffer, 8, file)) { - int n = atoi(buffer + 1); - switch (buffer[0]) { - case 'N': - w_y += n; - break; - case 'E': - w_x += n; - break; - case 'S': - w_y -= n; - break; - case 'W': - w_x -= n; - break; - case 'F': - for (int i = 0; i < n; i++) { - x += w_y; - y += w_x; - } - break; - case 'R': - for (int i = 0; i < n / 90; i++) { - SWAP(w_y, w_x); - w_y = -w_y; - } - break; - case 'L': - for (int i = 0; i < n / 90; i++) { - SWAP(w_y, w_x); - w_x = -w_x; - } - break; - default: - break; - } - } - - fclose(file); - - return abs(x) + abs(y); -} - -int main(int argc, char *argv[]) -{ - printf("%i\n", solve(argv[argc - 1])); -} diff --git a/12/testinput b/12/testinput deleted file mode 100644 index d382291..0000000 --- a/12/testinput +++ /dev/null @@ -1,5 +0,0 @@ -F10 -N3 -F7 -R90 -F11 diff --git a/13/input b/13/input deleted file mode 100644 index f9503fe..0000000 --- a/13/input +++ /dev/null @@ -1,2 +0,0 @@ -1005526 -37,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,41,x,x,x,x,x,x,x,x,x,587,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,13,19,x,x,x,23,x,x,x,x,x,29,x,733,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,17 diff --git a/13/part1.c b/13/part1.c deleted file mode 100644 index b62d007..0000000 --- a/13/part1.c +++ /dev/null @@ -1,48 +0,0 @@ -#include -#include -#include -#include - -#define BUFFER_SIZE 256 -#define MAX_INPUT_LEN 128 - -int solve(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - char buffer[BUFFER_SIZE] = { 0 }; - fgets(buffer, BUFFER_SIZE, file); - int depart = atoi(buffer); - fgets(buffer, BUFFER_SIZE, file); - int bus_ids[MAX_INPUT_LEN] = { 0 }; - bus_ids[0] = atoi(buffer); - int i = 1; - char *p = buffer; - while ((p = strchr(p, ','))) { - // x is never the last value, just keep looping we find a valid input - while (*++p == 'x') { - p += 1; - } - - bus_ids[i++] = atoi(p); - } - - int bus_id = 0; - int wait = INT32_MAX; - for (int j = 0; j < i; j++) { - int id = bus_ids[j]; - int tmprem = id - (depart % id); - if (tmprem < wait) { - bus_id = id; - wait = tmprem; - } - } - - fclose(file); - return bus_id * wait; -} - -int main(int argc, char *argv[]) -{ - printf("%i\n", solve(argv[argc - 1])); -} diff --git a/13/testinput b/13/testinput deleted file mode 100644 index d76f619..0000000 --- a/13/testinput +++ /dev/null @@ -1,2 +0,0 @@ -939 -7,13,x,x,59,x,31,19 diff --git a/2/input b/2/input deleted file mode 100644 index f7a1314..0000000 --- a/2/input +++ /dev/null @@ -1,1000 +0,0 @@ -2-4 r: prrmspx -5-6 p: hpzplphxb -5-8 t: ttttbtttttc -1-6 k: kkkkkk -1-3 q: qqqq -4-8 t: pctpfqtrtttmvptvfmws -3-5 z: zznzslv -12-14 h: hhhhhhhhhhhhhhhh -14-15 v: vvvvvvvvhvvvvdmvv -8-17 x: xxxxxxdxxxxxxxckxx -11-12 f: gkfjnffjfcmfwk -10-12 s: xsgsssshbmsbnss -6-15 s: sssssnsssssssss -2-8 d: qnqtrqdrnvq -5-7 k: lhxkkkk -4-5 k: xkkkk -10-16 v: vvvvvvvvvcvvvvvpvv -1-6 f: ffffflfffffff -4-5 x: fxdnq -10-12 p: mkspmhlldqjh -10-12 r: rcvzzcbdgrcr -4-7 r: rxbkrrrzrrrtrrr -18-19 k: kkkkkkkkkkkkkkkkkkk -1-2 f: sfffffffffffffffff -1-5 z: mhkzwdxklf -2-3 r: qzbgrghkmlpxdvd -2-3 q: mqqpcxbqdf -7-8 r: rrrrfrrj -1-9 x: vmxsmwhnxccf -9-10 t: ttttttttppt -2-4 x: rxxqxx -16-17 k: jkfmnwkkztnxvlkkw -3-4 c: ccbpccccczpcccc -5-8 g: ggggjggg -1-3 z: szzzzz -8-9 l: xnllznclz -4-10 m: pkmmptjvgsnwmxm -1-2 r: mbrrtkrjdr -1-3 c: ccqscsxcnctwlvm -4-6 p: ppppppppp -3-5 d: wdddxvmnbdhvzdgqbdm -5-7 n: nnwbsnqnnvn -2-11 j: sgbxjvqnbmq -5-13 q: qqqkpqqqsqqqxqqqq -2-12 m: kvwlwmmvhbpgmnzfddms -2-4 j: kjgcpgxgcphkqjjmbwd -3-6 v: tdvlvv -10-20 n: tnmhnlznnpnmnfnngnnn -4-7 h: hhhhhhhh -9-11 m: mmmmmmmmrmm -7-9 b: mbnbbbbqk -9-10 z: fqzzzmzzzzj -3-15 s: chdpzcpgsgrkhss -3-4 k: kklz -1-5 q: ltqqqxcndqrq -9-17 m: mmmmmmmmqdlmmxbmtmmm -14-16 k: kkkkkkmkkkkkjtkkk -8-9 k: kkkkkqkkxlk -2-6 n: kbhhjhdmgtn -3-8 w: rcwwwkqwbwkwmdqtwmw -10-11 x: snkbxmwqwxp -2-5 m: pmhmp -6-7 b: bbbbbbq -3-7 l: cfqmljq -9-13 q: qzqqqqqqqlqdt -2-10 w: kmwqwtwkssd -4-13 t: ttblttttttttftt -14-17 l: llllllwllllllwllclll -3-4 p: xzps -10-14 b: bjbbbbbpbdbbbb -5-7 v: jlvhjtvx -6-9 r: bscrrrrcrphffdw -5-7 r: brrvjrxfrljwxp -15-16 b: bbbbbbbbbbbbbbbb -7-8 h: bchfxxshh -2-13 z: zzqzzzzzzzzzzzz -1-5 b: bbbbrbbhbbbbbcb -2-3 k: zkkzjld -4-6 f: fnffffff -8-11 d: qdvdddddndphdndmgdkp -17-18 q: qqqkqqqqqqcqqqqtqq -11-16 m: mmmwmwxvmmmmmmmmmmm -12-13 v: vvvvfxvgblvvk -4-6 v: vsvvvvv -2-4 p: rqgm -7-8 r: rrrrrfrf -2-4 j: xpjjl -7-8 b: wdpbvwbb -15-16 k: fkkkskkkmkkkkkkk -10-14 s: shkscsqjszstssv -3-4 l: lllw -2-4 n: gjbnlsxvqmvxgcwntvvs -6-12 l: lclllgllllllll -16-17 b: bbbbbbbbbbbbbbbbbbb -7-8 q: pqqqqqwq -1-2 r: rrzsr -1-3 r: rrfr -16-17 f: fffcfffffjfmrzqffnr -15-17 h: bhzhhfndwgdhlhhhjh -7-11 t: vtwnrwzczmtwn -3-6 v: vvvvvmvvvvvv -4-5 s: ssptsss -1-3 t: ttntq -5-9 g: ggggtgggcg -7-8 h: hcjdkphhb -15-17 j: jjjjjmjjjjtjgvnxk -3-4 q: qqqq -5-7 g: lggsjqlg -11-18 m: mmmmmmmmmmqmmmmmmf -1-14 x: xxxxcxxxxxxxxxxxxx -7-8 f: ffffffbffff -3-4 t: xmct -3-4 x: xxtcd -1-11 x: xcnxxxxvxlxkmcrxn -8-11 h: hgnhkhhshhnhhzdhllw -8-10 z: zdzzzzzrpvvzzqz -6-7 r: lrbrrprrxr -6-10 n: fnnwnpnnjnhmnntqn -10-15 b: bbbbbbbbbwbbbbbbbbbb -13-16 z: zzzzzzzwzzzzvvzkztjz -5-6 t: xntkwthxbdtlmxtpzz -5-13 r: njrlghrrxfrfv -11-14 s: vssnzksspscrss -7-10 c: gtrkbcxccccccchch -6-11 v: vvsvvvvvvvvvvvvv -17-18 b: bbbbbbbqbbbsbbbbsnbb -13-15 x: smxxxjxmmkxxxmxx -10-11 h: hpqqwkxnfhd -15-16 j: jjjjjjjjjjjjzgjjwjjj -3-5 f: cjcff -3-4 z: hnfzzzmq -11-14 c: cccccccccczcckc -2-7 t: tstmdtk -2-3 f: wffkfm -7-16 w: tvgdzjjqlwzknwvwgzh -1-2 d: dzdqpn -8-14 j: jjzqjxjjsjrngzfj -6-9 h: xknzmlzpbpzcth -2-5 j: njmnj -10-15 z: kfqlljdfzzczzmp -7-12 g: gcqwnmgjhcrjnzwcmw -3-4 h: hhjhh -5-16 d: ddddddvddddddddddd -1-2 p: fwwtpllzbmjbwcnkbh -10-18 p: vhpwpppxfppppvppdh -2-6 x: rqgqgx -11-12 m: mhpmmmmmmmmmmm -3-4 z: lzzf -5-8 w: vfwwmlwfvwwwwlh -3-10 t: ltgtztzlct -7-8 k: kkkkkkmk -10-13 b: ndflbblbchkbq -18-19 z: zzzzzzzzzzzzszzzzzzz -2-5 n: nlzrmkhz -14-15 v: vwvvvvvvvvvjvmcvvv -13-15 p: ppppppppwpppxph -6-9 k: jvhxzwkkwkzv -9-11 s: snspssslkss -13-18 j: jgjrjjjjjqjjjhjtjj -5-7 v: vgvrhzvvv -1-7 t: ttttttttttttt -8-9 n: nnnnfnnnj -2-5 x: dxcrxhstqwldt -6-12 s: dkshssdsltspgcb -2-7 k: kkkkkkkk -7-13 d: vbjsdddfstdhtdxl -12-17 r: nrrgrrsrrrrkrrrdt -3-5 w: wwwjw -5-8 l: mlfldllll -4-5 m: mmmqm -9-10 j: sjtmlxjrzl -2-14 h: hhhhhhhhhhhhrnhhwh -3-4 b: bbbw -12-13 g: gggggggggggzg -13-14 t: tttgtttrztstltlhb -14-17 s: fhdxfshbglsvjsgbs -9-13 x: xxxxlxxtxxxxxxx -2-3 j: jjtn -12-13 n: nnnnnsnwnnvmq -3-6 z: gzzzbzmzzzmz -3-4 d: ddnt -2-7 s: pswmrnsrgb -8-9 q: qqqqqqqdv -5-6 s: sdlcqs -6-10 f: jffwjfhfff -4-5 p: pmpppps -9-14 p: pppppppppppvpppppppc -3-9 n: nsnpnmmnnwtnvb -3-4 b: bhzh -7-9 g: ggggggggng -10-11 x: xwxxxkxxxjxqxxxbbxx -17-18 k: kkkkkkkkkkkckkkkkk -3-4 v: vvrv -12-14 s: vdsrgdsghxcblflbwj -8-13 h: gxzhhbkdgfdglfqqcls -4-6 m: mmmvmfmmmmm -2-13 b: lbtzwffqfrfhbwb -1-3 r: lrcr -3-6 j: cjtcjj -5-8 z: zzztzmzz -4-12 t: wttrttvtgttztttdttst -6-7 n: zbfvmngknrzfzqpwhtx -12-14 g: gggggggggggggbgg -6-10 k: jkkkkkrkmbkdh -14-19 m: mmmmmmmmmmmmmmmmmmfm -2-4 d: sdft -4-10 g: bgtgsbjcqgt -2-4 t: trtqt -7-11 b: wjbbsqsvpkpb -12-14 z: zcfqlkxghjjpjzsc -3-4 g: ggjt -5-7 r: zdrrqrrrrrr -15-16 p: brpvpplmhvnbxppc -15-16 b: bbxbbbbbbbbbbbbb -8-11 c: hscggrpcpbxrxwgsv -10-15 j: jjjjjjjjjnjjjjmjjjj -4-6 g: bgkghgc -9-15 c: ccjcccsbcccspxc -2-3 v: fjzb -2-3 h: hhhxlchhwmjjzj -4-11 x: xxxxlxxxxcxxxxk -6-11 d: dvpdmdddzch -5-6 j: jjjjjjdjwj -6-12 p: pppppxpppppbppp -1-7 q: xqqqqqqqqqqqqq -5-6 w: xwwrtwjpwgsw -11-13 k: kkkkkkkkkkckfkkk -2-3 m: qbmnxlwmldmmc -2-3 w: jqlwws -6-8 k: kkkjbkmz -10-12 m: mmmmmmmmmvbm -6-13 n: hqnkdmwnxnwndnxgl -1-5 j: jjjjb -16-17 x: gxxxxxsxxbxxxxxmp -3-10 s: ssrsssssss -3-4 s: rslpsx -1-10 g: qgggjgwqzggvzflmj -8-9 g: gggbngqghg -1-3 q: qqqfj -3-5 m: mmmmzmmmmm -7-8 q: qqqxqqgqq -1-2 j: rpdjrrt -7-10 v: mdzpkvvdpv -12-14 m: xzmmjmhmmmmktmtmmmm -6-9 m: mmvbmvmzm -7-9 c: gcccqmlhc -6-8 z: zzzzzznrz -4-7 w: wwwmwwww -1-4 h: vhhhhh -13-14 z: xzzzjzzzzzzfzz -1-3 l: jlqml -10-12 f: wdbfzsbwffgf -4-8 p: vjpppfppxppjmctw -18-19 x: zkxbllxbtbzggncfxxx -5-6 x: xxxxhxxx -2-6 v: tvdprvvrvv -5-14 k: jkdhkhdhjgmtkk -1-2 k: sskk -5-12 w: mvqtkwwmcwwlkw -2-6 v: gvmlvv -12-13 p: ppppppppppppbp -3-4 r: frrrr -13-15 r: qrrrrrrrrbrrrrr -5-10 b: bxkbrbkdtwwrbkskjpc -4-5 x: bxrcx -12-15 f: ffffftjfffffffzfff -6-7 g: ggggggzgvxggg -10-11 w: kgwhvwwwwtcwp -9-10 j: jjjjjjjjpjj -5-12 t: pnbsttwccrtvttm -2-8 c: wcccccxfccnkvrllg -2-9 j: frddhfbkkj -9-11 m: mmmmmmmmtmmm -9-10 m: mmhmmmmmtm -2-4 r: crtr -14-15 v: vvvvvvvvvvvvvlrv -5-6 c: wccwctch -1-13 c: lcccccccccccfccc -12-15 x: zppxdwxtplfvzfxlwl -4-18 c: cccccccccccccccccc -2-3 c: xcccc -1-7 q: qvfbcfqx -6-9 k: lkbkhkkmsjlk -7-15 w: wwwwwwwwwwwwrwwwwwww -2-5 s: lscsssqsn -16-17 n: nnnnnnnnnnnnnnnnznnn -4-5 g: ggggggg -2-3 w: mfdw -4-5 r: rfrqh -3-7 f: vfpfbzf -8-9 j: jjjjjjjcbj -10-13 p: pppppzpppppppp -8-10 t: tntbgchftpttttttfttt -4-7 r: rlrbsmhnrqrbxrnlrm -13-17 m: vkmmmdhfkmtmgmxhk -9-11 t: ttttttttttt -16-17 g: gggggmgggfgggggsggvg -5-7 w: wpffgdw -3-7 r: rrzklzbmrrr -2-3 l: tllcqnlwfvlfmcgssg -3-4 q: qqqp -3-7 x: xnxxxzcxrqwx -7-18 s: shssssfwssssssksmss -1-4 r: rrrrmbc -2-6 t: tttdmsmtg -3-5 h: tmhbh -4-15 c: ccccccccccccccccr -8-10 v: vvvkvvvhvk -3-6 r: rsmzcrhqnxljrnnd -2-3 s: msss -10-18 w: wwwwwwwwwwwwwwwwwnw -11-13 j: hmwdjqjhjbfdrhj -5-17 x: hxpnccxhwlsxxdmxxd -4-5 t: ttznj -6-7 l: llllllqll -1-3 q: qsqnhqm -4-6 t: tdtttthc -16-17 x: xxxxkxxxxxlmxxvxfx -7-11 r: prtrxrprrrrr -5-7 j: mjjqjjg -3-8 l: rnllnklplllllllll -10-15 p: pppppppppdppppp -2-6 g: grgggx -3-4 s: ssqss -1-4 t: tttq -6-9 w: fxvvndkmwlskw -11-12 c: cccccccccccp -4-9 b: bbblbbbbbbbbbb -2-3 g: hggnbw -17-20 x: xxxpxxxxxxhxxxxxfxxx -1-2 f: bpvf -3-5 j: wjbfjw -13-19 m: srmmmmmmmmfhmgmmmqs -10-16 c: cccgcczcccccccbcfcct -11-15 b: bzpqpffbfqslknb -2-5 t: stnztmvjg -3-9 h: hqxhxxhhwh -2-4 r: rvrz -2-3 p: pppk -7-8 s: sskssjdss -5-9 x: xzvjjkmqzthpht -12-13 p: pstcvcjlnwsqphwnsr -3-15 p: lnfhbvnpmfztbqppcf -14-18 l: lllljllllllllllgld -4-5 g: gctggxhgpxkx -7-8 q: qqqqqqrdq -10-13 c: ccccccccccccc -4-9 s: sssnssskwsbfssssss -10-12 g: zgpgghbggjqgggkggjg -3-18 m: mmmmmmmmmmmmmmmmmkmm -1-3 z: jzzzz -1-4 k: fqqwmd -4-8 r: wzbrhxrw -2-13 x: fzvhrqwcrjjzxprnxlk -9-10 q: qqjqqqhqqr -4-10 g: mnlggbkdhrgtndk -4-19 w: wksmppsqrpppfkdzlrg -6-7 k: kkkkkxwkk -15-18 t: tttttttttttttthtttt -8-13 k: kkkkzkkvkkkktkkk -1-5 j: jjlqrwsjzkjbl -6-9 m: gmmmdmmmbmmdxmg -4-5 r: gdbfmxnrmc -3-4 h: rhhhh -2-8 n: nnnnnnnln -4-9 x: fxgwflwxblgnwxv -3-6 x: xmkxxvxxs -1-15 g: jgggggpgggggggpg -2-7 n: nwnnnnnn -2-4 r: hrwcr -5-8 x: tbbtxltxdsftztx -3-11 r: rzrwrdbqkhrbldrgph -2-10 j: jljxrjjxjv -17-18 b: bbbbbbwbbbbbbcbbtb -10-11 w: wwwjwwwwwrw -1-2 h: qbhh -2-3 r: rvjr -10-13 b: bfbbbjxbbjbbwblc -2-4 j: qjdt -4-5 j: jjjjjjbfjj -11-14 d: pssdgpplqjdzxr -4-8 x: zxgxfxjhjxgv -6-7 g: gdnhggz -3-14 f: fbfffsjffffffgfffff -2-7 f: qtxmpvfscrbgxfq -6-8 w: wwwwwlqwwswww -2-9 g: gbnwwncws -1-4 t: ttbctt -3-4 g: gggbl -5-8 h: hhhhhhhhh -9-16 n: nnnnnnnnnnnnnnnnn -3-4 x: xxxxxx -3-4 l: psgl -4-7 p: pppntst -4-13 m: mvdmnfnnpxjtmgnwgc -9-15 p: pprtppppwnphlhf -7-10 v: vlvvbvqtvp -11-15 k: jmckdsmvzptdslkkjqf -2-3 p: cwkf -8-9 r: rrrrmrrhhrr -7-8 h: vhhhhhhjh -4-5 z: zzhznzk -10-13 n: qnnnksnsnvnnnnt -1-4 m: jmmmmm -5-8 w: jpcmlxtwzvhww -10-12 k: kkkkkkkkkkkkk -11-14 g: ggggggrgmgggnhgggg -1-5 z: zzzwz -2-4 x: xxxxxxx -6-14 c: cccccvccccccckc -11-12 z: zzzkzzbzzcvz -13-18 p: pppppppppppppppppxpp -9-14 c: tcnphlfkczmcpc -7-8 n: wnzmjcnn -7-11 p: ppspppmdppp -2-6 w: wdwwwww -2-4 w: qzvw -8-9 j: njbvchssj -2-7 b: fnbbbnp -3-4 c: ccqv -1-5 x: xxqxdxx -3-9 w: wzwptwtwwwswbqmk -17-18 x: xxhplchxxxxxxxxxgm -4-5 g: fsggvmg -1-12 w: lwwwwwwwwwwwwwww -3-4 b: kbnvg -2-7 t: ztttmfftttrtttt -2-3 n: wqvnsn -1-6 z: qfddndzzg -15-17 z: nfzxdmgdvjzzpqdjt -1-5 g: mggglgggg -5-13 x: xxxxgxxxxxxxrxxb -12-13 x: xxxxxxxxxxxcx -5-6 r: prrvrrrrh -13-14 h: hhhhhhhlhhhhmz -8-10 j: jjjjjjnlbjhjzjljj -1-7 w: wwwwvwkwwb -4-5 h: hpshh -2-12 f: vhptghgvhqsf -16-17 w: wwwwwwwwwwwwwswzww -16-19 x: jltfxxfgkkxnnxjkrxz -3-13 s: ssfpvsssshssrxss -4-9 q: qsqqrqqqqjkqqkqv -9-11 h: djhvttnrjzh -2-3 j: jjjz -3-7 j: jtjqgmj -4-8 p: ppnpcpppspgpc -9-13 s: sssskslspdsnss -6-10 m: mxzlmmmpvgm -10-11 c: cccccccccwnc -6-8 f: klkqkthgzfbb -7-9 t: tttttttmx -2-13 r: nrlmjrhxwnjsrwfx -12-13 x: xthxxwpxsdxmj -3-11 r: nqgznrmqhcm -3-4 c: rqcxmgc -12-14 f: ffffffffrdfjffff -14-15 d: vdddxdddddddddddd -4-8 m: mmmcmkmmmmmkh -3-4 g: ggcggsm -7-10 p: pppppphppw -11-17 f: fffftfxbffffffffrff -1-18 f: ffffffffffffffffffff -4-6 x: mxnxkx -3-7 g: ggrlrmhggl -1-2 b: pbblqxtlztwcbt -4-5 c: ccccz -1-4 k: kqkhkkkk -9-12 v: vtvvgvvxvvvvv -3-4 g: ncgbnrvdbrm -9-12 t: tttttttttttttttt -14-17 c: crncccqdsjcclcxcmdw -8-10 h: hvhpghvhnfhhh -4-12 p: ppplpppppplnpppp -4-5 l: lrlllllnlllq -3-14 p: ppnppppppppppcpppppp -2-5 v: vmvvbv -6-7 v: vcvvvqvvvvvjvv -4-5 l: llllhl -5-12 h: hjhphkxhkcqh -6-7 f: fbskrlff -4-5 k: rkfnrk -1-4 q: tqqkqkqqcxq -6-7 p: pppppxp -1-2 f: fnfffffffffw -5-18 p: ppfpppppppppppppppp -1-5 d: dwndd -8-9 h: hhhhhhhhh -3-6 l: llllllllll -9-10 r: gvhwsfbckr -7-16 h: hhhhhhhhhhhhhhhhh -1-2 j: tjjlj -5-9 b: tsvwbmbvbk -1-8 r: vrrkbsrrrrkrrcrr -1-5 b: hbbbbbs -7-8 j: zgjwjcmnjjjljnvjjgj -11-15 z: zqzzzxvzzdmzzzzz -2-13 q: tqqnzjjxvcsvqksl -6-10 f: fqqczfhfmf -2-14 v: vcvvvvvvvvvvvvvv -1-5 c: kgcdcckbc -3-5 r: rrdrr -15-16 f: ffffffffffffffmbf -10-11 s: ssssssssssssxssnss -9-10 j: jjwjjjjjtkj -4-5 v: vfdvv -2-13 z: znkpztzzzzzzznlwzz -3-4 r: lrrm -15-16 n: nnnnnnnnnnnnnnsnn -6-12 n: nxnnxnnnpnnnnvn -4-8 q: lqsqdcqq -15-16 x: xxxxxxxxxmxxxxxtxrx -6-17 h: hhhhhhhhhhhhpjhhh -11-15 c: cccccjccccpcccc -11-12 r: rrmrhvzgrtrd -3-7 b: bwmbbblb -8-13 v: zlvhjhjhtwtkbxqqw -6-9 p: pppppfpppppk -2-5 r: rcrrjr -14-19 f: gfbrfsffprfffhrffzm -3-6 r: rrsrrtr -4-6 j: jjzjbz -1-4 l: jllnl -6-7 z: zzzzzppzzzzzz -17-18 h: xjvnmlhhnlxltrdltgr -2-14 z: xhtwcgngdxlzhnv -3-5 v: xvvrvvv -11-14 v: dnhpmxjvmwrknvvpr -8-17 w: vnwpmbbpmcwwgpwlwh -4-5 f: fffjl -13-16 v: vzvgvvvwvvvvvvvjvvgk -8-9 n: nnnnnknnn -18-19 g: gjgggkggggkxgpgdglh -2-4 t: ptkzwltkr -17-18 q: qbmbqqlqqjqqhtqfqq -3-6 r: rfkmhfd -4-7 h: fghxhhhh -4-5 s: spsxv -3-5 k: dkpkzkl -7-10 n: nzpnnnlnnsnnn -3-4 h: hhnh -19-20 r: rsrkmcrhkqfrfdqmlvxq -9-10 m: mmhmwmwmmvm -3-9 j: jdjjjjbjwjjjjjjjjjj -1-2 s: mpsscts -3-4 g: nghj -6-10 x: xxxxxnxxxhxx -10-13 t: tttttttttqttvtttt -12-13 s: nssssssnsjrss -7-9 z: hjkzxlzrczhhmm -16-17 s: sssssssssssssssfpsss -4-5 x: xxxxx -2-4 c: bppcccfwqs -4-11 w: wwwwwwwwwwwkw -6-8 m: hdxjhkpjdjmrql -2-19 k: zkhcfxztkgltmqbdqxj -1-3 n: gnqnnnnnrnnn -11-13 f: ffffffffgfmfkf -1-5 z: lwzkxzjzv -11-12 m: mhlxvjmrcffn -2-7 z: cqhbjlbzh -3-18 k: kdkkkfbkgwkdknkkkzjk -9-10 b: bbrbbbkcbbbbbzll -5-6 l: llplkl -9-15 c: vcgcngchvkvjsgcf -3-6 q: qqqqqwq -9-11 k: kxkjrpkkckkkkkskk -9-18 k: hbkrrwvctstksttkwrvf -2-3 j: jtjj -1-5 n: nnnnln -1-6 b: jpmbbbbqkd -5-7 w: wwkwwws -3-10 m: pxpwzblsvrlsxjpvpslt -11-12 j: ljjjjkjjjcmc -10-11 q: qqqqqqqqqqq -2-7 h: hqqhkbh -7-9 l: lllclmfslldrlsl -8-9 h: jhtvlvrhhhkhh -3-6 k: kkjkkkk -1-5 l: vllllc -1-2 q: vqqq -5-6 q: mkqhjp -7-14 l: lllllllrdlmlckll -3-4 k: kxkkrjk -6-8 l: pslrqlbl -1-8 t: gtzthtct -5-7 d: lhxkdrddf -2-3 h: hmhh -7-9 p: ppppvppppvwp -9-11 q: jhzvqqbqfnql -9-14 r: rrrrrrrrtrrrglrrz -11-12 s: shsssssssssbs -1-7 t: qtttttt -11-16 s: spgsmwbrshhldcsvvx -5-6 l: lkmlll -2-9 h: vdchgpmlhvxzjcp -4-7 k: xfkkkkkckmkk -1-3 w: wwww -13-14 c: cccccccgcwcccxdc -12-15 w: wrlwwxwwwlwwwfwcw -5-13 m: jmtjqmvkmpxdmt -7-11 m: nxnkxfgzcpfm -8-10 m: mmmmbhmmmk -11-13 z: khcksspxzwmznpl -6-7 x: xkxxcxj -8-11 s: sssrssssssss -6-12 h: wkzcnspbtjwchv -8-9 b: bbbbbbbkb -7-8 d: hxsjqfddxdb -15-16 g: gggggwgggggggggg -8-10 q: gqqzqmltqqlkqwtzgfn -11-16 j: kjsjjjjjjjckjjjj -2-4 s: vbfqcmgssqb -16-17 r: rrrrrrrrrrrrrrrrr -7-11 d: ddhdddrddtdd -2-3 x: gvpcx -4-10 t: mbftjndbttv -13-14 j: zjjfmsgqtgwdhd -6-11 s: qlqhssgsbvnsts -9-15 t: ttdttttvttttqttvs -3-6 l: lcvlll -3-5 x: mpdsxrhqlbcdx -1-4 q: kjqz -2-3 p: pncmptpppgp -2-6 l: tlbvnpllvxlgxhn -14-17 q: lgdsvqxwmhdwzhjsq -13-19 m: mmmmzmmsmmmmmmmmmmc -4-5 x: xxxxzl -2-4 n: nnrn -8-9 n: nnnnnnnns -11-14 l: bpmrcbhslcmxxv -7-12 p: ppmpvpppppkpfpp -4-10 k: kkkqkkkkkfkkkkk -8-11 s: sssfssssnssssss -8-16 l: xklrjlllrqlxhrkl -2-12 r: rrcrqrprhcrrrvrph -14-15 h: jrhhjhhhhhhzhmp -8-12 m: mmmmmcmmvwmmx -2-9 f: ffdffffmfqpffffffff -8-12 x: xxxxxxxgxxxr -5-6 z: zzzzzxz -14-17 j: jjjjjjjjjjjjjzjjs -1-3 f: qfjmrf -6-7 t: ttbttdq -8-9 x: xfxxxxxxxxbxxxq -4-6 q: qqpgwqbr -5-12 l: lqzqrtgjmzml -5-7 w: wwwnwjwwfw -5-6 x: znxdtx -4-5 x: qqxhvmxxxxz -1-5 n: nnnnnn -2-5 s: gxsnj -5-7 s: gssjssszst -9-14 h: zjhrdpjwhkppdf -2-8 t: ftgttpcttxtvnttntjs -1-4 t: lttl -8-10 f: fffffffffrf -3-6 q: qvqxrhd -9-10 j: zrfxvmhgzcnkthzs -5-7 q: rqtqxqq -2-4 j: jxnj -7-8 c: fccccczkc -1-2 x: xktx -5-6 t: tttqkt -3-4 m: crbhwmq -5-7 d: ddddhdcd -3-4 w: wwcn -2-7 d: dmdddcd -6-7 l: llzllfg -5-8 l: llxllllllf -3-4 s: lspsb -1-6 k: kkkkkdk -6-12 x: ztxxmxxqxrxxxcxx -5-12 p: fpngpxprbqhprvj -1-11 k: kvkkkkkkkkkkkkkkk -2-11 x: qxxnxxxxxxxmxfxjsg -12-14 r: wzrrfztrbrrrztgrgrm -1-4 r: rbrlrj -14-16 d: dddddddddddddsddd -8-15 l: lzllmllclllljlll -7-8 l: qkgqklzzllqclqlfjl -1-4 g: vggggg -12-13 c: krbpskrctrvtc -3-6 t: btttttmkt -8-12 t: tttttttttttltttt -10-16 k: kkkkkqkkkkkkkkkw -5-6 d: ddldvkd -10-14 v: vvbrvvvkbvgvvr -4-13 v: vvvcvvqcvflrph -7-17 x: qxfxxxxvzslqzzbcx -9-10 g: ggggggggvjggggggggg -3-4 p: hpppkp -1-3 s: lstcssssv -4-6 n: nnnsnmnnn -2-6 k: kkkknkvkg -1-2 c: cccccc -8-13 h: hhhhhhhhhzhhv -10-13 h: hwvhhhhjhhthhhhlxh -15-18 p: pzpgpppppgpxpppbppnp -10-11 n: nffrjnmbnxj -5-9 l: lllldrllbzljsw -4-8 j: jjmjjjrjsjjjjj -2-9 v: vtzlvvdjv -2-3 g: ggcf -9-15 b: psxgbbcjbbhbntb -15-16 q: qqqqqqqqqqqqqqqz -11-12 c: dvgckwdtcccc -5-11 s: nskssssssfwb -2-7 p: pdfdnpqppzpp -3-7 d: dcdwnmdgnstt -13-14 w: hwdsrqmdmxhlkm -5-7 l: lzzdzlvrtgzllcn -5-6 t: bttttvt -6-8 c: crcczxckcc -5-7 g: gmvgggg -7-9 g: gggggglgqgg -5-6 t: ttttrt -2-3 g: sntggpm -4-6 m: flmmsm -9-12 w: wwwwwwwwwwjw -6-13 x: cfxrwlljbnzlb -13-16 v: wvfcgrgfvggjcbqv -7-8 n: sdnrsnhn -1-3 q: qqqrqmjfq -4-6 s: bzdsslss -1-5 f: rfffcf -4-5 s: sssss -4-5 h: xhkhhh -10-11 g: ggjdgpvggggx -9-10 v: vvvvvvvvjvvvjvwvv -3-7 b: fbbmzbblqzvfgpnrl -6-11 h: hhhhhlhhhhchhhhh -3-4 l: llllstmhwlchzd -3-7 t: xthsjgtcblcszn -2-17 f: kfjwdtmhzjzlvhpjf -2-5 b: rbtbg -9-15 z: mzzzcfzzzwvtzqgbzjzm -6-12 f: qgtzmktjffmfn -11-17 f: flcffsqwlfjvbcffb -5-6 r: gsdrrr -13-14 b: bbbbbbnbbbnbbbbbsb -2-9 b: bcbrvbvbbbzb -3-5 t: tkttft -6-7 v: vcvlqvdcvdh -7-13 w: wwwxwwwwhwwwlqwh -5-6 z: zkhpzzjtnkjzf -7-9 p: pppppppppppkppppp -4-7 p: spppfjmc -8-9 k: sxnkplwfz -4-5 r: clpgrr -7-8 m: mmmntmmmpmmmmrmpk -4-5 j: jxbjnxj -3-10 b: jwbclnqzdbnb -5-6 r: rxbxlnsmrrfr -3-4 f: fvfsbq -2-4 x: sxxxd -7-8 p: qpppppprpp -3-4 q: qqqq -6-8 n: njwgnqntnnn -6-10 z: zdzzgzzzzj -6-9 d: rwdlfdrtd -5-6 l: skllpxslll -5-7 d: dwdznhddttljdnvkdws -1-3 d: dhdc -1-11 s: sqgzsrrvgms -8-14 w: wvvwrwwlwwmwwwn -11-12 t: ttbttttttttttttt -17-18 f: lfffffmfffffffffkff -17-19 k: kkkmzkkkrkfspllkckb -4-7 f: fxfjtdfcxff -4-10 h: hhhrhhhhhhhhhh -6-7 p: ppkpppppp -5-10 c: hccpcgbkbctctp -5-11 l: llllvljllltlllplll -5-6 c: kcntkj -16-18 m: mmxmmmmmmmlmmmmwmmm -4-7 b: bbvbbrbb -6-7 n: dbrqnnn -3-4 h: hhhht -11-13 s: sssssssssvlwxsfj -3-9 g: zrsdrgrzgghxj -14-15 f: ffzgnqfrclzgxfffff -7-8 c: cccccccbc -5-8 s: ssssssssss -8-15 k: klkkkppksvdrknd -4-6 h: hfhhjljh -8-15 c: cxljcccvhpklxcr -3-7 h: kpnttrczt -14-16 p: tqxpdpddrwfxgjvc -12-15 j: cjjjmwjdbtpwjmjcg -11-17 n: nnnnnnnnnnnnnnnnln -1-8 s: sssswsms -9-10 w: wwwwwwwwww -6-16 v: gvfjvvvvvqlsbrvvd -3-8 q: rvfnrfvsmjk -4-6 w: wvpwtww -7-10 c: xcctfssplcdqrpqs -4-10 j: mjcjjwvjwjm -7-11 w: qmwjfrjpjkqww -6-18 r: qvvthtbxlkrnvqzvlf -10-12 f: ffglffjffffctfffff -6-7 x: xxhxtfpqxxx -9-10 t: tttttttxtt -3-10 j: cpqxwljhgjldfns -15-16 q: mqqnqfqjfqqqzqqt -4-12 f: fffffffffffvf -4-10 s: ssssssszst -1-6 x: xgxxxxxxkx -2-4 z: zzzb -11-13 j: jjjjjjjjjjjjv -1-2 j: hjjd -4-12 h: hhljhhxhxnhr -6-10 b: bbbbbkbbbv -7-8 m: mmmmmmgvmm -9-15 h: hhhhhhhhwhhhwhhh -1-2 g: gvglg -4-10 v: gkbvgntvrvv -9-10 p: mjpppbppnpjv -1-3 w: wwwtww -1-7 v: vmvsgjdfdpwtvqqfsh -10-12 c: ccccccccclmcccjc -13-14 g: gggggglgrggqzgggvbgg -1-6 p: mhptnp -10-11 n: nnnnnnjnnpxxn -2-5 l: tllcc -13-14 j: zbvlwljjgljwjj -10-11 p: ppppppvpppjppvp -12-18 c: cccccccccctdccccch -15-16 j: jjjjjjjjjjjjrjjj -5-8 t: gjkttztjt -5-9 k: kjkhwdvkk -5-7 p: pjvpppp -2-4 w: wwwhwlwwm -4-5 m: mmljm -6-15 b: rbbncbrvmdvbbqb -13-15 n: nnnrnnpdfnnqnnncnfnn -2-11 r: srfhtxczprbx -3-6 n: nnnnnh -15-16 v: vvvvvrvvvvvvvvvvr -7-8 m: jphmmmmft -4-6 p: pppjpvp -1-4 g: dggkgg -1-2 p: zppsp -6-7 b: bbbbbbbbbbb -3-4 x: vxsv -9-13 t: pqtqttttkxtghv -10-19 v: vvvvvvvvvvvvvvvvvvxv -6-13 z: wnmzkzzqftzmc -6-13 l: vklgsrjrkjpzlqll -3-6 h: mwhllh -1-8 l: blllllltl -3-9 v: glxlzpffvgvmb -2-5 s: sssstss -3-9 t: tfptcrhtlzqxcv -9-10 t: ttttttttttjttt -9-14 h: ktwphtsnkmlzwd -3-5 z: zzznz -2-3 t: twtt -3-5 f: ffffsf -17-18 w: wwhwwwwwvwwwwwwwnsw -3-13 w: wwwwwwwvhwwwwpwww -7-8 n: pjnxnnnntpwnbsjnnz -2-4 v: vvvjhvv -2-9 d: dmddwcpnqdddszpb -3-4 q: qqrqqh -1-2 d: czdd -1-4 d: xsdzrms -1-3 n: znxnnn -5-7 r: rrrrnrzrr -2-5 c: ccccxcc -6-7 c: nccccdc -1-4 s: bslsrvgjdfsgf -10-11 j: jcjnjjpjlhh -8-12 k: lzrvvhtkkpbkfwjzcmz -10-13 b: bbbbbbbrsnbbmb -2-9 s: hswtzhlss -6-7 j: cpnjjjf -11-15 p: pgppqsfjcpbnmqp -4-6 k: kkkfwq -10-11 c: rccccccccccccc -5-14 d: bmfppdgvccmbdqpx -7-8 v: vqnvvqvvvvjvv -7-16 f: ffffffkfffffffffff -14-15 r: nbdlfkrbcrxbcts -13-14 v: vvfvvvvvzgvvvvmvv -1-12 l: glwdllllpllltll -3-9 x: mnxpljmxnm -4-5 h: rjqhbxnvkc -13-14 z: zzjzkzzlcbzpjzzz -2-6 p: tnpppp -8-12 n: kpjfjwpnwlzqhwbz -2-15 q: jqkjkbzcwvvqbxq -2-3 l: llllll -15-19 l: llllllllllfllllllll -1-3 p: pkzkpsvdptz -1-8 f: fffffffvfrf -1-11 j: prdqjlhjdvljjvjmhnm -10-16 v: stshngzvzvvvnffv -10-11 m: nmmtmqmmmmb -4-9 t: nzttkfcvrnd -18-20 t: bbttltktrgtntgtzhtct -4-6 p: pppglp -7-13 g: vgrccggpbvxgl -5-7 l: lqllvld -7-10 w: wswwwwqrww -7-8 c: cncczcmlcmcx -1-9 d: ggjtdddcqcmpd -4-7 q: vdkqwnqkbsdqxwwth -5-6 s: ptjwxsz -7-14 v: vvgbvtvvxvzvwvvc -4-8 h: tmjhhrndwlh -6-7 w: wwjvswf -2-9 v: vvvvvvvmv -2-4 c: hcgc -2-3 x: xxxx -6-15 h: vnbhwhhwtzztrlh -13-16 k: kkknkkkkkkkkkkkrkk -2-7 b: nbfxslbqblbbbbbbl -9-11 k: kkrqkzkkkvkshqkbkkhk -9-13 j: qjjjjjjvmrjjjjjjjj -7-15 h: zhqhhhjbhdhhmhfn -3-5 t: vtvstkkttftttt -7-8 h: hdhhhqhhnnfqwhzhdlsx -16-19 k: kkkkkkkkkkkkkkkfkkd -3-4 f: qfjsxfnsfq -13-14 t: ttjftttcttttptttt -8-9 f: gjmfffgrq -9-10 m: mmpmmljmmmmmm -9-10 k: skttkrjkkb -3-4 k: kkgk -1-6 h: vhhhhvhh -11-19 z: zzhzzzzzzzzvznzzzzgz -9-11 z: mzzzzzzlzzbz -7-16 c: tpcwtwcbljrnztwrsdd -13-15 b: hnrbfgqwqwqhpnc -2-4 g: fgsdg -2-3 k: kklkkqkhklkkqb -8-9 g: tgrfdbvgfzqvsf -3-12 j: jmjvwqrpsjvc -4-10 v: zvhjvtpjgvvd -5-6 p: fgplzd -9-13 r: csngrmrxrqvhdwfkvns -7-13 q: qqqqqqqqqqqqqqqqq -11-16 l: cvlxgkdmltldzsplzz -8-11 z: znmhzzcpbzz -13-14 x: xxxxxxxxxxxxxhxx -11-20 c: qmhcvthqctdtscfcjcck -14-15 l: lnllllslwjlllll -5-7 p: qppptqm -1-7 f: chffvqfrdffbcmqf -8-14 h: hhhbhhrshhphhl -16-19 j: tgsjqjwjjjbcjtjjjjj -3-4 p: jzppdrzpkgcxdljgm -5-6 z: zzzzgzzz -3-8 t: nvzdttst -4-6 x: qfkznxh -9-18 d: ddddddddzddddddddl -11-17 x: xcxrxxxxxqzrxxxxxxx -3-4 l: lmll -10-13 f: fffffffffffffff -7-9 v: mccgvfvlh -9-10 m: ddmlmtmgmmgmprmbmpqm -5-10 v: vvvvjvvvvvvvvvx -3-10 v: dwxdfjhxgsznhzqsqnd -1-3 k: xkrkkkkkkmp -2-5 c: dcrscf -1-10 p: ppwpwppppppljtppr -3-7 r: rrrrrrbrdr -5-9 t: ttttjtttttttttt -4-5 w: wwwxr -6-11 f: rtwzsffhxplnwrzpwwj -3-9 c: klcdzfchcnxcccnccpc -3-4 g: mgnlg -1-5 f: kffgpffft -3-4 l: qlsvllnl -2-5 w: vwwwwwwrf -11-12 n: qcgnnznfnmnt -6-13 d: rbbzghqwwmrdkssgn -1-3 x: hdxnqxtphtmk -10-13 w: xwwwxwcwrfcwm -9-10 p: tpppfxvbppppgpnvfzcv -8-13 h: nhqhqhthmpmnhlch -11-13 z: hjkftzgzlfhjjh -9-10 t: tttthttpzt -2-8 g: vghggdbfggrfggrgggrt -11-16 g: gjzgfnggggsgggzh -6-10 r: srmjvrrrlrrrhrl -2-11 d: ddddddddbddddd -5-6 j: jjfjjjj -8-11 s: ssssssssssqssmssss -4-5 v: vvvhp -5-7 c: ccqxvklbc -8-9 q: qnqfgqvqqqdwzqmcq -3-5 q: zbqqq -6-9 g: kkgzgwpvgt -1-14 h: hhhhhhhhhhhhhhh -9-10 w: swwwwwwwjq -1-13 j: xjwjjljjjjdjjjjmjj -11-13 m: smmhmmcmmmkmdmmmmm -15-17 p: ppppppppppppppsps diff --git a/2/part1.c b/2/part1.c deleted file mode 100644 index 11d955b..0000000 --- a/2/part1.c +++ /dev/null @@ -1,41 +0,0 @@ -#include -#include -#include -#include - -bool is_valid_password(char *pass, char *policy) -{ - int min = atoi(policy); - char *minP = strchr(policy, '-'); - int max = atoi(++minP); - char c = *(strchr(minP, ' ') + 1); - char *p = pass; - int occ = 0; - do { - if (*p == c) { - occ++; - } - } while (*++p); - - return occ >= min && occ <= max; -} - -int main(int argc, char *argv[]) -{ - FILE *file = fopen(argv[argc - 1], "r"); - if (!file) { - return 1; - } - - char buffer[128] = { 0 }; - int valid = 0; - while (fgets(buffer, 128, file)) { - if (is_valid_password(strchr(buffer, ':') + 2, buffer)) { - valid++; - } - } - - fclose(file); - - printf("%i", valid); -} diff --git a/2/part2.c b/2/part2.c deleted file mode 100644 index 7a2e16e..0000000 --- a/2/part2.c +++ /dev/null @@ -1,34 +0,0 @@ -#include -#include -#include -#include - -bool is_valid_password(char *pass, char *policy) -{ - int pos1 = atoi(policy) - 1; - char *minP = strchr(policy, '-'); - int pos2 = atoi(++minP) - 1; - char c = *(strchr(minP, ' ') + 1); - - return (pass[pos1] == c) != (pass[pos2] == c); -} - -int main(int argc, char *argv[]) -{ - FILE *file = fopen(argv[argc - 1], "r"); - if (!file) { - return 1; - } - - char buffer[128] = { 0 }; - int valid = 0; - while (fgets(buffer, 128, file)) { - if (is_valid_password(strchr(buffer, ':') + 2, buffer)) { - valid++; - } - } - - fclose(file); - - printf("%i", valid); -} diff --git a/2020/01/part1.c b/2020/01/part1.c new file mode 100644 index 0000000..1b825df --- /dev/null +++ b/2020/01/part1.c @@ -0,0 +1,38 @@ +#include +#include +#include +#include + +#define INPUT_LEN 200 + +int repair(const int * arr) +{ + for (int i = 0; i < INPUT_LEN; i++) { + for (int j = 0; j < INPUT_LEN; j++) { + if (arr[i] + arr[j] == 2020) { + return arr[i] * arr[j]; + } + } + } + + return 0; +} + +int main(int argc, char *argv[]) +{ + FILE *file = fopen(argv[argc - 1], "r"); + if (!file) { + return 1; + } + + char buffer[8] = { 0 }; + int input[INPUT_LEN] = { 0 }; + for (int i = 0; i < 200; i++) { + fgets(buffer, 8, file); + input[i] = atoi(buffer); + } + + fclose(file); + + printf("%i", repair(input)); +} diff --git a/2020/01/part1.f90 b/2020/01/part1.f90 new file mode 100644 index 0000000..a7c09c8 --- /dev/null +++ b/2020/01/part1.f90 @@ -0,0 +1,25 @@ +program day1 + implicit none + + integer, parameter :: input_len = 200 + integer, parameter :: search = 2020 + + integer :: i, j + integer, dimension(input_len) :: input + + open(10, file='input', status='old') + do i = 1, input_len + read(10, *) input(i) + end do + close(10) + + do i = 1, input_len + do j = 1, input_len + if (input(i) + input(j) == search) then + print *, input(i) * input(j) + stop + end if + end do + end do + +end program day1 diff --git a/2020/01/part2.c b/2020/01/part2.c new file mode 100644 index 0000000..9c10b61 --- /dev/null +++ b/2020/01/part2.c @@ -0,0 +1,40 @@ +#include +#include +#include +#include + +#define INPUT_LEN 200 + +int repair(const int *arr) +{ + for (int i = 0; i < INPUT_LEN; i++) { + for (int j = 0; j < INPUT_LEN; j++) { + for (int k = 0; k < INPUT_LEN; k++) { + if (arr[i] + arr[j] + arr[k] == 2020) { + return arr[i] * arr[j] * arr[k]; + } + } + } + } + + return 0; +} + +int main(int argc, char *argv[]) +{ + FILE *file = fopen(argv[argc - 1], "r"); + if (!file) { + return 1; + } + + char buffer[8] = { 0 }; + int input[INPUT_LEN] = { 0 }; + for (int i = 0; i < 200; i++) { + fgets(buffer, 8, file); + input[i] = atoi(buffer); + } + + fclose(file); + + printf("%i", repair(input)); +} diff --git a/2020/01/part2.f90 b/2020/01/part2.f90 new file mode 100644 index 0000000..b3d6bd2 --- /dev/null +++ b/2020/01/part2.f90 @@ -0,0 +1,27 @@ +program day1 + implicit none + + integer, parameter :: input_len = 200 + integer, parameter :: search = 2020 + + integer :: i, j, k + integer, dimension(input_len) :: input + + open(10, file='input', status='old') + do i = 1, input_len + read(10, *) input(i) + end do + close(10) + + do i = 1, input_len + do j = 1, input_len + do k = 1, input_len + if (input(i) + input(j) + input(k) == search) then + print *, input(i) * input(j) * input(k) + stop + end if + end do + end do + end do + +end program day1 diff --git a/2020/01/part2_fast.c b/2020/01/part2_fast.c new file mode 100644 index 0000000..c32f881 --- /dev/null +++ b/2020/01/part2_fast.c @@ -0,0 +1,127 @@ +#include +#include +#include +#include + +#define INPUT_LEN 200 +#define SEARCH 2020 + +#ifdef USE_ASM +int repair_avx_inner(const int *arr, __m256i search); +#else +int repair_avx_inner(const int *arr, __m256i search) +{ + for (int k = 0; k < INPUT_LEN; k += 8) { + __m256i new = _mm256_loadu_si256((__m256i *)(&arr[k])); + if (_mm256_movemask_epi8(_mm256_cmpeq_epi32(new, search))) { + return _mm256_extract_epi32(search, 0); + } + } + + return 0; +} +#endif + +int repair_avx(const int *arr) +{ + __m256i search = _mm256_set1_epi32(SEARCH); + for (int i = 0; i < INPUT_LEN; i++) { + __m256i start = _mm256_set1_epi32(arr[i]); + for (int j = 0; j < INPUT_LEN; j += 8) { + __m256i new = _mm256_loadu_si256((__m256i *)(&arr[j])); + new = _mm256_add_epi32(start, new); + unsigned int mask = (unsigned int)_mm256_movemask_epi8(_mm256_cmpgt_epi32(new, search)); + if (mask == 0xffffffff) { + continue; + } + + switch (__lzcnt32(mask) / 4) { + case 0: + { + __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(7))); + int tmp = repair_avx_inner(arr, cmp); + if (tmp) { + return tmp * arr[i] * arr[j + 7]; + } + } + case 1: + if ((mask & 0x0f000000) == 0) { + __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(6))); + int tmp = repair_avx_inner(arr, cmp); + if (tmp) { + return tmp * arr[i] * arr[j + 6]; + } + } + case 2: + if ((mask & 0x00f00000) == 0 ){ + __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(5))); + int tmp = repair_avx_inner(arr, cmp); + if (tmp) { + return tmp * arr[i] * arr[j + 5]; + } + } + case 3: + if ((mask & 0x000f0000) == 0) { + __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(4))); + int tmp = repair_avx_inner(arr, cmp); + if (tmp) { + return tmp * arr[i] * arr[j + 4]; + } + } + case 4: + if ((mask & 0x0000f000) == 0) { + __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(3))); + int tmp = repair_avx_inner(arr, cmp); + if (tmp) { + return tmp * arr[i] * arr[j + 3]; + } + } + case 5: + if ((mask & 0x00000f00) == 0) { + __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(2))); + int tmp = repair_avx_inner(arr, cmp); + if (tmp) { + return tmp * arr[i] * arr[j + 2]; + } + } + case 6: + if ((mask & 0x000000f0) == 0) { + __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(1))); + int tmp = repair_avx_inner(arr, cmp); + if (tmp) { + return tmp * arr[i] * arr[j + 1]; + } + } + case 7: + if ((mask & 0x0000000f) == 0) { + __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_setzero_si256())); + int tmp = repair_avx_inner(arr, cmp); + if (tmp) { + return tmp * arr[i] * arr[j]; + } + } + } + } + } + + return 0; +} + +int main(int argc, char *argv[]) +{ + FILE *file = fopen(argv[argc - 1], "r"); + if (!file) { + return 1; + } + + char buffer[8] = { 0 }; + int input[INPUT_LEN] = { 0 }; + for (int i = 0; i < 200; i++) { + fgets(buffer, 8, file); + input[i] = atoi(buffer); + } + + fclose(file); + + printf("%i\n", repair_avx(input)); +} diff --git a/2020/01/repair_avx.asm b/2020/01/repair_avx.asm new file mode 100644 index 0000000..4f128f6 --- /dev/null +++ b/2020/01/repair_avx.asm @@ -0,0 +1,21 @@ +global repair_avx_inner + +section .text + +repair_avx_inner: +%assign i 0 +%rep 25 + vpcmpeqd ymm1, ymm0, [rdi + i] +; vptest ymm1, ymm1 ; slower then vpmovmskb + test + vpmovmskb eax, ymm1 + test eax, eax + jne .found +%assign i i+32 +%endrep + xor eax, eax ; not found, return 0 + vzeroupper ; eliminate performance penalties caused by false dependencies when transitioning between AVX and legacy SSE instructions + ret +.found: + vzeroupper ; eliminate performance penalties caused by false dependencies when transitioning between AVX and legacy SSE instructions + movd eax, xmm0 ; smaller then putting a vmovd before the vzeroupper and no measurable performance difference + ret diff --git a/2020/02/part1.c b/2020/02/part1.c new file mode 100644 index 0000000..11d955b --- /dev/null +++ b/2020/02/part1.c @@ -0,0 +1,41 @@ +#include +#include +#include +#include + +bool is_valid_password(char *pass, char *policy) +{ + int min = atoi(policy); + char *minP = strchr(policy, '-'); + int max = atoi(++minP); + char c = *(strchr(minP, ' ') + 1); + char *p = pass; + int occ = 0; + do { + if (*p == c) { + occ++; + } + } while (*++p); + + return occ >= min && occ <= max; +} + +int main(int argc, char *argv[]) +{ + FILE *file = fopen(argv[argc - 1], "r"); + if (!file) { + return 1; + } + + char buffer[128] = { 0 }; + int valid = 0; + while (fgets(buffer, 128, file)) { + if (is_valid_password(strchr(buffer, ':') + 2, buffer)) { + valid++; + } + } + + fclose(file); + + printf("%i", valid); +} diff --git a/2020/02/part2.c b/2020/02/part2.c new file mode 100644 index 0000000..7a2e16e --- /dev/null +++ b/2020/02/part2.c @@ -0,0 +1,34 @@ +#include +#include +#include +#include + +bool is_valid_password(char *pass, char *policy) +{ + int pos1 = atoi(policy) - 1; + char *minP = strchr(policy, '-'); + int pos2 = atoi(++minP) - 1; + char c = *(strchr(minP, ' ') + 1); + + return (pass[pos1] == c) != (pass[pos2] == c); +} + +int main(int argc, char *argv[]) +{ + FILE *file = fopen(argv[argc - 1], "r"); + if (!file) { + return 1; + } + + char buffer[128] = { 0 }; + int valid = 0; + while (fgets(buffer, 128, file)) { + if (is_valid_password(strchr(buffer, ':') + 2, buffer)) { + valid++; + } + } + + fclose(file); + + printf("%i", valid); +} diff --git a/2020/03/part1.c b/2020/03/part1.c new file mode 100644 index 0000000..b664b7d --- /dev/null +++ b/2020/03/part1.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include + +#define INC_RIGHT 3 + +int count_trees(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[64] = { 0 }; + // Start is always safe + fgets(buffer, 64, file); + // strlen includes the newline + int width = strchr(buffer, '\n') - buffer; + + int pos = INC_RIGHT; + int hit = 0; + while (fgets(buffer, 64, file)) { + if (buffer[pos] == '#') { + hit++; + } + + pos = (pos + INC_RIGHT) % width; + } + + fclose(file); + + return hit; +} + +int main(int argc, char *argv[]) +{ + printf("%i", count_trees(argv[argc - 1])); +} diff --git a/2020/03/part2.c b/2020/03/part2.c new file mode 100644 index 0000000..bae8654 --- /dev/null +++ b/2020/03/part2.c @@ -0,0 +1,41 @@ +#include +#include +#include +#include + +int count_trees(int inc_right, int inc_down, const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[64] = { 0 }; + // Start is always safe + fgets(buffer, 64, file); + // strlen includes the newline + int width = strchr(buffer, '\n') - buffer; + + int pos = inc_right; + int hit = 0; + for (int i = 1; fgets(buffer, 64, file); i++) { + if (inc_down != 1 && i % inc_down != 0) { + continue; + } + + if (buffer[pos] == '#') { + hit++; + } + + pos = (pos + inc_right) % width; + } + + fclose(file); + + return hit; +} + +int main(int argc, char *argv[]) +{ + char *arg = argv[argc - 1]; + long mul = (long)count_trees(1, 1, arg) * count_trees(3, 1, arg) * count_trees(5, 1, arg) * count_trees(7, 1, arg) * count_trees(1, 2, arg); + printf("%li\n", mul); +} diff --git a/2020/04/part1.c b/2020/04/part1.c new file mode 100644 index 0000000..b4a3b8e --- /dev/null +++ b/2020/04/part1.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include + +bool is_valid_passport(const char *pass) +{ + return strstr(pass, "byr:") + && strstr(pass, "iyr:") + && strstr(pass, "eyr:") + && strstr(pass, "hgt:") + && strstr(pass, "hcl:") + && strstr(pass, "ecl:") + && strstr(pass, "pid:"); +} + +int count_valid_passports(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[128] = { 0 }; + + bool has_byr = false; + bool has_iyr = false; + bool has_eyr = false; + bool has_hgt = false; + bool has_hcl = false; + bool has_ecl = false; + bool has_pid = false; + int correct = 0; + while (fgets(buffer, 128, file)) { + if (buffer[0] == '\n') { + if (has_byr && has_iyr && has_eyr && has_hgt && has_hcl && has_ecl && has_pid) { + correct++; + } + + has_byr = false; + has_iyr = false; + has_eyr = false; + has_hgt = false; + has_hcl = false; + has_ecl = false; + has_pid = false; + } + + has_byr = has_byr || strstr(buffer, "byr:"); + has_iyr = has_iyr || strstr(buffer, "iyr:"); + has_eyr = has_eyr || strstr(buffer, "eyr:"); + has_hgt = has_hgt || strstr(buffer, "hgt:"); + has_hcl = has_hcl || strstr(buffer, "hcl:"); + has_ecl = has_ecl || strstr(buffer, "ecl:"); + has_pid = has_pid || strstr(buffer, "pid:"); + } + + if (has_byr && has_iyr && has_eyr && has_hgt && has_hcl && has_ecl && has_pid) { + correct++; + } + + fclose(file); + + return correct; +} + +int main(int argc, char *argv[]) +{ + printf("%i", count_valid_passports(argv[argc - 1])); +} diff --git a/2020/04/part2.c b/2020/04/part2.c new file mode 100644 index 0000000..5aac219 --- /dev/null +++ b/2020/04/part2.c @@ -0,0 +1,135 @@ +#include +#include +#include +#include +#include + +#define KEYS_LEN 7 +const char* const keys[] = { "byr:", "iyr:", "eyr:", "hgt:", "hcl:", "ecl:", "pid:" }; + +bool is_valid_field(const char *key, const char *value) +{ + if (strncmp(key, "byr", 3) == 0) { + int v = atoi(value); + return v >= 1920 && v <= 2002; + } + + if (strncmp(key, "iyr", 3) == 0) { + int v = atoi(value); + return v >= 2010 && v <= 2020; + } + + if (strncmp(key, "eyr", 3) == 0) { + int v = atoi(value); + return v >= 2020 && v <= 2030; + } + + if (strncmp(key, "hgt", 3) == 0) { + int v = atoi(value); + if (strncmp(value + 3, "cm", 2) == 0) { + return v >= 150 && v <= 193; + } + + if (strncmp(value + 2, "in", 2) == 0) { + return v >= 59 && v <= 76; + } + + return false; + } + + if (strncmp(key, "hcl", 3) == 0) { + if (value[0] != '#') { + return false; + } + + for (int i = 1; i < 7; i++) { + if (!(value[i] >= 48 && value[i] <= 57) && !(value[i] >= 97 && value[i] <= 102)) { + return false; + } + } + + return true; + } + + if (strncmp(key, "ecl", 3) == 0) { + return strncmp(value, "amb", 3) == 0 + || strncmp(value, "blu", 3) == 0 + || strncmp(value, "brn", 3) == 0 + || strncmp(value, "gry", 3) == 0 + || strncmp(value, "grn", 3) == 0 + || strncmp(value, "hzl", 3) == 0 + || strncmp(value, "oth", 3) == 0; + } + + if (strncmp(key, "pid", 3) == 0) { + for (int i = 0; i < 9; i++) { + if (!(value[i] >= 48 && value[i] <= 57)) { + return false; + } + } + + return !(value[9] >= 48 && value[9] <= 57); + } + + return false; +} + +bool is_valid_passport(const char *pass) +{ + for (int i = 0; i < KEYS_LEN; i++) { + const char *p = strstr(pass, keys[i]); + if (!p) { + return false; + } + + if (!is_valid_field(p, p + 4)) { + return false; + } + } + + return true; +} + +int count_valid_passports(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[128] = { 0 }; + + uint8_t values = 0; + int correct = 0; + while (fgets(buffer, 128, file)) { + if (buffer[0] == '\n') { + if (values == 0x7f) { + correct++; + } + + values = 0; + } + + for (int i = 0; i < KEYS_LEN; i++) { + const char *p = strstr(buffer, keys[i]); + if (!p) { + continue; + } + + if (is_valid_field(p, p + 4)) { + values = values | (0x1 << i); + } + } + } + + if (values == 0x7f) { + correct++; + } + + fclose(file); + + return correct; +} + +int main(int argc, char *argv[]) +{ + printf("%i", count_valid_passports(argv[argc - 1])); +} diff --git a/2020/05/part1.c b/2020/05/part1.c new file mode 100644 index 0000000..ca726b7 --- /dev/null +++ b/2020/05/part1.c @@ -0,0 +1,82 @@ +#include + +#define COLUMNS 8 +#define ROWS 128 + +int seat_id(const char *seat) +{ + int row = 0; + int row_lower = 0; + int row_upper = ROWS - 1; + int column = 0; + int column_lower = 0; + int column_upper = COLUMNS - 1; + int i = 0; + for (; i < 6; i++) { + switch (seat[i]) { + case 'F': + row_upper -= (row_upper - row_lower + 1) / 2; + break; + case 'B': + row_lower += (row_upper - row_lower + 1) / 2; + break; + } + } + + switch (seat[i++]) { + case 'F': + row = row_lower; + break; + case 'B': + row = row_upper; + break; + } + + for (; i < 9; i++) { + switch (seat[i]) { + case 'L': + column_upper -= (column_upper - column_lower + 1) / 2; + break; + case 'R': + column_lower += (column_upper - column_lower + 1) / 2; + break; + } + } + + switch (seat[i++]) { + case 'L': + column = column_lower; + break; + case 'R': + column = column_upper; + break; + } + + return row * COLUMNS + column; +} + +int highest_seat_id(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[16] = { 0 }; + + int max = 0; + + while (fgets(buffer, 16, file)) { + int tmp = seat_id(buffer); + if (tmp > max) { + max = tmp; + } + } + + fclose(file); + + return max; +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", highest_seat_id(argv[argc - 1])); +} diff --git a/2020/05/part2.c b/2020/05/part2.c new file mode 100644 index 0000000..396ea76 --- /dev/null +++ b/2020/05/part2.c @@ -0,0 +1,95 @@ +#include + +#define COLUMNS 8 +#define ROWS 128 + +int seat_id(const char *seat) +{ + int row = 0; + int row_lower = 0; + int row_upper = ROWS - 1; + int column = 0; + int column_lower = 0; + int column_upper = COLUMNS - 1; + int i = 0; + for (; i < 6; i++) { + switch (seat[i]) { + case 'F': + row_upper -= (row_upper - row_lower + 1) / 2; + break; + case 'B': + row_lower += (row_upper - row_lower + 1) / 2; + break; + } + } + + switch (seat[i++]) { + case 'F': + row = row_lower; + break; + case 'B': + row = row_upper; + break; + } + + for (; i < 9; i++) { + switch (seat[i]) { + case 'L': + column_upper -= (column_upper - column_lower + 1) / 2; + break; + case 'R': + column_lower += (column_upper - column_lower + 1) / 2; + break; + } + } + + switch (seat[i++]) { + case 'L': + column = column_lower; + break; + case 'R': + column = column_upper; + break; + } + + return row * COLUMNS + column; +} + +int missing_seat_id(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + char table[COLUMNS * ROWS] = { 0 }; + + // Include space for newline and string terminator + char buffer[16] = { 0 }; + + int min = __INT_MAX__; + int max = 0; + while (fgets(buffer, 16, file)) { + int tmp = seat_id(buffer); + if (tmp < min) { + min = tmp; + } + else if (tmp > max) { + max = tmp; + } + + table[tmp] = 1; + } + + fclose(file); + + for (int i = min + 1; i < max; i++) { + if (table[i] == 0) { + return i; + } + } + + return 0; +} + +int main(int argc, char *argv[]) +{ + printf("%i", missing_seat_id(argv[argc - 1])); +} diff --git a/2020/05/part2_fast.c b/2020/05/part2_fast.c new file mode 100644 index 0000000..483dd8f --- /dev/null +++ b/2020/05/part2_fast.c @@ -0,0 +1,90 @@ +#include + +#define COLUMNS 8 +#define ROWS 128 + +int row(const char *seat) +{ + int end_res = 0; + for (int i = 0; i < 7; i++) { + if (seat[i] == 'B') { + end_res |= 0x40 >> i; + } + } + + return end_res; +} + +int column(const char *seat) +{ + int end_res = 0; + for (int i = 7; i < 10; i++) { + if (seat[i] == 'R') { + end_res |= 0x200 >> i; + } + } + + return end_res; +} + +#ifdef USE_ASM +int seat_id(const char *seat); +#else +int seat_id(const char *seat) +{ + int end_res = 0; + int i = 0; + for (; i < 7; i++) { + if (seat[i] == 'B') { + end_res |= 0x200 >> i; + } + } + + for (; i < 10; i++) { + if (seat[i] == 'R') { + end_res |= 0x200 >> i; + } + } + + return end_res; +} +#endif + +int missing_seat_id(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + char table[COLUMNS * ROWS] = { 0 }; + + // Include space for newline and string terminator + char buffer[16] = { 0 }; + + int min = __INT_MAX__; + int max = 0; + while (fgets(buffer, 16, file)) { + int tmp = seat_id(buffer); + if (tmp < min) { + min = tmp; + } + else if (tmp > max) { + max = tmp; + } + + table[tmp] = 1; + } + + for (int i = min + 1; i < max; i++) { + if (table[i] == 0) { + return i; + } + } + + fclose(file); + + return 0; +} + +int main(int argc, char *argv[]) +{ + printf("%i", missing_seat_id(argv[argc - 1])); +} diff --git a/2020/05/seat_id.asm b/2020/05/seat_id.asm new file mode 100644 index 0000000..a372a9a --- /dev/null +++ b/2020/05/seat_id.asm @@ -0,0 +1,25 @@ +global seat_id + +section .text + +seat_id: + xor eax, eax ; set up return value + cmp BYTE [rdi], 'B' + sete al + xor ecx, ecx +%assign i 1 +%rep 6 + shl eax, 1 + cmp BYTE [rdi + i], 'B' + sete cl + or eax, ecx +%assign i i+1 +%endrep +%rep 3 + shl eax, 1 + cmp BYTE [rdi + i], 'R' + sete cl + or eax, ecx +%assign i i+1 +%endrep + ret diff --git a/2020/05/seat_id_ssse3.asm b/2020/05/seat_id_ssse3.asm new file mode 100644 index 0000000..4d51cbe --- /dev/null +++ b/2020/05/seat_id_ssse3.asm @@ -0,0 +1,23 @@ +global seat_id + +section .rodata + align 16 + xmm_shuf: db 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 10, 11, 12, 13, 14, 15 + xmm_cmp: db 1, 'RBBBBBBB', 1, 1, 1, 1, 1, 1, 1 + +section .text + +seat_id: + movq xmm0, qword [rdi] ; load first 8 bytes + pshufb xmm0, [rel xmm_shuf] ; reverse byte order and already shift left once + pcmpeqb xmm0, [rel xmm_cmp] + pmovmskb eax, xmm0 ; store mask in return value + xor ecx, ecx + cmp byte [rdi + 8], 'R' + sete cl + or eax, ecx + shl eax, 1 + cmp byte [rdi + 9], 'R' + sete cl + or eax, ecx + ret diff --git a/2020/06/part1.c b/2020/06/part1.c new file mode 100644 index 0000000..1b38192 --- /dev/null +++ b/2020/06/part1.c @@ -0,0 +1,37 @@ +#include + +int plane_count(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[32] = { 0 }; + + int tot = 0; + unsigned int current = 0; + + while (fgets(buffer, 32, file)) { + if (buffer[0] == '\n') { + tot += __builtin_popcount(current); + current = 0; + + continue; + } + + char *p = buffer; + do { + current |= 1 << (*p - 97); + } while (*++p != '\n'); + } + + tot += __builtin_popcount(current); + + fclose(file); + + return tot; +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", plane_count(argv[argc - 1])); +} diff --git a/2020/06/part2.c b/2020/06/part2.c new file mode 100644 index 0000000..11c8469 --- /dev/null +++ b/2020/06/part2.c @@ -0,0 +1,44 @@ +#include + +int plane_count(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[32] = { 0 }; + + int tot = 0; + unsigned int current = 0xffffffff; + + while (fgets(buffer, 32, file)) { + if (buffer[0] == '\n') { + if (current != 0xffffffff) { + tot += __builtin_popcount(current); + current = 0xffffffff; + } + + continue; + } + + unsigned int tmp = 0; + char *p = buffer; + do { + tmp |= 1 << (*p - 97); + } while (*++p != '\n'); + + current &= tmp; + } + + fclose(file); + + if (current != 0xffffffff) { + tot += __builtin_popcount(current); + } + + return tot; +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", plane_count(argv[argc - 1])); +} diff --git a/2020/07/part1.c b/2020/07/part1.c new file mode 100644 index 0000000..7e04278 --- /dev/null +++ b/2020/07/part1.c @@ -0,0 +1,158 @@ +#include +#include +#include +#include + +#define SEARCH_NAME "shiny gold" +#define MAX_NAMES 1024 +#define MAX_SIZE 600 +#define MAX_INNER_BAGS 4 + +struct Bag +{ + size_t inner_bags_size; + char *inner_bags[MAX_INNER_BAGS]; + char *bag_color; +}; + +char *insert_name(char **names, size_t *names_size, char *new_name) +{ + long long low = 0, high = *names_size; + while (low < high) { + int m = low + (high - low) / 2; + int c = strcmp(names[m], new_name); + if (c == 0) { + /* Name already exists, + return pointer to the already existsing string and free the new one. + */ + free(new_name); + return names[m]; + } + else if (c < 0) { + low = m + 1; + } + else { + high = m; + } + } + + for (long long i = *names_size - 1; i >= low; i--) { + names[i + 1] = names[i]; + } + + (*names_size)++; + return names[low] = new_name; +} + +void insert_name2(char **names, size_t *names_size, char *new_name) +{ + long long low = 0, high = *names_size; + while (low < high) { + int m = low + (high - low) / 2; + int c = strcmp(names[m], new_name); + if (c == 0) { + return; + } + else if (c < 0) { + low = m + 1; + } + else { + high = m; + } + } + + for (long long i = *names_size - 1; i >= low; i--) { + names[i + 1] = names[i]; + } + + (*names_size)++; + names[low] = new_name; + return; +} + +char *get_and_insert_name(char *bufstart, char *bufend, char **names, size_t *names_size) +{ + size_t bag_name_len = bufend - bufstart; + char *new_name = malloc((bag_name_len + 1) * sizeof(char)); + memcpy(new_name, bufstart, bag_name_len); + new_name[bag_name_len] = 0; // null terminate string + return insert_name(names, names_size, new_name); +} + +int bags_count(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[128] = { 0 }; + + struct Bag *bags = malloc(MAX_SIZE * sizeof(struct Bag)); + struct Bag *cur_bag = bags; + char **names = malloc(MAX_NAMES * sizeof(char *)); + + // Already add the name we're searching + char *search_name = names[0] = SEARCH_NAME; + size_t names_size = 1; + + while (fgets(buffer, 128, file)) { + char *end_bag_name = strstr(buffer, " bags"); + if (!end_bag_name) { + break; + } + + char* new_name = get_and_insert_name(buffer, end_bag_name, names, &names_size); + + cur_bag++; + cur_bag->bag_color = new_name; + if (strncmp(end_bag_name, " bags contain no", 16) == 0) { + cur_bag->inner_bags_size = 0; + continue; + } + + char *string_end = strchr(end_bag_name, '.'); + char *start_bag_name = end_bag_name + 16; + while ((end_bag_name = strstr(start_bag_name, " bag"))) { + new_name = get_and_insert_name(start_bag_name, end_bag_name, names, &names_size); + cur_bag->inner_bags[cur_bag->inner_bags_size++] = new_name; + start_bag_name = end_bag_name + (strncmp(end_bag_name, " bags", 5) ? 8 : 9); + if (start_bag_name > string_end) { + // We're outside the buffer, stop + break; + } + } + } + + fclose(file); + + char **outer_bags = malloc(MAX_SIZE * sizeof(char *)); + + // Start search with SEARCH_NAME + outer_bags[0] = search_name; + size_t outer_bags_size = 1; + + size_t old_size = 0; + while (old_size != outer_bags_size) { + old_size = outer_bags_size; + for (size_t i = 0; i < outer_bags_size; i++) { + struct Bag *p = bags; + while (p <= cur_bag) { + for (size_t j = 0; j < p->inner_bags_size; j++) { + if (p->inner_bags[j] == outer_bags[i]) { + insert_name2(outer_bags, &outer_bags_size, p->bag_color); + break; + } + } + + p++; + } + } + } + + // Don't count SEARCH_NAME + return outer_bags_size - 1; +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", bags_count(argv[argc - 1])); +} diff --git a/2020/07/part2.c b/2020/07/part2.c new file mode 100644 index 0000000..f4214f5 --- /dev/null +++ b/2020/07/part2.c @@ -0,0 +1,129 @@ +#include +#include +#include +#include +#include + +#define SEARCH_NAME "shiny gold" +#define MAX_NAMES 1024 +#define MAX_SIZE 600 +#define MAX_INNER_BAGS 4 + +struct Bag +{ + size_t inner_bags_size; + char *inner_bags[MAX_INNER_BAGS]; + int inner_bags_count[MAX_INNER_BAGS]; + char *bag_color; +}; + +char *insert_name(char **names, size_t *names_size, char *new_name) +{ + long long low = 0, high = *names_size; + while (low < high) { + int m = low + (high - low) / 2; + int c = strcmp(names[m], new_name); + if (c == 0) { + /* Name already exists, + return pointer to the already existsing string and free the new one. + */ + free(new_name); + return names[m]; + } + else if (c < 0) { + low = m + 1; + } + else { + high = m; + } + } + + for (long long i = *names_size - 1; i >= low; i--) { + names[i + 1] = names[i]; + } + + (*names_size)++; + return names[low] = new_name; +} + +char *get_and_insert_name(char *bufstart, char *bufend, char **names, size_t *names_size) +{ + size_t bag_name_len = bufend - bufstart; + char *new_name = malloc((bag_name_len + 1) * sizeof(char)); + memcpy(new_name, bufstart, bag_name_len); + new_name[bag_name_len] = 0; // null terminate string + return insert_name(names, names_size, new_name); +} + +size_t get_num_bags(struct Bag *bags, size_t bags_size, char *bag_color) +{ + for (size_t i = 0; i < bags_size; i++) { + if (bags[i].bag_color == bag_color) { + struct Bag bag = bags[i]; + size_t total = 1; + for (size_t j = 0; j < bag.inner_bags_size; j++) { + total += get_num_bags(bags, bags_size, bag.inner_bags[j]) * bag.inner_bags_count[j]; + } + + return total; + } + } + + return 0; +} + +int bags_count(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[128] = { 0 }; + + struct Bag *bags = malloc(MAX_SIZE * sizeof(struct Bag)); + struct Bag *cur_bag = bags; + char **names = malloc(MAX_NAMES * sizeof(char *)); + + // Already add the name we're searching + char *search_name = names[0] = SEARCH_NAME; + size_t names_size = 1; + + while (fgets(buffer, 128, file)) { + char *end_bag_name = strstr(buffer, " bags"); + if (!end_bag_name) { + break; + } + + char* new_name = get_and_insert_name(buffer, end_bag_name, names, &names_size); + + cur_bag++; + cur_bag->bag_color = new_name; + if (strncmp(end_bag_name, " bags contain no", 16) == 0) { + cur_bag->inner_bags_size = 0; + continue; + } + + char *string_end = strchr(end_bag_name, '.'); + char *start_bag_name = end_bag_name + 14; + while ((end_bag_name = strstr(start_bag_name, " bag"))) { + int num_bags = atoi(start_bag_name); + start_bag_name += 2; + new_name = get_and_insert_name(start_bag_name, end_bag_name, names, &names_size); + cur_bag->inner_bags[cur_bag->inner_bags_size] = new_name; + cur_bag->inner_bags_count[cur_bag->inner_bags_size++] = num_bags; + start_bag_name = end_bag_name + (strncmp(end_bag_name, " bags", 5) ? 6 : 7); + if (start_bag_name > string_end) { + // We're outside the buffer, stop + break; + } + } + } + + fclose(file); + + return get_num_bags(bags, cur_bag - bags + 1, search_name) - 1; +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", bags_count(argv[argc - 1])); +} diff --git a/2020/08/part1.c b/2020/08/part1.c new file mode 100644 index 0000000..d4261be --- /dev/null +++ b/2020/08/part1.c @@ -0,0 +1,74 @@ +#include +#include +#include + +#define INPUT_LEN 650 + +struct Operation +{ + char opcode; + int arg; + char has_been_executed; +}; + +int exe_program(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[16] = { 0 }; + + struct Operation ops[INPUT_LEN]; + size_t opcount = 0; + + while (fgets(buffer, 16, file)) { + struct Operation *op = &ops[opcount++]; + op->has_been_executed = 0; + switch (buffer[0]) + { + // nop + case 'n': + op->opcode = 0; + break; + // acc + case 'a': + op->opcode = 1; + break; + // jmp + case 'j': + op->opcode = 2; + break; + } + + op->arg = atoi(&buffer[4]); + } + + fclose(file); + + struct Operation *cur_op = ops; + int acc = 0; + while (!cur_op->has_been_executed) + { + cur_op->has_been_executed = 1; + switch (cur_op->opcode) + { + case 0: + cur_op++; + break; + case 1: + acc += cur_op->arg; + cur_op++; + break; + case 2: + cur_op += cur_op->arg; + break; + } + } + + return acc; +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", exe_program(argv[argc - 1])); +} diff --git a/2020/08/part2.c b/2020/08/part2.c new file mode 100644 index 0000000..44ebdec --- /dev/null +++ b/2020/08/part2.c @@ -0,0 +1,109 @@ +#include +#include +#include + +#define INPUT_LEN 650 + +struct Operation +{ + char opcode; + int arg; + char has_been_executed; +}; + +int execute(struct Operation *ops, size_t opcount) +{ + struct Operation *cur_op = ops; + int acc = 0; + do { + if (cur_op->has_been_executed) { + return -1; + } + + cur_op->has_been_executed = 1; + switch (cur_op->opcode) + { + case 0: + cur_op++; + break; + case 1: + acc += cur_op->arg; + cur_op++; + break; + case 2: + cur_op += cur_op->arg; + break; + } + } while (cur_op < ops + opcount); + + return acc; +} + +int exe_program(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[16] = { 0 }; + + struct Operation ops[INPUT_LEN]; + size_t opcount = 0; + + while (fgets(buffer, 16, file)) { + struct Operation *op = &ops[opcount++]; + op->has_been_executed = 0; + switch (buffer[0]) + { + // nop + case 'n': + op->opcode = 0; + break; + // acc + case 'a': + op->opcode = 1; + break; + // jmp + case 'j': + op->opcode = 2; + break; + } + + op->arg = atoi(&buffer[4]); + } + + fclose(file); + + struct Operation *cur_op = ops; + int flip_previous = 0; + do { + if (flip_previous) { + (cur_op - 1)->opcode ^= 2; + flip_previous = 0; + } + + if (cur_op->opcode == 1 + || (cur_op->opcode == 0 && cur_op->arg <= 0) + || (cur_op->opcode == 2 && cur_op->arg >= 0)) { + continue; + } + + cur_op->opcode ^= 2; + flip_previous = 1; + + for (size_t i = 0; i < opcount; i++) { + ops[i].has_been_executed = 0; + } + + int acc = execute(ops, opcount); + if (acc != -1) { + return acc; + } + } while (++cur_op < ops + opcount); + + return -1; +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", exe_program(argv[argc - 1])); +} diff --git a/2020/09/part1.c b/2020/09/part1.c new file mode 100644 index 0000000..d17fb2b --- /dev/null +++ b/2020/09/part1.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include + +#define INPUT_LEN 1000 +#define SEARCH_LEN 25 + +bool has_sum(uint64_t *cur_num) +{ + uint64_t search = *cur_num; + uint64_t *p1 = cur_num - SEARCH_LEN; + do { + uint64_t *p2 = cur_num - SEARCH_LEN; + do { + if (*p1 + *p2 == search) { + return true; + } + } while (++p2 < cur_num); + } while (++p1 < cur_num); + + return false; +} + +int exe_program(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[24] = { 0 }; + + uint64_t nums[INPUT_LEN]; + size_t num_size = 0; + + while (fgets(buffer, 24, file)) { + nums[num_size++] = strtoull(buffer, NULL, 10); + } + + fclose(file); + + uint64_t *cur_num = nums + SEARCH_LEN; + do { + if (!has_sum(cur_num)) { + return *cur_num; + } + } while (++cur_num < nums + num_size); + + return -1; +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", exe_program(argv[argc - 1])); +} diff --git a/2020/09/part1.f90 b/2020/09/part1.f90 new file mode 100644 index 0000000..a89ee41 --- /dev/null +++ b/2020/09/part1.f90 @@ -0,0 +1,45 @@ +integer function has_sum(arg, arr) + implicit none + + integer, parameter :: arr_len = 25 + + integer (kind=8) :: arg + integer (kind=8), dimension(25) :: arr + integer :: i, j + + do i = 1, arr_len + do j = 1, arr_len + if (arr(i) + arr(j) == arg) then + has_sum = 1 + return + end if + end do + end do + + has_sum = 0 + return +end function has_sum + +program day9 + implicit none + + integer, parameter :: input_len = 1000 + + integer :: has_sum, i, tmp + integer (kind=8), dimension(input_len) :: input + + open(10, file='input', status='old') + do i = 1, input_len + read(10, *) input(i) + end do + close(10) + + do i = 26, input_len + tmp = has_sum(input(i), input(i - 25)) + if (tmp == 0) then + print *, input(i) + stop + end if + end do + +end program day9 diff --git a/2020/09/part2.c b/2020/09/part2.c new file mode 100644 index 0000000..28c335e --- /dev/null +++ b/2020/09/part2.c @@ -0,0 +1,78 @@ +#include +#include +#include +#include + +#define INPUT_LEN 1000 +#define SEARCH_LEN 25 + +bool has_sum(uint64_t *cur_num) +{ + uint64_t search = *cur_num; + uint64_t *p1 = cur_num - SEARCH_LEN; + do { + uint64_t *p2 = cur_num - SEARCH_LEN; + do { + if (*p1 + *p2 == search) { + return true; + } + } while (++p2 < cur_num); + } while (++p1 < cur_num); + + return false; +} + +int exe_program(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[24] = { 0 }; + + uint64_t nums[INPUT_LEN] = { 0 }; + size_t num_size = 0; + + while (fgets(buffer, 24, file)) { + nums[num_size++] = strtoull(buffer, NULL, 10); + } + + fclose(file); + + uint64_t *cur_num = nums + SEARCH_LEN; + uint64_t search = -1; + do { + if (!has_sum(cur_num)) { + search = *cur_num; + break; + } + } while (++cur_num < nums + num_size); + + cur_num = nums; + do { + uint64_t min = __UINT64_MAX__; + uint64_t max = 0; + uint64_t sum = 0; + uint64_t *p1 = cur_num; + do { + if (*p1 < min) { + min = *p1; + } + else if (*p1 > max) { + max = *p1; + } + + sum += *p1; + + if (sum == search) { + return min + max; + } + } while (++p1 < nums + num_size); + } while (++cur_num < nums + num_size); + + return -1; +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", exe_program(argv[argc - 1])); +} diff --git a/2020/09/part2.f90 b/2020/09/part2.f90 new file mode 100644 index 0000000..b7e65de --- /dev/null +++ b/2020/09/part2.f90 @@ -0,0 +1,60 @@ +integer function has_sum(arg, arr) + implicit none + + integer, parameter :: arr_len = 25 + + integer (kind=8) :: arg + integer (kind=8), dimension(25) :: arr + integer :: i, j + + do i = 1, arr_len + do j = 1, arr_len + if (arr(i) + arr(j) == arg) then + has_sum = 1 + return + end if + end do + end do + + has_sum = 0 + return +end function has_sum + +program day9 + implicit none + + integer, parameter :: input_len = 1000 + + integer :: has_sum, i, j, tmp + integer (kind=8), dimension(input_len) :: input + integer (kind=8) :: search = -1, sum + + open(10, file='input', status='old') + do i = 1, input_len + read(10, *) input(i) + end do + close(10) + + do i = 26, input_len + tmp = has_sum(input(i), input(i - 25)) + if (tmp == 0) then + search = input(i) + exit + end if + end do + + do i = 1, input_len + sum = 0 + do j = i, input_len + sum = sum + input(j) + if (sum >= search) then + exit + end if + end do + if (sum == search) then + print *, minval(input(i:j)) + maxval(input(i:j)) + stop + end if + end do + +end program day9 diff --git a/2020/09/part2_fast.c b/2020/09/part2_fast.c new file mode 100644 index 0000000..cf06bbd --- /dev/null +++ b/2020/09/part2_fast.c @@ -0,0 +1,98 @@ +#include +#include +#include +#include + +#define INPUT_LEN 1000 +#define SEARCH_LEN 25 + +uint64_t min_uint64(const uint64_t *start, const uint64_t *stop) +{ + uint64_t min = *start; + while (++start <= stop) { + if (*start < min) { + min = *start; + } + } + + return min; +} + +uint64_t max_uint64(const uint64_t *start, const uint64_t *stop) +{ + uint64_t max = *start; + while (++start <= stop) { + if (*start > max) { + max = *start; + } + } + + return max; +} + +bool has_sum(uint64_t *cur_num) +{ + uint64_t search = *cur_num; + uint64_t *p1 = cur_num - SEARCH_LEN; + do { + if (*p1 >= search) + { + continue; + } + + uint64_t *p2 = cur_num - SEARCH_LEN; + do { + if (*p1 + *p2 == search) { + return true; + } + } while (++p2 < cur_num); + } while (++p1 < cur_num); + + return false; +} + +int exe_program(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[24] = { 0 }; + + uint64_t nums[INPUT_LEN] = { 0 }; + size_t num_size = 0; + + while (fgets(buffer, 24, file)) { + nums[num_size++] = strtoull(buffer, NULL, 10); + } + + fclose(file); + + uint64_t *cur_num = nums + SEARCH_LEN; + uint64_t search = -1; + do { + if (!has_sum(cur_num)) { + search = *cur_num; + break; + } + } while (++cur_num < nums + num_size); + + cur_num = nums; + do { + uint64_t sum = 0; + uint64_t *p1 = cur_num; + do { + sum += *p1; + } while (++p1 < nums + num_size && sum < search); + + if (sum == search) { + return min_uint64(cur_num, p1) + max_uint64(cur_num, p1); + } + } while (++cur_num < nums + num_size); + + return -1; +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", exe_program(argv[argc - 1])); +} diff --git a/2020/10/part1.c b/2020/10/part1.c new file mode 100644 index 0000000..f5a700e --- /dev/null +++ b/2020/10/part1.c @@ -0,0 +1,70 @@ +#include +#include +#include +#include +#include + +#define MAX_INPUT_LEN 128 + +void insert_value_sorted(int *list, size_t *size, int value) +{ + long long low = 0, high = *size; + while (low < high) { + int m = low + (high - low) / 2; + if (list[m] < value) { + low = m + 1; + } + else if (list[m] > value) { + high = m; + } + else { + // Value already exists in the list + return; + } + } + + for (long long i = *size - 1; i >= low; i--) { + list[i + 1] = list[i]; + } + + (*size)++; + list[low] = value; +} + +int solve(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[128] = { 0 }; + + int input[MAX_INPUT_LEN] = { 0 }; + size_t input_size = 1; // 0 is our start value + + while (fgets(buffer, 128, file)) { + insert_value_sorted(input, &input_size, atoi(buffer)); + } + + fclose(file); + + int diff1 = 0; + int diff3 = 1; // Diff with adapter + + for (size_t i = 1; i < input_size; i++) + { + int diff = input[i] - input[i - 1]; + if (diff == 1) { + diff1++; + } + else if (diff == 3) { + diff3++; + } + } + + return diff1 * diff3; +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", solve(argv[argc - 1])); +} diff --git a/2020/10/part2.c b/2020/10/part2.c new file mode 100644 index 0000000..5e766d4 --- /dev/null +++ b/2020/10/part2.c @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include + +#include "../utils.h" + +#define MAX_INPUT_LEN 128 + +void insert_value_sorted(int *list, size_t *size, int value) +{ + long long low = 0, high = *size; + while (low < high) { + int m = low + (high - low) / 2; + if (list[m] < value) { + low = m + 1; + } + else if (list[m] > value) { + high = m; + } + else { + // Value already exists in the list + return; + } + } + + for (long long i = *size - 1; i >= low; i--) { + list[i + 1] = list[i]; + } + + (*size)++; + list[low] = value; +} + +#ifdef USE_ASM +uint64_t possible_seq(const int *input, size_t input_size); +#else +uint64_t possible_seq(const int *input, size_t input_size) +{ + // Use char to optimize for size + const static char TRIB[] = { 1, 1, 2, 4, 7 }; + int con = 0; + uint64_t res = 1; + const int *prev = input; + const int *cur = input + 1; + do { + if (likely(*cur - *prev == 1)) { + con++; + } + else { + res *= TRIB[con]; + con = 0; + } + } while (++prev && ++cur < input + input_size); + + return res; +} +#endif + +uint64_t solve(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[16] = { 0 }; + + int input[MAX_INPUT_LEN] = { 0 }; + size_t input_size = 1; // 0 is our start value + + while (fgets(buffer, 16, file)) { + insert_value_sorted(input, &input_size, atoi(buffer)); + } + + // Add our device's built-in joltage adapter + input[input_size] = input[input_size - 1] + 3; + input_size++; + + fclose(file); + + return possible_seq(input, input_size); +} + +int main(int argc, char *argv[]) +{ + printf("%lu\n", solve(argv[argc - 1])); +} diff --git a/2020/10/possible_seq.asm b/2020/10/possible_seq.asm new file mode 100644 index 0000000..b737d13 --- /dev/null +++ b/2020/10/possible_seq.asm @@ -0,0 +1,30 @@ +global possible_seq + +section .rodata + TRIB: dq 1, 1, 2, 4, 7 ; tribonacci sequence (without first 2 zeroes) + +section .text + +possible_seq: + mov eax, 1 ; set up return value + xor ecx, ecx ; # of connected elements counter + lea rdx, [rdi + 4 * rsi - 4] ; pointer to the last element + lea r8, [rel TRIB] + jmp .loop +.ncon: + imul rax, qword [r8 + 8 * rcx] + xor ecx, ecx + add rdi, 4 + cmp rdi, rdx + jae .return +.loop: + mov esi, dword [rdi + 4] + sub esi, dword [rdi] + cmp esi, 1 + jne .ncon + inc ecx + add rdi, 4 + cmp rdi, rdx + jb .loop +.return: + ret diff --git a/2020/11/part1.c b/2020/11/part1.c new file mode 100644 index 0000000..459befe --- /dev/null +++ b/2020/11/part1.c @@ -0,0 +1,123 @@ +#include +#include +#include +#include +#include + +#define MAX_INPUT_WIDTH 128 +#define MAX_INPUT_HEIGTH 128 +#define MAX_INPUT MAX_INPUT_WIDTH * MAX_INPUT_HEIGTH + +int count_char(const char *source, char search) +{ + int oc = 0; + do { + oc += *source == search; + } while (*++source); + + return oc; +} + +void replace_char(char *destination, const char *source, char original, char replace) +{ + do { + if (*source == original) { + *destination = replace; + } + else { + *destination = *source; + } + } while (++destination && *++source); + *destination = 0; +} + +int sur_oc_seats(const char *source, size_t width, size_t height, size_t index_y, size_t index_x) +{ + int num = 0; + // Check 3 seats on the line above + if (index_y > 0) { + size_t x = index_x == 0 ? index_x : index_x - 1; + size_t end_x = index_x < width - 1 ? index_x + 2 : index_x + 1; + for (; x < end_x; x++) { + num += source[(index_y - 1) * width + x] == '#'; + } + } + + // Check sides + if (index_x > 0) { + num += source[index_y * width + index_x - 1] == '#'; + } + + if (index_x < width - 1) { + num += source[index_y * width + index_x + 1] == '#'; + } + + // Check 3 seats on the line above + if (index_y < height - 1) { + size_t x = index_x == 0 ? index_x : index_x - 1; + size_t end_x = index_x < width - 1 ? index_x + 2 : index_x + 1; + for (; x < end_x; x++) { + num += source[(index_y + 1) * width + x] == '#'; + } + } + + return num; +} + +int solve(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[128] = { 0 }; + + char input[MAX_INPUT] = { 0 }; + size_t height = 1; + fgets(buffer, 128, file); + size_t width = strchr(buffer, '\n') - buffer; + replace_char(input, buffer, 'L', '#'); + + while (fgets(buffer, 128, file)) { + // Round 1 + replace_char(&input[height++ * width], buffer, 'L', '#'); + } + + fclose(file); + + size_t size = height * width; + + // Zero terminate + input[size] = 0; + + char input2[MAX_INPUT] = { 0 }; + do { + for (size_t i = 0; i < size; i++) { + if (input[i] == '.') { + input2[i] = '.'; + } + else if (input[i] == 'L') { + if (sur_oc_seats(input, width, height, i / width, i % width) == 0) { + input2[i] = '#'; + } + else { + input2[i] = 'L'; + } + } + else if (input[i] == '#') { + if (sur_oc_seats(input, width, height, i / width, i % width) >= 4) { + input2[i] = 'L'; + } + else { + input2[i] = '#'; + } + } + } + } while (memcmp(input, input2, size) && memcpy(input, input2, size)); + + return count_char(input, '#'); +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", solve(argv[argc - 1])); +} diff --git a/2020/11/part2.c b/2020/11/part2.c new file mode 100644 index 0000000..2443ddd --- /dev/null +++ b/2020/11/part2.c @@ -0,0 +1,202 @@ +#include +#include +#include +#include +#include + +#define MAX_INPUT_WIDTH 128 +#define MAX_INPUT_HEIGTH 128 +#define MAX_INPUT MAX_INPUT_WIDTH * MAX_INPUT_HEIGTH + +int count_char(const char *source, char search) +{ + int oc = 0; + do { + oc += *source == search; + } while (*++source); + + return oc; +} + +void replace_char(char *destination, const char *source, char original, char replace) +{ + do { + if (*source == original) { + *destination = replace; + } + else { + *destination = *source; + } + } while (++destination && *++source); + *destination = 0; +} + +char get_char(const char *source, size_t width, size_t y, size_t x) { + return source[y * width + x]; +} + +int sur_oc_seats(const char *source, size_t width, size_t height, size_t index_y, size_t index_x) +{ + int num = 0; + // Check upwards + size_t y = index_y; + size_t x = index_x; + while (--y < height) { + char c = get_char(source, width, y, x); + if (c == '.') { + continue; + } + + num += c == '#'; + break; + } + + // Check downwards + y = index_y; + while (++y < height) { + char c = get_char(source, width, y, x); + if (c == '.') { + continue; + } + + num += c == '#'; + break; + } + + // Check left + y = index_y; + x = index_x; + while (--x < width) { + char c = get_char(source, width, y, x); + if (c == '.') { + continue; + } + + num += c == '#'; + break; + } + + // Check right + x = index_x; + while (++x < width) { + char c = get_char(source, width, y, x); + if (c == '.') { + continue; + } + + num += c == '#'; + break; + } + + // Check left upwards + y = index_y; + x = index_x; + while (--y < height && --x < width) { + char c = get_char(source, width, y, x); + if (c == '.') { + continue; + } + + num += c == '#'; + break; + } + + // Check left downwards + y = index_y; + x = index_x; + while (++y < height && --x < width) { + char c = get_char(source, width, y, x); + if (c == '.') { + continue; + } + + num += c == '#'; + break; + } + + // Check right upwards + y = index_y; + x = index_x; + while (--y < height && ++x < width) { + char c = get_char(source, width, y, x); + if (c == '.') { + continue; + } + + num += c == '#'; + break; + } + + // Check right downwards + y = index_y; + x = index_x; + while (++y < height && ++x < width ) { + char c = get_char(source, width, y, x); + if (c == '.') { + continue; + } + + num += c == '#'; + break; + } + + return num; +} + +int solve(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[128] = { 0 }; + + char input[MAX_INPUT] = { 0 }; + size_t height = 1; + fgets(buffer, 128, file); + size_t width = strchr(buffer, '\n') - buffer; + replace_char(input, buffer, 'L', '#'); + + while (fgets(buffer, 128, file)) { + // Round 1 + replace_char(&input[height++ * width], buffer, 'L', '#'); + } + + fclose(file); + + size_t size = height * width; + + // Zero terminate + input[size] = 0; + + char input2[MAX_INPUT] = { 0 }; + do { + for (size_t i = 0; i < size; i++) { + if (input[i] == '.') { + input2[i] = '.'; + } + else if (input[i] == 'L') { + if (sur_oc_seats(input, width, height, i / width, i % width) == 0) { + input2[i] = '#'; + } + else { + input2[i] = 'L'; + } + } + else if (input[i] == '#') { + if (sur_oc_seats(input, width, height, i / width, i % width) >= 5) { + input2[i] = 'L'; + } + else { + input2[i] = '#'; + } + } + } + } while (memcmp(input, input2, size) && memcpy(input, input2, size)); + + return count_char(input, '#'); +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", solve(argv[argc - 1])); +} diff --git a/2020/12/part1.c b/2020/12/part1.c new file mode 100644 index 0000000..7ee0f4a --- /dev/null +++ b/2020/12/part1.c @@ -0,0 +1,78 @@ +#include +#include +#include +#include +#include + +#define MAX_INPUT_WIDTH 128 +#define MAX_INPUT_HEIGTH 128 +#define MAX_INPUT MAX_INPUT_WIDTH * MAX_INPUT_HEIGTH + +enum direction { + North, + East, + South, + West +}; + +int solve(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[8] = { 0 }; + + enum direction dir = East; + int hor = 0; + int ver = 0; + while (fgets(buffer, 8, file)) { + int n = atoi(buffer + 1); + switch (buffer[0]) { + case 'N': + ver += n; + break; + case 'E': + hor += n; + break; + case 'S': + ver -= n; + break; + case 'W': + hor -= n; + break; + case 'F': + switch (dir) { + case North: + ver += n; + break; + case East: + hor += n; + break; + case South: + ver -= n; + break; + case West: + hor -= n; + break; + } + break; + case 'R': + dir = (enum direction)(((int)dir + (n / 90)) % 4); + break; + case 'L': + dir = (enum direction)((abs(4 + ((int)dir - (n / 90))) % 4)); + break; + default: + break; + } + } + + fclose(file); + + return abs(ver) + abs(hor); +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", solve(argv[argc - 1])); +} diff --git a/2020/12/part2.c b/2020/12/part2.c new file mode 100644 index 0000000..745b56c --- /dev/null +++ b/2020/12/part2.c @@ -0,0 +1,66 @@ +#include +#include +#include +#include +#include + +#include "../utils.h" + +int solve(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[8] = { 0 }; + + int w_x = 10; + int w_y = 1; + int y = 0; + int x = 0; + while (fgets(buffer, 8, file)) { + int n = atoi(buffer + 1); + switch (buffer[0]) { + case 'N': + w_y += n; + break; + case 'E': + w_x += n; + break; + case 'S': + w_y -= n; + break; + case 'W': + w_x -= n; + break; + case 'F': + for (int i = 0; i < n; i++) { + x += w_y; + y += w_x; + } + break; + case 'R': + for (int i = 0; i < n / 90; i++) { + SWAP(w_y, w_x); + w_y = -w_y; + } + break; + case 'L': + for (int i = 0; i < n / 90; i++) { + SWAP(w_y, w_x); + w_x = -w_x; + } + break; + default: + break; + } + } + + fclose(file); + + return abs(x) + abs(y); +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", solve(argv[argc - 1])); +} diff --git a/2020/13/part1.c b/2020/13/part1.c new file mode 100644 index 0000000..b62d007 --- /dev/null +++ b/2020/13/part1.c @@ -0,0 +1,48 @@ +#include +#include +#include +#include + +#define BUFFER_SIZE 256 +#define MAX_INPUT_LEN 128 + +int solve(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + char buffer[BUFFER_SIZE] = { 0 }; + fgets(buffer, BUFFER_SIZE, file); + int depart = atoi(buffer); + fgets(buffer, BUFFER_SIZE, file); + int bus_ids[MAX_INPUT_LEN] = { 0 }; + bus_ids[0] = atoi(buffer); + int i = 1; + char *p = buffer; + while ((p = strchr(p, ','))) { + // x is never the last value, just keep looping we find a valid input + while (*++p == 'x') { + p += 1; + } + + bus_ids[i++] = atoi(p); + } + + int bus_id = 0; + int wait = INT32_MAX; + for (int j = 0; j < i; j++) { + int id = bus_ids[j]; + int tmprem = id - (depart % id); + if (tmprem < wait) { + bus_id = id; + wait = tmprem; + } + } + + fclose(file); + return bus_id * wait; +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", solve(argv[argc - 1])); +} diff --git a/2020/prepare b/2020/prepare new file mode 100755 index 0000000..7e4f9e5 --- /dev/null +++ b/2020/prepare @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +set -ef + +day="$(printf '%02d' "$1")" +file="part$2.c" +if test -f "part$2_fast.c" +then + file="part$2_fast.c" +fi +clang -Wall -pedantic -O3 -march=native -mtune=native -flto -s -o run "$day/$file" diff --git a/2021/Cargo.toml b/2021/Cargo.toml new file mode 100644 index 0000000..136bfa6 --- /dev/null +++ b/2021/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "aoc2021" +version = "0.1.0" +edition = "2018" + +[dependencies] + +[profile.release] +lto = true +panic = "abort" +codegen-units = 1 diff --git a/2021/asm/day01.asm b/2021/asm/day01.asm new file mode 100644 index 0000000..b4f73e7 --- /dev/null +++ b/2021/asm/day01.asm @@ -0,0 +1,65 @@ +%include "unistd.asm" +%include "utils.asm" + +stdout equ 1 + +global _start + +section .text +_start: + mov rcx, [rsp] ; Get number of arguments + mov rdi, [rsp + rcx * 8] ; Get last argument + + mov rax, SYS_access ; Check if file exists and is readable + mov esi, R_OK + syscall + test rax, rax + jnz .exit_err + + mov rax, SYS_open + xor esi, esi + xor edx, edx + syscall + + mov r8d, eax ; Move fd into r8 + mov rax, SYS_mmap + xor edi, edi ; Let the kernel choose the address + mov rsi, 12288 + mov rdx, PROT_READ + mov r10d, MAP_PRIVATE + xor r9d, r9d + syscall + + cmp rax, -1 ; Exit on error + je .exit_err + + xor r13d, r13d + mov r12d, ~0 + mov rdi, rax +.loop: + call atoi + cmp eax, r12d + jna .na + inc r13d +.na: + mov r12d, eax + + cmp byte [rdi], 0 + je .exit + inc rdi + cmp byte [rdi], 0 + jne .loop + +.exit: + mov edi, stdout + mov esi, r13d + call write_ulong + + mov rax, SYS_exit + xor edi, edi + syscall + +.exit_err: + mov rax, SYS_exit + mov edi, 1 + syscall diff --git a/2021/build.rs b/2021/build.rs new file mode 100644 index 0000000..adbcf87 --- /dev/null +++ b/2021/build.rs @@ -0,0 +1,29 @@ +use std::env; +use std::error::Error; + +fn main() -> Result<(), Box> { + println!("cargo:rerun-if-env-changed=AOCDAY"); + println!("cargo:rerun-if-env-changed=AOCPART"); + + if let Ok(version) = env::var("AOCDAY") { + let version = version.parse::()?; + match version { + 1..=2 => println!("cargo:rustc-cfg=day{:02}", version), + _ => panic!("Not a valid day") + }; + } else { + panic!("No date specified"); + } + + if let Ok(version) = env::var("AOCPART") { + let version = version.parse::()?; + match version { + 1..=2 => println!("cargo:rustc-cfg=part{}", version), + _ => panic!("Not a valid part") + }; + } else { + panic!("No part specified"); + } + + Ok(()) +} diff --git a/2021/prepare b/2021/prepare new file mode 100755 index 0000000..decb322 --- /dev/null +++ b/2021/prepare @@ -0,0 +1,7 @@ +#!/bin/sh + +set -ef + +AOCDAY="$1" AOCPART="$2" RUSTFLAGS="-C target-cpu=native" cargo build --release +cp "$(pwd)/target/release/aoc2021" "$(pwd)/run" +strip run diff --git a/2021/src/day01.rs b/2021/src/day01.rs new file mode 100644 index 0000000..7b1e6a9 --- /dev/null +++ b/2021/src/day01.rs @@ -0,0 +1,39 @@ +use std::error::Error; +use std::fs; +use std::path::Path; + +fn get_input(path: &Path) -> Result, Box> { + let data = fs::read_to_string(path)?; + Ok(data.lines().filter_map(|x| x.parse::().ok()).collect()) +} + +#[cfg(part1)] +pub fn solve(path: &Path) -> Result<(), Box> { + let values = get_input(path)?; + let mut last = u16::MAX; + let mut larger = 0; + for v in values { + if v > last { + larger += 1; + } + + last = v; + } + + println!("{}", larger); + Ok(()) +} + +#[cfg(part2)] +pub fn solve(path: &Path) -> Result<(), Box> { + let values = get_input(path)?; + let mut increase = 0; + for i in 0..(values.len() - 3) { + if values[i] < values[i + 3] { + increase += 1; + } + } + + println!("{}", increase); + Ok(()) +} diff --git a/2021/src/day02.rs b/2021/src/day02.rs new file mode 100644 index 0000000..e64d2e9 --- /dev/null +++ b/2021/src/day02.rs @@ -0,0 +1,67 @@ +use std::str::FromStr; +use std::error::Error; +use std::fs; +use std::path::Path; + +#[derive(PartialEq, Debug)] +enum Command { + Forward(i32), + Down(i32), + Up(i32) +} + +#[derive(Debug)] +struct ParseCommandError; + +impl FromStr for Command { + type Err = ParseCommandError; + + fn from_str(s: &str) -> Result { + let i = s.find(' ').ok_or(ParseCommandError)?; + let num = s[i + 1..].parse::().map_err(|_| ParseCommandError)?; + match &s[..i] { + "forward" => Ok(Command::Forward(num)), + "down" => Ok(Command::Down(num)), + "up" => Ok(Command::Up(num)), + _ => Err(ParseCommandError) + } + } +} + +#[cfg(part1)] +pub fn solve(path: &Path) -> Result<(), Box> { + let data = fs::read_to_string(path)?; + let mut hor = 0; + let mut depth = 0; + for command in data.lines().filter_map(|x| x.parse::().ok()) { + match command { + Command::Forward(v) => hor += v, + Command::Down(v) => depth += v, + Command::Up(v) => depth -= v + } + } + + println!("{}", hor * depth); + Ok(()) +} + +#[cfg(part2)] +pub fn solve(path: &Path) -> Result<(), Box> { + let data = fs::read_to_string(path)?; + let mut aim = 0; + let mut hor = 0; + let mut depth = 0; + for command in data.lines().filter_map(|x| x.parse::().ok()) { + match command { + Command::Forward(v) => { + hor += v; + depth += aim * v; + }, + Command::Down(v) => aim += v, + Command::Up(v) => aim -= v + } + } + + println!("{}", hor * depth); + Ok(()) +} diff --git a/2021/src/main.rs b/2021/src/main.rs new file mode 100644 index 0000000..ae5f8f2 --- /dev/null +++ b/2021/src/main.rs @@ -0,0 +1,22 @@ +use std::env; +use std::error::Error; +use std::path::Path; + +#[cfg(day01)] +use day01::solve; + +#[cfg(day02)] +use day02::solve; + +#[cfg(day01)] +mod day01; + +#[cfg(day02)] +mod day02; + +fn main() -> Result<(), Box> { + let args = env::args().last().unwrap(); + let path = Path::new(&args); + + solve(path) +} diff --git a/2022/01/part2.asm b/2022/01/part2.asm new file mode 100644 index 0000000..6fed668 --- /dev/null +++ b/2022/01/part2.asm @@ -0,0 +1,82 @@ +%include "unistd.asm" +%include "utils.asm" + +stdout equ 1 + +global _start + +section .text +_start: + mov rcx, [rsp] ; Get number of arguments + mov rdi, [rsp + rcx * 8] ; Get last argument + + mov rax, SYS_access ; Check if file exists and is readable + mov esi, R_OK + syscall + test rax, rax + jnz .exit_err + + mov rax, SYS_open + xor esi, esi + xor edx, edx + syscall + + mov r8d, eax ; Move fd into r8 + mov rax, SYS_mmap + xor edi, edi ; Let the kernel choose the address + mov rsi, 12288 + mov rdx, PROT_READ + mov r10d, MAP_PRIVATE + xor r9d, r9d + syscall + + cmp rax, -1 ; Exit on error + je .exit_err + + xor r12d, r12d ; current count for elf + xor r13d, r13d ; Max # cal for one elf + xor r14d, r14d ; 2nd max # cal for one elf + xor r15d, r15d ; 3rd max # cal for one elf + mov rdi, rax +.loop: + cmp byte [rdi], 0 + je .exit + call atoi + add r12d, eax + cmp byte [rdi], 0 + inc rdi + je .exit + cmp byte [rdi], `\n` + je .next_elf + jmp .loop + +.next_elf: + cmp r15d, r12d + cmovl r15d, r12d + xor r12d, r12d + cmp r14d, r15d + jge .cmp_top_2 + xchg r14d, r15d +.cmp_top_2: + cmp r13d, r14d + jge .done + xchg r13d, r14d +.done: + add rdi, 1 + jmp .loop + +.exit: + mov edi, stdout + mov esi, r13d + add esi, r14d + add esi, r15d + call write_ulong + + mov rax, SYS_exit + xor edi, edi + syscall + +.exit_err: + mov rax, SYS_exit + mov edi, 1 + syscall diff --git a/2022/prepare b/2022/prepare new file mode 100755 index 0000000..206fe35 --- /dev/null +++ b/2022/prepare @@ -0,0 +1,7 @@ +#!/bin/sh + +set -ef + +day="$(printf '%02d' "$1")" +nasm -f elf64 "$day/part$2.asm" -i "../utils" -o run.o +ld run.o -o run diff --git a/3/input b/3/input deleted file mode 100644 index 6e5de58..0000000 --- a/3/input +++ /dev/null @@ -1,323 +0,0 @@ -...........#..#.#.###....#..... -...#..#...........#.#...#...... -#.....#..#........#...#..##.... -..#...##.#.....#.............#. -#.#..#......#.....#....#....... -.....#......#..#....#.....#.... -.......#.#..............#...... -.....#...#..........##...#..... -...#....#.#...#.#........#...#. -..#.........###.......##...##.. -.#....#...........#........#..# -..#.............##............. -..#.##.#....#................#. -.....##.#.......#....#...#..... -......#.#....##................ -..#..........###..#..#.#..#.... -....#..............#....##..#.# -.#.........#.#....#.#.#....#... -..#.....#......##.#....#....... -..#.#....#..#.#...##....###.... -...#......##...#........#.#..#. -.##.#.......##....#............ -...##..#.#............#...#.#.. -.##...##.#..#.................. -..#......##......#......##..... -.....##...#..#...#.........#... -.##.#.....#..#..#.##....##....# -..#.#......#.......##.......... -......................#......## -##.#...#.................#.#.#. -......#.#..........#.....##.#.. -#.#......#.....#...........#... -.....#...#.......#..#..#.#...#. -...........#......#.#...#...... -....##...##...........#......#. -.........#.##.................. -......#...#....#......##.##...# -......#...#.#########......#... -.......#.#...#.......#..#...... -............#...#...#.###...##. -...........#..........#...#.... -...#..#.#................#.#..# -..#....#.....#.............#.#. -....##......#........#....#.... -........##...............#....# -........#..#...#..............# -...#....#.#...#..#...#....#.#.# -.........#.......#....##....... -#.##..............#.#........## -......................###...... -.........#....##..##....#.#.#.. -.#...##.#.#...#....##..#.....#. -....................#.#......#. -.#..#.......................#.. -..#..#.............#..#....#... -...#...#..#...#...#.#..#.##.... -........#....#...#....#........ -.#.....#........#.........#...# -...#......#..#..#..####..#..... -#....#..............#.##....... -.#....#.............##...#..... -....#...#.##........##......#.. -##....#...#.......#..#........# -....##........................# -..................#..#......... -..#....#........#..#.......#... -#...#..#....#...##...........#. -.........#..#..#.#.##.......... -....#.#..#.....#..#.#.#.#..#.## -##................#.##.....#... -.#.....###..#..#..#.....#....## -...#...........#..........####. -.#.....#....#......#.##..#.#... -..#...##....#................#. -........#.......#......#.#..... -....#.#.#.#....#...#......#..#. -...........#......#..#......... -###...##......##.#..#....##.... -##....##.........#..#....###... -#.#.....#....#......#...#..##.. -#....##.#..............#.##.... -.#........#.#.........#...#.... -......................#......#. -........#..#..##.....#..#.#.... -..#...###.................#..#. -...#...#............#.......... -.##.......#..#.........#....#.. -.#..............#....#....##... -...............##..#.#.......## -.#.....#....#...#..#.......#..# -#..#.............#....#......#. -.....#.#......#.........###..#. -.#...#.#...............#....#.. -#......#.............#......... -.#.##.#.####...#..#.##..#.....# -.....#......#..#...#.......#... -#........###...#.....#..#.....# -....#.#.....#...#..........#... -...#.#.......#.#......#..#.##.. -..#..........#.#..#.......#.#.. -#...#.#..............#...###.#. -...#..#...#............###..... -..#..#...#.#............#..#... -.###.#.....................#..# -....#....#..#.....##.##........ -#....#....#.#..#.........#..... -.#.....##....#............##..# -#....#.#...#...#..#.#......#... -#.....##.....##.....##.#...##.. -...##...#..#..####.#........#.. -.........#...#......##..##..#.. -..#.....###.#..#..####.#....... -.......#......#...#..##....#... -.#.....#.#.#..#....#...#..##... -..........#.#...#...#.#..#..... -....#.....#........#.....##..#. -..#.#.##.........#...##.....##. -.........#.##....#............# -............##.....#.......#.#. -......#.....#...#..#..###...... -##.....#.......#...##.#....#... -...........##......#..##...#.#. -..#.#.#.#...#.......#....#...#. -#.............#.....#.#...###.. -##....#.......#.....#..##.#.... -...#.......#....#.........##... -......#.......#......##.##..... -..#......#...#.#........#...... -....#.#....#.#.##......#.....#. -#......#.........#..#....#..... -........#..#....##.....#....... -#......##....#.##....#......#.. -..#.......#............##.....# -...........#...#...........#... -#.......#...#....#....#...#.#.# -..###..#........#........#..... -..#..###...........#.#......#.. -.#...........#......#.......... -.#.......#.....#.......#....... -..#......##.#............#....# -#..........#.....#.#..#........ -.....#...##.##.......#......#.. -..........#.....#........#.#.#. -....#......#.....#......#.#.... -.........#.#.#..#...##....#...# -.........#.......#...##...#.#.. -.##........#...............#... -.......#....#...........##..... -.........###......#.........#.# -......#.......#...#..........#. -...#.#..........##......#...#.. -#.......#.#..........#......... -................#..#......#..## -.....#...#....#.#.....#........ -#.....#....#...........#....#.. -#....#.#..#...##....#...##.#... -...#.....#......#.#....#..#..#. -..#................#...#.#..##. -..........#..............#..#.# -.....##.....#..#.###........... -....#.#......#.#...........#... -.#....#.#.........##.#....#.... -.#.#........#........###....#.. -##.#................#...#..#... -.......#......##..#.....#..#.#. -...#............#......###...## -#.#...........#.........#...... -.....#.#.#.................#... -....#..............#...#.#..... -...#.#.....##..#............... -.#..##...#....##.....###..#.... -...............#...#...#.#.###. -.###....#.....#...#.#......#... -...#..#.....#.......#..##.#.... -...........#..#....##..#...#... -...#...#..........#.......##.#. -............#.#.......#........ -....#.........#.....#.......... -...#.###.##..#...##..####..#..# -.#.#...#..#...................# -.....#..#.....##..#............ -....#......#...##..#.##........ -...#...............#..#.....##. -...#......#.........#.#..##.... -.#....#.##.......#......#...... -....#.......#....#..........#.. -#.#.#....###.#.#.............#. -..##..###........#.#..#.#..#... -......#.#............##.#...### -.........#.#....#####.....##... -............##......#.#..#..... -...#.....#.....###....#........ -##..........####.##.#.#........ -....................##.....##.# -#.#............#........#...... -....#...##.....#......#....#... -...###.#..##..................# -..###......#..............#.#.# -.#...#...........#....#........ -....#............#..#..#.#..... -...#.........#.#.........#.#### -..#...#...#...#...........#.... -...............#.#......##..#.. -#....#.#.......#.#..#......#..# -........#.#....#..#...#..#...#. -...#..#.......#...........#.... -...........#.......#........... -.#......#................#..... -....#.#.#...#......#..#...#.... -................#.#.#....#..... -.........................##..#. -.#...........#............##... -#...............#.....##.#.#..# -.........#.......###....#.....# -....##...#...#.....#..#........ -........#.....#..#.#.#...#..#.. -......#.......#.#.........#.#.. -#......#............#...#....#. -#..##...#..#................#.. -.##...#...#.....#.##.......#..# -.......#.##........##..##...... -##.#..##...............#.....#. -......#....#..##...#......###.# -#........##..#....#.#......#... -.#......##.#...#.#...#......... -.#.#...#..#.............#...... -.##..........#..........#...... -.#.....#.....#..............#.# -..#.........#..#.#.....#.#....# -..#.##..............##...#..### -....................#.......... -......###..#..#...........#.... -..#..........#.......#...#..... -...#......#......#............. -....##..............#.#.....#.. -........#.#......#..#........## -.............#...#.#.........## -...###...#..........##.......#. -.#..........#...##..#.#.....#.. -##...#.........#............... -......#....#....#.....#.....#.. -..........#....#...#...#..#...# -...##....#.#.#..#...##......... -#......#.#...##.###...#....#... -##.......##.#......##..#...#... -......#.............#.##.....## -#.......###....####.#...##....# -..#...#..#.......#..........#.. -#.....#..#..#..#.##...###...#.. -.....##.#..#..#..#.#....#...#.. -..#...#..................##.... -....#.#........##.............. -#...#.......##...#...#.#....... -..#...#........##....#.#....... -..........###...###...#......#. -#.....#..###...##...##..#..#..# -..#.....##.....#.......##..#.#. -........#........#.........#... -.................#....#.......# -.......#...#.....#...#.#....... -....##...............#...##...# -.##...#................#...#... -.............#................. -.#..#....#....#.#....#......... -.#.#..#..........#.......#..... -.....##.....##...#..#.......... -#...#.#.........#......#..#.... -........#....#...#....#.#.##... -....#..#........#...#...#...... -.#..#.....#.#...#.........#.... -.#..#..#...........#..#....#... -....###.............#..#....... -#......#..#..##..........#.#... -#..#..#.##..#...#.#.#.......... -....###......#.##.....#....#... -.##..#...#......##.#........... -..#..#.......#.....#.##....#.#. -.......#.#.#........#....##.... -..##...#....#...............### -#..##..#...........#.#....##... -...##..#.....................#. -###......#....#....###..#...##. -.........##............#..#...# -..#..........#...#.#.#......#.# -.......#.....##..##......#.##.. -#..........#.....##.#.......... -#.......#.#...#...#....#....... -#...#.....##.......#.#..#.#.#.. -.........#.#.#..#..#...#.###... -.................##...#....#... -###.......#..........##...#.... -#.#..#.........#....##.#....... -......#.#.....#........#....... -.......#.#........#......#.#..# -..............#..#...##....#..# -#...........#...##.....#..#.#.. -..#....#..#.#.#...#..#....#.#.. -...##.#.....#..#...##..#.....#. -..#.#................#........# -......#...#.............#...... -.##............#....#...#..#... -....#...#...........#.......#.. -.###..#.......#.............#.# -.#.#....#.#...........#.#...... -...#.........#.........#..#.... -...#..........#.#.....#.#...... -.....#........#....##......#... -..#.#.#......#..#.#......#....# -.#.#..#................#.#..... -.#.#.........##...#.......#.#.# -#..#.....#...#..#...........#.. -..##......####......#..#....### -#.....###....#.#........#..#..# -..##.#...#.#..##..........#..#. -#.........#.#.............#...# -...#.#...#...#.#.#....##....... -##.##...#.....#...#...........# -....#........#.#.....#......... -.................##..#..##...## -.....##....#...#...#.....#..#.. -....#...#........#............# -..#...........##....#...#...##. -.....#......#.........#..##.#.. diff --git a/3/part1.c b/3/part1.c deleted file mode 100644 index b664b7d..0000000 --- a/3/part1.c +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include -#include -#include - -#define INC_RIGHT 3 - -int count_trees(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[64] = { 0 }; - // Start is always safe - fgets(buffer, 64, file); - // strlen includes the newline - int width = strchr(buffer, '\n') - buffer; - - int pos = INC_RIGHT; - int hit = 0; - while (fgets(buffer, 64, file)) { - if (buffer[pos] == '#') { - hit++; - } - - pos = (pos + INC_RIGHT) % width; - } - - fclose(file); - - return hit; -} - -int main(int argc, char *argv[]) -{ - printf("%i", count_trees(argv[argc - 1])); -} diff --git a/3/part2.c b/3/part2.c deleted file mode 100644 index bae8654..0000000 --- a/3/part2.c +++ /dev/null @@ -1,41 +0,0 @@ -#include -#include -#include -#include - -int count_trees(int inc_right, int inc_down, const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[64] = { 0 }; - // Start is always safe - fgets(buffer, 64, file); - // strlen includes the newline - int width = strchr(buffer, '\n') - buffer; - - int pos = inc_right; - int hit = 0; - for (int i = 1; fgets(buffer, 64, file); i++) { - if (inc_down != 1 && i % inc_down != 0) { - continue; - } - - if (buffer[pos] == '#') { - hit++; - } - - pos = (pos + inc_right) % width; - } - - fclose(file); - - return hit; -} - -int main(int argc, char *argv[]) -{ - char *arg = argv[argc - 1]; - long mul = (long)count_trees(1, 1, arg) * count_trees(3, 1, arg) * count_trees(5, 1, arg) * count_trees(7, 1, arg) * count_trees(1, 2, arg); - printf("%li\n", mul); -} diff --git a/4/input b/4/input deleted file mode 100644 index 0e247b0..0000000 --- a/4/input +++ /dev/null @@ -1,953 +0,0 @@ -ecl:amb -pid:690616023 -byr:1994 iyr:2014 hgt:172cm hcl:#c0946f eyr:2022 - -eyr:1980 cid:97 -hcl:z ecl:#102145 iyr:2011 byr:1945 -pid:187cm hgt:179in - -ecl:amb -iyr:2011 -cid:113 -eyr:2021 hcl:#b6652a pid:004682943 byr:1940 -hgt:173cm - -iyr:2023 -cid:146 byr:2022 ecl:dne hgt:76in eyr:2040 hcl:z - -hcl:#f97e30 -cid:73 iyr:2013 byr:1929 hgt:157cm -eyr:2024 ecl:blu pid:673398662 - -hcl:5343fe -hgt:152 byr:2018 -eyr:1992 pid:85999926 iyr:1938 ecl:#15bd97 - -byr:1975 hcl:z eyr:1988 pid:#c36f52 -iyr:2018 -hgt:184cm - -byr:1954 eyr:2023 hgt:170cm iyr:2012 ecl:blu pid:299556897 hcl:#b6652a - -hgt:191cm ecl:oth hcl:#7d3b0c -iyr:2016 pid:187567535 -byr:1999 eyr:2023 - -pid:814358147 eyr:2022 iyr:2000 byr:2001 hcl:#18171d -ecl:blu -hgt:76in - -ecl:hzl -hgt:163cm byr:1955 iyr:2018 eyr:2024 hcl:#6b5442 pid:343362099 - -eyr:2020 pid:185090160 ecl:#21a5e6 -iyr:1928 byr:2006 hcl:a2ebbf hgt:104 - -hgt:153cm -hcl:#a97842 ecl:blu eyr:2028 byr:1969 iyr:2019 -pid:729700590 - -iyr:2019 byr:1981 hgt:150cm pid:606092356 hcl:#18171d eyr:2026 -ecl:grn - -pid:760899887 -eyr:2023 hcl:#866857 hgt:185cm iyr:2017 -byr:1976 ecl:gry - -byr:1965 eyr:2026 -hcl:#623a2f -ecl:blu pid:483363116 iyr:2010 hgt:178cm cid:204 - -ecl:oth eyr:2022 -pid:268557763 byr:1965 iyr:2015 hcl:#c0946f hgt:164cm - -ecl:gry hgt:168cm hcl:#623a2f eyr:2020 cid:163 pid:124082663 iyr:2016 byr:1996 - -hcl:4c44fb iyr:1957 eyr:2039 ecl:grt hgt:63cm byr:2012 cid:104 - -byr:2024 iyr:2023 -ecl:gry -eyr:2007 pid:170cm hgt:68 hcl:d57b67 cid:333 - -byr:1956 -hgt:169cm iyr:2013 pid:370491367 -ecl:gry hcl:#5bc41d - -eyr:2023 iyr:2028 byr:1969 ecl:lzr hcl:1989b1 hgt:71cm pid:#12c226 - -cid:304 pid:866132461 -byr:2022 -hcl:z hgt:191in ecl:lzr iyr:2029 eyr:1989 - -ecl:brn hcl:#9a45a7 -hgt:176cm -byr:1974 pid:758747330 iyr:2014 eyr:2020 - -cid:190 ecl:hzl iyr:2014 byr:1990 hgt:69in eyr:2037 pid:384015829 hcl:#ceb3a1 - -byr:1998 eyr:2022 iyr:2018 hgt:153cm -hcl:#733820 pid:424512443 -ecl:blu - -hcl:27c41f byr:1972 eyr:1994 pid:777840405 -ecl:gry -hgt:179cm -iyr:2021 - -hgt:166cm eyr:2032 ecl:gry byr:1936 -pid:41703652 - -hcl:#efcc98 iyr:2019 byr:1936 pid:985830958 eyr:2021 -hgt:175cm ecl:brn - -eyr:2025 pid:972163513 hgt:155cm ecl:brn cid:169 iyr:2015 -hcl:#6b5442 - -eyr:2026 -hgt:173cm -byr:1984 -cid:191 -pid:791209101 hcl:#341e13 iyr:2020 ecl:hzl - -hgt:64cm -iyr:2010 byr:1978 -pid:618891746 hcl:#d6ac23 eyr:2023 ecl:brn - -eyr:2021 hcl:#341e13 iyr:2018 pid:502081929 -ecl:blu - -ecl:amb -iyr:2018 pid:8933462515 -hgt:160cm hcl:e330f0 eyr:2030 byr:2007 - -ecl:gry byr:1980 hcl:#341e13 iyr:2015 pid:830724822 hgt:167cm cid:156 -eyr:2023 - -ecl:gry hcl:#c39b75 byr:1995 hgt:153cm -eyr:2029 pid:83056475 iyr:2013 - -byr:1965 cid:250 -ecl:oth iyr:2016 -pid:242792947 eyr:2025 hcl:#efcc98 - -byr:2011 ecl:#62fe2d hcl:#2b434a hgt:190cm -eyr:2031 iyr:1964 pid:7096872943 - -cid:258 hcl:#c0946f pid:698224453 eyr:2029 hgt:189cm iyr:2012 ecl:blu byr:1963 - -eyr:2028 byr:1942 hgt:156cm pid:836243052 iyr:2016 -hcl:#888785 cid:310 ecl:brn - -hcl:#a97842 pid:740164307 ecl:oth byr:1997 -hgt:166cm -iyr:2015 eyr:2026 - -hcl:4ee9da iyr:2020 -eyr:1933 hgt:136 ecl:#8dee29 pid:44266010 byr:1966 cid:82 - -ecl:amb byr:1921 hgt:182cm eyr:2026 -hcl:#c0946f iyr:2010 - -hgt:178cm cid:343 eyr:2023 pid:197119382 hcl:#623a2f iyr:2017 -ecl:brn byr:2002 - -eyr:2030 byr:1967 ecl:blu hgt:166cm iyr:2017 -pid:655602762 hcl:#6b5442 - -cid:143 hgt:152cm eyr:2026 iyr:2018 byr:1950 ecl:grn hcl:#866857 pid:067535973 - -byr:2019 ecl:#e3c288 iyr:1948 hgt:72cm hcl:7da71b eyr:1956 - -hcl:#cfa07d -pid:688405238 cid:200 byr:1950 -iyr:2020 ecl:hzl hgt:170cm - -eyr:2026 hgt:164cm iyr:2010 hcl:#b6652a pid:404835595 byr:1924 ecl:blu - -iyr:2016 hcl:#866857 -ecl:gry -eyr:2023 pid:986813245 cid:247 byr:1977 -hgt:173cm - -ecl:#a59335 eyr:2023 -hcl:033f22 byr:1947 hgt:152 -iyr:2029 pid:#1e686a cid:305 - -byr:2005 -ecl:amb hcl:#a97842 -iyr:1972 -eyr:1967 pid:274884869 - -eyr:2038 iyr:2018 -pid:181cm ecl:xry hgt:185in -hcl:109b28 cid:287 - -ecl:amb byr:1943 pid:002483342 hgt:178cm -hcl:#c0946f eyr:2030 -iyr:2014 - -iyr:2020 byr:1963 cid:131 hcl:#18171d hgt:181cm pid:146726616 eyr:2021 - -pid:062629370 byr:1931 hgt:188cm eyr:2021 ecl:gry -hcl:#166b3d - -pid:007028786 ecl:blu hgt:156cm byr:1981 hcl:#888785 cid:53 iyr:2019 - -iyr:2014 hcl:#623a2f -ecl:hzl eyr:2029 byr:1988 -pid:849096536 hgt:167cm cid:322 - -pid:160824363 -hcl:#19bed3 -eyr:2024 hgt:171cm -byr:1968 iyr:2019 - -eyr:2024 hcl:#dd66d0 -byr:1986 -cid:105 pid:816153574 ecl:hzl iyr:2013 -hgt:173cm - -hcl:#ceb3a1 hgt:62in ecl:gry -iyr:2017 cid:234 byr:1963 -eyr:2029 -pid:514406488 - -hcl:#fffffd ecl:blu -eyr:2020 iyr:2010 -pid:544347103 hgt:164cm byr:1939 - -eyr:2021 -pid:999479324 hgt:164in ecl:brn iyr:2016 -hcl:#a97842 byr:2020 - -pid:053149570 byr:1920 eyr:2027 hgt:190cm iyr:2011 hcl:#fffffd ecl:oth - -hgt:165cm -hcl:#cfa07d -ecl:oth -eyr:2023 -pid:186cm -byr:1937 iyr:2012 - -eyr:2026 hgt:64cm hcl:#ac426a byr:1969 -cid:345 iyr:1960 -pid:#df648a ecl:blu - -byr:1923 iyr:2017 -eyr:2027 pid:798497862 hgt:182cm -hcl:#ceb3a1 ecl:oth - -hgt:182cm eyr:1990 ecl:grn hcl:#efcc98 byr:1968 -pid:005962011 -iyr:2010 - -cid:74 eyr:2020 hgt:71in -iyr:2015 pid:487940408 byr:1952 -hcl:#733820 - -hgt:75cm cid:249 -ecl:hzl -hcl:#6b5442 pid:4860441 eyr:2020 - -ecl:hzl eyr:2025 hgt:183cm -iyr:2020 byr:1993 pid:572766871 hcl:#866857 - -hcl:#888785 pid:200125941 hgt:155cm byr:1923 -eyr:2021 iyr:2010 ecl:gry - -pid:502547835 iyr:2014 hcl:#b6652a -byr:1985 hgt:189cm eyr:2024 - -eyr:2024 hcl:#fffffd ecl:amb byr:1952 -pid:724639818 -iyr:2013 hgt:183cm - -byr:2023 -iyr:2026 ecl:gry eyr:2032 hcl:3e0fc4 pid:5620497552 -hgt:84 - -cid:79 -hgt:68cm -iyr:2021 -pid:#365b83 byr:1928 -ecl:#79a6b3 eyr:2027 hcl:54130e - -hgt:74cm byr:1953 -cid:263 iyr:2018 -ecl:zzz -hcl:#efcc98 -pid:154cm eyr:1951 - -cid:272 pid:0638528559 hcl:z hgt:63cm byr:2029 ecl:zzz -eyr:2033 - -iyr:2016 -hgt:193cm hcl:#6b5442 pid:715518898 ecl:brn cid:195 -eyr:2025 - -ecl:oth -eyr:2025 hgt:166cm byr:1944 -iyr:2017 pid:814141652 - -eyr:2025 cid:140 ecl:hzl hcl:#c0946f pid:824866056 iyr:2011 hgt:65in byr:1947 - -iyr:2016 -ecl:brn eyr:2021 -hgt:161cm -byr:1984 hcl:#602927 pid:821539320 - -hgt:175cm cid:190 hcl:#ceb3a1 ecl:brn byr:1927 iyr:2017 eyr:2029 pid:836598854 - -eyr:2026 ecl:brn hgt:157cm pid:038645205 byr:1995 -iyr:2019 cid:339 - -ecl:brn hgt:70in hcl:#c0946f -pid:535498918 cid:153 -iyr:2012 eyr:2030 - -byr:1995 -hcl:#efcc98 hgt:174cm eyr:2030 pid:180839761 -ecl:grn iyr:2010 - -hgt:59cm eyr:2035 byr:2021 iyr:2012 ecl:hzl pid:219328725 hcl:#888785 - -ecl:oth hgt:184cm byr:1984 iyr:2016 -hcl:#cfa07d - -iyr:1998 byr:2024 ecl:lzr hgt:187 hcl:z eyr:1935 pid:#789b56 - -iyr:1967 hcl:z pid:828930046 hgt:59in -cid:153 -byr:2021 -ecl:grn -eyr:1935 - -byr:1991 -hcl:#341e13 ecl:gry iyr:2018 -hgt:67in pid:157970631 eyr:2021 - -byr:1941 hgt:169cm pid:322510952 hcl:#cfa07d cid:75 ecl:oth -eyr:2021 iyr:2020 - -hcl:#7d3b0c iyr:2013 cid:78 hgt:167cm ecl:brn byr:1974 pid:237404828 - -pid:1567157833 -hcl:#7d3b0c iyr:2025 eyr:2023 -byr:2002 ecl:oth hgt:191cm - -ecl:amb iyr:2014 hgt:182cm pid:526612838 -cid:287 eyr:2025 byr:1988 -hcl:#866857 - -hcl:#866857 hgt:174cm byr:1992 eyr:2028 iyr:2015 - -eyr:2029 -hgt:190cm -hcl:#18171d -cid:245 -ecl:oth pid:3636033742 byr:2024 -iyr:2019 - -byr:1972 hgt:163cm eyr:2020 hcl:#b6652a -pid:360516396 iyr:2019 ecl:grn - -iyr:1997 ecl:#be02d2 -eyr:2020 cid:259 byr:1953 -hcl:#6b5442 -hgt:177cm pid:978155362 - -pid:377596476 cid:153 -eyr:2025 byr:2000 hgt:181cm iyr:2014 hcl:#abc5cb ecl:hzl - -cid:171 ecl:lzr iyr:2013 eyr:1973 byr:2004 -pid:#267099 hgt:101 - -hcl:#623a2f -pid:029193661 -hgt:183cm -ecl:hzl eyr:2029 iyr:2013 -byr:1977 - -ecl:amb eyr:2021 hgt:159cm byr:1970 cid:152 -hcl:#b6652a iyr:2020 pid:180512119 - -eyr:2025 -ecl:grn -hgt:60in iyr:2013 pid:697352361 -hcl:#18171d byr:1989 - -byr:1934 hgt:165cm pid:703537570 ecl:hzl iyr:2015 -hcl:#888785 - -ecl:gmt -hcl:6dd6a5 -byr:1951 -pid:#7ab761 cid:304 iyr:1924 eyr:1953 hgt:71in - -ecl:amb hcl:#733820 eyr:2030 hgt:178cm -pid:692422832 iyr:2019 -cid:276 - -iyr:2012 ecl:oth -pid:674969358 -eyr:2027 hgt:157cm cid:247 hcl:#a97842 - -byr:2017 eyr:2031 hgt:180cm hcl:#ceb3a1 pid:372071110 -iyr:2015 ecl:amb - -hgt:165cm iyr:2015 -eyr:2021 ecl:amb byr:2000 cid:235 - -eyr:2027 hcl:#623a2f pid:595874068 -ecl:amb -hgt:177cm iyr:2019 byr:1929 - -pid:8150929412 hgt:191in eyr:2031 cid:233 byr:2027 -iyr:2026 ecl:#e94348 hcl:z - -hgt:65 byr:2009 iyr:2029 hcl:#fffffd eyr:1950 pid:950012410 cid:212 ecl:#5a6042 - -ecl:#44c561 hgt:178cm eyr:2021 pid:753771724 -iyr:2014 -hcl:#70adb2 byr:1989 - -iyr:2018 pid:809109448 ecl:amb hcl:#b6652a hgt:63in byr:1976 cid:96 - -byr:2021 ecl:grn pid:9284377919 iyr:2011 hgt:75cm hcl:#18171d eyr:2026 - -ecl:oth -byr:1926 -hgt:63 iyr:1948 cid:61 hcl:a528d1 eyr:2034 - -byr:1978 pid:150503169 iyr:2015 ecl:grn hgt:172cm cid:70 eyr:2022 hcl:#7d3b0c - -byr:1957 hcl:#cfa07d iyr:2010 ecl:amb eyr:2025 pid:921901279 - -ecl:utc pid:154cm -byr:1964 eyr:1978 hgt:114 hcl:z - -byr:1929 ecl:amb eyr:2028 iyr:2013 -hcl:#fffffd pid:479814281 -cid:105 hgt:64in - -pid:949640425 -cid:205 hcl:#341e13 ecl:amb -hgt:171cm byr:1998 - -hgt:190cm cid:113 ecl:grn eyr:2037 -hcl:#ceb3a1 pid:7994792779 iyr:2011 - -hgt:152cm iyr:2010 -byr:1992 eyr:2020 -hcl:#602927 -cid:66 -pid:604149642 - -eyr:2028 -byr:1961 hgt:71in -iyr:2013 cid:135 -pid:534090716 hcl:#ceb3a1 ecl:oth - -iyr:1937 byr:1995 cid:200 -eyr:2037 pid:#daf9af -hcl:052017 ecl:zzz hgt:73cm - -ecl:amb -hcl:#a97842 -iyr:2018 -hgt:153cm -cid:149 eyr:2023 pid:533403632 - -cid:275 ecl:brn iyr:2017 pid:087665205 byr:1945 hcl:#7d3b0c -eyr:2025 - -eyr:2030 hgt:177cm hcl:#cfa07d iyr:2018 pid:734113761 -byr:1965 - -hgt:163cm byr:1924 ecl:blu cid:125 -eyr:2027 hcl:#fffffd pid:137238888 - -hgt:174cm hcl:#623a2f eyr:2023 ecl:gry pid:585758460 -iyr:2011 - -cid:183 -byr:1928 pid:471385060 -hgt:192cm -ecl:oth iyr:2010 hcl:#623a2f eyr:2020 - -hgt:177cm -cid:273 ecl:oth eyr:2020 -hcl:#efcc98 -iyr:2012 pid:246299733 -byr:1954 - -pid:052203766 cid:146 ecl:hzl byr:1974 hcl:#6b5442 -eyr:2030 hgt:173cm -iyr:2011 - -hgt:167cm -byr:1972 iyr:2010 -pid:783359411 ecl:hzl hcl:#9f8cc9 eyr:2028 - -iyr:2020 hcl:#18171d ecl:grn -byr:1992 -hgt:189cm -eyr:2023 pid:736882272 - -cid:230 ecl:utc iyr:2022 -pid:170cm -byr:2015 hcl:#c0946f -eyr:2031 - -cid:261 -byr:1922 hgt:170cm ecl:brn eyr:2021 -pid:593276915 hcl:#18171d -iyr:2017 - -hcl:#341e13 pid:038417039 hgt:61in eyr:2025 iyr:2017 -cid:117 - -iyr:2017 eyr:2026 pid:441484223 -hgt:155cm byr:1968 hcl:#ceb3a1 ecl:hzl - -eyr:2021 -hgt:64in -ecl:oth hcl:#b6652a byr:1954 pid:204959612 iyr:2016 - -hcl:z eyr:1969 -pid:162cm ecl:#944b0f -iyr:2030 byr:2029 - -hgt:114 eyr:2034 byr:2026 hcl:84fa1a -pid:47909473 -iyr:2028 -ecl:utc - -eyr:2025 ecl:blu hgt:157cm iyr:2014 hcl:#a97842 byr:1974 pid:702610675 cid:241 - -pid:732388109 -hcl:#6b5442 cid:272 eyr:2026 hgt:193cm -ecl:amb byr:1982 - -eyr:2030 byr:1994 -hgt:177in ecl:amb pid:1589147420 iyr:2011 hcl:#4bf920 -cid:252 - -ecl:oth eyr:2022 -byr:1948 -pid:177cm cid:90 hgt:102 hcl:z iyr:2028 - -hgt:157cm pid:233347213 -hcl:z -byr:2009 eyr:2027 cid:235 ecl:blu -iyr:1965 - -ecl:blu iyr:2030 eyr:2028 hcl:#18171d pid:322593908 byr:1954 -cid:215 hgt:63in - -hgt:72cm -cid:345 pid:911728732 eyr:2025 -byr:2004 ecl:#0c4af7 hcl:3bb675 - -pid:171714794 byr:2019 -hcl:#866857 -cid:290 hgt:183in ecl:#d0c30f eyr:2032 - -iyr:2016 pid:905945155 hcl:#ceb3a1 byr:1958 hgt:159cm eyr:2028 cid:180 ecl:oth - -hcl:efb614 -eyr:2022 hgt:177cm pid:46962273 -byr:1974 -ecl:#089bdd iyr:1988 - -pid:662993164 iyr:2011 eyr:2025 ecl:hzl -byr:1942 hcl:#fffffd -hgt:175cm - -hcl:#7d3b0c iyr:2016 hgt:175cm eyr:2022 pid:953132241 -byr:1963 cid:261 ecl:grn - -iyr:2013 hgt:180cm cid:318 -ecl:amb -byr:1985 pid:439097817 eyr:2029 hcl:#602927 - -hgt:162cm ecl:blu -pid:675749832 cid:73 -byr:1940 hcl:#888785 -eyr:2026 - -pid:275352007 iyr:2012 eyr:2020 -ecl:amb hcl:#623a2f hgt:175cm cid:317 byr:1988 - -hcl:z hgt:164in -iyr:2026 eyr:1961 ecl:#2df35e pid:#5c9ed5 cid:341 - -pid:848086119 ecl:oth eyr:2021 iyr:2011 hgt:180cm byr:1923 hcl:#93461b - -eyr:2028 -iyr:2014 -byr:1978 -hgt:184cm -pid:966277564 ecl:hzl -cid:176 - -hcl:#888785 ecl:amb cid:329 pid:835961958 byr:1927 eyr:2028 iyr:2016 - -pid:160cm eyr:2026 hcl:#08714b -ecl:hzl iyr:1961 -hgt:156cm byr:1984 - -ecl:gry cid:302 -byr:1965 -iyr:2019 hcl:#ceb3a1 eyr:2027 pid:458192010 hgt:156cm - -pid:058273969 byr:1942 eyr:2027 -hcl:#c0946f iyr:2013 hgt:179cm - -iyr:2019 hgt:193in pid:52144528 eyr:2036 -cid:169 ecl:grt hcl:7e7039 - -hgt:192cm ecl:blu iyr:2015 pid:544936486 eyr:2024 -byr:1972 hcl:#c0946f - -eyr:2000 -hcl:78de23 byr:2020 -hgt:171in pid:160cm cid:68 -iyr:1956 ecl:gmt - -hcl:#733820 ecl:grn iyr:2018 -byr:2001 pid:770957230 - -cid:103 ecl:grn iyr:2018 -pid:068344094 -eyr:2023 hgt:69in byr:1984 hcl:#6b5442 - -hgt:193cm eyr:2021 ecl:grn hcl:#602927 byr:1938 iyr:2011 - -iyr:1931 -hcl:c0a318 -pid:99195939 -byr:2028 ecl:grt hgt:164 eyr:2017 - -eyr:1980 -ecl:zzz -hgt:98 cid:161 -pid:#96fe01 hcl:z -iyr:1974 - -byr:1936 hgt:176cm pid:56797167 iyr:2015 -ecl:#07ad47 -hcl:z - -pid:48720181 hcl:270e76 -byr:2022 -hgt:180cm ecl:#dde399 -eyr:2035 iyr:2023 - -eyr:2030 byr:2022 iyr:2018 hgt:162in ecl:gry -hcl:#63e2ec pid:615812600 - -ecl:grn -cid:56 hcl:#623a2f eyr:2020 hgt:167cm byr:1971 iyr:2012 -pid:262692066 - -hgt:61 hcl:#efcc98 iyr:2011 eyr:2026 -byr:1938 -ecl:amb pid:385025739 - -pid:972423724 hcl:#602927 eyr:2027 ecl:oth iyr:2015 -hgt:158cm byr:1956 - -pid:530035096 -ecl:hzl -iyr:2017 -eyr:2024 hcl:#888785 byr:1962 hgt:64in - -byr:1935 eyr:2022 ecl:grn hcl:#7d3b0c pid:294714199 - -eyr:2029 -iyr:2013 -byr:1927 hgt:175cm pid:058261075 hcl:#cfa07d ecl:amb - -ecl:blu pid:188764763 hgt:155cm byr:1921 -iyr:2018 eyr:2029 hcl:#b6652a - -byr:1975 hcl:930e76 iyr:2019 -pid:169cm eyr:2009 hgt:191 -ecl:#d28c56 - -hcl:z -pid:3190617557 -hgt:160cm cid:80 ecl:oth iyr:2022 eyr:2008 -byr:2016 - -hcl:#888785 byr:1999 ecl:blu cid:238 iyr:2018 hgt:160cm -eyr:2028 pid:174517111 - -eyr:2035 -hcl:z byr:2020 -pid:262135957 cid:324 iyr:2016 hgt:161cm ecl:grn - -byr:1936 -ecl:grn -iyr:2013 hcl:#623a2f eyr:2029 hgt:166cm - -hcl:#cfa07d hgt:159cm eyr:2021 -ecl:hzl -iyr:2014 pid:816039817 byr:1935 - -pid:596634790 hgt:161cm -eyr:2036 iyr:2016 -hcl:#7d3b0c byr:2015 ecl:brn - -byr:1952 -hgt:157cm eyr:2024 cid:60 pid:876160626 -ecl:blu iyr:2011 hcl:z - -hgt:193cm iyr:2020 eyr:2026 -pid:0136642346 ecl:hzl hcl:#efcc98 byr:1995 - -byr:1934 hgt:177cm -pid:445993865 -ecl:brn iyr:2018 -eyr:2030 -hcl:#733820 - -eyr:2021 hgt:71in -pid:918630878 -hcl:#602927 iyr:2017 byr:1943 -ecl:gry - -ecl:#81de2c iyr:2021 hgt:176cm eyr:1947 hcl:#888785 pid:1370052400 - -ecl:amb -byr:1922 iyr:2012 eyr:2022 pid:098866466 hcl:#18171d hgt:63in - -eyr:2028 iyr:2010 hcl:184355 -byr:1968 pid:337089458 ecl:brn hgt:181cm - -hcl:#733820 pid:225958483 ecl:gry eyr:2030 hgt:62in iyr:2012 byr:1987 - -eyr:1955 -hcl:03199c -pid:#3e832e -byr:2014 ecl:#453931 hgt:70cm - -byr:1975 -ecl:blu hcl:#7d3b0c -cid:169 pid:582470437 hgt:151cm -iyr:2019 eyr:2027 - -iyr:2017 byr:1971 pid:343492418 hgt:150cm hcl:#fffffd eyr:2024 - -byr:1997 -eyr:2026 -cid:257 hcl:#7d3b0c ecl:blu hgt:166cm iyr:2016 pid:117625518 - -iyr:2014 cid:248 hgt:165cm hcl:#18171d pid:294270262 -byr:1925 ecl:amb -eyr:2028 - -hgt:167in ecl:dne pid:174cm iyr:2019 byr:2005 hcl:b29331 cid:86 - -hcl:#733820 pid:259969636 eyr:2023 -ecl:hzl cid:317 -hgt:185cm byr:2025 -iyr:2012 - -hcl:#cfa07d hgt:152cm pid:807755992 iyr:2020 -byr:1922 ecl:grn eyr:2025 cid:241 - -pid:997807107 byr:1958 ecl:dne iyr:2013 eyr:2023 hcl:#18171d -hgt:152cm - -ecl:blu hgt:170cm -byr:1932 -pid:775223495 eyr:2024 iyr:2015 - -iyr:2011 -ecl:grn hcl:#ceb3a1 pid:190577415 -hgt:63in -eyr:2021 -byr:1986 - -ecl:oth eyr:2025 hgt:180cm -pid:258195402 iyr:2017 -byr:1961 -cid:109 hcl:#888785 - -hgt:178cm byr:1952 eyr:2023 hcl:#733820 -pid:106939563 ecl:brn iyr:2012 - -hgt:188cm iyr:2012 hcl:#fffffd byr:1942 -ecl:brn pid:804371742 - -byr:1978 cid:120 -eyr:2026 pid:405714523 hgt:60in -hcl:#a97842 ecl:blu -iyr:2017 - -iyr:2015 byr:1958 ecl:grn -hcl:#b6652a pid:#9e8af3 -eyr:2026 hgt:167cm - -hgt:171cm hcl:#888785 -cid:274 -ecl:grn pid:919263460 eyr:2023 iyr:2020 - -pid:606726472 eyr:2022 -byr:2008 -ecl:zzz cid:72 hgt:173in - -eyr:2032 byr:2004 -hcl:z iyr:2011 ecl:hzl -pid:523494728 -hgt:70cm - -hgt:169cm pid:755822781 byr:1984 ecl:hzl hcl:#6b5442 iyr:2014 - -eyr:2020 -byr:1942 cid:85 -hgt:157cm pid:558287447 hcl:#efcc98 -ecl:hzl - -byr:1980 cid:225 pid:367501996 iyr:2016 ecl:grn hcl:#efcc98 -hgt:175cm eyr:2029 - -pid:264780775 hgt:182cm ecl:grn -hcl:#18171d -eyr:2024 -byr:1926 iyr:2013 - -byr:1969 iyr:2015 -eyr:2026 ecl:blu -hcl:#fffffd -pid:005695878 cid:273 - -ecl:brn byr:2006 hgt:152cm -hcl:#888785 -pid:171cm cid:249 iyr:2026 -eyr:2022 - -byr:2011 iyr:2020 ecl:zzz hcl:z pid:412624100 -eyr:2031 - -cid:111 hcl:df9bd0 -iyr:2022 ecl:#32fdf9 -byr:2017 eyr:2000 -hgt:166in pid:0654651026 - -eyr:2021 -ecl:gry pid:587324819 hgt:187cm byr:1951 hcl:#6b5442 - -iyr:2011 -pid:180780096 hcl:#623a2f ecl:amb hgt:160cm byr:1991 eyr:2026 - -byr:2022 hgt:152cm eyr:2023 cid:70 ecl:grn -hcl:e0a24e -iyr:1959 pid:77110462 - -pid:251982311 byr:1994 ecl:gry hgt:165cm eyr:2021 -hcl:#623a2f -iyr:2019 - -ecl:blu byr:1945 -cid:241 -pid:732768808 hcl:#efcc98 -hgt:171cm eyr:2020 iyr:2012 - -cid:243 eyr:2001 -hcl:01a022 -hgt:162 pid:507703455 -byr:2003 ecl:#c6a07b -iyr:1941 - -hcl:#733820 cid:150 -ecl:hzl pid:843607639 hgt:190cm -byr:1958 -eyr:2025 - -eyr:2030 -pid:489370607 iyr:2014 ecl:oth hcl:#cfa07d byr:1995 hgt:193cm - -hgt:68in -byr:1933 -iyr:2010 ecl:brn -pid:380075958 -hcl:#623a2f cid:279 -eyr:2025 - -iyr:2019 -byr:2001 -hcl:#cfa07d ecl:brn pid:349877352 -hgt:161cm eyr:2029 - -hgt:171cm -eyr:2040 ecl:dne hcl:#6b5442 iyr:2020 byr:1990 - -hcl:#fffffd -hgt:154cm -byr:1979 eyr:2020 iyr:2018 -pid:118713281 cid:174 - -hcl:#7d3b0c eyr:2030 ecl:brn iyr:2017 -cid:184 hgt:180cm pid:504181498 byr:1925 - -hgt:150cm -eyr:2020 byr:1999 hcl:#a97842 iyr:2011 ecl:grn pid:620166468 - -hcl:#602927 -iyr:2015 -byr:1928 -pid:083747352 -eyr:2027 hgt:193cm -ecl:hzl - -byr:1938 ecl:gry -pid:511669464 eyr:1973 hgt:70cm -cid:262 iyr:2015 hcl:#c0946f - -eyr:2029 -byr:1923 hgt:160cm hcl:#7d3b0c iyr:2013 pid:525837692 ecl:gry - -hcl:#602927 eyr:2025 -pid:232338168 hgt:174cm cid:322 iyr:2010 ecl:oth - -hgt:192in cid:126 hcl:#6b5442 -pid:101406211 byr:1922 ecl:hzl eyr:2022 iyr:2013 - -eyr:2026 ecl:amb -byr:1921 -cid:336 -iyr:2020 hgt:182cm pid:533626984 - -pid:411943955 ecl:amb eyr:2025 hgt:166cm byr:1964 hcl:#341e13 cid:285 -iyr:2010 - -ecl:grn byr:1933 eyr:2024 -hgt:153cm -hcl:#5cfb31 iyr:2019 pid:773885967 - -ecl:hzl pid:426060511 -hgt:159cm -byr:1922 hcl:#6ffd04 iyr:2017 - -byr:2025 pid:#097d1b iyr:2020 eyr:2029 hcl:73d113 hgt:69cm ecl:utc - -ecl:amb hgt:170cm eyr:2025 byr:1930 iyr:2018 hcl:#733820 -cid:262 - -iyr:2019 -eyr:2021 -cid:65 pid:258615618 -ecl:oth byr:1987 -hcl:#efcc98 -hgt:178cm - -hcl:z eyr:1980 ecl:#1c5fd1 hgt:65cm byr:2014 -cid:222 pid:#c69fd5 iyr:2020 - -cid:271 pid:#4b8380 hcl:80fab0 -byr:2024 ecl:#20e25f -iyr:1945 -eyr:1935 hgt:159cm diff --git a/4/part1.c b/4/part1.c deleted file mode 100644 index b4a3b8e..0000000 --- a/4/part1.c +++ /dev/null @@ -1,68 +0,0 @@ -#include -#include -#include -#include - -bool is_valid_passport(const char *pass) -{ - return strstr(pass, "byr:") - && strstr(pass, "iyr:") - && strstr(pass, "eyr:") - && strstr(pass, "hgt:") - && strstr(pass, "hcl:") - && strstr(pass, "ecl:") - && strstr(pass, "pid:"); -} - -int count_valid_passports(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[128] = { 0 }; - - bool has_byr = false; - bool has_iyr = false; - bool has_eyr = false; - bool has_hgt = false; - bool has_hcl = false; - bool has_ecl = false; - bool has_pid = false; - int correct = 0; - while (fgets(buffer, 128, file)) { - if (buffer[0] == '\n') { - if (has_byr && has_iyr && has_eyr && has_hgt && has_hcl && has_ecl && has_pid) { - correct++; - } - - has_byr = false; - has_iyr = false; - has_eyr = false; - has_hgt = false; - has_hcl = false; - has_ecl = false; - has_pid = false; - } - - has_byr = has_byr || strstr(buffer, "byr:"); - has_iyr = has_iyr || strstr(buffer, "iyr:"); - has_eyr = has_eyr || strstr(buffer, "eyr:"); - has_hgt = has_hgt || strstr(buffer, "hgt:"); - has_hcl = has_hcl || strstr(buffer, "hcl:"); - has_ecl = has_ecl || strstr(buffer, "ecl:"); - has_pid = has_pid || strstr(buffer, "pid:"); - } - - if (has_byr && has_iyr && has_eyr && has_hgt && has_hcl && has_ecl && has_pid) { - correct++; - } - - fclose(file); - - return correct; -} - -int main(int argc, char *argv[]) -{ - printf("%i", count_valid_passports(argv[argc - 1])); -} diff --git a/4/part2.c b/4/part2.c deleted file mode 100644 index 5aac219..0000000 --- a/4/part2.c +++ /dev/null @@ -1,135 +0,0 @@ -#include -#include -#include -#include -#include - -#define KEYS_LEN 7 -const char* const keys[] = { "byr:", "iyr:", "eyr:", "hgt:", "hcl:", "ecl:", "pid:" }; - -bool is_valid_field(const char *key, const char *value) -{ - if (strncmp(key, "byr", 3) == 0) { - int v = atoi(value); - return v >= 1920 && v <= 2002; - } - - if (strncmp(key, "iyr", 3) == 0) { - int v = atoi(value); - return v >= 2010 && v <= 2020; - } - - if (strncmp(key, "eyr", 3) == 0) { - int v = atoi(value); - return v >= 2020 && v <= 2030; - } - - if (strncmp(key, "hgt", 3) == 0) { - int v = atoi(value); - if (strncmp(value + 3, "cm", 2) == 0) { - return v >= 150 && v <= 193; - } - - if (strncmp(value + 2, "in", 2) == 0) { - return v >= 59 && v <= 76; - } - - return false; - } - - if (strncmp(key, "hcl", 3) == 0) { - if (value[0] != '#') { - return false; - } - - for (int i = 1; i < 7; i++) { - if (!(value[i] >= 48 && value[i] <= 57) && !(value[i] >= 97 && value[i] <= 102)) { - return false; - } - } - - return true; - } - - if (strncmp(key, "ecl", 3) == 0) { - return strncmp(value, "amb", 3) == 0 - || strncmp(value, "blu", 3) == 0 - || strncmp(value, "brn", 3) == 0 - || strncmp(value, "gry", 3) == 0 - || strncmp(value, "grn", 3) == 0 - || strncmp(value, "hzl", 3) == 0 - || strncmp(value, "oth", 3) == 0; - } - - if (strncmp(key, "pid", 3) == 0) { - for (int i = 0; i < 9; i++) { - if (!(value[i] >= 48 && value[i] <= 57)) { - return false; - } - } - - return !(value[9] >= 48 && value[9] <= 57); - } - - return false; -} - -bool is_valid_passport(const char *pass) -{ - for (int i = 0; i < KEYS_LEN; i++) { - const char *p = strstr(pass, keys[i]); - if (!p) { - return false; - } - - if (!is_valid_field(p, p + 4)) { - return false; - } - } - - return true; -} - -int count_valid_passports(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[128] = { 0 }; - - uint8_t values = 0; - int correct = 0; - while (fgets(buffer, 128, file)) { - if (buffer[0] == '\n') { - if (values == 0x7f) { - correct++; - } - - values = 0; - } - - for (int i = 0; i < KEYS_LEN; i++) { - const char *p = strstr(buffer, keys[i]); - if (!p) { - continue; - } - - if (is_valid_field(p, p + 4)) { - values = values | (0x1 << i); - } - } - } - - if (values == 0x7f) { - correct++; - } - - fclose(file); - - return correct; -} - -int main(int argc, char *argv[]) -{ - printf("%i", count_valid_passports(argv[argc - 1])); -} diff --git a/5/input b/5/input deleted file mode 100644 index 5145d8e..0000000 --- a/5/input +++ /dev/null @@ -1,781 +0,0 @@ -FBFFBFFRLL -BFFFFBBRLR -FFFBBBBRLR -FBFFFBFLRL -FFBFBFFRRL -FFBBBBFRRR -FBFFBFBLRR -FFBBFBFRRL -FFFFBBFRRL -BFBBBBBLLL -FFBFBFBLLL -FFBFFFBLLL -FBBBFBFRLL -BBFFFBFRRR -FFFBFBBLLR -FBFBFBFRRR -BBFFBFBRLL -FBFBBBBLRL -FBFFFFFLLL -BFFFFFFRLL -BFFFBFBLRL -BFBBBFBRRL -BFFFBFFRRL -FBFFFFFRRR -FFBBBBBLLR -BFBBFFBLRL -FBBFBBBRLR -BFBFBFFRLL -BFBFBFBRLL -BFFBFBFLLL -FFBBFFBLRL -FBBFFBFLRR -FBBBFBBRRR -BFBFFBFRLR -BFBBBFBLLL -FFBFBBBLRR -BFBFFBFLLL -FBFBFBBLLL -BFBBBFBLRL -FBFBFBFLRL -FFBFFBFRRL -FBBFFBFLLL -BFBBBBBLRL -FBBBBBFRLR -BFFFBBFRLL -FBBBBFFLLR -FBBBBBFRLL -BFBBBFFRLR -BFBBBFBRLL -BFFFBFFLLL -FFFBFBFLRL -BFFBBFFLRL -BBFFFBFRLL -BFBBFFBRLR -BFBFBFBRRL -BBFFFBFRRL -FBBFBBBLRR -FFBFBBBLLL -BFFFBFBRLR -FFBBFBBLLL -FBFBBFBLLL -BFBBFBFLLR -FFBFBBBRRL -FFBFFFFLRL -FFFBBFFLRR -FBBBBBFRRR -FFFFBBBRLL -BFBFBBBRRR -BBFFBFBRRL -FBFBBFFRLR -FBBFFBFRRR -BBFFBFBRRR -FBFBBFBLRR -FBBFFBBLRR -FBBBBFFRLL -BFBFFFBRLR -FBFBBFBRRL -FFBFBBFRRR -FBFBFFFRLL -BFBBFFBLLR -FBFFFFBRLR -BFBBBFFRLL -FFBBFFBRLR -FFFBBFBRLL -FBBBBBBLRR -FBFFBBBLRR -BFFFFBFLRL -BBFFFFFLRR -BFFBFFBLLR -FFBBBFFRLL -BFBFBFBRLR -FBBFBFBLRR -FBFBBBFRLR -FBFFBBBRRR -FBBFFBFRLL -FBBBFFFRLR -BFBBBBFLLR -BFFFBFFLLR -FFBFFFBRRR -FBFFFBFLLR -FFFFBBBLLR -BFBFFFBRLL -BFFBBFBLRL -BFFBFBFLLR -FFBFFBFRLR -BFBFFFBRRL -FFBBFBFLLL -BFBBBBBRLR -BFBFBFBLRR -FBFFBFBLLR -FBFBFBBRRL -BFBFBBBLLL -FFBBFBBLRL -FBFFFBFRRL -BFBBFFFLRR -BFBFBBFRRR -FBFFFFBLRL -BBFFBBFRRR -FFBFFBBRLR -FBBFBFBLRL -BFBFFFBRRR -FFFBBBFLRL -BFFBFFBRLL -FBFBFFBLRR -FFBFBBFLLL -FFBBBFFLRL -FFBBFFFRLR -BBFFBFBLRL -FFFFBBFRLR -FFFBFFBLRR -BFFBBBFLLR -BFFFBBBRRL -FBBFBFBRLL -BFFBFFFRRR -BBFFFFFLRL -BBFFFBBRLL -BFFFBBBRRR -BFFFBBBLRL -BBFFBFFRRR -BFFBFFBLRL -FBBBBFBRLR -FFFBFBFRRL -BFFBBBBRRL -FBBBBBFLRR -FBFBBBBLLR -FBBBBFBLRR -FFFBFFBRLL -FFBBBBFLLR -FFBBBBBRRL -FBBFFFFLLL -FBFFBBBRLL -FBFBFFBLLR -FBBBBBFRRL -BFFFBFBLLL -FFFBFFFLRL -FFFFBBFRLL -BFBBFFFRLR -BFFFBBBRLR -FFBBBFBLLR -BFFFBFBRRR -BFFBFBBLRL -FFBFBFBLRR -FBBBBFBRRR -FFBFBFFLLR -BBFFFFFLLR -FBBBFBFRRR -BBFFFFBRRL -FBFBFBBLRL -BFBBBFFLLR -BBFFBBFLRL -BFBFFBBRLR -FBFBBBFRRL -FBBBFFBRLL -BBFFFFBLLR -FFBBFBBLRR -FBBBBBBRLR -FFFFBBBRRL -FBFBBBBRLR -BBFFBFFRRL -FBBBFFBLRL -FFBBBFBLRR -BFBFBBBRLL -FBFFFBBLRL -FBFBBBBRLL -BBFFFBBLLL -BFBBFFBLLL -BFFBBBBRRR -FBFBFFBLLL -FBFBFBFRRL -FBBFFFBLLL -BBFFFBFRLR -FBBBBFFLRR -FBFFFBBRLL -FFBBFBFRRR -FBFFFFFLRR -BFBFFBBLRR -FFBFBFFRRR -BFBFFBBRLL -FBBFFFFRRL -BFFBBFBRLL -BFFFFFBLLR -FBFBBFBLLR -BFFBBFBRLR -BFFBFBFRRR -FFBFBBFRLL -FFFBBBBLRR -BFFFBFBLLR -FBBBBFBLRL -FBFBBFFLRL -FFFBFFFRLL -BFFFFBBRRL -FBBFFFBRRR -FBBFBFFLLR -BFBBBBBRRR -BFFBFBFRLL -FFBFBBFRRL -BFBFBFBLLR -FFBFBBFLLR -FFBFFFFLRR -FBBBFBBRRL -BFFBFBFRLR -BFFBFFBRRL -BFBBBFBRLR -BBFFFFBLRL -FBBBFFBRRL -FBFFFBBRRL -FBBBBBBLLL -FFFBFFBLLL -BFBBFBFRLL -FBFBFFBRLR -FFFFBBBRRR -BBFFFBBRLR -BFBBBBFRLR -FBFFBBFLRR -BFFFBFFRLR -FFFBBBBLLR -FBFFFFBLRR -FBFBFBBRLL -FBFFBBBRLR -BFFFFFFLRR -FBFFFFFRLL -FFBFBFFRLL -FFFBBFFRLR -FBBFBFFRRL -FBBBBBBRRR -BFBFBBBLRL -BBFFFFBRRR -FFBFFBBLRL -FBBBBBBLLR -FFBBFFFLRL -FBBBFBBLRR -FFBBBBBRLR -BFBFFFFLLR -BFFBBBBRLL -BFBFBFFLRL -FBBFFFBLRL -BFBFBBBRRL -BFBFBFBLRL -BFBBFBFLRR -BFFFFBFRLR -BFFFBFBRLL -FBFBFBFLLL -FBFFBFFLRL -BFFFFFFRRL -FBBFBFFRLR -FFBBBFFLLR -FBBBBFFLRL -FBBBFBBRLR -BFBBBFFLRL -FBFFBBBLRL -BFFFFBFRRL -BFFFBFFLRR -FFBFBBFLRL -BFBFFFBLRL -BFFFFFBLLL -FBFFBFBLLL -FBFBBBBRRL -FBBFFBBRLR -BFFFBBFRRL -BFBBFBBRLR -FFFBFBBLRR -FFFBFBFRLR -FBFBFBFRLR -BFBFBBBRLR -BFFFFBBLLL -BFFBBFBRRR -BFFBBBFLLL -FFBBBFFRRL -BFBBBFBLLR -FBBFFBBLLR -FBBFBBFLRL -BFFFFFBRRR -FBBBFBBRLL -FBFBFFBRRR -BFFBBBFRRR -FBBBBBBLRL -FFBBBFFLRR -BFFBBBFRLL -BBFFBBFRLL -FBBFBBFRLR -BFBFBFFRRR -BFBFBBFLRL -BFFFFBFRLL -FFBBFBFLLR -BFFBFBBLRR -FBFFBBBRRL -FBBFBBFRLL -FBFFFBBLLR -FFFBBBBRRR -FFFFBBBLRL -FFBBFFFRRL -BFFBBFFRRL -BFFFBBFLRL -BFFFFBBLRR -BBFFBBBLRR -BFBFFFFLRR -FBFBBBBLLL -BBFFFBBLRR -FFFBFBFLRR -FBBFFFFLRL -FFBBBBFRLL -FBFFBFBLRL -BFBBFBBLLL -FBBFBBFLLL -FFBFFBBRLL -BFBFFFFRLR -FBFFBBFRRR -FFFBBFFRRR -FFFBFFBRLR -FBBBBBFLLL -FBBBFFFLRL -FFBBFFFLRR -FFFBBBBRRL -BFBFBBFRLL -BFBFFBBRRL -FBBFBBFRRL -BFBFBBFLLR -BBFFBBBRRR -BFFFBBFRLR -FFFBBBFRLR -BFFBFFFRLL -BFBFFFFRRL -FFBBFFFLLL -FBFBBBBLRR -FBFBFFFLRR -BBFFBFFLRR -FBBBFBBLRL -BFBFBFBLLL -FBFBFFFLLR -BFFBBFBLRR -FBBFFFBRRL -BFFBBFFRRR -FBBFBBBRRL -BFFFFBBLLR -FFBBBBFLLL -BFFBFFBRRR -BFFFFBFRRR -FFFBBBFRRR -FBFBFFFRLR -FBBBFBFLLR -FFBBFFBRLL -FBFBFFFLLL -BFFBFBFRRL -BFBFFBFRRL -BFBBBBFLLL -FBBBFBFRRL -FFBFBFFLLL -BFBBFFFRRL -FFBBFFBLLR -BFFBBBBRLR -FFBBBBBLRR -BFFBFFFRRL -BFFBFBBRLL -FBBBFBFRLR -FBBFFFFLRR -BFFFBBFLLR -FFFBBFBRRL -FFBBFFBLRR -FBBFFFBRLR -BFBBBBBRLL -BBFFFFFRRL -FFBFFBBRRL -BFBFFBFLLR -FBFBBBFLLL -FBFFFFFRRL -BFFFBFBLRR -FBFFFFBLLR -FBBFBFBRRR -FBBBFFFLLR -BBFFBFBLRR -BBFFFBFLLL -FBFFFBFRLR -BFFFBFFLRL -BBFFBFFLRL -BFFFFFFLLR -BBFFBBBLLL -FFBFBBBLLR -FBBFBBBLRL -BFBBFBBLRR -FFBFBFBLLR -FFBFBFBRRL -BFBBFBBRRL -BFFBFFFLLR -FFBBFFBRRL -BBFFBBBRRL -FFFBBFBRLR -BFBBFBFRRR -BFFFFFFRRR -FBBBFFBLLL -BFBFFFFLLL -BBFFBFBLLR -BFBFBBFRLR -FFBFBBBRRR -BFFFBBFLLL -FBFFBBFRLL -FFBBFBFRLL -BFBFBBBLLR -FBBFBFBLLL -BBFFFFBRLL -BBFFBFBLLL -BFFBFFBLRR -BFFBBFBLLL -FFBFFFBLRR -FBBFFBFRRL -FBBBBFBLLL -FFBFFBBLLR -BFFBBBFLRR -FBFBFFBRLL -FFBFFFBRLL -FFBFFBFLLL -FBFBBFBLRL -FBBFBFFRRR -BFBFBFFLLR -FBBFFFBLLR -BFBBBBFRRR -FBBFBBFRRR -BBFFBFFRLR -FBFBBBFRLL -FBBFBBBLLR -BFFFFFFLRL -BFBFFBBRRR -BFFFBFFRLL -BFBBFBFLRL -FFBFFFFRRR -BFFBBFFRLR -FBBBBBFLLR -FBFBFFBLRL -FFFBBFBLLR -FBBFBFBLLR -FFFBFFBRRR -FBFFFFFRLR -FBFBBFBRLR -FBBBFBFLRR -FBFBBBFLRL -BFFBFFFLRL -FFBBBFFRRR -FFBBBBBLLL -FBFFBBFLLR -FFBFBFFLRR -FFFBBBFLRR -BFBFBBFLLL -BBFFBFFLLR -FFBBFBBRLL -FBBFFBBLLL -FBFFBFBRLL -BFBFBFFLRR -FBBBFFBRLR -FFBFFBFRLL -FFFFBBBLLL -FFBFFBBRRR -FBBBBFBRLL -BFFFFBBRRR -FFBBFFFRLL -FFBFBFBRLL -BBFFFFBLLL -FFBBBFBRRL -BFFFFBBLRL -FBBBFBBLLR -FBBBFBBLLL -FFBFBFBLRL -FBBBBFFRRR -FBBFFFFRLR -FFBFFFBRLR -BFBFBFBRRR -FFFBFBBRLL -FBBBFFBRRR -FBBFBFFRLL -BFFBFBFLRR -BFBBBFFRRL -BFFBBFBLLR -FFBBBFBRLL -FBFBFBBLRR -BFBBFFFLRL -BFBFBBFLRR -BFBBBFFRRR -FBBBFFFRRL -FBFBFBFLLR -FBBFFFFLLR -FFBFBBFRLR -FFFBFBBLRL -BBFFFBBLLR -BFFBBBFRLR -FFFFBBBRLR -BBFFBBFRLR -FBFFFFBRLL -FBFBFFFRRR -FBFFFBBLLL -BFBBBBFRLL -FBFBFFBRRL -FFFBFFFRLR -BFBBFBFRRL -FBFFBFFLRR -FBFFFBBLRR -FFBFBBBRLR -FBBFBFFLRR -FBFFFBBRRR -FFBFBBBRLL -FFBBBBBRRR -BFFBBFFLLL -BFBBBBBRRL -BBFFBBBRLL -FBFFFFFLRL -BFFBBFFLRR -FBFFBBFLRL -BFBFFBFRRR -FBFBBFBRLL -BFFFBFBRRL -FBBFFBFLLR -BFFFFFFLLL -FBFBFBFRLL -FBBBBFFRRL -BFBFFBBLLR -FBBFBFBRRL -FFFBFFFLLR -FFBBBBBLRL -FFBFFBBLRR -FFFBFBFRRR -BFBBFBBRLL -BFBBBFBLRR -FFBBBBFLRR -FBBBFFBLLR -BBFFBBBLLR -FBFBBFFRRL -FBBBBBFLRL -FFFBBFFRRL -BFFBBBBLRR -FFFFBBBLRR -FFFFBBFLRR -FBFFFBFLLL -FBFBFBBLLR -BFFBBBBLLL -FFBFFFFRLR -BFBBFFBLRR -FFBBFBFLRL -BFBFBFFLLL -BFFBFBBLLR -BFBBFBBLRL -FFBBBBFLRL -FBBBFFFLLL -FFFBFFBRRL -BFFFFBBRLL -BFFFBBBRLL -BFFBFFFLRR -FFBFBFBRRR -BBFFBBFLLR -FFBBFBBLLR -FFBFFBFRRR -FFBBBFFRLR -BFFBBBBLLR -FFFBFFFLRR -FBFFFFFLLR -FBFFBBBLLL -BBFFBBFLLL -FFBBFBFLRR -BFFBFBFLRL -FBFBBBFRRR -BFBBFBBLLR -FBFFFFBRRL -FFFBBFBLRR -BBFFFFBLRR -BFBBBBFRRL -FFBBBFBLLL -BFBBFBFRLR -BFBBFFBRRL -BFBFBFFRRL -FBBFFBBLRL -FFFBFFBLRL -BFFBBFFRLL -FBBBFFFRLL -FBBFBBFLLR -FFBFFFFLLR -FBBBFBFLRL -BFFFBBBLLR -FBFBBBBRRR -FBBFBFBRLR -FFFBFBFLLR -FFFFBBFRRR -FFFBBFFLRL -BFBFFBFRLL -FFFBFFBLLR -FBBFFFBRLL -FFBBBFBRRR -FFBBFBBRLR -BBFFFFFRRR -FFBFFFFRLL -FBBFFBBRRL -BBFFFBFLRR -FBBFFFFRRR -FFBFFFBRRL -BFBBFBFLLL -BFFFFBFLRR -BBFFFFFLLL -FFBBFBBRRL -FFBFBFFLRL -FBFFBBFRRL -BBFFBFBRLR -BBFFBBFLRR -FBFFBFBRRR -FBBFBBFLRR -FBFFFBFRLL -BFBFFFFLRL -FFFBBFBRRR -BFBBBBBLLR -FBBFFBBRRR -FFBBBFFLLL -FBBBBFBLLR -BBFFFFFRLL -FFBBBBFRLR -FBFBFBBRRR -FBFFBFFLLL -FBFFBBBLLR -FBBBBFBRRL -BFBFBFFRLR -FBBFBBBRLL -BFBBFFFRLL -FBBBFBFLLL -FFBFFFFRRL -FBFBBFFRRR -FBFFFFBLLL -FBBBBBBRLL -BFFBFBBRRR -BBFFBBFRRL -FBBFBFFLRL -FBFFFFBRRR -FBBFFFFRLL -FFFBFFFRRR -FBFFBBFLLL -BFFFFBFLLL -BFFFFBFLLR -FFBFFBFLLR -FFBFFBFLRR -BFFBBBBLRL -FFBBFFBLLL -FBBFBBBLLL -FBFBBBFLLR -BFFBBBFLRL -BFBBFFBRLL -FBFFBFFRRR -FFBFFFBLRL -FFFBBBFRRL -FFBFBBFLRR -FFFBBBBLRL -FFFBBFFLLL -FFFBFBBRRR -FBBFBFFLLL -BFFFBBBLLL -BFFBFFFRLR -FFFBBBBLLL -BFFFFFBRRL -FFBBFFFLLR -BFBBFFFRRR -BFBFFBFLRR -FFFBBBFLLR -FBFBBBFLRR -BBFFBBBRLR -FBFBBFFLRR -FFBBBFBLRL -FFFBBBFRLL -BFFBFFBRLR -BBFFFBBRRR -BFBBBBFLRL -BFBBBFBRRR -FBBBBFFLLL -FFFBFBBLLL -BBFFFFFRLR -BBFFBFFLLL -FFBFBBBLRL -FFBBFBFRLR -BFBBBBBLRR -FFBFFFBLLR -FFBFFBFLRL -BFFBFBBRLR -FBFBFFFRRL -FBBBFFFLRR -FFFBBFFLLR -FBBBBFFRLR -FFBBFBBRRR -BFBBFBBRRR -BFBFBBFRRL -BFFBBBFRRL -FFFBFFFLLL -FBBFFBFLRL -FFFBFBBRLR -BFBBFFFLLR -BFBBFFBRRR -FBFFBFBRRL -FFBBBBBRLL -BFFBFFBLLL -BFFFBBFRRR -FBFFFBFRRR -FFBFBFBRLR -FBFBBFFLLR -FBBFBBBRRR -BFBFFFFRRR -FFBFFFFLLL -FBFBBFFRLL -BFBFFBFLRL -BFBBFFFLLL -FBFBBFBRRR -BFBFFFBLLR -BFBFFFBLLL -BBFFFBFLLR -BBFFBFFRLL -FFBBBBFRRL -BBFFFBFLRL -BBFFBBBLRL -BFBFFFBLRR -FFFBFBFRLL -BFBFFBBLLL -BBFFFBBRRL -BFBBBFFLLL -BFFBBFFLLR -FFBFFBBLLL -BFFBBFBRRL -BFFFFFBLRL -BBFFFFBRLR -FBFBBFFLLL -FFBBBFBRLR -FFFBBFBLLL -FBFFFBBRLR -FFBFBFFRLR -BFFFFFBLRR -FFFBBBBRLL -FFBBFFFRRR -BFFFFFBRLR -FBBBFFBLRR -FBFBFBBRLR -FBBFFFBLRR -BFBFFBBLRL -FBFFBFBRLR -FBFBFFFLRL -BFFFFFBRLL -BFBBBBFLRR -BFFBFFFLLL -FBFFBFFRRL -FFFBBFFRLL -BFFFBFFRRR -FBFFBFFLLR -FFFBBBFLLL -FBFFFBFLRR -BFFBFBBLLL -BFFFBBBLRR -FBBBBBBRRL -FBFFBFFRLR -FBBFFBBRLL -FBBBFFFRRR -BFFBFBBRRL -FFBBFFBRRR -BFBBBFFLRR -FFFBFBBRRL -BFBFBBBLRR -FFFBBFBLRL -FBFFBBFRLR -BFFFBBFLRR -BBFFFBBLRL -FBBFFBFRLR -FFFBFBFLLL -FFFBFFFRRL -BBFBFFFLLL -FBFBFBFLRR -BFBFFFFRLL diff --git a/5/part1.c b/5/part1.c deleted file mode 100644 index ca726b7..0000000 --- a/5/part1.c +++ /dev/null @@ -1,82 +0,0 @@ -#include - -#define COLUMNS 8 -#define ROWS 128 - -int seat_id(const char *seat) -{ - int row = 0; - int row_lower = 0; - int row_upper = ROWS - 1; - int column = 0; - int column_lower = 0; - int column_upper = COLUMNS - 1; - int i = 0; - for (; i < 6; i++) { - switch (seat[i]) { - case 'F': - row_upper -= (row_upper - row_lower + 1) / 2; - break; - case 'B': - row_lower += (row_upper - row_lower + 1) / 2; - break; - } - } - - switch (seat[i++]) { - case 'F': - row = row_lower; - break; - case 'B': - row = row_upper; - break; - } - - for (; i < 9; i++) { - switch (seat[i]) { - case 'L': - column_upper -= (column_upper - column_lower + 1) / 2; - break; - case 'R': - column_lower += (column_upper - column_lower + 1) / 2; - break; - } - } - - switch (seat[i++]) { - case 'L': - column = column_lower; - break; - case 'R': - column = column_upper; - break; - } - - return row * COLUMNS + column; -} - -int highest_seat_id(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[16] = { 0 }; - - int max = 0; - - while (fgets(buffer, 16, file)) { - int tmp = seat_id(buffer); - if (tmp > max) { - max = tmp; - } - } - - fclose(file); - - return max; -} - -int main(int argc, char *argv[]) -{ - printf("%i\n", highest_seat_id(argv[argc - 1])); -} diff --git a/5/part2.c b/5/part2.c deleted file mode 100644 index 396ea76..0000000 --- a/5/part2.c +++ /dev/null @@ -1,95 +0,0 @@ -#include - -#define COLUMNS 8 -#define ROWS 128 - -int seat_id(const char *seat) -{ - int row = 0; - int row_lower = 0; - int row_upper = ROWS - 1; - int column = 0; - int column_lower = 0; - int column_upper = COLUMNS - 1; - int i = 0; - for (; i < 6; i++) { - switch (seat[i]) { - case 'F': - row_upper -= (row_upper - row_lower + 1) / 2; - break; - case 'B': - row_lower += (row_upper - row_lower + 1) / 2; - break; - } - } - - switch (seat[i++]) { - case 'F': - row = row_lower; - break; - case 'B': - row = row_upper; - break; - } - - for (; i < 9; i++) { - switch (seat[i]) { - case 'L': - column_upper -= (column_upper - column_lower + 1) / 2; - break; - case 'R': - column_lower += (column_upper - column_lower + 1) / 2; - break; - } - } - - switch (seat[i++]) { - case 'L': - column = column_lower; - break; - case 'R': - column = column_upper; - break; - } - - return row * COLUMNS + column; -} - -int missing_seat_id(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - char table[COLUMNS * ROWS] = { 0 }; - - // Include space for newline and string terminator - char buffer[16] = { 0 }; - - int min = __INT_MAX__; - int max = 0; - while (fgets(buffer, 16, file)) { - int tmp = seat_id(buffer); - if (tmp < min) { - min = tmp; - } - else if (tmp > max) { - max = tmp; - } - - table[tmp] = 1; - } - - fclose(file); - - for (int i = min + 1; i < max; i++) { - if (table[i] == 0) { - return i; - } - } - - return 0; -} - -int main(int argc, char *argv[]) -{ - printf("%i", missing_seat_id(argv[argc - 1])); -} diff --git a/5/part2_fast.c b/5/part2_fast.c deleted file mode 100644 index 483dd8f..0000000 --- a/5/part2_fast.c +++ /dev/null @@ -1,90 +0,0 @@ -#include - -#define COLUMNS 8 -#define ROWS 128 - -int row(const char *seat) -{ - int end_res = 0; - for (int i = 0; i < 7; i++) { - if (seat[i] == 'B') { - end_res |= 0x40 >> i; - } - } - - return end_res; -} - -int column(const char *seat) -{ - int end_res = 0; - for (int i = 7; i < 10; i++) { - if (seat[i] == 'R') { - end_res |= 0x200 >> i; - } - } - - return end_res; -} - -#ifdef USE_ASM -int seat_id(const char *seat); -#else -int seat_id(const char *seat) -{ - int end_res = 0; - int i = 0; - for (; i < 7; i++) { - if (seat[i] == 'B') { - end_res |= 0x200 >> i; - } - } - - for (; i < 10; i++) { - if (seat[i] == 'R') { - end_res |= 0x200 >> i; - } - } - - return end_res; -} -#endif - -int missing_seat_id(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - char table[COLUMNS * ROWS] = { 0 }; - - // Include space for newline and string terminator - char buffer[16] = { 0 }; - - int min = __INT_MAX__; - int max = 0; - while (fgets(buffer, 16, file)) { - int tmp = seat_id(buffer); - if (tmp < min) { - min = tmp; - } - else if (tmp > max) { - max = tmp; - } - - table[tmp] = 1; - } - - for (int i = min + 1; i < max; i++) { - if (table[i] == 0) { - return i; - } - } - - fclose(file); - - return 0; -} - -int main(int argc, char *argv[]) -{ - printf("%i", missing_seat_id(argv[argc - 1])); -} diff --git a/5/seat_id.asm b/5/seat_id.asm deleted file mode 100644 index a372a9a..0000000 --- a/5/seat_id.asm +++ /dev/null @@ -1,25 +0,0 @@ -global seat_id - -section .text - -seat_id: - xor eax, eax ; set up return value - cmp BYTE [rdi], 'B' - sete al - xor ecx, ecx -%assign i 1 -%rep 6 - shl eax, 1 - cmp BYTE [rdi + i], 'B' - sete cl - or eax, ecx -%assign i i+1 -%endrep -%rep 3 - shl eax, 1 - cmp BYTE [rdi + i], 'R' - sete cl - or eax, ecx -%assign i i+1 -%endrep - ret diff --git a/5/seat_id_ssse3.asm b/5/seat_id_ssse3.asm deleted file mode 100644 index 4d51cbe..0000000 --- a/5/seat_id_ssse3.asm +++ /dev/null @@ -1,23 +0,0 @@ -global seat_id - -section .rodata - align 16 - xmm_shuf: db 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 10, 11, 12, 13, 14, 15 - xmm_cmp: db 1, 'RBBBBBBB', 1, 1, 1, 1, 1, 1, 1 - -section .text - -seat_id: - movq xmm0, qword [rdi] ; load first 8 bytes - pshufb xmm0, [rel xmm_shuf] ; reverse byte order and already shift left once - pcmpeqb xmm0, [rel xmm_cmp] - pmovmskb eax, xmm0 ; store mask in return value - xor ecx, ecx - cmp byte [rdi + 8], 'R' - sete cl - or eax, ecx - shl eax, 1 - cmp byte [rdi + 9], 'R' - sete cl - or eax, ecx - ret diff --git a/6/input b/6/input deleted file mode 100644 index de63680..0000000 --- a/6/input +++ /dev/null @@ -1,2172 +0,0 @@ -su -egu - -h -h -h -h - -cpuqz -cfqu -cqekuv -xunqc - -hsaygprt -hsfatgyr -srtagyfbph -rgqywhsealtx - -aefomnlihcsdpyvxurbkq -ipudhrafbcszoxmeqknv -hpricubknmdoqsjvfx -uiwohncxmrpsgqbfvktd - -tvruzqbyspjdfalicehwkm -haswlezrvxjbtckfyipmq -alzkjcqpbsfmetihuvyr -rkjibhvylpfqscaemzt -zjctmrhpseqgfklnibyva - -ix -akdhy -felrouzwt -ygs - -pifgwbtvs -gkwbcpixmt -pbrgitw - -vex -iyhmwl -cks -fj -dzsfn - -xsvmdzrpq -ipzmvdgsxqa -tcouzvhdqxwlspe -psjydqizxgv - -sdcgvhx -ieupwazvdxq -vgfxd -xgjdbslv - -cla -aj -a - -unvhtezsdrxjyka -sruxtezyjhdbkav - -f -s - -l -l -l -l -l - -dqlpmwrfuaeioc -kzpyiembgthnj - -ks -qoh -cftlim -ukv - -ekfwgpbaurcqijdvhtxznl -tafuqxhgjkizprsvylcedb -eukbxaligpfhdvrqtczjm - -muikcbg -ithfkq - -ojdwcsigaflpykv -uzjmbhrdlxnt - -v -v -bv -v -vf - -il -li - -sfqoutzki -erfsuxcjqhtk - -op -gbepq - -vtzpwj -ijmxtzv - -zvoxpf -bwiexz -birzwxq - -h -f - -pjiae -pjkyza -akzptjb -ajipz -sjhap - -xerdismyblco -yaiowgpsedtnzrhx -dilmokqxybrescu - -bxeclkt -bighzytlw - -itokcrbm -isa -iwuq - -rqcue -pisb - -gpdmiyet -mwtgl -gmtdz - -hrselofawdu -roadesjfukh -sopadrhefuj -drusaofeh -hsdoekafur - -matixrjqfw -traxmfqwisj -ajtqkrwmfi -ipmwjaftvrq - -eyvmb -bht -nkpbw -ehtba -zdrsjxblf - -efpgnzjdabsukr -kjpagiumfsbedzrn -djngsrapubzefk -kfbzpeadgrujsn - -pwnqbhjv -vwqhbp -qwbhvp - -sdlizutpwkfbhjm -sdqvrpuflmwjz - -uxahnymvs -xnrlpebt -gnzlxjfoq -kfzxn - -amedtwkgxcypbrqnujvifhs -saxvbymtfrhgdiwqjnkcpe -erjkmaigvdfxcnbtyqhwps - -ivb -vbi -vbi - -gme -gem -gme - -h -p -e -e -e - -b -b -b -b -bl - -t -l -l - -zda -efmil - -ulx -solxwu - -gclsqwx -cgxswl - -qawroeb -owfeqlzxbn -igratbowseq -otvcqjbegw - -mcahbeizsjovynpx -nsbdiclahpmxyove -qgepcisukanhmwyv - -cogbsyu -cusogb -uxoscbgf -bpugchsort -bgocmsuv - -jxigcazhlfsruwetkpynmvqo -drkvthunlgcsyeaxzqpjfwimo -syaeqcvmuxpnkgtwjfhbozilr -mgczoqvyhjuxreawtnkfpsil -acouwfqpjtgkrxyzivehsnml - -xpyldvrbug -falxpgdzuhsvrt -ldewxuvpgrtm - -jzbpury -hlgzxrkpouavq -emirbuzcp -wnfumipczrb - -liydasvrkgqe -ayidqgrsvel -vdjygiulearpws -gvedasikylr - -ikatocyfxps -spaoikxctyf -ckpsxfioyuta -waxiforkpystc -xcmykipsftoa - -zxleoadsyv -yovaleu -veaoyl - -qnmkplahgtubszedcij -pscidealhtqjbguynz -jqseucdgzbpilanth -liahqmuznjscdbpgyte -avqrielhntdjzpgxubsc - -uflmyhndsqboxv -mnlofduxbsqyvh -kvoptzfmrgysanuhxblqdjec -dfsnbvxolqmyuh - -ihrjpxygmfudqwcaoezt -jdlbmonxwraiqyctzhvupfe -utfhadqciozemwjpryxg - -mcy -my -ym -aym - -euktqozh -qvjfhalk - -ziblapqkvhcmdte -lfqkvdeaicmztph -mliqbcvpkathz -ylwiochpqmtakvjz - -oahnmutxc -hncxomtuva - -kfnsgxhiyzcbjmwvloe -ezciqlkbmspnfgx - -fatwrkenzmlij -rftamzejnskiwl -nlifwzaerjmtk - -ygpdfunhz -ycfquwndg -ygfnud -nfrygudbt - -wargt -vzumj - -pevirabdgyntjmfzxu -fbajcpgwtmveixnyzu -fqkgtevmuiybnjxapz -gufjytsplnvamozeixb - -n -w -wsp -y -dheck - -dyltqraen -tpsgabzmoexn -rvkailytneq -tfnayeihu - -ewsxrgjbqyno -qmswbxnjogrye -gobjqesnywxr -bsyexgrnwjoq -rbjewonsqgxy - -stwikjqlp -lrsiupwhofjtk -pljtwiks -pwkijqstl -cslkjtwpiq - -tpdekxavhynbmwq -cplmqztabw - -tagofzql -leaoktp -ltnuaoxv -kylztoa - -cyhkmbsxfwjndv -xykhbcfvmenwdsj -ycfmjwvnbhxskdz -ecvmhdkjbwsxfyn -xbksdmhwfjvycn - -dwhonqeszgyucxip -ilbhvtupfksgzm - -oazfpt -ozfpbt - -yxor -xrbe -brxe -rx -erx - -d -d -d -d -d - -ihnyoscrtazjfwme -jibycpvemkqzas -jbaivmzxsgecudy - -kmsp -smapk -jmpek - -wbeoh -zon -fzoq - -cmbwrupzjkq -qzbprmkowuj -rajuzkbwmpq -ljrpxbuztwiqkme - -ijnglzsbcqfawohpdxmtve -aqpzxbndsfgtomwlvehjci -ambcxwlvdzqftenorgjsihp - -rbjtkm -krm -mkr -mrk - -qjkdftrpnumcizayl -wqplnjcudgxzmkriatyf - -qlhrxgeftoy -bzorhtyxlpqegf -egbolyfxrthq -etflxyhoiqrg -fyruhtqgoxel - -ydogmjnixtkw -yminkvjwfpdqgo -nigxjwoykmd -igwjnydkxom -nikydjgmow - -s -s -s - -mctyqjebhrx -jmteybcxhq -vmbtseyoxhacdl -miyeqcxhtb -cmuybexth - -j -jrn -j -j -j - -gjwhqzotyivsa -dncumikebpr - -rjgvkwqib -dumtbxzowfylh - -oge -eivjdbkmcywg -eg -gfoe -ge - -qebcdswmkoygivfhzt -hxyztepdnocigquwvbfa -dgtwcyhfivboeqz -cdhbgtveizowfylqk -yfzbqhlvitmcgwedso - -evhlbqwtrfx -mlfbwh -hbflwp -bfwlkhim -whnfbl - -pcrf -crhf -fcr -cfr - -okxihbndges -cfheijbgqotnsk -yngobhskevi -rgknsoielhb -dknoeisbhg - -nztcvyikjfx -fkityvjxnc -kjvnfycxilgtp - -tjlbadpizowyev -qehgkdrzbcvotlay -falbynztqeodhv - -x -x -x -x -x - -ausbpe -sbeauop - -ftgly -bf - -erhokg -gekohr -hrgkeo -ghreko -hregko - -ag -ga -ga -ag - -vempgsokyfctax -ckonsxfptmyvge -yxefdorjmuzhvpsgwbltck -esxmcvgykfnpot - -thob -obe - -xg -qyalvxc -xg -x - -sqyowmanjczfebkulxtvgid -fahgqzenwypcbrmtvjslok - -zohlmctqxnueg -jhpbgfkds - -fyj -cwojdbf -jtf -rfjt - -hycpvrmfqlngu -vmqcypgunlrh -pqmhuvylgncr - -rxgswj -dwsybphk - -pcozvsdx -kvznm - -xneik -xkin -xinqk -nxsjik - -btfdr -jbqcasvpd -tkubd -ubdxwr -towilbd - -bfjidznx -nxbijdzf -jzfxidbn -nifdbxjz -nzfbidjx - -kjnydrclqeiumxg -foidejlnxgckm -coinexmgdlkj -lpckgdvnhmjxei - -upnhgfa -uhfpn -uhpfn -phufn - -hvyqepkfdsulzb -kfdepzvyhqlb -yezgbkqpvfdh -yzpfkegqdvhb -ykveqbfjzhwrpd - -lvndux -uxdnlv - -skymq -yqmi -yqzm -zymutq -qym - -lgnxbpzsce -eczlspaibgt - -raimheuwjdlsvncoypgzbqkxt -gcwavnjedbxsyfkqlprthuimoz -gjszrpmaxbydoktivewhlqncu -tojqzuenragvmxckiydphslwb -xeacszmjuliyvqdgkwprbnoht - -eahlnzupx -ulhmektsxdyjz - -zulrwsdaq -rqilsadz -tarlisqmdz -arslzdq - -pwzjtoafs -pzjwoafts -joafwztps -fzstwojap - -qbsykroiwcmzugealpxfjtdn -rcketgxqjupwzbymofaidns -kbngvtqdysrpumcejwaifozx - -vxpyulwietrmfqbo -tyeqbwxprmvfl -jlqismvbdprexwtkyf -betvyxlrnmwaqfpc -pqywsxoerfitvmbl - -osgilzptxmyhdwnbkjucvfq -iovflbqpkshyxdcjtg -iphsqdgyjfcevlotxk - -pdmxwbrzyk -orxtiplgmeua - -rkeaoq -muncxwzvjtfp -eyhkiqso - -acjpbvh -knmspwuebjyvgft -vbjpd -pqbvrj - -spld -qlaogwv -fhzjnmixyrut - -khmw -sjqdtwk -pckw -okwjz -ybvnuakxwgr - -js -j -qj -j -je - -sdqftlargy -jrmtgfaydoizsl -rtdlwafsyg -rtfylgwsad -adgltwryefs - -ujxfzvaptw -txuwfjzp -vjuzfatwxp -gnzfxptwju - -ltnfhrdwxv -dnwxtprhfv -hxfdntvawir - -sd -tl -dvytb -cv -pofkherqumi - -bnhwe -iwesc -swe - -xgukzobv -xkzugbafjrov -ebxukzgvo - -yor -ior -ryo -royk - -wj -jzw -wj -wj -jw - -pigbdcozntylm -toxilbam -bixopln -bvwkrloiefuh - -eduk -uekd -eudk -ckdue - -vulk -klvu - -jeyafmuqxd -aoxfed -edxaf - -sjbkveaymcdtgx -gtskxcyqmhvjarfn -jrngyohawxkqmpcvst - -fmubgnqisdyax -axnydgimfuts - -nzkrjofhqiubspv -fksopnbuihrjqvz -vhrbipqfjsozknu -urfvnibojqpkszh -jvnpuzkifhobqsr - -ctikjyqxempoh -comiqtxhjpkny - -whbdemfkursty -ryfuqxvkwmbesht -tkrumwhfsbeya -ryefhwstbmukn - -xnd -flrakdi -rlps -ehqtbzvjgcouy - -qvwihfpbd -imsfuvbrwhd -fvhdipbw -vhifdbw - -uezrmltpvhd -fykjilqzsac - -davlkgpqbwuc -bgvdnwlcuakpq -abuwhqckgzvtdplr - -nd -fdrjxc -a -bmzeuwq - -luopqihwtygjda -hodyuwapglqjbrti -agwqcijhduoyplt -qypgdtjlahiow -ljpskhxvqwyafiotdg - -nhkdmtw -thyknm - -jnfxrctwgqahudmoiyvs -axdtfwsonugzimcjrhlyqv -atcnfovyhjguxqimrdws - -ue -cm -xrnozk -a - -n -n -n -n -n - -fojreag -e -enq -etdzqm -eb - -wfsakpx -isfaxk -axwskvf -xeldakfsu - -kzpwfxhab -gfkqxdhtpbwz -pfhazwxkb -wbpzfkxh - -tbcn -mg -vbkmg -au -sfz - -vangwftohxdbrzy -vohwdnbraftxzgy -xvozdtfargyhnwb -yardwbvhtofxzgn - -irfa -irawf -iraf -ifra - -jbtsqvywarn -bajcviqwyrt -kutgqjmlxaryzbvwo -rwsqjevdbyat - -iyhg -hyg -hgy -gyh -ghy - -qwidmahzfcueoskvlp -fkysbnihvumpaegtd -kaemjsurfdvhxip - -oujsvbwceghnlpzxraf -ecaogrvjxluswpnfhbz -azexcujlfosbwnvgrhp -busrxgazjvpcfonwhel - -ughqky -ntdwhmblxearjogzck -hfkyg -qighsk -khgp - -cuzonhjegy -zujhocvnyeg -eoculrnjbgzywh -hjzcuyoegn -ugzvhcemynjo - -lrigswxvmcqofua -owxmivacesurglkjq -wcmaqsirovxnglu -lisvmugqxrcofaw - -t -mj -m -j -zdl - -nmsexwigtjulcy -favyolnmgqtbrjkw - -w -w -w - -gxu -utx - -mcgfu -g -gr -rg -gp - -rhjaizdkxup -erblofajmvspxt - -zt -tzf -lxmcowgyk - -q -rux -q -g -q - -uantxs -snwukxvjo - -rixtwvc -vwciatx - -ycipkftmez -yimcftepkz -empozcyfikt - -aijwrvfmgyxlbztod -znytdgfbekxlpi - -svqgfxh -nvkqgseaxh - -mgqxhbl -zkvgqlbxm -lqgmxb - -wq -fm - -ktydgbsziqehmjfl -ksihgtdfjylze - -ne -ne -ne -tenx - -vzcwnxfimj -icvxzjmnwf -vzcmjrdxiwbnf -wjxnmfzcvi - -dwy -h -ovk - -nbowqrxlpyzifjvka -zyvxrolwfbpikqa -vkqdwrbyiapzxofl -kzebrvfiqypaomxlw - -zjksb -zkjbs -zkbsj -bzksj - -oeimldgvybkrznxhc -ejfxokaqhzd - -esvbydlxc -nbvcxlyes -eoclzgsvxkmywb -eltvbcsyx -vnyelctsbx - -hbjpermvdoc -hmjpercovdb -pjchombvred -vdrobejphcm - -ipbeqnsmujhvtdkowc -bhmtonvedjkiuwcqsp - -a -eg -t - -vcmogkuapqrlsednzh -lvhzknodrcapxuetqs -nurkabhsywlceozdpfqv -ingvptqocaszlkurehd -skchauznlpvreodqg - -oaqcwxnjr -btdki -cahmjsof -vuegzpyl - -cvy -vyc -yvc - -pqrtafjgizcldshx -ldsrhuqpjafgctinx - -p -p -p - -bwjtu -ft -fbp -qosmg - -oixgna -wangjr -xomcdugal -agkftv - -tvzoq -oatqsvc - -xvnkdyz -kzdyafl - -cxaquiretkwplvyszm -cmlqxwuertsozyaphi -fjzpsbytwnrxmqadgiceul - -fnb -p -b - -xvjswmpu -fuwspvxm - -ofwkhlpbdarcze -eopfkwbazrhdl - -m -c -a -m - -cnty -ybonsp -nykrh -hnyc - -tunpiybzjvskxwrgh -zhfcxlatqbmdygwrosev -yzdvgmxhesrbwtq - -bflvmeipqojdngtyxuawh -ktdjovceibnugpsfymqxhl -vbueothjgpxfmilndqy -qjinbdmfoerpvhglyutx - -d -d -d - -vcmh -mch - -ti -bt -rwhfdxtsy -ti -tmbi - -ftiokrw -tofkriw -witkofr -tkowrif - -akfsdozrbuleytnjivq -vaefyztrjboiqskhln -ladtnokzvirjbsyefpq - -kyzuqsnpmclrhi -ulqznyrsckhpmi -zilfphqmucyrsnk - -yrtjqxbfmalw -zsfmbqajcrgxyltwkv -yqmjaxwolfbrt -pnxlqmyrbwtfaj - -qukbzapi -uzakbq -zkfbayv -tkaznb -qlbazk - -pzfdbhyav -swlmrnt -rmw -jn -luqm - -fmkgtbahndrqycowsplxiv -micuraxlznwhgbfkystqpo -ghrnsfwkcaoyimlbqtexp - -kougsrdnt -xtrd -rtlwd -hrpdaty -xrdptm - -nivmqo -ivqnmo -vmonqgi - -tluszyrbkhg -rhyucgzetibl -wyuetgnlrzmh -rhdzvluqajotgxyfp - -vhqmbdneyafzgw -lhwkvpaidgmyjzerq -hauvndomegwzqty - -jcwlh -lwch -ltcw -weyckla - -vcfrjqsgdtilbm -edltfjsrcmvbgih -bcylqfrmvstdgiej -fjbzklvdnwasmptcgori - -acyvqjfgopdzksmw -dzofksgmycawpjvq -fogswakdzxpcyvmjq -mwqzsoydfcagpvjk -agsmowfzpykdvcjq - -imxe -exim -iexmd - -zkxaqfudyi -yacupxzkdqebfr -xwfuakhnmqvdzly -bqfydxakzru - -ohaj -ajho -djoah -ohaj - -xmra -mpa -mwaqn -am -anm - -sgqjafrnbm -qfmrbjnas -rsfnjabmq -nsyjrbqfawm -mjfarkqsbn - -fba -vfo - -fncekxpr -epkbzds - -qrpejclbhaf -lzcirpeqahjbf -lsphcjfbqaewir -rpnehulvcqayfj - -ejkpzwght -tzkjegwxph - -mxtojefrbdlnkwaz -mnwzjrbkaxoietfd -daktrfexnojpbzmw - -zyeq -yzq -cwnax - -pvqzxgs -xfqvszg -xsqpzvg - -banycodivlqzt -mjbkheui -rbwixjf - -ltq -tlq -olxtq -iltq - -kerwtgcizshypfnxajdvolu -gueyjtxonfrsliw -lwruobigyesfnxtj -leqrmsoyfbigntjuwx - -qsfokthwrlx -dlxosjagmr -xljorvsg - -dgohszbxkmvw -gwzsboxvchkm -xkzohpsgwbvjm - -mquspzhxlgktcid -xqktughicmdlzsp -cusqlzghkptxmid -zlscphgxdutimkq - -vbrlu -rbdvel -lubvr - -mkwzhyinogvxfl -gwzovxnkfhm -bksxgwzmvohn -mnwvgxlzkho -hgevxtklmwozn - -m -m -jb - -fjidp -pjsid -dfpji -pdij - -nvsmdfhlzowxiqjp -npzqlhxifsvomdwj -dmfhsqxvnjwpzoli -vxoflmpdqzwjinsh -qsjwxoifldmnpzhv - -xthm -mtxh -txmh -btxmwhd - -b -c -kz -c - -ohvnbcapejswtmrk -awskorhblqjepvtm - -tvygs -ysvtg -gvsty -ytsgv -tvsyg - -oyzucnqkxrimf -quxnfyzmckir -mrfkcqxyzniu -yferzmqixkucn -kfinqcrymxuz - -gbuti -bniufgtw -giubt -igutb - -jgtmbxs -mcbsxjt - -huilkbsfytevzxwa -ibuhkapfyszedxrv -yufsaojhzkveibxg - -mnswgtfdojhazrbq -athqodnrgwmzsfjbp -wtgdoaiuqnfxshbmrzj - -wymeobr -mrycewo -oghswaxmzyufer -pemowyr - -vxcfqtzadwkmipnr -iuarmqnpvdwkztx -dktmqbnvwarzixp - -w -l - -nprsxahzgfjltmwcbie -zmrlbnegfxscwaiphj -xzlwhejamsbipcgfrn -pwrealhncjbzgxmifs -mzwbepsjarflxnhcig - -rqnie -qxnimer -ineqr - -ergmlia -jgtxbszvfhy - -tpbklr -plbtrk -tlbkpr -pkrlbt - -e -e -e - -ozqnktgywfjsm -ywfzxqcnomg -nqgfeczamywlo -dyfznqiomgbw - -sxzgtkpvyedf -txgeyfmsd -difagyxtse - -qoehywxtjgpdkavfs -bqjdigkxtwyfphev - -dmni -dimn - -tfrvu -tvaqruf -ruvztfwy -vuftqr - -ydlrkcnoqahzjs -fhlnkersbcy -ervyucshkln - -axkgudrfbvelt -pjuegtolfxdvika -evlkdfuzatgx -bxtvaefudklg -etxdlkafhguvr - -hdcnjpfkbevusm -mblvpcfjseuhdn -bskjevpcufdnmh - -wqnjbpoduamhytfkievszlgxc -xjlygvwsmhnauzkipotb -ixjknowtgzhbvumpylas -wtgnmbxriuhjplvakzyso - -tl -tjl -ayufcpid -zxlm -zm - -cnmwbldgaisjyzpfq -fjmrwsdibzqylcgpa -lozcsdmqfyaijpbgtw - -dtf -fd - -uqmtlwkfvo -yhpgrcdi -jhsnbezaxp - -cefj -tfjce -tec -wsec - -onazewv -wavykhnzd -lxsgvrzabmtcpq - -nbcrxusghzimepqa -psqieacnuxohzgmbr -xhgrbqcnfvuspieamz -rixebsnmcpazdgjquh -sngeamhprxfcbquzwi - -grydbjpzscfunwx -qcakmej - -idhbcqoxzfuvt -dtocbufh -tfubdohc - -yrp -ypr -pyr -yrp -rpy - -bxlkfmjhqawictrnyvdpgus -unbrdyifkgwcsmptjhxlaveq -tlzjsycbnifvrdwuaphmkgqx - -edkclbw -elwabdk - -iehpmokrctn -pydojmegufz -mpxoeayujw - -ewdarsfjpvlchmqiboxg -sfewicgrvdoxbmalhjqp -tsphvciwfqdgrexalbomj -vsxjleqokrfchybdpmiawg -rlqeiwpvacogmhjfbxds - -y -y - -vshoznkgwcdimrp -nzdrkoiehltvwsmg -gsjyoarznhwqvkdm -fshedmouvlrnzkwcg -vsokunwzrbdmhg - -t -t -t -ta - -paejgztcsxq -eszajxg -znjdgasxe -igxezjnas - -ufakhtvdmr -adfmjhvkrtu -vmktjrzfdauh -tumkdfvhra -kutmavlhfrd - -yxcnqsb -hpufomvwaz -lgai -agfdw - -bytx -xrt -rhdtx - -qcuypb -ycwlknup -cpuy -ucpy - -l -l -l -yl -zlx - -kradgyufzbxwole -xydwzbgfauole -alwugfoxbdyze - -rob -oer -or - -smul -lhms - -hxrpgin -oxpcm -xpmc - -ekcjs -nbkqpfjsc -puckyszjo -jsckb - -mtakdsrxwecgozyi -lijgwkmsratdxoyzu -hkrtxgwyiamodsz - -ucnfl -nuflc - -uoh -shog -osh -oh -hovazw - -aywsjgbkn -wgbqynskij -ybsgknjpa -ykqsbgnj -bzsgdxcnyjke - -zwlxdg -wxgnlm -gdjwlx - -vfkurtlgnqpszwod -nvtksfduzwqprglo -fkolzvndqwgurtps -oklfvqwtzgpunsdr - -rbwfldicv -fopvzijb -hukbvgfqexyi -rnzvisfb -dbizvpaf - -ruhvznkbqsxpmla -zhbxpvaqrmknuse -zbsrukpvnmaxwqh -azqrbmnsxkhvpud - -onsfuwzlx -olsxufnvzw -ozfluxswn -oxwufzsln - -xgzhikqe - -pmwhykbvjduq -mxpfyjuvswah - -eylbn -vebjwf -prhomzs -b - -xqsvyfjgr -wqxrsl - -whapjuqyd -uqgpwajd -aqwpuj -sfljpqnmaiuw -kabjpqgewvuc - -cyrpbuoslqkz -zybkcxqfsrnue -yszrkqtucob - -rtweslzqynuoxhmpbc -wuhbjyiackqfvpx - -ahisomynwvbgklpjuzrxdtc -lxavshmbwykztcuniorpgdj -irdcxlzskwempjvghyatunbo - -nlswcqkhvmxyfodrjizegu -mlxaqjovndhyrcgiufzse -fjdugnmlyeqzciovhxrws - -suhwdifyrk -giwtnkpsfauydmc - -weshq -qajovwhi - -ph -ph -ph -ph - -mrouzhwixysv -zarmsieovtyc -yrivmozs - -vsxbz -svyxbzl -szqvxb -xzsbvq - -b -w -w -w - -cwetnkaxfvgirdphsolyzj -kapdhrvxezgwyfolijncts -vdlwgrocshaexyktzifjnp -ikezpjoraldxvfshwcgnty -frdysohpmjtlkxgzewcanvi - -wcoqzgbitjlyad -duoznymtjbiwca -wpahfobjcuiydtz - -aclkhypervifzjbwqgxdstu -sxlarjdgifwbztkchpuyvqe -tfdbrjxepvkslwqzciguhya -dyltqaruiwgckjvsbfxzhpe - -qylp -qpy -yqpl -qype -pqy - -xrkebt -tbrkemx -kebrtx -xketbr -etxrbk - -yucsht -sycwu -vkuzcysl - -qlfbrenuhm -qzfrnelmu -lrixmuefqn -qjmdspkfornela - -vmtc -d - -ait -ita -ait -ati -xavti - -bxoygq -mtgbyoq - -nkes -swkeg -kes -ksen -kres - -saouewqmlfd -cygzlhbndtukixj - -mxuboivyfpctzkael -qjbtgukilvmy -mktqbvhilnyu -gtjykviblusm -klbimtvyuq - -fbdnvswoxpakthuz -adwhspktonufxzv -oamtszpdhkwyfnxuv -tudnvpzawockfxhs - -ugxpjzytdbm -cerilwoby - -onpmy -mylpo -pmoy -lmypo - -jaf -afr -af - -casenkqdir -sicuanvekrxh -yizacrkosntpe -agicxnrkesw - -jqt -ql -qg -jq - -wc -w -w -b - -hzr -g -h -iabscl - -hqwpsagbnldrukzjifytx -zpfrqidyshjkgwaxbtnul -fjiprlyakugwdqzhtbnsx -fiarukdwntlyhgzpbqsjx - -czukvtah -comukqhjbra - -wmhncxkspailt -uxfkbmrgt - -teolabiy -hpktibyaxoc - -bqyarip -wiyp -piny - -mtrgebyouwfk -emwjyfrut -eruvtfywm -amwyfunelrptz - -niduf -nfdiu -ifunjd - -pelahycbn -hpovfylkcbn -iblwzqmxchgdstn -bnrjhkcul - -sfjzl -sa - -b -d -j -ji -j - -zshvimlaw -alwsvmhi -vhlwsami -vhsawlmi - -awvgejcbhlsintoupdf -gajfxdoebcphnsuwtl - -tuickvpglhw -lvthdgiuwp -shuivyptl - -nlxwpzuigcq -lcwpufgxzniq -wlxzuniqpgc -pjgxclzuwiqn - -tsozgkq -lmvyuqracphne -qfitdwgkzjx - -k -zk -skh -drkup -ablk - -qcr -lq - -m -i -jy -m - -hrsgfwaeytpl -rifdnaq - -detrifahwgjs -piagxwmfsrhe - -g -l -l -t -u - -xlphfs -tqnc -knrgiu - -auscpvhwfnkjgxdbtlzo -wldqsafnxycpjzibrvu -fzpdcuvngbxwslaj -flsdbuwexnvajomzgpc -wazdljnbuxcfpvs - -ejpwgam -pmgwja -jgawmp -wpamgj - -jlupvzoyitmkeagfqnxswch -csahitmwogflvunqxkjpzey -vquxiozpmjatncwsykhlfeg -ihoejuxnwtsckzylqmfvagp -ovgfeciumakxsnpqyltzwhj - -rlcy -lyrg -yr -hyqr - -pnv -np - -dxirheclfvkugyq -lmqcngrihtbzkoa - -xmdr -cxdm -jmxlsdgq -dmx -xmdo - -tomwqa -oqawmt -kwtbmaoq - -jm -w - -dem -dme -dejm - -u -u -u -u - -dhqxlsbnp -udbspl -ldbspc -kpsldbu -subkldp - -wconqgth -vuhrlnzgt -kghntm -zhgnrt - -tubwopjkrsglmfdqn -kpixtmabowfsjlezdnqrcg -ymjnolpqstbvfrgwkd - -fykdachlrtxupbgq -aprdlbchfkguytejx -amvksrbwzlcfhyxgtupd - -yac -cay -ydaeoc - -yva -avxy -jyv -vyo - -ryozihbkmxegfvw -ljexptfsyiwqcv - -rszwmnhjp -mslwygz -zgwsm - -lshvanz -vnlha -vnlha - -glrmyfequjpboiczkhw -uozqrgjhwfceyidblmaxpk -wckorliguhqzmyfbepj - -bc -dcj -bhc - -ed -ed -de -led -de - -geyxwujopkzd -pkwuzxjdoegy - -fplwjykaod -rgz - -qgpz -fpgaq - -yfwzkgqej -vuzed -znhsecid - -vlgxshtipzfj -vghilfsztxj -hxpisvfgtlzj -izshytgluxfvj - -wyhoqaieuzf -lcjpm -btdxknglc -rclts - -qucrslhpoywjidgkmvab -bvlidmwphqsoaykgurczj -ramesuijngcxpqlkdovbwh -ubapcqvshrgklwimojd - -wfhcyjidtlqokx -nhgvuwobcklisdqm -drcnwvqslkaizohb - -fidrkaw -fr -rueof - -izypgsvlhfounrwemtdkqx -yfthniwaxlskqopvurg -xnqpustrywighalvbfko - -gkihqofrasyz -xptgbqkim -iemgxqkup - -rstvcynoaxpejid -xajeyproin -jixpmoreany -mriewajpxgony -rjaepyngiox - -hysqpw -quwtyiph -hyqupw -jvfrnywqhlp -hwypqu - -vojesgyt -vgeuyoj - -kq -kgq - -qash -qhsdvl - -ogecvxt -gvtcxqeo -xtvcogeu - -aiuzktwjnshlevr -ixuwcdgptmfzejl - -mlsu -luy -wl -tl -golfv - -ujxfyqdpchbk -mckfrhiqudxp -gkhbuxpcdfq - -kamydczqfrsvg -szgkfuvyicmrqa -smcfgykqrvaz - -hdyistonwvkuxm -uqospkewltar - -iloqsexhubfy -deuiqbhfylxosw -jqheudxwsiblyofa -slahouqefyxib -gfntrbcyqxoeisulh - -rtkqzxi -txzi -vygxiwzt -exztaci - -pscgbunrdmlxz -vmolpgzcxndr -jrompngxdczl -cxdlznrmgp - -myopnajkcxd -aoxdymgknjc -fayoxjbdclvsnm -cmjaxnoyd -adenpocymjx - -gwurxpealzqfn -uqanelrwzpfxg - -p -p -qgmpt -p -p - -osjvfthlruqecwdgab -omqzlxkfuybce -oypfucqleibnm - -jkylogfscpehwnzudbi -yvqcuehfbzwsjplniogk -cpgeosihzlbkwynjfu -ekcwtnyjsgpohfuilbz - -bqoxplvhnmgs -jnmozhsdgqclb -tuhbnyoqsmgwl - -pyanchrwtoqe -oenqatcphw -wpqcnetoah -nwqcapteho - -wndqsh -jfgnq -pclbvk - -gwav -gawv -gawv -awvg - -t -zd -jfcl -t - -ryhqtewijk -fnqwhjkyrie -qhjwrynki -kogrhwuixqypj - -vhytdaqf -vyathqdf - -vyeizmaopnglsqcxbdr -acoixrsbglqvyzujdp -bzqagplxovdcrsiy -scxizbrdvpqgolya -cylxpabuiodgsrvqz - -hp -hs -rzuh -he - -glxeqjf -tmufqbxiekdcj -fxslvpeqj -nzgpxjeqf -xnzjlqefh - -fcwd -pxnowvtfrc -lfcw -wqgkcfd - -teblqdskjwymgipvfocanzr -glbojevqktirspuydncamwfz - -zftjgnpuc -zrcuqjtfn -irdutbecnz -nkcovuxzswmtlyah -ztqncdu - -kdirczys -skrdzciy -dcszyirk - -weytvzmidgnbxl -qdxfpkblsrouajvw - -gmdupkbl -klhtgdmsbp -nbvpmdlkg -pzibclmyeodqgk -mpbxldkg - -ikchnfbqgymdwpet -gkmfnhtwxiqbdcyve -mgdecfiotqknhbaw -dsmrqfnkyctighzewb -mqehgkwnscdbift - -rzdnimcaxe -dceaxbmzrt -dmrecazx -zeuqxmchlrydak -rxeaczmd - -nlbecfu -nuelcf -eufncl -fluenc - -skoltxqicvwfbhzdupem -ilqsfyouaxvkwdcpth - -gvecuatmospxl -mhbxcyskojpeluv -upfslomxcnve -pqvmluiecsox -mnpcfxzueloavts - -mxquegw -esgcbif -gevrn -cykzdhge -bgzkieadl - -hna -nxha - -qmorc -rmcoq -mcrqo -cqorm -qrcom - -tewncgarvqjdoumkb -jgwqdbcmorevutkn -eomtvngdjrbcqkuw - -aeckhjmvzn -mvenkcuhazj -hzkvdejamcn -jevzhnmcak -mhejzkcavn - -yvpjqszo -dtg -atg - -ghczoyrkviaudbtjwne -dnbecrftkowghyuzvai -wbygucnavdktezhior - -vyoq -voy -oyv -voy - -um -m -m - -eijf -jief -jgief -jfie -fijxde - -xy -xyc -xy -yx -xy - -ubcnvioqxlhm -iqzbngoclhmxu -iofwxbcmslndq - -njqvmbatkxlfswizur -dqxkwlzbnmvau -vbuwmznakqlhx -unvzlxmwaqkbg - -izwlbfqdh -wubacgyzrhfm - -xvdzmaireyoqgfpub -rndxuczebfyipvtogma -vodgmwbxfzpeiyurja - -hpdwqz -rqdhpzwn -whpdzq -qphzwd -cwqphvzd - -rndgovb -gdrvobn -govndbr -vgbnord -nbvgord - -ufxdk -pehaqtz -rwpiea - -v -v -v - -zrclgthjybdxwsnmvqi -tnwyvidqrzxlgjscmbh -isjynzrmbgwlxtpchdvq -ynqwlihbxrmztsjdcgv - -q -q -q - -c -c -jb -u -c - -vkejfcmgwixbnolutaqphrzsdy -fqdwjngcuxviloyzkshmpteabr - -rfv -r -rz -qjmrg - -wzhdyp -r -gbm -aw - -rsdywfzikhnlqc -kifcrndqlswzhy -hdfkiylsnqcrzw - -lfhtzrxcj -fbtzlhrcj -lzdaftrjphco diff --git a/6/part1.c b/6/part1.c deleted file mode 100644 index 1b38192..0000000 --- a/6/part1.c +++ /dev/null @@ -1,37 +0,0 @@ -#include - -int plane_count(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[32] = { 0 }; - - int tot = 0; - unsigned int current = 0; - - while (fgets(buffer, 32, file)) { - if (buffer[0] == '\n') { - tot += __builtin_popcount(current); - current = 0; - - continue; - } - - char *p = buffer; - do { - current |= 1 << (*p - 97); - } while (*++p != '\n'); - } - - tot += __builtin_popcount(current); - - fclose(file); - - return tot; -} - -int main(int argc, char *argv[]) -{ - printf("%i\n", plane_count(argv[argc - 1])); -} diff --git a/6/part2.c b/6/part2.c deleted file mode 100644 index 11c8469..0000000 --- a/6/part2.c +++ /dev/null @@ -1,44 +0,0 @@ -#include - -int plane_count(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[32] = { 0 }; - - int tot = 0; - unsigned int current = 0xffffffff; - - while (fgets(buffer, 32, file)) { - if (buffer[0] == '\n') { - if (current != 0xffffffff) { - tot += __builtin_popcount(current); - current = 0xffffffff; - } - - continue; - } - - unsigned int tmp = 0; - char *p = buffer; - do { - tmp |= 1 << (*p - 97); - } while (*++p != '\n'); - - current &= tmp; - } - - fclose(file); - - if (current != 0xffffffff) { - tot += __builtin_popcount(current); - } - - return tot; -} - -int main(int argc, char *argv[]) -{ - printf("%i\n", plane_count(argv[argc - 1])); -} diff --git a/7/input b/7/input deleted file mode 100644 index 8a5b6d0..0000000 --- a/7/input +++ /dev/null @@ -1,594 +0,0 @@ -mirrored silver bags contain 4 wavy gray bags. -clear tan bags contain 5 bright purple bags, 1 pale black bag, 5 muted lime bags. -dim crimson bags contain 5 vibrant salmon bags, 2 clear cyan bags, 2 striped lime bags, 5 vibrant violet bags. -mirrored beige bags contain 4 pale gold bags, 1 pale aqua bag. -pale maroon bags contain 2 dotted orange bags. -dim tan bags contain no other bags. -bright crimson bags contain 4 dull gold bags, 1 dim lime bag, 2 plaid crimson bags, 3 pale gold bags. -muted violet bags contain 2 dim lavender bags, 2 dotted fuchsia bags, 5 dull indigo bags. -drab yellow bags contain 4 shiny plum bags, 3 dark chartreuse bags. -dark cyan bags contain 2 wavy beige bags. -shiny olive bags contain 2 shiny indigo bags, 4 faded tomato bags. -wavy plum bags contain 4 posh gold bags, 5 light plum bags, 5 dotted lavender bags. -wavy gold bags contain 3 drab coral bags, 2 posh yellow bags, 4 pale magenta bags, 3 shiny orange bags. -wavy chartreuse bags contain 4 bright turquoise bags, 1 pale tan bag, 2 wavy gray bags, 4 muted plum bags. -dark tomato bags contain 2 shiny violet bags, 5 dim olive bags. -posh aqua bags contain 1 pale white bag, 5 pale olive bags, 3 dotted cyan bags, 2 striped teal bags. -drab blue bags contain 5 faded plum bags, 4 mirrored lime bags, 1 wavy teal bag. -drab orange bags contain 1 dull lavender bag. -vibrant orange bags contain 5 muted plum bags. -drab tan bags contain 3 pale tomato bags, 1 dull indigo bag, 2 clear tan bags, 1 dim green bag. -plaid beige bags contain 4 faded crimson bags, 5 faded purple bags. -shiny white bags contain 5 striped black bags. -shiny orange bags contain 2 faded olive bags. -bright blue bags contain 1 striped tan bag, 1 plaid crimson bag, 1 light magenta bag. -faded green bags contain 4 clear turquoise bags, 1 mirrored indigo bag, 3 vibrant fuchsia bags. -wavy red bags contain 5 shiny fuchsia bags, 1 dim bronze bag, 4 dim turquoise bags, 3 dotted violet bags. -dim aqua bags contain 4 striped plum bags, 5 posh tan bags, 1 mirrored gray bag, 2 muted brown bags. -striped bronze bags contain 4 pale red bags, 4 pale tomato bags, 1 faded gray bag. -shiny lavender bags contain 5 vibrant magenta bags, 1 bright turquoise bag, 2 shiny beige bags, 4 pale tan bags. -dotted olive bags contain 1 striped bronze bag, 1 dim lavender bag, 5 posh plum bags, 2 posh silver bags. -shiny tomato bags contain 2 shiny magenta bags, 1 shiny gold bag. -dark brown bags contain 5 shiny gold bags, 3 faded crimson bags, 1 mirrored gray bag. -pale violet bags contain 3 plaid blue bags. -muted brown bags contain 5 clear fuchsia bags, 2 shiny orange bags. -clear silver bags contain 1 shiny gold bag, 5 bright beige bags. -plaid green bags contain 3 striped magenta bags, 2 posh plum bags. -clear beige bags contain 4 plaid lavender bags. -pale red bags contain 4 muted maroon bags, 4 dark black bags. -dull lavender bags contain 5 clear fuchsia bags, 1 muted blue bag, 1 shiny gold bag, 5 dotted turquoise bags. -posh red bags contain 2 pale black bags, 3 shiny violet bags, 1 dull gray bag. -mirrored aqua bags contain 1 dull gold bag. -drab red bags contain 2 muted violet bags, 1 vibrant plum bag. -plaid crimson bags contain 4 faded olive bags, 2 shiny purple bags, 2 dotted magenta bags. -plaid tomato bags contain 1 plaid turquoise bag, 5 muted lime bags. -posh lavender bags contain 2 posh crimson bags, 5 striped magenta bags, 4 bright purple bags. -posh beige bags contain 4 drab tan bags, 2 posh salmon bags, 2 dotted brown bags, 3 muted plum bags. -drab aqua bags contain 5 pale red bags, 2 dim green bags, 3 dim white bags. -bright gray bags contain 5 faded green bags, 3 posh crimson bags. -shiny purple bags contain 4 dark black bags, 3 vibrant magenta bags, 3 pale tan bags, 4 bright turquoise bags. -dim yellow bags contain 1 dark black bag. -dotted magenta bags contain 5 pale lavender bags. -clear bronze bags contain 3 dim lavender bags, 3 drab indigo bags. -pale tomato bags contain 3 wavy teal bags, 2 posh tomato bags, 4 vibrant magenta bags, 2 pale orange bags. -dull violet bags contain 3 wavy beige bags, 4 wavy brown bags, 5 drab fuchsia bags, 1 mirrored white bag. -shiny teal bags contain 3 dark gray bags, 1 pale red bag, 3 light bronze bags, 1 dim cyan bag. -mirrored salmon bags contain 3 pale red bags, 3 dim white bags, 5 faded teal bags, 5 pale purple bags. -striped maroon bags contain 3 drab turquoise bags, 2 bright blue bags, 1 shiny indigo bag. -posh crimson bags contain 2 muted teal bags. -faded olive bags contain 2 muted plum bags, 4 mirrored lavender bags. -drab fuchsia bags contain 1 clear lavender bag, 3 dark yellow bags, 2 drab violet bags. -posh magenta bags contain 2 clear orange bags, 5 wavy silver bags, 1 striped magenta bag, 4 drab salmon bags. -dull bronze bags contain 4 dull indigo bags, 2 dim lavender bags. -vibrant coral bags contain 1 mirrored gray bag, 3 dull magenta bags, 1 faded crimson bag. -plaid cyan bags contain 3 dotted olive bags, 4 wavy tan bags. -dark fuchsia bags contain 1 dark turquoise bag, 2 shiny purple bags. -faded brown bags contain 2 clear green bags. -light gold bags contain 4 dim coral bags, 5 light violet bags, 5 wavy gold bags. -light lime bags contain 5 bright indigo bags, 5 striped teal bags. -dark white bags contain 5 shiny orange bags, 3 dotted blue bags, 1 striped salmon bag, 2 posh tomato bags. -muted magenta bags contain 5 mirrored salmon bags, 1 drab bronze bag. -vibrant bronze bags contain 2 mirrored lime bags, 2 plaid white bags. -dim lavender bags contain 3 clear yellow bags, 5 shiny beige bags. -dark turquoise bags contain 2 dull indigo bags. -dim coral bags contain 2 posh teal bags. -striped lime bags contain 2 clear yellow bags, 2 mirrored lavender bags, 5 drab olive bags, 1 bright orange bag. -wavy purple bags contain 5 shiny white bags, 5 striped aqua bags, 1 wavy cyan bag. -drab coral bags contain 3 dull orange bags, 3 posh yellow bags, 5 dim olive bags, 3 faded olive bags. -vibrant red bags contain 3 mirrored gray bags, 1 striped black bag, 1 plaid coral bag. -posh lime bags contain 3 drab olive bags, 3 clear magenta bags. -muted yellow bags contain 1 muted crimson bag, 2 dull yellow bags. -dull magenta bags contain 4 muted purple bags, 5 dull orange bags. -dull beige bags contain 5 light green bags. -bright black bags contain 2 dotted indigo bags, 4 faded yellow bags. -mirrored gold bags contain 2 faded tan bags, 1 faded maroon bag, 2 plaid purple bags, 5 bright blue bags. -muted green bags contain 4 muted gold bags, 4 wavy indigo bags. -posh gold bags contain 2 wavy cyan bags, 4 dark tomato bags, 3 shiny purple bags, 1 pale indigo bag. -muted blue bags contain 1 dark brown bag, 5 vibrant beige bags. -mirrored bronze bags contain 3 posh black bags, 4 striped silver bags, 4 bright olive bags, 4 muted yellow bags. -faded white bags contain 3 drab green bags, 5 dark black bags, 2 pale green bags. -clear indigo bags contain 3 shiny cyan bags, 4 plaid blue bags, 2 dark silver bags, 1 dotted cyan bag. -faded orange bags contain 3 pale plum bags, 1 posh plum bag, 4 mirrored lavender bags. -muted teal bags contain 3 pale olive bags, 1 clear chartreuse bag, 5 bright fuchsia bags. -dotted salmon bags contain 4 dotted magenta bags, 1 mirrored green bag, 5 pale chartreuse bags, 4 drab green bags. -wavy indigo bags contain 5 muted purple bags, 2 dark black bags, 2 dotted orange bags. -wavy teal bags contain 3 shiny purple bags, 2 clear yellow bags, 1 pale lavender bag. -plaid yellow bags contain 2 clear chartreuse bags, 2 clear crimson bags. -clear turquoise bags contain 4 pale tomato bags, 3 mirrored lavender bags. -bright silver bags contain 1 striped plum bag. -faded coral bags contain 2 shiny maroon bags, 5 wavy salmon bags, 1 wavy orange bag. -clear teal bags contain 2 drab olive bags, 5 posh red bags. -shiny black bags contain 5 faded gold bags, 1 bright tomato bag. -pale indigo bags contain 4 striped bronze bags, 3 drab olive bags. -drab purple bags contain 4 dim silver bags. -light beige bags contain 2 drab teal bags, 2 mirrored lime bags, 3 dotted coral bags, 3 vibrant cyan bags. -plaid teal bags contain 2 clear white bags. -dim bronze bags contain 2 dark bronze bags, 2 vibrant crimson bags. -muted aqua bags contain 1 vibrant magenta bag. -pale gray bags contain 2 pale orange bags, 3 faded olive bags, 1 vibrant brown bag. -drab gold bags contain 2 bright yellow bags, 2 light green bags, 5 light plum bags, 3 faded white bags. -dull lime bags contain 1 dotted maroon bag, 5 drab tan bags, 1 vibrant tomato bag. -dull aqua bags contain 5 mirrored crimson bags, 2 vibrant teal bags, 3 dim lime bags. -bright maroon bags contain 1 bright green bag, 4 shiny olive bags, 1 dotted magenta bag, 3 light plum bags. -dark silver bags contain 2 dotted indigo bags. -dark purple bags contain 3 shiny gray bags. -shiny beige bags contain 5 clear yellow bags, 5 posh salmon bags, 1 striped magenta bag, 3 bright turquoise bags. -mirrored fuchsia bags contain 5 muted blue bags, 5 muted coral bags, 1 light lavender bag. -vibrant silver bags contain 2 dull brown bags. -posh black bags contain 3 dotted orange bags. -pale crimson bags contain 5 drab plum bags, 1 pale red bag, 2 dark lavender bags. -posh tomato bags contain 4 shiny lavender bags, 2 clear yellow bags, 1 dotted turquoise bag, 1 muted gold bag. -muted silver bags contain 4 faded gray bags. -dull tan bags contain 2 faded gold bags, 4 dim yellow bags, 3 plaid white bags, 1 light green bag. -bright tomato bags contain 4 faded lime bags, 1 faded violet bag, 1 light green bag, 3 shiny turquoise bags. -shiny cyan bags contain 1 plaid black bag. -wavy magenta bags contain 5 drab coral bags, 2 vibrant gold bags. -dim green bags contain 2 shiny fuchsia bags, 1 dark chartreuse bag, 5 shiny purple bags, 4 dotted turquoise bags. -pale beige bags contain 2 wavy aqua bags, 3 wavy indigo bags, 2 dull gray bags. -clear purple bags contain 1 light plum bag, 2 wavy maroon bags, 2 posh white bags. -light magenta bags contain 3 dotted cyan bags. -light bronze bags contain 2 bright coral bags. -dim teal bags contain 3 vibrant aqua bags, 1 muted olive bag, 5 mirrored red bags, 2 muted maroon bags. -mirrored gray bags contain 4 dull orange bags, 1 dull bronze bag, 5 mirrored white bags, 1 plaid beige bag. -mirrored lavender bags contain 3 muted plum bags, 5 vibrant magenta bags, 4 pale tan bags, 5 bright turquoise bags. -vibrant yellow bags contain 1 dotted yellow bag, 5 mirrored gray bags. -drab cyan bags contain 1 shiny green bag, 2 dull yellow bags. -dim chartreuse bags contain 2 muted maroon bags, 1 dull bronze bag, 2 vibrant plum bags, 5 muted gold bags. -mirrored coral bags contain 4 dull crimson bags, 3 striped gold bags, 3 muted brown bags. -clear blue bags contain 4 clear lavender bags. -plaid coral bags contain 4 pale gold bags, 5 plaid violet bags, 1 muted aqua bag. -dark magenta bags contain 4 shiny turquoise bags. -drab crimson bags contain 5 mirrored olive bags, 4 dull silver bags, 1 wavy purple bag. -faded crimson bags contain 5 pale tan bags, 5 dim tan bags, 5 wavy indigo bags, 2 shiny lavender bags. -faded tan bags contain 4 dim green bags, 5 pale black bags, 5 muted maroon bags, 1 vibrant crimson bag. -dull black bags contain 4 wavy indigo bags, 2 bright crimson bags. -light black bags contain 3 vibrant magenta bags, 2 vibrant violet bags, 5 light purple bags, 3 striped beige bags. -light blue bags contain 2 dotted lavender bags, 4 pale beige bags. -drab beige bags contain 4 plaid blue bags, 1 dim blue bag, 5 pale aqua bags. -dim black bags contain 4 light bronze bags, 1 clear orange bag, 4 dark gray bags. -bright coral bags contain 4 wavy cyan bags, 1 posh aqua bag. -vibrant blue bags contain 4 wavy gray bags, 2 dim gold bags, 3 clear green bags, 1 dotted white bag. -shiny brown bags contain 3 pale tan bags, 1 drab purple bag. -light chartreuse bags contain 2 pale olive bags. -striped gray bags contain 1 dim orange bag, 1 bright lime bag. -mirrored cyan bags contain 4 drab bronze bags, 3 dotted red bags, 1 plaid indigo bag. -faded gold bags contain 3 vibrant yellow bags, 1 shiny fuchsia bag. -dull teal bags contain 5 dim purple bags. -bright yellow bags contain 5 posh gray bags. -dotted gold bags contain 1 clear gray bag, 4 light bronze bags. -light indigo bags contain 3 shiny olive bags. -plaid indigo bags contain 1 posh green bag, 3 mirrored red bags. -faded purple bags contain 4 muted purple bags, 3 dark gold bags, 3 shiny purple bags. -dark plum bags contain 4 drab aqua bags, 4 dull tomato bags. -bright turquoise bags contain no other bags. -drab gray bags contain 2 dim yellow bags, 1 dim white bag, 4 posh plum bags. -dull orange bags contain 5 dim tan bags. -pale bronze bags contain 5 dim salmon bags, 2 bright salmon bags, 2 striped aqua bags, 1 bright white bag. -dotted crimson bags contain 5 vibrant magenta bags. -pale orange bags contain 2 shiny beige bags, 2 dotted turquoise bags. -dim gold bags contain 4 bright bronze bags, 3 muted plum bags, 4 pale tomato bags. -clear magenta bags contain 4 muted turquoise bags. -shiny magenta bags contain 4 pale brown bags, 1 striped tan bag, 2 dark brown bags. -dark lavender bags contain 2 dull fuchsia bags, 3 striped salmon bags. -plaid white bags contain 3 mirrored red bags. -drab turquoise bags contain 5 mirrored blue bags. -striped red bags contain 2 faded indigo bags, 3 posh plum bags. -pale yellow bags contain 2 wavy yellow bags, 1 plaid purple bag, 3 striped black bags. -vibrant lime bags contain 1 dim teal bag, 3 pale salmon bags. -pale tan bags contain 2 muted gold bags. -posh olive bags contain 3 wavy bronze bags, 1 dull lavender bag, 5 dim white bags, 5 mirrored olive bags. -posh white bags contain 2 dark gray bags. -shiny red bags contain 4 striped crimson bags, 1 dark brown bag. -dark orange bags contain 2 wavy teal bags. -wavy white bags contain 2 posh green bags, 2 wavy maroon bags, 4 clear turquoise bags, 2 bright crimson bags. -pale plum bags contain 1 shiny beige bag, 5 wavy indigo bags, 3 muted plum bags. -dark violet bags contain 5 wavy indigo bags, 3 faded magenta bags, 4 dim teal bags. -posh maroon bags contain 5 posh aqua bags, 4 clear teal bags, 5 light aqua bags, 2 dim aqua bags. -pale gold bags contain 4 posh tomato bags, 3 clear yellow bags. -light yellow bags contain 1 plaid aqua bag, 1 pale aqua bag, 1 plaid violet bag, 4 drab bronze bags. -dotted red bags contain 2 light indigo bags, 2 posh tomato bags. -shiny bronze bags contain 1 drab coral bag, 5 vibrant magenta bags, 3 mirrored tomato bags, 2 pale teal bags. -dull gray bags contain 1 striped plum bag, 5 posh salmon bags, 5 posh yellow bags, 3 bright cyan bags. -bright plum bags contain 1 posh gray bag. -light aqua bags contain 4 light turquoise bags, 4 posh indigo bags, 1 drab tomato bag, 3 bright gold bags. -muted turquoise bags contain 3 muted crimson bags. -clear crimson bags contain 1 posh crimson bag, 2 posh coral bags, 2 pale tomato bags, 5 dull aqua bags. -faded fuchsia bags contain 3 striped bronze bags, 2 faded orange bags, 3 dark gold bags, 4 posh beige bags. -bright violet bags contain 1 bright olive bag, 2 faded olive bags, 1 muted aqua bag. -wavy lime bags contain 4 light lime bags. -plaid red bags contain 4 wavy silver bags, 1 plaid gray bag, 5 drab turquoise bags, 2 dotted tomato bags. -clear cyan bags contain 5 bright olive bags, 1 muted green bag, 4 striped magenta bags. -light silver bags contain 4 pale black bags, 5 dim aqua bags, 1 posh lavender bag. -vibrant indigo bags contain 1 dotted yellow bag, 3 dull gold bags. -pale turquoise bags contain 4 muted plum bags, 1 striped magenta bag, 4 shiny fuchsia bags. -faded bronze bags contain 4 dim blue bags, 5 faded salmon bags. -dark black bags contain 2 muted maroon bags, 2 bright turquoise bags. -posh tan bags contain 4 dark black bags. -dark olive bags contain 5 dotted olive bags. -dim blue bags contain 4 wavy maroon bags, 4 dull crimson bags. -dim salmon bags contain 3 clear lime bags, 5 pale indigo bags, 2 dull yellow bags. -striped indigo bags contain 2 wavy violet bags, 3 pale gold bags, 5 bright bronze bags, 3 dark beige bags. -clear plum bags contain 1 dark gray bag, 1 mirrored yellow bag, 3 light red bags, 3 dull olive bags. -drab plum bags contain 4 clear white bags, 3 vibrant cyan bags. -light teal bags contain 1 faded yellow bag, 5 striped brown bags, 2 dull magenta bags. -mirrored plum bags contain 4 mirrored tomato bags, 3 dotted cyan bags. -vibrant black bags contain 1 posh gray bag, 1 dotted fuchsia bag. -dark teal bags contain 3 bright indigo bags, 1 plaid violet bag, 2 faded plum bags. -pale teal bags contain 5 faded olive bags, 4 striped white bags, 3 dotted orange bags. -dotted chartreuse bags contain 2 clear teal bags, 1 clear brown bag, 3 dotted beige bags. -pale olive bags contain 2 clear chartreuse bags, 3 dotted turquoise bags, 2 dull bronze bags. -light tan bags contain 1 muted bronze bag. -light cyan bags contain 1 plaid lime bag. -posh coral bags contain 1 dotted turquoise bag, 1 pale plum bag. -wavy tomato bags contain 3 striped coral bags. -dull cyan bags contain 5 plaid white bags, 1 drab lime bag, 2 posh chartreuse bags. -bright white bags contain 5 posh green bags, 5 vibrant crimson bags. -dotted black bags contain 1 shiny chartreuse bag. -plaid silver bags contain 1 posh indigo bag, 4 dotted yellow bags, 2 vibrant beige bags. -striped magenta bags contain 2 bright turquoise bags, 5 dull indigo bags, 3 clear yellow bags. -dotted lime bags contain 4 vibrant gold bags, 3 posh crimson bags, 5 muted green bags, 4 posh plum bags. -shiny indigo bags contain 5 muted blue bags, 3 pale tomato bags. -dull olive bags contain 2 bright fuchsia bags. -wavy yellow bags contain 1 dark teal bag, 3 posh plum bags, 2 striped crimson bags. -vibrant aqua bags contain 1 pale green bag, 4 posh tan bags, 5 dotted brown bags. -dim purple bags contain 4 striped teal bags, 2 muted violet bags, 2 dim white bags, 3 light lime bags. -mirrored purple bags contain 3 muted green bags, 2 clear salmon bags, 2 light orange bags, 5 wavy purple bags. -striped blue bags contain 5 vibrant black bags. -posh brown bags contain 1 muted turquoise bag, 2 dim orange bags, 4 dim silver bags, 1 mirrored blue bag. -muted black bags contain 5 clear cyan bags, 3 mirrored teal bags, 3 posh turquoise bags, 4 dull plum bags. -posh salmon bags contain 4 dull indigo bags. -vibrant olive bags contain 1 dull beige bag, 2 posh tomato bags. -wavy orange bags contain 1 pale green bag, 2 plaid green bags, 4 vibrant black bags. -bright tan bags contain 3 dull purple bags, 1 dim chartreuse bag, 2 light lime bags, 4 pale plum bags. -striped yellow bags contain 5 bright plum bags. -faded blue bags contain 4 wavy indigo bags, 5 posh yellow bags, 3 pale black bags. -muted lime bags contain 4 shiny lavender bags. -light crimson bags contain 5 dull tomato bags, 3 bright beige bags, 1 dark silver bag. -dotted plum bags contain 2 muted blue bags, 5 wavy gray bags, 4 posh tan bags. -light white bags contain 5 dim indigo bags, 3 plaid plum bags, 1 clear gray bag, 2 faded gold bags. -dim maroon bags contain 2 plaid turquoise bags. -dull red bags contain 4 shiny orange bags, 2 dull crimson bags. -striped black bags contain 1 striped white bag. -plaid gray bags contain 1 muted violet bag, 3 faded black bags, 4 pale lavender bags. -light turquoise bags contain 1 faded crimson bag, 5 mirrored olive bags, 5 vibrant cyan bags. -pale chartreuse bags contain 2 drab coral bags, 5 mirrored crimson bags. -vibrant green bags contain 2 dim indigo bags, 3 bright cyan bags, 1 dull chartreuse bag. -dull indigo bags contain no other bags. -vibrant plum bags contain 4 vibrant magenta bags, 1 muted plum bag. -striped white bags contain 5 mirrored lavender bags, 5 dark black bags. -striped aqua bags contain 3 dim gold bags. -shiny violet bags contain 5 shiny red bags, 5 striped crimson bags, 3 shiny fuchsia bags, 4 dotted magenta bags. -vibrant violet bags contain 5 plaid turquoise bags. -drab tomato bags contain 3 pale tomato bags, 1 pale lavender bag, 3 pale plum bags, 1 posh red bag. -vibrant chartreuse bags contain 2 plaid fuchsia bags, 1 muted silver bag, 2 vibrant magenta bags. -vibrant salmon bags contain 1 clear olive bag, 3 light orange bags, 2 striped plum bags, 2 dark aqua bags. -dotted yellow bags contain 4 pale olive bags, 4 shiny purple bags, 1 dim lavender bag. -pale magenta bags contain 2 striped teal bags, 5 mirrored olive bags. -mirrored orange bags contain 5 pale coral bags. -bright beige bags contain 3 clear fuchsia bags, 2 muted orange bags. -vibrant tan bags contain 3 muted tan bags, 5 posh gray bags, 1 dim yellow bag. -clear aqua bags contain 3 pale plum bags, 1 wavy fuchsia bag. -striped cyan bags contain 2 posh olive bags, 3 light chartreuse bags, 2 muted turquoise bags, 1 pale teal bag. -posh purple bags contain 3 dotted brown bags. -striped green bags contain 2 light brown bags. -bright olive bags contain 2 drab coral bags, 5 striped orange bags. -vibrant beige bags contain 4 faded crimson bags. -wavy gray bags contain 5 posh salmon bags. -dull chartreuse bags contain 2 shiny purple bags, 3 faded maroon bags. -bright chartreuse bags contain 3 wavy beige bags. -striped orange bags contain 3 wavy indigo bags, 2 wavy teal bags. -drab white bags contain 2 bright fuchsia bags. -clear white bags contain 1 posh teal bag. -drab bronze bags contain 1 mirrored tan bag, 2 pale black bags, 1 bright cyan bag, 1 striped magenta bag. -dotted indigo bags contain 3 mirrored tan bags, 5 faded lavender bags, 4 dotted magenta bags, 3 dim silver bags. -posh violet bags contain 4 dotted maroon bags, 4 dotted magenta bags, 3 bright purple bags. -plaid blue bags contain 5 shiny tan bags, 1 wavy maroon bag, 2 muted crimson bags. -vibrant tomato bags contain 4 shiny fuchsia bags. -bright cyan bags contain 3 wavy black bags, 1 muted lime bag. -muted cyan bags contain 2 muted teal bags, 3 vibrant magenta bags, 5 dull magenta bags. -vibrant maroon bags contain 1 wavy aqua bag. -dark gold bags contain no other bags. -mirrored magenta bags contain 4 dim gold bags. -muted beige bags contain 4 dull magenta bags, 2 drab olive bags. -striped purple bags contain 3 vibrant beige bags. -light green bags contain 5 striped black bags, 5 clear orange bags, 5 muted indigo bags, 5 wavy yellow bags. -light orange bags contain 2 pale salmon bags, 2 dotted blue bags, 5 mirrored crimson bags. -dull plum bags contain 4 dotted fuchsia bags. -bright aqua bags contain 3 posh chartreuse bags, 2 dark tomato bags. -muted orange bags contain 1 posh salmon bag, 5 bright purple bags, 4 dotted magenta bags, 2 dark chartreuse bags. -plaid purple bags contain 3 posh gray bags, 5 vibrant coral bags, 4 vibrant yellow bags, 4 shiny aqua bags. -shiny tan bags contain 1 dotted cyan bag. -drab lime bags contain 4 striped orange bags, 4 muted green bags, 3 faded gray bags. -drab violet bags contain 3 bright olive bags, 4 drab indigo bags, 5 clear turquoise bags. -muted red bags contain 5 dotted plum bags, 4 striped plum bags, 1 bright violet bag, 1 mirrored tomato bag. -vibrant lavender bags contain 2 vibrant magenta bags, 4 shiny beige bags, 2 drab bronze bags, 1 faded indigo bag. -dark crimson bags contain 5 mirrored tan bags, 5 drab bronze bags. -muted salmon bags contain 4 dull tan bags, 2 faded magenta bags, 5 muted violet bags. -light maroon bags contain 5 dim lavender bags, 1 striped lime bag, 2 dotted maroon bags. -posh plum bags contain 3 dotted turquoise bags. -pale white bags contain 4 wavy indigo bags, 2 striped orange bags, 2 mirrored tomato bags. -dotted lavender bags contain 3 clear tan bags, 2 clear salmon bags, 2 faded brown bags. -mirrored indigo bags contain 3 muted olive bags, 2 striped purple bags, 4 light chartreuse bags, 5 bright magenta bags. -pale lavender bags contain no other bags. -wavy coral bags contain 2 drab salmon bags. -striped beige bags contain 1 plaid maroon bag, 5 pale olive bags, 5 pale yellow bags, 1 plaid violet bag. -wavy salmon bags contain 4 dotted purple bags, 4 light indigo bags, 5 faded green bags, 4 faded crimson bags. -faded turquoise bags contain 1 dim beige bag. -wavy brown bags contain 1 drab red bag, 2 shiny red bags, 2 vibrant aqua bags. -plaid aqua bags contain 1 muted yellow bag, 5 vibrant orange bags, 5 drab tomato bags, 2 drab brown bags. -wavy beige bags contain 4 dim red bags. -bright lime bags contain 3 pale lavender bags. -posh orange bags contain 5 dark chartreuse bags. -clear chartreuse bags contain 2 pale plum bags, 4 dull indigo bags. -dim silver bags contain 5 shiny purple bags, 1 mirrored olive bag. -shiny salmon bags contain 3 clear lavender bags, 3 shiny purple bags. -dull crimson bags contain 5 muted blue bags, 1 dark black bag, 1 bright purple bag, 2 shiny purple bags. -mirrored maroon bags contain 5 mirrored tan bags, 5 pale indigo bags, 2 pale olive bags, 3 vibrant plum bags. -vibrant teal bags contain 5 mirrored olive bags, 5 pale beige bags, 1 pale tan bag. -dim turquoise bags contain 4 dark plum bags, 3 dull orange bags, 3 plaid plum bags, 3 dark orange bags. -shiny lime bags contain 2 muted lavender bags, 4 vibrant magenta bags, 4 bright gold bags. -wavy cyan bags contain 3 light beige bags. -muted tomato bags contain 5 dim white bags, 2 vibrant gold bags, 1 vibrant coral bag. -muted gold bags contain no other bags. -dark blue bags contain 2 posh teal bags, 2 pale beige bags, 2 shiny green bags, 1 bright fuchsia bag. -faded chartreuse bags contain 4 wavy white bags. -striped teal bags contain 5 dim olive bags, 3 striped crimson bags, 1 faded crimson bag. -bright green bags contain 2 mirrored tan bags, 5 posh salmon bags, 5 shiny aqua bags. -wavy green bags contain 2 posh blue bags, 2 mirrored teal bags. -dim red bags contain 3 dull magenta bags. -shiny fuchsia bags contain 2 pale red bags. -dotted white bags contain 5 light beige bags, 5 dark beige bags. -shiny gold bags contain 2 clear chartreuse bags. -faded violet bags contain 1 dim chartreuse bag. -faded cyan bags contain 1 drab yellow bag, 3 muted crimson bags, 4 muted teal bags. -shiny gray bags contain 4 mirrored white bags. -dim beige bags contain 2 light chartreuse bags, 3 dim white bags, 3 shiny lavender bags. -muted white bags contain 1 drab gray bag, 2 wavy silver bags, 3 drab purple bags, 4 dim magenta bags. -dark green bags contain 4 muted tomato bags, 5 dotted coral bags, 5 mirrored tomato bags, 1 dull crimson bag. -shiny yellow bags contain 2 drab red bags. -bright gold bags contain 2 mirrored gray bags. -dim tomato bags contain 4 bright tomato bags, 5 bright plum bags, 1 light lime bag, 5 muted turquoise bags. -dim white bags contain 3 shiny beige bags. -mirrored turquoise bags contain 2 shiny cyan bags, 3 mirrored green bags, 4 dim silver bags, 1 faded aqua bag. -striped fuchsia bags contain 4 dark black bags, 1 plaid lavender bag, 4 mirrored yellow bags, 5 drab bronze bags. -clear orange bags contain 3 striped plum bags. -shiny coral bags contain 4 vibrant crimson bags. -posh indigo bags contain 3 dull indigo bags, 2 clear green bags, 3 pale tan bags, 4 clear tan bags. -dark bronze bags contain 3 striped orange bags, 4 drab lime bags. -striped olive bags contain 3 muted bronze bags. -clear gold bags contain 4 light red bags, 3 clear tan bags, 2 drab black bags. -clear brown bags contain 3 dull fuchsia bags, 3 clear white bags, 3 dull aqua bags. -bright magenta bags contain 3 light green bags, 1 muted yellow bag. -posh silver bags contain 5 pale silver bags, 3 bright crimson bags, 4 light orange bags, 4 posh beige bags. -muted crimson bags contain 5 dotted orange bags. -pale black bags contain 4 striped plum bags. -light gray bags contain 2 bright tan bags. -light salmon bags contain 2 drab olive bags, 4 light purple bags, 2 dull white bags. -dark red bags contain 4 muted aqua bags, 5 bright coral bags, 2 dotted tan bags, 1 drab tomato bag. -faded gray bags contain 2 clear fuchsia bags, 4 dotted magenta bags, 4 dim white bags, 4 dim tan bags. -dotted tomato bags contain 5 shiny tomato bags, 4 dull plum bags, 3 dull white bags. -posh cyan bags contain 2 bright bronze bags. -dark maroon bags contain 3 muted plum bags, 2 striped bronze bags, 2 shiny fuchsia bags. -clear olive bags contain 3 pale lavender bags, 5 plaid white bags, 3 clear chartreuse bags, 1 posh chartreuse bag. -bright salmon bags contain 5 dim beige bags, 4 dotted indigo bags. -faded red bags contain 1 drab white bag, 4 mirrored white bags. -dotted purple bags contain 1 vibrant magenta bag, 2 dull beige bags, 5 light orange bags, 4 plaid blue bags. -faded plum bags contain 3 mirrored tan bags, 1 drab bronze bag. -pale coral bags contain 4 plaid white bags. -muted olive bags contain 3 bright turquoise bags, 5 dim tan bags, 1 striped crimson bag, 3 clear yellow bags. -faded aqua bags contain 5 faded crimson bags. -mirrored olive bags contain 2 striped white bags, 2 posh yellow bags. -drab teal bags contain 5 dull black bags. -dark salmon bags contain 2 drab lime bags, 3 dim silver bags. -light brown bags contain 2 wavy violet bags. -light fuchsia bags contain 3 striped blue bags, 2 faded aqua bags, 4 mirrored tomato bags, 3 shiny bronze bags. -dim brown bags contain 4 faded gold bags. -dotted bronze bags contain 4 drab lime bags. -posh bronze bags contain 3 pale purple bags. -plaid maroon bags contain 2 dull cyan bags, 3 drab maroon bags, 3 shiny white bags. -bright purple bags contain 3 posh tomato bags, 5 dotted turquoise bags. -striped gold bags contain 3 dim lavender bags, 5 faded brown bags, 5 posh tomato bags, 5 bright cyan bags. -faded teal bags contain 1 wavy teal bag. -light lavender bags contain 1 faded violet bag, 2 bright beige bags. -dim plum bags contain 4 clear coral bags, 4 shiny cyan bags, 5 striped orange bags. -muted chartreuse bags contain 3 dim silver bags, 4 plaid black bags. -light red bags contain 5 dim gold bags, 2 dim beige bags, 4 striped teal bags, 4 muted indigo bags. -shiny aqua bags contain 5 drab aqua bags. -faded magenta bags contain 4 pale silver bags, 5 dull lavender bags. -light tomato bags contain 4 shiny silver bags, 5 striped aqua bags, 5 vibrant crimson bags. -faded maroon bags contain 1 striped magenta bag, 5 mirrored coral bags, 3 pale lavender bags. -shiny chartreuse bags contain 5 plaid coral bags, 3 dim beige bags, 1 dim yellow bag. -clear gray bags contain 5 dark yellow bags. -clear salmon bags contain 4 muted green bags, 3 vibrant gray bags. -clear black bags contain 3 muted plum bags, 1 muted cyan bag. -vibrant brown bags contain 3 bright bronze bags, 5 striped salmon bags, 1 dim tan bag, 5 wavy black bags. -wavy fuchsia bags contain 2 posh chartreuse bags. -dotted blue bags contain 1 pale brown bag, 5 dim olive bags, 1 dotted yellow bag. -plaid orange bags contain 2 dull lime bags, 2 bright maroon bags. -dull fuchsia bags contain 5 drab turquoise bags, 3 clear cyan bags. -shiny green bags contain 4 clear lavender bags, 4 light turquoise bags, 5 muted brown bags. -mirrored brown bags contain 3 dark lavender bags, 1 drab violet bag. -muted lavender bags contain 3 dim silver bags, 3 drab purple bags, 4 faded crimson bags. -mirrored yellow bags contain 4 drab olive bags, 5 dotted coral bags, 3 plaid purple bags. -plaid turquoise bags contain 4 mirrored tomato bags, 2 shiny gold bags, 5 dim lavender bags, 3 bright turquoise bags. -wavy tan bags contain 4 faded chartreuse bags. -dark chartreuse bags contain 2 muted aqua bags, 3 shiny purple bags, 5 shiny beige bags, 1 posh tomato bag. -faded beige bags contain 2 vibrant orange bags. -clear yellow bags contain no other bags. -wavy maroon bags contain 2 muted purple bags, 2 posh yellow bags. -bright fuchsia bags contain 2 muted lime bags, 2 pale black bags. -clear violet bags contain 4 vibrant violet bags, 1 vibrant tomato bag. -mirrored teal bags contain 3 faded olive bags, 3 dotted crimson bags, 2 drab bronze bags. -drab green bags contain 2 muted green bags, 5 mirrored crimson bags, 4 mirrored lavender bags, 2 bright turquoise bags. -wavy crimson bags contain 1 bright fuchsia bag, 1 posh crimson bag, 1 posh salmon bag, 1 dull gray bag. -drab silver bags contain 2 dull chartreuse bags, 4 striped bronze bags, 5 bright orange bags. -wavy aqua bags contain 5 dotted turquoise bags, 3 dull bronze bags. -mirrored red bags contain 4 bright purple bags, 4 wavy aqua bags. -vibrant fuchsia bags contain 2 shiny green bags, 3 clear green bags, 4 posh violet bags, 4 wavy magenta bags. -dim fuchsia bags contain 2 light fuchsia bags, 1 dark coral bag, 3 muted yellow bags. -posh yellow bags contain 2 mirrored lavender bags. -dull coral bags contain 1 dark purple bag, 3 faded turquoise bags, 5 striped brown bags, 5 mirrored white bags. -faded black bags contain 4 wavy turquoise bags, 3 faded gold bags, 5 wavy teal bags. -dull silver bags contain 2 wavy black bags, 3 posh salmon bags, 2 dim brown bags. -shiny turquoise bags contain 2 dull gray bags, 4 faded silver bags, 1 posh lavender bag, 4 plaid coral bags. -dark coral bags contain 1 pale purple bag. -pale purple bags contain 3 dim lime bags, 4 vibrant cyan bags, 4 dull indigo bags, 1 muted violet bag. -clear tomato bags contain 2 posh red bags, 3 dull aqua bags. -dotted aqua bags contain 2 vibrant fuchsia bags, 3 light olive bags, 1 clear salmon bag, 4 dotted yellow bags. -drab olive bags contain 3 wavy chartreuse bags, 4 bright orange bags. -vibrant cyan bags contain 3 pale tan bags, 4 pale gold bags. -muted tan bags contain 2 wavy silver bags, 4 dotted gold bags, 3 mirrored violet bags, 5 posh crimson bags. -faded silver bags contain 2 drab blue bags. -wavy olive bags contain 4 dark tomato bags. -dark beige bags contain 5 dotted cyan bags, 4 muted crimson bags. -pale cyan bags contain 3 plaid purple bags, 5 pale tan bags. -faded lavender bags contain 1 muted indigo bag, 4 posh cyan bags, 4 faded yellow bags, 4 wavy black bags. -clear lavender bags contain 5 pale tan bags, 1 vibrant beige bag, 5 drab olive bags, 2 muted purple bags. -mirrored lime bags contain 5 dull indigo bags. -dotted green bags contain 1 dull chartreuse bag, 3 drab cyan bags. -shiny blue bags contain 5 drab purple bags, 4 dim yellow bags. -dotted turquoise bags contain 1 dark gold bag, 2 striped magenta bags. -dull tomato bags contain 5 pale tomato bags, 5 mirrored tomato bags, 1 plaid crimson bag. -vibrant crimson bags contain 5 wavy white bags, 4 shiny salmon bags, 3 faded lavender bags. -dark indigo bags contain 3 bright yellow bags, 1 shiny violet bag, 4 dark turquoise bags, 1 muted brown bag. -vibrant turquoise bags contain 2 dotted teal bags, 4 dotted gray bags, 5 pale tomato bags, 5 dark lavender bags. -mirrored tan bags contain 4 pale white bags, 3 wavy indigo bags, 5 shiny gold bags, 5 posh plum bags. -clear green bags contain 2 shiny lavender bags. -wavy lavender bags contain 1 dim magenta bag, 4 drab red bags, 1 light chartreuse bag. -dull blue bags contain 4 dull magenta bags, 4 dotted brown bags, 1 faded brown bag. -dull turquoise bags contain 1 striped lime bag, 5 pale white bags, 4 posh tan bags, 5 faded fuchsia bags. -striped brown bags contain 4 light brown bags. -dotted cyan bags contain 3 muted purple bags, 1 dull orange bag. -dotted beige bags contain 2 dark brown bags, 5 posh gray bags, 5 light magenta bags, 4 wavy silver bags. -dotted brown bags contain 2 shiny gold bags, 4 mirrored olive bags. -dim magenta bags contain 4 muted yellow bags. -faded lime bags contain 4 dim orange bags. -drab magenta bags contain 2 muted teal bags. -bright brown bags contain 4 vibrant lime bags. -striped chartreuse bags contain 4 vibrant gray bags, 5 dull magenta bags, 1 vibrant cyan bag, 5 muted gray bags. -pale blue bags contain 4 striped fuchsia bags. -dull salmon bags contain 3 posh cyan bags, 5 dull magenta bags, 4 wavy violet bags. -dotted coral bags contain 4 muted teal bags, 4 posh tan bags. -plaid fuchsia bags contain 4 wavy chartreuse bags, 1 light orange bag, 1 bright silver bag. -vibrant magenta bags contain no other bags. -dotted tan bags contain 5 posh magenta bags, 1 drab magenta bag. -dull maroon bags contain 3 posh red bags, 4 posh indigo bags, 2 drab lime bags, 5 shiny magenta bags. -vibrant gold bags contain 4 bright crimson bags. -light coral bags contain 2 mirrored blue bags, 1 light red bag. -dotted orange bags contain 3 shiny purple bags. -vibrant gray bags contain 2 pale olive bags, 4 drab purple bags. -light olive bags contain 3 dotted blue bags, 5 pale white bags. -wavy black bags contain 2 muted olive bags. -dim indigo bags contain 1 bright crimson bag, 5 dull olive bags, 5 light orange bags. -dull white bags contain 2 drab gold bags, 4 drab gray bags, 5 striped salmon bags. -plaid brown bags contain 3 striped tan bags, 5 dark bronze bags, 4 faded tomato bags. -striped salmon bags contain 5 muted purple bags, 5 pale tan bags, 2 shiny bronze bags. -faded tomato bags contain 4 striped crimson bags. -clear lime bags contain 1 light green bag, 5 drab red bags, 3 muted bronze bags. -posh chartreuse bags contain 1 muted lime bag, 1 dull orange bag, 2 dotted cyan bags. -drab maroon bags contain 4 muted aqua bags, 1 shiny beige bag. -shiny silver bags contain 2 pale red bags, 4 light magenta bags, 2 dark crimson bags. -wavy silver bags contain 4 vibrant brown bags, 5 wavy lime bags. -striped coral bags contain 3 pale white bags. -mirrored white bags contain 2 dark gold bags. -dotted silver bags contain 1 dark crimson bag, 5 dotted turquoise bags. -muted gray bags contain 2 mirrored crimson bags, 3 mirrored white bags. -striped tomato bags contain 3 muted maroon bags, 5 posh beige bags, 3 vibrant plum bags. -dim cyan bags contain 4 muted brown bags, 5 dim magenta bags, 3 bright cyan bags. -dark gray bags contain 5 faded blue bags, 3 light magenta bags. -mirrored crimson bags contain 1 dark chartreuse bag, 5 striped lime bags. -muted indigo bags contain 4 pale silver bags, 4 striped white bags, 5 pale white bags, 5 striped plum bags. -drab indigo bags contain 5 plaid black bags. -dotted fuchsia bags contain 4 striped orange bags, 5 dim chartreuse bags. -posh blue bags contain 4 dotted lime bags, 1 vibrant cyan bag. -dark lime bags contain 3 clear maroon bags, 3 wavy white bags, 2 striped brown bags, 1 faded brown bag. -clear coral bags contain 4 dim cyan bags. -striped violet bags contain 5 vibrant yellow bags, 2 dim yellow bags. -drab brown bags contain 5 dark chartreuse bags, 2 pale gold bags, 3 mirrored maroon bags, 3 faded brown bags. -bright bronze bags contain 2 shiny lavender bags. -mirrored chartreuse bags contain 4 dim silver bags. -clear red bags contain 2 posh crimson bags, 2 drab brown bags, 5 vibrant violet bags, 1 faded turquoise bag. -mirrored blue bags contain 2 dull yellow bags, 3 dark yellow bags. -posh teal bags contain 4 muted indigo bags. -dotted teal bags contain 4 striped tomato bags, 3 clear salmon bags. -dim lime bags contain 3 wavy indigo bags, 4 shiny purple bags. -pale lime bags contain 3 clear salmon bags, 2 faded magenta bags, 4 drab fuchsia bags. -wavy violet bags contain 2 bright purple bags. -plaid tan bags contain 3 shiny orange bags, 2 striped tomato bags, 1 vibrant gray bag. -striped turquoise bags contain 2 muted brown bags, 2 clear tan bags, 1 vibrant lime bag. -plaid chartreuse bags contain 3 mirrored indigo bags. -dull brown bags contain 1 shiny salmon bag, 1 dull black bag, 5 striped violet bags, 4 muted maroon bags. -clear fuchsia bags contain 1 mirrored lavender bag, 5 striped magenta bags, 5 faded crimson bags. -mirrored green bags contain 4 shiny purple bags. -muted maroon bags contain no other bags. -wavy turquoise bags contain 1 striped magenta bag. -posh green bags contain 2 dim tan bags, 2 striped black bags, 4 striped magenta bags, 2 striped teal bags. -plaid salmon bags contain 5 pale olive bags. -striped plum bags contain 5 shiny lavender bags. -muted purple bags contain 2 shiny lavender bags, 4 shiny beige bags, 2 pale lavender bags. -posh gray bags contain 5 dark maroon bags, 5 shiny gray bags, 1 wavy black bag, 3 faded purple bags. -pale silver bags contain 1 wavy violet bag, 2 dim tan bags, 1 shiny red bag. -bright red bags contain 5 dotted indigo bags, 1 pale silver bag. -drab black bags contain 4 posh tomato bags. -plaid olive bags contain 4 posh coral bags, 4 dotted aqua bags, 5 shiny fuchsia bags. -plaid magenta bags contain 5 clear turquoise bags, 3 muted turquoise bags. -shiny maroon bags contain 5 dull blue bags. -pale brown bags contain 1 pale orange bag, 5 dotted orange bags, 1 bright lavender bag, 2 dull gray bags. -plaid lavender bags contain 4 drab coral bags, 4 dark tomato bags, 3 striped bronze bags, 5 shiny brown bags. -striped silver bags contain 1 posh chartreuse bag, 5 drab violet bags, 1 wavy crimson bag, 3 muted beige bags. -striped lavender bags contain 4 striped magenta bags. -dim violet bags contain 3 dull gray bags. -dull purple bags contain 1 posh green bag, 1 muted olive bag, 4 faded crimson bags. -vibrant purple bags contain 3 vibrant yellow bags. -light plum bags contain 4 pale lavender bags, 2 mirrored olive bags, 3 mirrored tomato bags. -dark aqua bags contain 4 plaid lavender bags. -faded yellow bags contain 5 drab teal bags. -mirrored tomato bags contain 3 vibrant magenta bags, 4 dim tan bags, 1 bright indigo bag. -shiny plum bags contain 5 wavy beige bags. -pale aqua bags contain 5 pale gold bags, 5 pale red bags, 5 striped orange bags, 1 dull bronze bag. -plaid violet bags contain 1 muted purple bag, 5 plaid turquoise bags, 4 posh chartreuse bags. -dim gray bags contain 5 dull teal bags. -light purple bags contain 1 striped plum bag. -posh turquoise bags contain 3 plaid aqua bags, 5 vibrant purple bags. -muted coral bags contain 4 bright crimson bags, 4 dotted salmon bags, 2 pale purple bags, 2 clear magenta bags. -posh fuchsia bags contain 5 drab aqua bags, 2 bright bronze bags. -dim orange bags contain 5 bright gold bags. -muted bronze bags contain 2 pale olive bags. -dotted violet bags contain 2 drab plum bags, 3 bright yellow bags, 2 plaid lime bags, 2 dark salmon bags. -pale green bags contain 5 clear lavender bags, 3 mirrored olive bags. -dark tan bags contain 4 wavy bronze bags. -bright indigo bags contain 5 muted purple bags. -striped tan bags contain 4 plaid white bags. -mirrored black bags contain 4 bright blue bags, 5 dull yellow bags, 5 dark teal bags, 5 wavy purple bags. -drab salmon bags contain 3 posh indigo bags, 1 plaid crimson bag, 1 pale purple bag. -dull yellow bags contain 2 plaid violet bags, 1 plaid fuchsia bag, 3 dark chartreuse bags. -drab lavender bags contain 5 dark white bags, 4 light green bags. -faded salmon bags contain 2 mirrored lime bags. -plaid bronze bags contain 4 wavy green bags, 4 mirrored blue bags, 4 faded magenta bags, 5 plaid olive bags. -faded indigo bags contain 2 vibrant orange bags, 5 faded violet bags, 3 dim orange bags. -shiny crimson bags contain 5 pale olive bags. -plaid lime bags contain 3 dotted brown bags, 2 drab lime bags, 3 bright fuchsia bags, 1 dotted crimson bag. -dotted maroon bags contain 2 vibrant gray bags, 1 faded blue bag, 5 bright turquoise bags. -pale fuchsia bags contain 4 dull tan bags. -plaid plum bags contain 2 dotted lime bags, 5 light green bags, 4 bright tan bags, 4 dark beige bags. -muted fuchsia bags contain 1 striped fuchsia bag, 5 plaid crimson bags, 1 vibrant red bag. -dull green bags contain 4 faded maroon bags, 2 dull gold bags, 2 wavy teal bags, 3 vibrant gold bags. -pale salmon bags contain 2 posh beige bags, 5 faded olive bags, 5 vibrant beige bags, 3 dark gold bags. -muted plum bags contain 1 muted maroon bag. -wavy blue bags contain 3 dark maroon bags. -dull gold bags contain 1 dim white bag, 4 wavy teal bags, 4 muted blue bags. -dotted gray bags contain 4 pale salmon bags. -clear maroon bags contain 3 mirrored indigo bags, 4 wavy coral bags, 1 dim brown bag, 2 bright chartreuse bags. -drab chartreuse bags contain 2 dim purple bags, 2 dark chartreuse bags, 1 bright teal bag. -vibrant white bags contain 2 dull aqua bags, 5 light gold bags, 5 clear silver bags, 4 muted purple bags. -plaid black bags contain 5 posh orange bags, 2 plaid violet bags, 4 pale olive bags. -dark yellow bags contain 5 dotted magenta bags, 5 pale black bags, 1 striped orange bag. -bright teal bags contain 1 light chartreuse bag, 3 posh magenta bags, 2 posh violet bags. -wavy bronze bags contain 5 bright cyan bags, 4 dull indigo bags. -mirrored violet bags contain 1 bright beige bag. -dim olive bags contain no other bags. -striped crimson bags contain 1 pale orange bag, 5 dim white bags, 3 clear fuchsia bags. -bright orange bags contain 5 faded olive bags, 5 posh tomato bags. -bright lavender bags contain 4 posh yellow bags, 4 posh salmon bags, 4 dim tan bags. -plaid gold bags contain 5 wavy magenta bags, 5 dim orange bags, 2 faded tomato bags, 4 faded purple bags. -light violet bags contain 1 plaid aqua bag. diff --git a/7/part1.c b/7/part1.c deleted file mode 100644 index 7e04278..0000000 --- a/7/part1.c +++ /dev/null @@ -1,158 +0,0 @@ -#include -#include -#include -#include - -#define SEARCH_NAME "shiny gold" -#define MAX_NAMES 1024 -#define MAX_SIZE 600 -#define MAX_INNER_BAGS 4 - -struct Bag -{ - size_t inner_bags_size; - char *inner_bags[MAX_INNER_BAGS]; - char *bag_color; -}; - -char *insert_name(char **names, size_t *names_size, char *new_name) -{ - long long low = 0, high = *names_size; - while (low < high) { - int m = low + (high - low) / 2; - int c = strcmp(names[m], new_name); - if (c == 0) { - /* Name already exists, - return pointer to the already existsing string and free the new one. - */ - free(new_name); - return names[m]; - } - else if (c < 0) { - low = m + 1; - } - else { - high = m; - } - } - - for (long long i = *names_size - 1; i >= low; i--) { - names[i + 1] = names[i]; - } - - (*names_size)++; - return names[low] = new_name; -} - -void insert_name2(char **names, size_t *names_size, char *new_name) -{ - long long low = 0, high = *names_size; - while (low < high) { - int m = low + (high - low) / 2; - int c = strcmp(names[m], new_name); - if (c == 0) { - return; - } - else if (c < 0) { - low = m + 1; - } - else { - high = m; - } - } - - for (long long i = *names_size - 1; i >= low; i--) { - names[i + 1] = names[i]; - } - - (*names_size)++; - names[low] = new_name; - return; -} - -char *get_and_insert_name(char *bufstart, char *bufend, char **names, size_t *names_size) -{ - size_t bag_name_len = bufend - bufstart; - char *new_name = malloc((bag_name_len + 1) * sizeof(char)); - memcpy(new_name, bufstart, bag_name_len); - new_name[bag_name_len] = 0; // null terminate string - return insert_name(names, names_size, new_name); -} - -int bags_count(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[128] = { 0 }; - - struct Bag *bags = malloc(MAX_SIZE * sizeof(struct Bag)); - struct Bag *cur_bag = bags; - char **names = malloc(MAX_NAMES * sizeof(char *)); - - // Already add the name we're searching - char *search_name = names[0] = SEARCH_NAME; - size_t names_size = 1; - - while (fgets(buffer, 128, file)) { - char *end_bag_name = strstr(buffer, " bags"); - if (!end_bag_name) { - break; - } - - char* new_name = get_and_insert_name(buffer, end_bag_name, names, &names_size); - - cur_bag++; - cur_bag->bag_color = new_name; - if (strncmp(end_bag_name, " bags contain no", 16) == 0) { - cur_bag->inner_bags_size = 0; - continue; - } - - char *string_end = strchr(end_bag_name, '.'); - char *start_bag_name = end_bag_name + 16; - while ((end_bag_name = strstr(start_bag_name, " bag"))) { - new_name = get_and_insert_name(start_bag_name, end_bag_name, names, &names_size); - cur_bag->inner_bags[cur_bag->inner_bags_size++] = new_name; - start_bag_name = end_bag_name + (strncmp(end_bag_name, " bags", 5) ? 8 : 9); - if (start_bag_name > string_end) { - // We're outside the buffer, stop - break; - } - } - } - - fclose(file); - - char **outer_bags = malloc(MAX_SIZE * sizeof(char *)); - - // Start search with SEARCH_NAME - outer_bags[0] = search_name; - size_t outer_bags_size = 1; - - size_t old_size = 0; - while (old_size != outer_bags_size) { - old_size = outer_bags_size; - for (size_t i = 0; i < outer_bags_size; i++) { - struct Bag *p = bags; - while (p <= cur_bag) { - for (size_t j = 0; j < p->inner_bags_size; j++) { - if (p->inner_bags[j] == outer_bags[i]) { - insert_name2(outer_bags, &outer_bags_size, p->bag_color); - break; - } - } - - p++; - } - } - } - - // Don't count SEARCH_NAME - return outer_bags_size - 1; -} - -int main(int argc, char *argv[]) -{ - printf("%i\n", bags_count(argv[argc - 1])); -} diff --git a/7/part2.c b/7/part2.c deleted file mode 100644 index f4214f5..0000000 --- a/7/part2.c +++ /dev/null @@ -1,129 +0,0 @@ -#include -#include -#include -#include -#include - -#define SEARCH_NAME "shiny gold" -#define MAX_NAMES 1024 -#define MAX_SIZE 600 -#define MAX_INNER_BAGS 4 - -struct Bag -{ - size_t inner_bags_size; - char *inner_bags[MAX_INNER_BAGS]; - int inner_bags_count[MAX_INNER_BAGS]; - char *bag_color; -}; - -char *insert_name(char **names, size_t *names_size, char *new_name) -{ - long long low = 0, high = *names_size; - while (low < high) { - int m = low + (high - low) / 2; - int c = strcmp(names[m], new_name); - if (c == 0) { - /* Name already exists, - return pointer to the already existsing string and free the new one. - */ - free(new_name); - return names[m]; - } - else if (c < 0) { - low = m + 1; - } - else { - high = m; - } - } - - for (long long i = *names_size - 1; i >= low; i--) { - names[i + 1] = names[i]; - } - - (*names_size)++; - return names[low] = new_name; -} - -char *get_and_insert_name(char *bufstart, char *bufend, char **names, size_t *names_size) -{ - size_t bag_name_len = bufend - bufstart; - char *new_name = malloc((bag_name_len + 1) * sizeof(char)); - memcpy(new_name, bufstart, bag_name_len); - new_name[bag_name_len] = 0; // null terminate string - return insert_name(names, names_size, new_name); -} - -size_t get_num_bags(struct Bag *bags, size_t bags_size, char *bag_color) -{ - for (size_t i = 0; i < bags_size; i++) { - if (bags[i].bag_color == bag_color) { - struct Bag bag = bags[i]; - size_t total = 1; - for (size_t j = 0; j < bag.inner_bags_size; j++) { - total += get_num_bags(bags, bags_size, bag.inner_bags[j]) * bag.inner_bags_count[j]; - } - - return total; - } - } - - return 0; -} - -int bags_count(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[128] = { 0 }; - - struct Bag *bags = malloc(MAX_SIZE * sizeof(struct Bag)); - struct Bag *cur_bag = bags; - char **names = malloc(MAX_NAMES * sizeof(char *)); - - // Already add the name we're searching - char *search_name = names[0] = SEARCH_NAME; - size_t names_size = 1; - - while (fgets(buffer, 128, file)) { - char *end_bag_name = strstr(buffer, " bags"); - if (!end_bag_name) { - break; - } - - char* new_name = get_and_insert_name(buffer, end_bag_name, names, &names_size); - - cur_bag++; - cur_bag->bag_color = new_name; - if (strncmp(end_bag_name, " bags contain no", 16) == 0) { - cur_bag->inner_bags_size = 0; - continue; - } - - char *string_end = strchr(end_bag_name, '.'); - char *start_bag_name = end_bag_name + 14; - while ((end_bag_name = strstr(start_bag_name, " bag"))) { - int num_bags = atoi(start_bag_name); - start_bag_name += 2; - new_name = get_and_insert_name(start_bag_name, end_bag_name, names, &names_size); - cur_bag->inner_bags[cur_bag->inner_bags_size] = new_name; - cur_bag->inner_bags_count[cur_bag->inner_bags_size++] = num_bags; - start_bag_name = end_bag_name + (strncmp(end_bag_name, " bags", 5) ? 6 : 7); - if (start_bag_name > string_end) { - // We're outside the buffer, stop - break; - } - } - } - - fclose(file); - - return get_num_bags(bags, cur_bag - bags + 1, search_name) - 1; -} - -int main(int argc, char *argv[]) -{ - printf("%i\n", bags_count(argv[argc - 1])); -} diff --git a/8/input b/8/input deleted file mode 100644 index b97230b..0000000 --- a/8/input +++ /dev/null @@ -1,636 +0,0 @@ -acc -13 -jmp +37 -acc -19 -jmp +1 -jmp +1 -jmp +413 -acc +10 -jmp +194 -jmp +587 -jmp +388 -acc +48 -nop +284 -acc +35 -jmp +239 -acc +0 -jmp +58 -acc +22 -acc +45 -acc +25 -acc +23 -jmp +544 -jmp +610 -nop +273 -jmp +554 -jmp +584 -acc +30 -jmp +481 -acc +29 -jmp +342 -acc +9 -acc +23 -nop +377 -jmp +483 -acc +33 -jmp +128 -nop +560 -nop +437 -jmp +485 -acc +2 -acc +30 -jmp +456 -acc +0 -acc -15 -nop +126 -acc +47 -jmp +299 -acc +36 -acc +9 -jmp -21 -acc +10 -acc +26 -acc -3 -acc +31 -jmp +337 -nop +517 -jmp +303 -acc +20 -nop -43 -acc +30 -acc +24 -jmp +348 -jmp +158 -acc +23 -acc +16 -acc +40 -jmp +1 -jmp +465 -acc +12 -jmp +276 -acc +0 -acc +32 -acc +43 -jmp +487 -acc +40 -acc +49 -nop +540 -jmp +455 -acc +24 -jmp +481 -acc +30 -nop +256 -acc +29 -acc +14 -jmp +390 -jmp +1 -acc -3 -jmp +1 -jmp +295 -acc +6 -acc +46 -acc +16 -nop +128 -jmp -38 -acc +0 -acc +16 -acc +10 -jmp +185 -acc -19 -acc +0 -acc +23 -acc -16 -jmp +180 -acc +14 -jmp +1 -acc +31 -acc -4 -jmp +439 -jmp +204 -acc +50 -acc +12 -nop +154 -jmp +474 -acc -16 -jmp +511 -acc +6 -acc +32 -jmp +504 -acc +17 -acc +21 -acc -18 -jmp +298 -acc -17 -acc +16 -acc +4 -acc +18 -jmp +18 -acc -10 -acc +26 -acc +36 -jmp +166 -nop -109 -jmp +266 -acc -9 -jmp +306 -nop +324 -acc +16 -acc +33 -acc +18 -jmp -50 -acc +25 -jmp +196 -acc +21 -jmp +308 -jmp +38 -acc +27 -jmp -48 -acc +14 -acc +46 -acc +48 -acc +15 -jmp +223 -acc +0 -acc +12 -jmp -115 -acc +19 -acc +27 -acc +30 -jmp +377 -jmp -144 -jmp +231 -acc +1 -jmp +410 -acc +41 -jmp +138 -acc -13 -acc -8 -acc -7 -acc +25 -jmp +366 -acc +8 -jmp +182 -acc +2 -nop +104 -acc +24 -acc +21 -jmp -43 -acc -8 -acc +37 -acc +23 -jmp +292 -jmp +365 -acc +33 -nop -144 -acc -10 -jmp +387 -acc +13 -acc -6 -acc -12 -nop +134 -jmp +345 -acc +5 -acc +16 -acc +35 -acc +50 -jmp +250 -acc +46 -jmp +105 -acc -6 -nop -152 -jmp +233 -jmp -88 -acc +39 -jmp +59 -acc -4 -acc +47 -jmp +165 -acc +32 -acc +49 -acc +24 -jmp +344 -acc -5 -acc +3 -jmp +359 -acc +27 -jmp +72 -acc +0 -acc +16 -acc +40 -jmp +98 -acc +2 -acc +23 -acc +48 -acc +2 -jmp -33 -jmp -186 -acc +27 -nop -83 -acc +2 -acc +19 -jmp -141 -acc +39 -acc +34 -acc +33 -jmp +282 -jmp +306 -acc +12 -jmp +317 -acc +32 -acc +50 -acc +17 -jmp +52 -acc +3 -acc +35 -jmp +328 -acc +26 -nop +163 -acc +6 -acc +19 -jmp +154 -acc +4 -jmp +1 -jmp +373 -acc -12 -acc +47 -jmp +1 -jmp -234 -acc +45 -acc +46 -acc -14 -acc +50 -jmp -134 -acc +26 -jmp +128 -jmp +233 -acc +23 -nop -133 -jmp -154 -jmp +260 -acc +21 -acc +14 -nop -89 -acc +9 -jmp -113 -acc +10 -acc +5 -jmp +127 -acc -9 -acc +2 -jmp +286 -nop +274 -jmp +93 -acc +46 -acc +36 -jmp +53 -acc +30 -jmp -126 -acc +11 -acc +11 -acc +23 -jmp +296 -nop -100 -jmp +304 -jmp +219 -acc +16 -jmp -93 -acc +12 -jmp +1 -jmp +205 -acc +6 -acc -11 -jmp +202 -jmp +107 -jmp +1 -jmp -224 -acc +24 -acc +50 -acc +37 -jmp +45 -acc +25 -acc -15 -jmp -151 -jmp +1 -acc +47 -jmp -196 -jmp +1 -jmp +300 -jmp +116 -acc +39 -acc +0 -nop -176 -acc -7 -jmp -53 -acc +20 -nop -216 -nop +291 -jmp +38 -acc +0 -acc +32 -acc -19 -jmp -28 -jmp -176 -acc +33 -acc +11 -acc +47 -nop -58 -jmp -203 -acc +48 -acc +50 -acc +41 -jmp -315 -acc -12 -acc +23 -acc +32 -jmp +210 -acc +46 -acc -11 -acc -16 -jmp +103 -acc +25 -nop +95 -acc +9 -jmp -117 -nop +18 -acc -19 -acc +38 -jmp -130 -acc +22 -jmp +25 -nop +201 -nop +205 -acc +14 -jmp -124 -jmp -46 -acc +9 -jmp -257 -acc -19 -acc -17 -acc +36 -acc +24 -jmp -210 -jmp -231 -acc +40 -jmp +46 -nop -192 -acc -13 -acc +7 -acc +33 -jmp +103 -acc +18 -acc +37 -acc -14 -jmp -11 -acc +12 -nop -240 -acc +35 -acc +33 -jmp -274 -acc -9 -acc +24 -jmp -128 -nop -129 -acc -17 -jmp -62 -acc +0 -acc +42 -nop +116 -jmp -44 -acc +16 -jmp +179 -acc -8 -acc +8 -jmp -149 -acc +39 -acc +2 -acc +14 -acc +12 -jmp -373 -jmp +76 -jmp -232 -jmp -385 -acc +22 -acc +41 -acc +28 -jmp -179 -acc +0 -acc +22 -acc +15 -jmp -291 -acc -18 -jmp -222 -acc +45 -acc -15 -jmp +61 -acc +10 -acc +16 -acc +43 -jmp +177 -acc +43 -acc -12 -acc +20 -acc +27 -jmp -13 -acc -14 -jmp -336 -nop -158 -acc +3 -nop -409 -acc +17 -jmp -257 -acc +0 -nop +124 -jmp +1 -jmp +117 -jmp -179 -acc -17 -acc -2 -jmp +1 -jmp -37 -acc +42 -jmp +175 -acc -9 -acc +12 -acc +4 -jmp +69 -acc -7 -jmp +1 -acc +32 -jmp +54 -jmp -444 -acc +7 -jmp -87 -acc -6 -nop -323 -acc +47 -acc -5 -jmp -143 -jmp +1 -nop -44 -acc +27 -acc +21 -jmp -184 -jmp -404 -jmp -70 -acc +32 -jmp -13 -acc +0 -nop -452 -acc +1 -acc +31 -jmp -77 -jmp -401 -acc +42 -jmp -428 -nop -120 -acc -17 -nop -75 -acc +6 -jmp +20 -jmp -291 -acc +7 -jmp +37 -acc +10 -acc +15 -jmp +1 -acc +11 -jmp -363 -acc -14 -nop -321 -jmp -40 -acc +41 -acc +31 -jmp +58 -jmp -493 -acc +32 -acc -10 -acc +44 -jmp -211 -acc +47 -acc +23 -jmp -241 -jmp -224 -acc -1 -jmp -350 -acc +8 -jmp -280 -acc -19 -acc +0 -acc +17 -jmp -274 -acc +27 -acc +11 -jmp -82 -acc +48 -acc +27 -jmp -518 -acc +3 -jmp -124 -jmp +1 -jmp -490 -acc +41 -jmp -238 -acc -6 -jmp -386 -jmp -189 -acc -11 -jmp +80 -acc -8 -acc +9 -nop -99 -jmp +56 -acc -18 -jmp -83 -acc +28 -acc +13 -jmp -228 -acc +32 -acc +34 -acc +3 -jmp -272 -nop -410 -acc +13 -acc -17 -jmp -236 -acc +45 -acc +0 -acc +19 -nop +29 -jmp +38 -jmp -75 -acc +7 -acc +33 -acc +40 -jmp -180 -jmp -557 -acc +22 -jmp -249 -acc +44 -acc +45 -acc +2 -acc -19 -jmp -537 -acc +44 -acc +32 -acc -14 -acc +39 -jmp -406 -jmp -488 -acc +14 -acc +41 -jmp -327 -acc +17 -acc +25 -nop -573 -acc +0 -jmp -563 -acc +18 -nop -282 -acc +13 -acc +45 -jmp -325 -acc +41 -acc -10 -nop -47 -nop -223 -jmp -155 -acc +14 -acc +23 -jmp +23 -acc +21 -nop -229 -acc +27 -acc -5 -jmp -95 -acc +2 -acc -10 -nop -451 -jmp -393 -jmp -406 -acc +42 -acc +18 -acc +49 -jmp -307 -acc -11 -jmp +1 -jmp -424 -jmp -192 -acc +49 -acc -1 -acc -17 -jmp -355 -jmp -268 -nop -320 -acc +1 -jmp -134 -acc +46 -jmp -564 -acc +40 -acc +29 -acc +13 -nop -285 -jmp -272 -acc +19 -acc -14 -acc +25 -acc +18 -jmp +1 diff --git a/8/part1.c b/8/part1.c deleted file mode 100644 index d4261be..0000000 --- a/8/part1.c +++ /dev/null @@ -1,74 +0,0 @@ -#include -#include -#include - -#define INPUT_LEN 650 - -struct Operation -{ - char opcode; - int arg; - char has_been_executed; -}; - -int exe_program(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[16] = { 0 }; - - struct Operation ops[INPUT_LEN]; - size_t opcount = 0; - - while (fgets(buffer, 16, file)) { - struct Operation *op = &ops[opcount++]; - op->has_been_executed = 0; - switch (buffer[0]) - { - // nop - case 'n': - op->opcode = 0; - break; - // acc - case 'a': - op->opcode = 1; - break; - // jmp - case 'j': - op->opcode = 2; - break; - } - - op->arg = atoi(&buffer[4]); - } - - fclose(file); - - struct Operation *cur_op = ops; - int acc = 0; - while (!cur_op->has_been_executed) - { - cur_op->has_been_executed = 1; - switch (cur_op->opcode) - { - case 0: - cur_op++; - break; - case 1: - acc += cur_op->arg; - cur_op++; - break; - case 2: - cur_op += cur_op->arg; - break; - } - } - - return acc; -} - -int main(int argc, char *argv[]) -{ - printf("%i\n", exe_program(argv[argc - 1])); -} diff --git a/8/part2.c b/8/part2.c deleted file mode 100644 index 44ebdec..0000000 --- a/8/part2.c +++ /dev/null @@ -1,109 +0,0 @@ -#include -#include -#include - -#define INPUT_LEN 650 - -struct Operation -{ - char opcode; - int arg; - char has_been_executed; -}; - -int execute(struct Operation *ops, size_t opcount) -{ - struct Operation *cur_op = ops; - int acc = 0; - do { - if (cur_op->has_been_executed) { - return -1; - } - - cur_op->has_been_executed = 1; - switch (cur_op->opcode) - { - case 0: - cur_op++; - break; - case 1: - acc += cur_op->arg; - cur_op++; - break; - case 2: - cur_op += cur_op->arg; - break; - } - } while (cur_op < ops + opcount); - - return acc; -} - -int exe_program(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[16] = { 0 }; - - struct Operation ops[INPUT_LEN]; - size_t opcount = 0; - - while (fgets(buffer, 16, file)) { - struct Operation *op = &ops[opcount++]; - op->has_been_executed = 0; - switch (buffer[0]) - { - // nop - case 'n': - op->opcode = 0; - break; - // acc - case 'a': - op->opcode = 1; - break; - // jmp - case 'j': - op->opcode = 2; - break; - } - - op->arg = atoi(&buffer[4]); - } - - fclose(file); - - struct Operation *cur_op = ops; - int flip_previous = 0; - do { - if (flip_previous) { - (cur_op - 1)->opcode ^= 2; - flip_previous = 0; - } - - if (cur_op->opcode == 1 - || (cur_op->opcode == 0 && cur_op->arg <= 0) - || (cur_op->opcode == 2 && cur_op->arg >= 0)) { - continue; - } - - cur_op->opcode ^= 2; - flip_previous = 1; - - for (size_t i = 0; i < opcount; i++) { - ops[i].has_been_executed = 0; - } - - int acc = execute(ops, opcount); - if (acc != -1) { - return acc; - } - } while (++cur_op < ops + opcount); - - return -1; -} - -int main(int argc, char *argv[]) -{ - printf("%i\n", exe_program(argv[argc - 1])); -} diff --git a/9/input b/9/input deleted file mode 100644 index 36bdf9b..0000000 --- a/9/input +++ /dev/null @@ -1,1000 +0,0 @@ -44 -17 -23 -42 -25 -26 -6 -45 -30 -8 -15 -39 -28 -16 -20 -50 -14 -47 -27 -7 -13 -46 -34 -24 -32 -19 -21 -31 -22 -23 -33 -41 -92 -29 -30 -70 -45 -26 -35 -28 -48 -50 -20 -36 -27 -37 -53 -42 -49 -39 -44 -43 -61 -51 -68 -46 -73 -138 -47 -56 -69 -63 -55 -57 -96 -64 -59 -79 -66 -108 -76 -106 -95 -88 -82 -119 -97 -192 -93 -103 -137 -135 -102 -104 -111 -112 -150 -123 -116 -125 -130 -249 -268 -142 -356 -191 -196 -181 -227 -288 -303 -190 -329 -213 -205 -206 -215 -498 -216 -313 -228 -239 -241 -255 -272 -311 -347 -441 -323 -371 -377 -403 -386 -396 -420 -395 -480 -488 -418 -411 -617 -455 -444 -467 -483 -469 -494 -636 -527 -694 -634 -724 -700 -947 -1641 -763 -781 -782 -898 -806 -1035 -829 -855 -2422 -880 -899 -911 -1021 -1547 -963 -996 -1130 -1221 -1630 -1328 -1334 -1424 -1463 -1544 -1545 -1563 -1587 -2399 -1704 -1635 -2304 -4126 -1735 -1779 -1932 -1810 -1959 -5671 -2093 -3723 -3150 -2351 -2878 -2662 -3990 -2758 -2887 -3279 -3323 -3108 -3198 -5507 -3370 -3663 -5986 -9633 -3514 -6083 -3589 -3742 -3769 -4052 -4444 -4851 -5013 -5109 -6401 -6649 -5420 -5645 -11662 -6967 -6477 -8755 -6306 -10135 -6884 -7566 -7103 -7256 -7283 -8527 -7331 -11411 -12010 -9864 -10271 -9295 -12365 -10122 -17418 -11065 -13580 -18765 -11951 -12783 -24793 -21246 -32124 -13190 -26021 -16861 -16551 -14359 -15783 -15810 -16626 -17195 -27194 -25973 -19159 -19417 -20360 -25141 -21187 -30131 -30441 -24734 -26310 -27142 -41988 -32334 -29741 -35227 -27549 -31554 -32978 -30142 -49586 -31593 -34969 -33821 -43168 -38576 -39519 -40604 -39777 -49875 -45921 -47497 -72231 -51044 -51876 -53452 -54691 -57290 -57691 -59103 -66799 -89660 -61696 -67947 -61735 -65414 -66562 -68790 -72397 -78095 -80381 -87016 -85698 -97372 -97797 -93418 -98541 -110979 -108735 -120666 -108143 -133361 -114981 -116794 -164359 -123431 -127110 -226779 -146885 -127149 -131976 -135352 -141187 -150492 -224937 -297720 -197995 -179116 -195169 -201561 -214084 -206684 -231775 -216878 -228809 -258635 -243943 -456630 -240225 -262462 -282468 -254259 -385800 -259125 -352086 -267328 -276539 -393200 -329608 -374285 -377111 -380677 -588733 -453804 -486034 -423562 -435493 -652371 -445687 -609486 -484168 -494484 -779000 -981979 -513384 -521587 -644439 -526453 -535664 -628625 -713015 -606147 -1150212 -1322501 -1508432 -869249 -804239 -1226399 -859055 -881180 -907730 -948877 -1138923 -1224687 -1503494 -978652 -1057251 -1142009 -1239468 -1407633 -1048040 -1484541 -1164289 -1432864 -1792914 -2556472 -2464510 -1750429 -1753116 -1673488 -1685419 -1830057 -1740235 -1766785 -1788910 -1996917 -1927529 -2026692 -3074732 -2911127 -2212329 -3236385 -2190049 -2840954 -2597153 -2480904 -2957203 -3118283 -3106352 -4337388 -3358907 -3413723 -3440273 -3618967 -3425654 -3452204 -3924446 -5103269 -3978959 -3716439 -5642253 -4787202 -4216741 -5264781 -6429070 -5833538 -4670953 -5031003 -9358692 -10620740 -6465259 -6063555 -6224635 -8766161 -13553363 -7032690 -6853996 -9858994 -6877858 -7350100 -17005567 -7640885 -7695398 -7933180 -11649619 -10429455 -10295784 -19979432 -9701956 -10504491 -10734508 -12063693 -11255638 -12288190 -13731854 -12528814 -30558930 -41293438 -18917689 -13886686 -13910548 -14204096 -14227958 -14518743 -21945403 -15336283 -17342841 -18951036 -17635136 -19997740 -20131411 -20206447 -20436464 -22792681 -32494637 -21990146 -23319331 -23784452 -26492286 -33469779 -35900694 -28090782 -28432054 -27797234 -28114644 -28138506 -28722839 -28746701 -29855026 -57652260 -26134589 -46065680 -37841583 -37632876 -40204187 -40337858 -52931101 -45309477 -44782827 -45774598 -47103783 -49453920 -49919041 -52626875 -53931823 -54225371 -54273095 -69060697 -54249233 -56837483 -74032316 -54857428 -83616181 -70917416 -63767465 -83151060 -83407474 -75474459 -77837063 -95195286 -104192136 -107180334 -90092304 -187599610 -99706421 -103941266 -99372961 -102545916 -106558698 -108157194 -294779944 -128305411 -180591014 -109106661 -120604948 -186162097 -118624893 -139241924 -134684881 -208479622 -319832938 -161244537 -229711609 -173032349 -185287590 -227678372 -196651002 -189465265 -315275895 -199079382 -201918877 -228762142 -288748208 -316636816 -217263855 -239229841 -243791542 -227731554 -248348585 -259846872 -320543770 -455409926 -397944887 -400998259 -703758511 -334276886 -346532127 -425413144 -388544647 -441148718 -386116267 -391384142 -523742151 -416343237 -438309223 -446025997 -1149784508 -466961395 -444995409 -456493696 -635175684 -548275324 -476080139 -508195457 -580390642 -775425604 -813957791 -680809013 -1021539360 -1566127745 -720393153 -735076774 -774660914 -779928789 -777500409 -836379551 -1259983788 -883304632 -1588618705 -1554589703 -891021406 -943041534 -901489105 -964689153 -984275596 -1440769292 -1253580548 -1228588610 -1088586099 -1261199655 -1494766804 -1517188564 -1681417894 -1455469927 -1495054067 -1497893562 -1927317130 -1552161323 -1742189562 -2458918303 -2204241189 -1774326038 -1784793737 -2817207315 -1792510511 -1834062940 -1844530639 -3534700073 -2684058537 -2726482172 -3457821737 -2317174709 -3269092842 -3423607456 -2716669582 -3608388978 -3259378126 -2950523994 -2953363489 -6992521810 -3815068271 -3294350885 -3577304248 -10261614652 -5421834887 -4048771828 -5442451918 -3618856677 -5882834768 -3626573451 -4797894128 -5586267551 -5774996446 -5267698703 -5033844291 -5270538198 -7863840099 -5667193576 -5670033071 -8529916324 -5903887483 -6579936940 -9288889748 -8375198376 -6871655133 -7196160925 -6913207562 -7203877699 -7245430128 -7667628505 -7675345279 -11256300622 -8416750805 -8897111649 -14539283638 -9831738419 -10304382489 -10301542994 -22914482014 -10701037867 -18452461547 -11337226647 -13334822081 -15401571457 -16791949181 -22623711829 -13451592073 -14067816058 -19198654643 -13784862695 -14871506204 -14117085261 -19004855152 -14920775407 -21460207974 -16092096084 -25240321505 -23753135067 -24703244623 -20532776286 -24768853925 -21641609136 -21002580861 -22038264514 -24035859948 -35874087065 -28988591465 -27119684776 -27236454768 -27519408131 -27568677334 -27852678753 -44568636234 -28656368899 -59909947013 -29037860668 -30209181345 -33925630559 -31012871491 -40795340707 -36624872370 -61045315335 -55089133521 -41535357147 -51850790481 -43679873650 -42644189997 -50040441529 -46074124462 -51155544724 -54688362110 -56507999596 -54639092907 -54755862899 -55088085465 -55421356087 -56509047652 -64134811904 -57694229567 -59247042013 -61222052836 -66834053715 -64938502050 -105129575050 -115861145743 -78160229517 -84179547144 -85215230797 -88718314459 -86324063647 -105461797616 -100338419564 -96114565991 -100713217369 -105794637631 -111930403739 -109394955806 -113115585654 -109843948364 -110509441552 -206175014985 -114203277219 -171066001200 -116941271580 -120469094849 -128056106551 -183775325295 -151262565697 -180294113135 -222510541460 -200648718198 -173933545256 -171539294444 -175042378106 -220807514413 -196452985555 -196827783360 -201909203622 -206507855000 -215189593437 -221325359545 -230056857234 -300763207984 -220353389916 -244997378131 -231144548799 -265465842916 -237410366429 -248525201400 -375691096304 -364069438430 -325196110953 -485935567829 -345472839700 -346581672550 -348975923362 -482407744560 -371870161466 -539111816536 -403335638360 -620395362866 -398736986982 -423234563167 -451497938715 -496610391715 -478582058634 -450410247150 -468554915228 -457763756345 -648333016491 -687820613579 -723345934258 -562606477382 -573721312353 -670668950653 -671777783503 -674172034315 -692054512250 -694448763062 -770607148448 -1036796536941 -775205799826 -795104724633 -1007666731764 -1446983583329 -1183001840248 -919844954882 -928992305784 -901908185865 -947136973862 -2111994146032 -1024131559503 -1576080220180 -1340387528741 -1136327789735 -1415400446508 -1345949817818 -1233275428035 -1244390263006 -1386503275312 -1363832295753 -1681838766079 -1462661660698 -1465055911510 -1545812948274 -2315495581096 -1570310524459 -1697012910498 -1821753140747 -2102846795130 -1830900491649 -3730896027604 -1849045159727 -1926039745368 -2706638314194 -2160459349238 -2257406987538 -2369603217770 -2380718052741 -2477665691041 -2579225245853 -2590340080824 -2779088376309 -4044281157363 -2750335571065 -4106452147265 -2927717572208 -3008474608972 -3546058070225 -3803219935812 -3924599935877 -3267323434957 -4505264991221 -3652653632396 -3679945651376 -3756940237017 -4555683473921 -6631238250071 -5915661287995 -4417866336776 -4530062567008 -4627010205308 -5378077826742 -4858383743782 -5056890936894 -5169565326677 -5529423947374 -9840261223872 -5758810180037 -6195041007165 -7332599283772 -10822051212473 -6275798043929 -6947269086333 -7409593869413 -7191923370834 -10459246805791 -10586314884268 -7436885888393 -8097811988152 -8973549810697 -14524522654606 -8947928903784 -9044876542084 -9276250080558 -9157072772316 -9485393949090 -11805652830115 -9915274680676 -10226456263571 -10928375506714 -16410435699090 -11953851187202 -12034608223966 -14139192457167 -13223067130262 -15432870816245 -13467721414763 -18981877310299 -14601517240247 -14628809259227 -15534697876545 -16384814792177 -16481762430477 -18130622583013 -17921478714481 -22512597956847 -17992805445868 -27467479040211 -18433322852874 -19383529035887 -19400668629766 -22962983730680 -22882226693916 -21154831770285 -23988459411168 -25176918317464 -27362259587429 -25257675354228 -27824584370509 -29002419291308 -35980319371610 -28069238655010 -29230326499474 -35756349010532 -35914284160349 -35865291466364 -34474567876345 -34403241144958 -41913266586613 -61870720185169 -37833991482640 -48613855535361 -37816851888761 -58988823252925 -63825587665542 -40555500400051 -50157251061593 -44037058464201 -46412507124513 -52057698066178 -50434593671692 -52619934941657 -53082259724737 -55893823025519 -72237232627598 -57299565154484 -63633567644432 -76420791866415 -71621640476896 -68877809021303 -70268532611322 -72220093033719 -79730118475374 -75650843371401 -84246498607153 -78372352288812 -81853910352962 -90712751461644 -84592558864252 -121497743962960 -86968007524564 -90449565588714 -94471652135893 -96847100796205 -102492291737870 -103054528613349 diff --git a/9/part1.c b/9/part1.c deleted file mode 100644 index d17fb2b..0000000 --- a/9/part1.c +++ /dev/null @@ -1,54 +0,0 @@ -#include -#include -#include -#include - -#define INPUT_LEN 1000 -#define SEARCH_LEN 25 - -bool has_sum(uint64_t *cur_num) -{ - uint64_t search = *cur_num; - uint64_t *p1 = cur_num - SEARCH_LEN; - do { - uint64_t *p2 = cur_num - SEARCH_LEN; - do { - if (*p1 + *p2 == search) { - return true; - } - } while (++p2 < cur_num); - } while (++p1 < cur_num); - - return false; -} - -int exe_program(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[24] = { 0 }; - - uint64_t nums[INPUT_LEN]; - size_t num_size = 0; - - while (fgets(buffer, 24, file)) { - nums[num_size++] = strtoull(buffer, NULL, 10); - } - - fclose(file); - - uint64_t *cur_num = nums + SEARCH_LEN; - do { - if (!has_sum(cur_num)) { - return *cur_num; - } - } while (++cur_num < nums + num_size); - - return -1; -} - -int main(int argc, char *argv[]) -{ - printf("%i\n", exe_program(argv[argc - 1])); -} diff --git a/9/part1.f90 b/9/part1.f90 deleted file mode 100644 index a89ee41..0000000 --- a/9/part1.f90 +++ /dev/null @@ -1,45 +0,0 @@ -integer function has_sum(arg, arr) - implicit none - - integer, parameter :: arr_len = 25 - - integer (kind=8) :: arg - integer (kind=8), dimension(25) :: arr - integer :: i, j - - do i = 1, arr_len - do j = 1, arr_len - if (arr(i) + arr(j) == arg) then - has_sum = 1 - return - end if - end do - end do - - has_sum = 0 - return -end function has_sum - -program day9 - implicit none - - integer, parameter :: input_len = 1000 - - integer :: has_sum, i, tmp - integer (kind=8), dimension(input_len) :: input - - open(10, file='input', status='old') - do i = 1, input_len - read(10, *) input(i) - end do - close(10) - - do i = 26, input_len - tmp = has_sum(input(i), input(i - 25)) - if (tmp == 0) then - print *, input(i) - stop - end if - end do - -end program day9 diff --git a/9/part2.c b/9/part2.c deleted file mode 100644 index 28c335e..0000000 --- a/9/part2.c +++ /dev/null @@ -1,78 +0,0 @@ -#include -#include -#include -#include - -#define INPUT_LEN 1000 -#define SEARCH_LEN 25 - -bool has_sum(uint64_t *cur_num) -{ - uint64_t search = *cur_num; - uint64_t *p1 = cur_num - SEARCH_LEN; - do { - uint64_t *p2 = cur_num - SEARCH_LEN; - do { - if (*p1 + *p2 == search) { - return true; - } - } while (++p2 < cur_num); - } while (++p1 < cur_num); - - return false; -} - -int exe_program(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[24] = { 0 }; - - uint64_t nums[INPUT_LEN] = { 0 }; - size_t num_size = 0; - - while (fgets(buffer, 24, file)) { - nums[num_size++] = strtoull(buffer, NULL, 10); - } - - fclose(file); - - uint64_t *cur_num = nums + SEARCH_LEN; - uint64_t search = -1; - do { - if (!has_sum(cur_num)) { - search = *cur_num; - break; - } - } while (++cur_num < nums + num_size); - - cur_num = nums; - do { - uint64_t min = __UINT64_MAX__; - uint64_t max = 0; - uint64_t sum = 0; - uint64_t *p1 = cur_num; - do { - if (*p1 < min) { - min = *p1; - } - else if (*p1 > max) { - max = *p1; - } - - sum += *p1; - - if (sum == search) { - return min + max; - } - } while (++p1 < nums + num_size); - } while (++cur_num < nums + num_size); - - return -1; -} - -int main(int argc, char *argv[]) -{ - printf("%i\n", exe_program(argv[argc - 1])); -} diff --git a/9/part2.f90 b/9/part2.f90 deleted file mode 100644 index b7e65de..0000000 --- a/9/part2.f90 +++ /dev/null @@ -1,60 +0,0 @@ -integer function has_sum(arg, arr) - implicit none - - integer, parameter :: arr_len = 25 - - integer (kind=8) :: arg - integer (kind=8), dimension(25) :: arr - integer :: i, j - - do i = 1, arr_len - do j = 1, arr_len - if (arr(i) + arr(j) == arg) then - has_sum = 1 - return - end if - end do - end do - - has_sum = 0 - return -end function has_sum - -program day9 - implicit none - - integer, parameter :: input_len = 1000 - - integer :: has_sum, i, j, tmp - integer (kind=8), dimension(input_len) :: input - integer (kind=8) :: search = -1, sum - - open(10, file='input', status='old') - do i = 1, input_len - read(10, *) input(i) - end do - close(10) - - do i = 26, input_len - tmp = has_sum(input(i), input(i - 25)) - if (tmp == 0) then - search = input(i) - exit - end if - end do - - do i = 1, input_len - sum = 0 - do j = i, input_len - sum = sum + input(j) - if (sum >= search) then - exit - end if - end do - if (sum == search) then - print *, minval(input(i:j)) + maxval(input(i:j)) - stop - end if - end do - -end program day9 diff --git a/9/part2_fast.c b/9/part2_fast.c deleted file mode 100644 index cf06bbd..0000000 --- a/9/part2_fast.c +++ /dev/null @@ -1,98 +0,0 @@ -#include -#include -#include -#include - -#define INPUT_LEN 1000 -#define SEARCH_LEN 25 - -uint64_t min_uint64(const uint64_t *start, const uint64_t *stop) -{ - uint64_t min = *start; - while (++start <= stop) { - if (*start < min) { - min = *start; - } - } - - return min; -} - -uint64_t max_uint64(const uint64_t *start, const uint64_t *stop) -{ - uint64_t max = *start; - while (++start <= stop) { - if (*start > max) { - max = *start; - } - } - - return max; -} - -bool has_sum(uint64_t *cur_num) -{ - uint64_t search = *cur_num; - uint64_t *p1 = cur_num - SEARCH_LEN; - do { - if (*p1 >= search) - { - continue; - } - - uint64_t *p2 = cur_num - SEARCH_LEN; - do { - if (*p1 + *p2 == search) { - return true; - } - } while (++p2 < cur_num); - } while (++p1 < cur_num); - - return false; -} - -int exe_program(const char *filename) -{ - FILE *file = fopen(filename, "r"); - - // Include space for newline and string terminator - char buffer[24] = { 0 }; - - uint64_t nums[INPUT_LEN] = { 0 }; - size_t num_size = 0; - - while (fgets(buffer, 24, file)) { - nums[num_size++] = strtoull(buffer, NULL, 10); - } - - fclose(file); - - uint64_t *cur_num = nums + SEARCH_LEN; - uint64_t search = -1; - do { - if (!has_sum(cur_num)) { - search = *cur_num; - break; - } - } while (++cur_num < nums + num_size); - - cur_num = nums; - do { - uint64_t sum = 0; - uint64_t *p1 = cur_num; - do { - sum += *p1; - } while (++p1 < nums + num_size && sum < search); - - if (sum == search) { - return min_uint64(cur_num, p1) + max_uint64(cur_num, p1); - } - } while (++cur_num < nums + num_size); - - return -1; -} - -int main(int argc, char *argv[]) -{ - printf("%i\n", exe_program(argv[argc - 1])); -} diff --git a/prepare b/prepare index 1702aa0..a3cd635 100755 --- a/prepare +++ b/prepare @@ -1,9 +1,7 @@ -#!/usr/bin/env bash +#!/bin/sh -cd ${1#0} -file="part$2.c" -if test -f "part$2_fast.c" -then - file="part$2_fast.c" -fi -clang -Wall -pedantic -O3 -march=native -mtune=native -flto -s -static -o ../run "part$2.c" +set -ef + +cd 2022 +./prepare "$1" "$2" +cp run ../run diff --git a/utils.h b/utils.h deleted file mode 100644 index 840d1d4..0000000 --- a/utils.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef AOC_UTILS_H -#define AOC_UTILS_H - -#define SWAP(a, b) (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))) - -#define likely(x) __builtin_expect((x), 1) -#define unlikely(x) __builtin_expect((x), 0) - -#endif diff --git a/utils/unistd.asm b/utils/unistd.asm new file mode 100644 index 0000000..4f13c45 --- /dev/null +++ b/utils/unistd.asm @@ -0,0 +1,382 @@ +%ifndef _ASM_UNISTD +%define _ASM_UNISTD + +%define F_OK 0 +%define X_OK 1 +%define W_OK 2 +%define R_OK 4 + +%define PROT_NONE 0x0 +%define PROT_READ 0x1 +%define PROT_WRITE 0x2 +%define PROT_EXEC 0x4 +%define PROT_SEM 0x8 +%define PROT_GROWSDOWN 0x01000000 +%define PROT_GROWSUP 0x02000000 + +%define MAP_SHARED 0x01 +%define MAP_PRIVATE 0x02 +%define MAP_SHARED_VALIDATE 0x03 + +%define SYS_read 0 +%define SYS_write 1 +%define SYS_open 2 +%define SYS_close 3 +%define SYS_stat 4 +%define SYS_fstat 5 +%define SYS_lstat 6 +%define SYS_poll 7 +%define SYS_lseek 8 +%define SYS_mmap 9 +%define SYS_mprotect 10 +%define SYS_munmap 11 +%define SYS_brk 12 +%define SYS_rt_sigaction 13 +%define SYS_rt_sigprocmask 14 +%define SYS_rt_sigreturn 15 +%define SYS_ioctl 16 +%define SYS_pread64 17 +%define SYS_pwrite64 18 +%define SYS_readv 19 +%define SYS_writev 20 +%define SYS_access 21 +%define SYS_pipe 22 +%define SYS_select 23 +%define SYS_sched_yield 24 +%define SYS_mremap 25 +%define SYS_msync 26 +%define SYS_mincore 27 +%define SYS_madvise 28 +%define SYS_shmget 29 +%define SYS_shmat 30 +%define SYS_shmctl 31 +%define SYS_dup 32 +%define SYS_dup2 33 +%define SYS_pause 34 +%define SYS_nanosleep 35 +%define SYS_getitimer 36 +%define SYS_alarm 37 +%define SYS_setitimer 38 +%define SYS_getpid 39 +%define SYS_sendfile 40 +%define SYS_socket 41 +%define SYS_connect 42 +%define SYS_accept 43 +%define SYS_sendto 44 +%define SYS_recvfrom 45 +%define SYS_sendmsg 46 +%define SYS_recvmsg 47 +%define SYS_shutdown 48 +%define SYS_bind 49 +%define SYS_listen 50 +%define SYS_getsockname 51 +%define SYS_getpeername 52 +%define SYS_socketpair 53 +%define SYS_setsockopt 54 +%define SYS_getsockopt 55 +%define SYS_clone 56 +%define SYS_fork 57 +%define SYS_vfork 58 +%define SYS_execve 59 +%define SYS_exit 60 +%define SYS_wait4 61 +%define SYS_kill 62 +%define SYS_uname 63 +%define SYS_semget 64 +%define SYS_semop 65 +%define SYS_semctl 66 +%define SYS_shmdt 67 +%define SYS_msgget 68 +%define SYS_msgsnd 69 +%define SYS_msgrcv 70 +%define SYS_msgctl 71 +%define SYS_fcntl 72 +%define SYS_flock 73 +%define SYS_fsync 74 +%define SYS_fdatasync 75 +%define SYS_truncate 76 +%define SYS_ftruncate 77 +%define SYS_getdents 78 +%define SYS_getcwd 79 +%define SYS_chdir 80 +%define SYS_fchdir 81 +%define SYS_rename 82 +%define SYS_mkdir 83 +%define SYS_rmdir 84 +%define SYS_creat 85 +%define SYS_link 86 +%define SYS_unlink 87 +%define SYS_symlink 88 +%define SYS_readlink 89 +%define SYS_chmod 90 +%define SYS_fchmod 91 +%define SYS_chown 92 +%define SYS_fchown 93 +%define SYS_lchown 94 +%define SYS_umask 95 +%define SYS_gettimeofday 96 +%define SYS_getrlimit 97 +%define SYS_getrusage 98 +%define SYS_sysinfo 99 +%define SYS_times 100 +%define SYS_ptrace 101 +%define SYS_getuid 102 +%define SYS_syslog 103 +%define SYS_getgid 104 +%define SYS_setuid 105 +%define SYS_setgid 106 +%define SYS_geteuid 107 +%define SYS_getegid 108 +%define SYS_setpgid 109 +%define SYS_getppid 110 +%define SYS_getpgrp 111 +%define SYS_setsid 112 +%define SYS_setreuid 113 +%define SYS_setregid 114 +%define SYS_getgroups 115 +%define SYS_setgroups 116 +%define SYS_setresuid 117 +%define SYS_getresuid 118 +%define SYS_setresgid 119 +%define SYS_getresgid 120 +%define SYS_getpgid 121 +%define SYS_setfsuid 122 +%define SYS_setfsgid 123 +%define SYS_getsid 124 +%define SYS_capget 125 +%define SYS_capset 126 +%define SYS_rt_sigpending 127 +%define SYS_rt_sigtimedwait 128 +%define SYS_rt_sigqueueinfo 129 +%define SYS_rt_sigsuspend 130 +%define SYS_sigaltstack 131 +%define SYS_utime 132 +%define SYS_mknod 133 +%define SYS_uselib 134 +%define SYS_personality 135 +%define SYS_ustat 136 +%define SYS_statfs 137 +%define SYS_fstatfs 138 +%define SYS_sysfs 139 +%define SYS_getpriority 140 +%define SYS_setpriority 141 +%define SYS_sched_setparam 142 +%define SYS_sched_getparam 143 +%define SYS_sched_setscheduler 144 +%define SYS_sched_getscheduler 145 +%define SYS_sched_get_priority_max 146 +%define SYS_sched_get_priority_min 147 +%define SYS_sched_rr_get_interval 148 +%define SYS_mlock 149 +%define SYS_munlock 150 +%define SYS_mlockall 151 +%define SYS_munlockall 152 +%define SYS_vhangup 153 +%define SYS_modify_ldt 154 +%define SYS_pivot_root 155 +%define SYS__sysctl 156 +%define SYS_prctl 157 +%define SYS_arch_prctl 158 +%define SYS_adjtimex 159 +%define SYS_setrlimit 160 +%define SYS_chroot 161 +%define SYS_sync 162 +%define SYS_acct 163 +%define SYS_settimeofday 164 +%define SYS_mount 165 +%define SYS_umount2 166 +%define SYS_swapon 167 +%define SYS_swapoff 168 +%define SYS_reboot 169 +%define SYS_sethostname 170 +%define SYS_setdomainname 171 +%define SYS_iopl 172 +%define SYS_ioperm 173 +%define SYS_create_module 174 +%define SYS_init_module 175 +%define SYS_delete_module 176 +%define SYS_get_kernel_syms 177 +%define SYS_query_module 178 +%define SYS_quotactl 179 +%define SYS_nfsservctl 180 +%define SYS_getpmsg 181 +%define SYS_putpmsg 182 +%define SYS_afs_syscall 183 +%define SYS_tuxcall 184 +%define SYS_security 185 +%define SYS_gettid 186 +%define SYS_readahead 187 +%define SYS_setxattr 188 +%define SYS_lsetxattr 189 +%define SYS_fsetxattr 190 +%define SYS_getxattr 191 +%define SYS_lgetxattr 192 +%define SYS_fgetxattr 193 +%define SYS_listxattr 194 +%define SYS_llistxattr 195 +%define SYS_flistxattr 196 +%define SYS_removexattr 197 +%define SYS_lremovexattr 198 +%define SYS_fremovexattr 199 +%define SYS_tkill 200 +%define SYS_time 201 +%define SYS_futex 202 +%define SYS_sched_setaffinity 203 +%define SYS_sched_getaffinity 204 +%define SYS_set_thread_area 205 +%define SYS_io_setup 206 +%define SYS_io_destroy 207 +%define SYS_io_getevents 208 +%define SYS_io_submit 209 +%define SYS_io_cancel 210 +%define SYS_get_thread_area 211 +%define SYS_lookup_dcookie 212 +%define SYS_epoll_create 213 +%define SYS_epoll_ctl_old 214 +%define SYS_epoll_wait_old 215 +%define SYS_remap_file_pages 216 +%define SYS_getdents64 217 +%define SYS_set_tid_address 218 +%define SYS_restart_syscall 219 +%define SYS_semtimedop 220 +%define SYS_fadvise64 221 +%define SYS_timer_create 222 +%define SYS_timer_settime 223 +%define SYS_timer_gettime 224 +%define SYS_timer_getoverrun 225 +%define SYS_timer_delete 226 +%define SYS_clock_settime 227 +%define SYS_clock_gettime 228 +%define SYS_clock_getres 229 +%define SYS_clock_nanosleep 230 +%define SYS_exit_group 231 +%define SYS_epoll_wait 232 +%define SYS_epoll_ctl 233 +%define SYS_tgkill 234 +%define SYS_utimes 235 +%define SYS_vserver 236 +%define SYS_mbind 237 +%define SYS_set_mempolicy 238 +%define SYS_get_mempolicy 239 +%define SYS_mq_open 240 +%define SYS_mq_unlink 241 +%define SYS_mq_timedsend 242 +%define SYS_mq_timedreceive 243 +%define SYS_mq_notify 244 +%define SYS_mq_getsetattr 245 +%define SYS_kexec_load 246 +%define SYS_waitid 247 +%define SYS_add_key 248 +%define SYS_request_key 249 +%define SYS_keyctl 250 +%define SYS_ioprio_set 251 +%define SYS_ioprio_get 252 +%define SYS_inotify_init 253 +%define SYS_inotify_add_watch 254 +%define SYS_inotify_rm_watch 255 +%define SYS_migrate_pages 256 +%define SYS_openat 257 +%define SYS_mkdirat 258 +%define SYS_mknodat 259 +%define SYS_fchownat 260 +%define SYS_futimesat 261 +%define SYS_newfstatat 262 +%define SYS_unlinkat 263 +%define SYS_renameat 264 +%define SYS_linkat 265 +%define SYS_symlinkat 266 +%define SYS_readlinkat 267 +%define SYS_fchmodat 268 +%define SYS_faccessat 269 +%define SYS_pselect6 270 +%define SYS_ppoll 271 +%define SYS_unshare 272 +%define SYS_set_robust_list 273 +%define SYS_get_robust_list 274 +%define SYS_splice 275 +%define SYS_tee 276 +%define SYS_sync_file_range 277 +%define SYS_vmsplice 278 +%define SYS_move_pages 279 +%define SYS_utimensat 280 +%define SYS_epoll_pwait 281 +%define SYS_signalfd 282 +%define SYS_timerfd_create 283 +%define SYS_eventfd 284 +%define SYS_fallocate 285 +%define SYS_timerfd_settime 286 +%define SYS_timerfd_gettime 287 +%define SYS_accept4 288 +%define SYS_signalfd4 289 +%define SYS_eventfd2 290 +%define SYS_epoll_create1 291 +%define SYS_dup3 292 +%define SYS_pipe2 293 +%define SYS_inotify_init1 294 +%define SYS_preadv 295 +%define SYS_pwritev 296 +%define SYS_rt_tgsigqueueinfo 297 +%define SYS_perf_event_open 298 +%define SYS_recvmmsg 299 +%define SYS_fanotify_init 300 +%define SYS_fanotify_mark 301 +%define SYS_prlimit64 302 +%define SYS_name_to_handle_at 303 +%define SYS_open_by_handle_at 304 +%define SYS_clock_adjtime 305 +%define SYS_syncfs 306 +%define SYS_sendmmsg 307 +%define SYS_setns 308 +%define SYS_getcpu 309 +%define SYS_process_vm_readv 310 +%define SYS_process_vm_writev 311 +%define SYS_kcmp 312 +%define SYS_finit_module 313 +%define SYS_sched_setattr 314 +%define SYS_sched_getattr 315 +%define SYS_renameat2 316 +%define SYS_seccomp 317 +%define SYS_getrandom 318 +%define SYS_memfd_create 319 +%define SYS_kexec_file_load 320 +%define SYS_bpf 321 +%define SYS_execveat 322 +%define SYS_userfaultfd 323 +%define SYS_membarrier 324 +%define SYS_mlock2 325 +%define SYS_copy_file_range 326 +%define SYS_preadv2 327 +%define SYS_pwritev2 328 +%define SYS_pkey_mprotect 329 +%define SYS_pkey_alloc 330 +%define SYS_pkey_free 331 +%define SYS_statx 332 +%define SYS_io_pgetevents 333 +%define SYS_rseq 334 +%define SYS_pidfd_send_signal 424 +%define SYS_io_uring_setup 425 +%define SYS_io_uring_enter 426 +%define SYS_io_uring_register 427 +%define SYS_open_tree 428 +%define SYS_move_mount 429 +%define SYS_fsopen 430 +%define SYS_fsconfig 431 +%define SYS_fsmount 432 +%define SYS_fspick 433 +%define SYS_pidfd_open 434 +%define SYS_clone3 435 +%define SYS_close_range 436 +%define SYS_openat2 437 +%define SYS_pidfd_getfd 438 +%define SYS_faccessat2 439 +%define SYS_process_madvise 440 +%define SYS_epoll_pwait2 441 +%define SYS_mount_setattr 442 +%define SYS_quotactl_fd 443 +%define SYS_landlock_create_ruleset 444 +%define SYS_landlock_add_rule 445 +%define SYS_landlock_restrict_self 446 +%define SYS_memfd_secret 447 +%define SYS_process_mrelease 448 + +%endif diff --git a/utils/utils.asm b/utils/utils.asm new file mode 100644 index 0000000..5b65f15 --- /dev/null +++ b/utils/utils.asm @@ -0,0 +1,43 @@ +global atoi, write_ulong + +%include "unistd.asm" + +section .text +atoi: + mov ecx, 10 + xor eax, eax +.loop: + movzx r8d, byte [rdi] + xor r8d, '0' + cmp r8d, ecx ; minor optimization, comparing with a register generates smaller machine code then comparing with an immediate + jnl .return + xor edx, edx + mul rcx + add eax, r8d + inc rdi ; Move ptr to next character + jmp .loop +.return: + ret + +write_ulong: + push rdi ; Push fd onto stack + mov rax, rsi + lea rcx, [rsp - 1] + mov byte [rcx], 0 + mov rsi, rcx + mov edi, 10 ; Divisor +.loop: + xor edx, edx + div rdi + xor edx, '0' + dec rsi + mov byte [rsi], dl + test rax, rax + jnz .loop + + mov rax, SYS_write + pop rdi ; Pop fd from stack + mov rdx, rcx + sub rdx, rsi + syscall + ret diff --git a/utils/utils.h b/utils/utils.h new file mode 100644 index 0000000..840d1d4 --- /dev/null +++ b/utils/utils.h @@ -0,0 +1,9 @@ +#ifndef AOC_UTILS_H +#define AOC_UTILS_H + +#define SWAP(a, b) (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))) + +#define likely(x) __builtin_expect((x), 1) +#define unlikely(x) __builtin_expect((x), 0) + +#endif -- cgit v1.2.3