From 9cf858b860789b28fdf618463b0100a4286878ea Mon Sep 17 00:00:00 2001 From: Jos van Goor Date: Thu, 1 Dec 2022 13:46:47 +0100 Subject: [PATCH] Added older advents --- advent_of_code_2015/day1/input.in | 1 + advent_of_code_2015/day1/main1.cc | 18 + advent_of_code_2015/day1/main2.cc | 27 + advent_of_code_2015/day2/input.in | 1000 +++++++ advent_of_code_2015/day2/main1.cc | 63 + advent_of_code_2015/day3/input.in | 1 + advent_of_code_2015/day3/main1.cc | 53 + advent_of_code_2015/day3/main2.cc | 56 + advent_of_code_2015/day4/main1.cc | 24 + advent_of_code_2015/day4/md5.cpp | 362 +++ advent_of_code_2015/day4/md5.hpp | 93 + advent_of_code_2015/day5/input.in | 1000 +++++++ advent_of_code_2015/day5/main1.cc | 59 + advent_of_code_2015/day5/main2.cc | 50 + advent_of_code_2015/day6/input.in | 300 +++ advent_of_code_2015/day6/main.ih | 54 + advent_of_code_2015/day6/main1.cc | 56 + advent_of_code_2015/day6/main2.cc | 54 + advent_of_code_2018/day1/input.in | 994 +++++++ advent_of_code_2018/day1/main2.cc | 46 + advent_of_code_2018/day10/input.in | 385 +++ advent_of_code_2018/day10/main.ih | 49 + advent_of_code_2018/day10/main1.cc | 101 + advent_of_code_2018/day10/test.in | 31 + advent_of_code_2018/day11/input.in | 3 + advent_of_code_2018/day11/main.cc | 80 + advent_of_code_2018/day11/test.in | 3 + advent_of_code_2018/day12/input.in | 34 + advent_of_code_2018/day12/main.cc | 127 + advent_of_code_2018/day12/out.txt | 2328 +++++++++++++++++ advent_of_code_2018/day2/input.in | 250 ++ advent_of_code_2018/day2/main1.cc | 40 + advent_of_code_2018/day2/main2.cc | 56 + advent_of_code_2018/day25/input1.in | 1216 +++++++++ advent_of_code_2018/day25/main.cc | 137 + advent_of_code_2018/day25/test.in | 10 + advent_of_code_2018/day3/input.in | 1237 +++++++++ advent_of_code_2018/day3/main1.cc | 83 + advent_of_code_2018/day3/main2.cc | 105 + advent_of_code_2018/day3/test.in | 3 + advent_of_code_2018/day4/input.in | 1002 +++++++ advent_of_code_2018/day4/main1.cc | 159 ++ advent_of_code_2018/day4/test.in | 17 + advent_of_code_2018/day5/input.in | 1 + advent_of_code_2018/day5/main.cc | 56 + advent_of_code_2018/day6/input.in | 50 + advent_of_code_2018/day6/main1.cc | 125 + advent_of_code_2018/day6/main2.cc | 73 + advent_of_code_2018/day7/input.in | 101 + advent_of_code_2018/day7/main1.cc | 63 + advent_of_code_2018/day7/main2.cc | 142 + advent_of_code_2018/day7/test.in | 7 + advent_of_code_2018/day8/input.in | 1 + advent_of_code_2018/day8/main.cc | 83 + advent_of_code_2018/day8/test.in | 1 + advent_of_code_2018/day9/input.in | 1 + advent_of_code_2018/day9/main1.cc | 120 + advent_of_code_2018/day9/main2.cc | 146 ++ advent_of_code_2018/day9/test.in | 1 + advent_of_code_2019/day1/input.txt | 100 + advent_of_code_2019/day1/main1.cc | 25 + advent_of_code_2019/day1/main2.cc | 29 + advent_of_code_2019/day2/input.txt | 1 + advent_of_code_2019/day2/main1.cc | 59 + advent_of_code_2019/day2/main2.cc | 79 + advent_of_code_2019/day2/test.txt | 1 + advent_of_code_2019/day3/input.txt | 2 + advent_of_code_2019/day3/main.ih | 104 + advent_of_code_2019/day3/main1.cc | 143 + advent_of_code_2019/day3/main2.cc | 144 + advent_of_code_2019/day3/test.txt | 2 + advent_of_code_2019/day4/main1.cc | 41 + advent_of_code_2019/day4/main2.cc | 62 + advent_of_code_2020/day1/input.txt | 200 ++ advent_of_code_2020/day1/main1.cc | 35 + advent_of_code_2020/day1/main2.cc | 42 + advent_of_code_2022/{day_1 => day1}/input.txt | 0 advent_of_code_2022/{day_1 => day1}/main.cc | 0 78 files changed, 13807 insertions(+) create mode 100644 advent_of_code_2015/day1/input.in create mode 100644 advent_of_code_2015/day1/main1.cc create mode 100644 advent_of_code_2015/day1/main2.cc create mode 100644 advent_of_code_2015/day2/input.in create mode 100644 advent_of_code_2015/day2/main1.cc create mode 100644 advent_of_code_2015/day3/input.in create mode 100644 advent_of_code_2015/day3/main1.cc create mode 100644 advent_of_code_2015/day3/main2.cc create mode 100644 advent_of_code_2015/day4/main1.cc create mode 100644 advent_of_code_2015/day4/md5.cpp create mode 100644 advent_of_code_2015/day4/md5.hpp create mode 100644 advent_of_code_2015/day5/input.in create mode 100644 advent_of_code_2015/day5/main1.cc create mode 100644 advent_of_code_2015/day5/main2.cc create mode 100644 advent_of_code_2015/day6/input.in create mode 100644 advent_of_code_2015/day6/main.ih create mode 100644 advent_of_code_2015/day6/main1.cc create mode 100644 advent_of_code_2015/day6/main2.cc create mode 100755 advent_of_code_2018/day1/input.in create mode 100755 advent_of_code_2018/day1/main2.cc create mode 100644 advent_of_code_2018/day10/input.in create mode 100644 advent_of_code_2018/day10/main.ih create mode 100644 advent_of_code_2018/day10/main1.cc create mode 100644 advent_of_code_2018/day10/test.in create mode 100644 advent_of_code_2018/day11/input.in create mode 100644 advent_of_code_2018/day11/main.cc create mode 100644 advent_of_code_2018/day11/test.in create mode 100644 advent_of_code_2018/day12/input.in create mode 100644 advent_of_code_2018/day12/main.cc create mode 100644 advent_of_code_2018/day12/out.txt create mode 100644 advent_of_code_2018/day2/input.in create mode 100644 advent_of_code_2018/day2/main1.cc create mode 100644 advent_of_code_2018/day2/main2.cc create mode 100644 advent_of_code_2018/day25/input1.in create mode 100644 advent_of_code_2018/day25/main.cc create mode 100644 advent_of_code_2018/day25/test.in create mode 100644 advent_of_code_2018/day3/input.in create mode 100644 advent_of_code_2018/day3/main1.cc create mode 100644 advent_of_code_2018/day3/main2.cc create mode 100644 advent_of_code_2018/day3/test.in create mode 100644 advent_of_code_2018/day4/input.in create mode 100644 advent_of_code_2018/day4/main1.cc create mode 100644 advent_of_code_2018/day4/test.in create mode 100644 advent_of_code_2018/day5/input.in create mode 100644 advent_of_code_2018/day5/main.cc create mode 100644 advent_of_code_2018/day6/input.in create mode 100644 advent_of_code_2018/day6/main1.cc create mode 100644 advent_of_code_2018/day6/main2.cc create mode 100644 advent_of_code_2018/day7/input.in create mode 100644 advent_of_code_2018/day7/main1.cc create mode 100644 advent_of_code_2018/day7/main2.cc create mode 100644 advent_of_code_2018/day7/test.in create mode 100644 advent_of_code_2018/day8/input.in create mode 100644 advent_of_code_2018/day8/main.cc create mode 100644 advent_of_code_2018/day8/test.in create mode 100644 advent_of_code_2018/day9/input.in create mode 100644 advent_of_code_2018/day9/main1.cc create mode 100644 advent_of_code_2018/day9/main2.cc create mode 100644 advent_of_code_2018/day9/test.in create mode 100644 advent_of_code_2019/day1/input.txt create mode 100644 advent_of_code_2019/day1/main1.cc create mode 100644 advent_of_code_2019/day1/main2.cc create mode 100644 advent_of_code_2019/day2/input.txt create mode 100644 advent_of_code_2019/day2/main1.cc create mode 100644 advent_of_code_2019/day2/main2.cc create mode 100644 advent_of_code_2019/day2/test.txt create mode 100644 advent_of_code_2019/day3/input.txt create mode 100644 advent_of_code_2019/day3/main.ih create mode 100644 advent_of_code_2019/day3/main1.cc create mode 100644 advent_of_code_2019/day3/main2.cc create mode 100644 advent_of_code_2019/day3/test.txt create mode 100644 advent_of_code_2019/day4/main1.cc create mode 100644 advent_of_code_2019/day4/main2.cc create mode 100644 advent_of_code_2020/day1/input.txt create mode 100644 advent_of_code_2020/day1/main1.cc create mode 100644 advent_of_code_2020/day1/main2.cc rename advent_of_code_2022/{day_1 => day1}/input.txt (100%) rename advent_of_code_2022/{day_1 => day1}/main.cc (100%) diff --git a/advent_of_code_2015/day1/input.in b/advent_of_code_2015/day1/input.in new file mode 100644 index 0000000..71a7803 --- /dev/null +++ b/advent_of_code_2015/day1/input.in @@ -0,0 +1 @@ +()(((()))(()()()((((()(((())(()(()((((((()(()(((())))((()(((()))((())(()((()()()()(((())(((((((())))()()(()(()(())(((((()()()((())(((((()()))))()(())(((())(())((((((())())))(()())))()))))()())()())((()()((()()()()(()((((((((()()())((()()(((((()(((())((())(()))()((((()((((((((())()((()())(())((()))())((((()())(((((((((((()()(((((()(()))())(((()(()))())((()(()())())())(()(((())(())())()()(()(()((()))((()))))((((()(((()))))((((()(()(()())())()(((()((((())((((()(((()()(())()()()())((()((((((()((()()))()((()))()(()()((())))(((()(((()))((()((()(()))(((()()(()(()()()))))()()(((()(((())())))))((()(((())()(()(())((()())))((((())))(()(()(()())()((()())))(((()((()(())()()((()((())(()()((())(())()))()))((()(())()))())(((((((()(()()(()(())())))))))(()((((((())((((())((())())(()()))))()(())(()())()())((())(()))))(()))(()((()))()(()((((((()()()()((((((((()(()(())((()()(()()))(())()())()((())))()))()())(((()))(())()(())()))()((()((()(()()())(())()()()((())())))((()()(()()((()(())()()())(((()(()()))))(())))(()(()())()))()()))))))()))))((((((())))())))(()(())())(()())))))(()))()))))))()((()))))()))))(()(()((()())())(()()))))(((())()))())())())(((()(()()))(())()(())(())((((((()()))))((()(()))))))(()))())(((()()(()))()())()()()())))))))))))))(())(()))(()))((()(())(()())(())())(()())(())()()(()())))()()()))(())())()))())())(())((())))))))(())))(())))))()))))((())(()(((()))))(()))()((()(())))(()())(((((()))()())()()))))()))))()))())(()(()()()))()))))))((()))))))))))()((()))((()(())((())()()(()()))()(()))))()()(()))()))(((())))(())()((())(())(()())()())())))))))())))()((())))()))(()))()()))(((((((()))())(()()))(()()(()))()(()((()())()))))))(((()()()())))(())()))()())(()()))()()))))))))(())))()))()()))))))()))()())))()(())(())))))()(())()()(()()))))())((()))))()))))(()(((((()))))))))())))())()(())()()))))(())))())()()())()()())()(()))))()))()))))))))())))((()))()))()))())))()())()()())))())))(()((())()((()))())))))())()(())((())))))))))))())()())(())())())(()))(()))()))())(()(())())()())()()(()))))(()(())))))))(())))())(())))))))())()()(())())())))(())))))()))()(()())()(()))())())))))()()(()))()))))())))))))))()))))()))))))())()())()()))))()())))())))))))))))()()))))()()(((()))()()(())()))))((()))))(()))(())())))(())()))))))(()))()))))(())())))))()))(()())))))))))))))())))))))))()((()())(()())))))))((()))))(())(())))()(()())())))())())(()()()())))()))))))())))))())()()())))))))))))()()(()))))()())()))((()())(()))))()(()))))))))))()())())(((())(()))))())()))()))()))))))()))))))(()))))()))))()(())))(())))(()))())()()(()()))()))(()()))))))))()))(()))())(()()(()(()())()()))()))))))))(())))))((()()(()))())())))))()))())(()())()()))())))()(()()()()))((())())))())()(()()))()))))))))(()))(())))()))))(()(()())(()))))()())())()))()()))())))))))))))())()))))))()))))))))())))))()))))())(()())))(())()))())())))))()()(()()())(()())))()()))(((()))(()()()))))()))))()))))((())))()((((((()()))))))())))))))))))(((()))))))))))))(())())))))())(()))))))(()))((()))())))()(()((()))()))()))))))))))())()))()(()()))))())))())(())()(()))()))())(()))()))))(()()))()()(())))))()))(())(()(()()))(()()())))))(((()))))))()))))))))))))(())(()))))()())())()()((()()))())))))(()))))())))))))()()()))))))))())))()(((()()))(())))))(((())())))))((()))()(()))(()))))(()())))(()))())))))()))))(())(())))()((()))(())())))()()))()))))))))()))(()()()(()()()(()))())(())()())(((()))(())))))))))(((()())))()()))))))))()(())(()))()((((())(())(()())))()))(((())()()()))((()))(()))())())))())))(()))())()())())(()(())())()()()(())))())(())))(())))(())()))()))(()((()))))))))())(()))))))())(()()))()()))()(()(()())))()()(()((()((((((()))(())))()()()))())()))((()()(()))())((()(()(()))(()()))))()())))()))()())))))))()()((()())(())))()))(()))(())(()))())(()(())))()()))))))(((()(((()()))()(()(())())((()()))()))()))()))()(()()()(()))((()())()(())))()()))(((())()()())(())()((()()()()(()(())(()()))()(((((()())))((())))))(()()()))))(((()(())))()))((()((()(())()(()((())))((()())()(()))(((()())()()(()))(())(((()((()())()((())()())(((()()))((()((())(()))(()())(()()()))((()))(())(()((()()())((()))(())))(())(())(())))(()())))(((((()(()(((((()())((((()(()())(())(()()(((())((()(((()()(((()()((((((())))())(()((((((()(()))()))()()((()((()))))()(()()(()((()()))))))(((((()(((((())()()()(())())))))))()))((()()(())))(())(()()()())))))(()((((())))))))()()(((()(()(()(()(()())()()()(((((((((()()())()(()))((()()()()()(((((((()())()((())()))((((((()(()(()(()())(((()(((((((()(((())(((((((((())(())())()))((()(()))(((()()())(())(()(()()(((()(())()))())))(())((((((())(()()())()()(((()(((())(()(((())(((((((()(((((((((()))(())(()(()(()))))((()))()(())())())((()(()((()()))((()()((()(())(())(()((())(((())(((()()()((((((()()(())((((())()))))(())((()(()((())))(((((()(()()())())((())())))((())((()((()()((((((())(((()()(()())())(()(()))(()(()))())())()(((((((()(((()(())()()((())((()(()()((()(()()(((((((((((())((())((((((())((()((((()(()((((()(((((((())()((()))))())()((()((((()(()(((()((()())))(())())(((()(((())((((((()(((((((((()()(())))(()(((((()((((()())))((()((()((()(()()(((())((((((((((((()(((())(()(((((()))(()()(()()()()()()((())(((((((())(((((())))))())()(()()(()(()(((()()(((((())(()((()((()(((()()((()((((())()))()((((())(())))()())(((())(())(()()((()(((()()((((((((((()()(()())())(((((((((())((((()))()()((((())(()((((()(((())())(((((((((((()((((())))(())(()(((()(((()((())(((((()((()()(()(()()((((((()((((()((()(()((()(()((((((()))))()()(((((()((()(()(())()))(())(((((((()((((()())(()((()((()(()))())))(())((()))))(((((((()()()())(()))(()()((()())()((()((()()()(()(()()))(()())(())(((((()(((((((((((()((()(((()(((((((()()((((((()(((((()(()((()(((((())((((((()))((((())((()()((())(((())()(((((()()(((((()((()(()(((((((()(((((()((()((()((())(())((())(()))()()))(()()(()(()()(((((((()(((()(((())()(((((()((((((()())((((())()((()((()(()()())(()))((((()()((((((()((()(()(()((((()((()((())((((((()(()(())((((((()((((((((((()((())()))()(()(()(((((()()()))((())))()(()((((((((((((((()(((()((((()((())((()((()(((()()(()(((()((())(()()())))()(()(()(((((()()(()(()((((()(((((())()(()(()))(((((()()(((()()(())((((((((((((((())((())(((((((((((())()()()(())()(()(()(((((((((())(((()))(()()())(()((((()(())(((((()())(())((((((((())()((((()((((((())(()((()(())(((()((((()))(((((((((()()))((((()(())()()()(())(()((())((()()))()(((())(((((())((((((()()))(((((((((()((((((())))(((((((()((()(()(())))())(()(()))()(((((()())(()))()(()(())(((()))))())()())))(((((()))())()((()(()))))((()()()((((((()))()()((((((((())((()(()(((()(()((())((()())(()((((())(()(((()()()(()(()()))())())((((((((((())())((()))()((())(())(())))())()(()()(())))())(()))(((()(()()(((()(((())))()(((()(())()((((((())()))()))()((((((()(()(((((()())))()))))())()()(((()(((((())((()()(()((()((()(()(()(())))(()()()()((()(())(((()((()))((((()))())(())))())(()))()()()())()))(((()()())()((())))(())(()()()()(()())((()(()()((((())))((()((()(())((()(()((())()(()()(((()())()()())((()))((())(((()()(())))()()))(((()((())()(((((()())(())((())()())())((((((()(()(((((()))(()( \ No newline at end of file diff --git a/advent_of_code_2015/day1/main1.cc b/advent_of_code_2015/day1/main1.cc new file mode 100644 index 0000000..4628226 --- /dev/null +++ b/advent_of_code_2015/day1/main1.cc @@ -0,0 +1,18 @@ +#include +#include +#include + +using namespace std; + +int main() +{ + string buffer; + + while(getline(cin, buffer)) + { + int up = count(buffer.begin(), buffer.end(), '('); + int down = count(buffer.begin(), buffer.end(), ')'); + + cout << "Floor: " << up - down << "\n"; + } +} \ No newline at end of file diff --git a/advent_of_code_2015/day1/main2.cc b/advent_of_code_2015/day1/main2.cc new file mode 100644 index 0000000..cc5f885 --- /dev/null +++ b/advent_of_code_2015/day1/main2.cc @@ -0,0 +1,27 @@ +#include +#include +#include + +using namespace std; + +int main() +{ + string buffer; + + while(getline(cin, buffer)) + { + int floor = 0; + + for (size_t idx = 0; idx != buffer.size(); ++idx) + { + floor += buffer[idx] == '(' ? 1 : -1; + if (floor == -1) + { + cout << "Entered basement in step " << idx + 1 << "\n"; + return 0; + } + } + + + } +} \ No newline at end of file diff --git a/advent_of_code_2015/day2/input.in b/advent_of_code_2015/day2/input.in new file mode 100644 index 0000000..74fefbf --- /dev/null +++ b/advent_of_code_2015/day2/input.in @@ -0,0 +1,1000 @@ +3x11x24 +13x5x19 +1x9x27 +24x8x21 +6x8x17 +19x18x22 +10x9x12 +12x2x5 +26x6x11 +9x23x15 +12x8x17 +13x29x10 +28x18x6 +22x28x26 +1x5x11 +29x26x12 +8x28x29 +27x4x21 +12x7x16 +7x4x23 +15x24x8 +15x14x2 +11x6x29 +28x19x9 +10x3x1 +5x20x13 +10x25x1 +22x17x7 +16x29x3 +18x22x8 +18x11x19 +21x24x20 +4x7x17 +22x27x12 +1x26x6 +5x27x24 +29x21x3 +25x30x2 +21x26x2 +10x24x27 +10x16x28 +18x16x23 +6x5x26 +19x12x20 +6x24x25 +11x20x7 +4x8x5 +2x13x11 +11x17x1 +13x24x6 +22x29x16 +4x24x20 +10x25x10 +12x29x23 +23x27x12 +11x21x9 +13x2x6 +15x30x2 +8x26x24 +24x7x30 +22x22x8 +29x27x8 +28x23x27 +13x16x14 +9x28x20 +21x4x30 +21x20x20 +11x17x30 +9x14x22 +20x2x6 +10x11x14 +1x8x23 +23x19x19 +26x10x13 +21x12x12 +25x7x24 +1x28x17 +20x23x9 +2x24x27 +20x24x29 +1x3x10 +5x20x14 +25x21x3 +15x5x22 +14x17x19 +27x3x18 +29x23x19 +14x21x19 +20x8x3 +22x27x12 +24x15x18 +9x10x19 +29x25x28 +14x22x6 +4x19x28 +4x24x14 +17x19x17 +7x19x29 +28x8x26 +7x20x16 +11x26x29 +2x18x3 +12x7x18 +11x15x21 +24x7x26 +2x22x23 +2x30x5 +1x19x8 +15x29x10 +15x26x22 +20x16x14 +25x29x22 +3x13x19 +1x12x30 +3x15x27 +19x9x11 +30x8x21 +26x12x20 +11x17x19 +17x25x1 +19x24x12 +30x6x20 +11x19x18 +18x15x29 +18x8x9 +25x15x5 +15x6x26 +13x27x19 +23x24x12 +3x15x28 +17x10x10 +15x4x7 +15x27x7 +21x8x11 +9x18x2 +7x20x20 +17x23x12 +2x19x1 +7x26x26 +13x23x8 +10x3x12 +11x1x9 +1x11x19 +25x14x26 +16x10x15 +7x6x11 +8x1x27 +20x28x17 +3x25x9 +30x7x5 +17x17x4 +23x25x27 +23x8x5 +13x11x1 +15x10x21 +22x16x1 +12x15x28 +27x18x26 +25x18x5 +21x3x27 +15x25x5 +29x27x19 +11x10x12 +22x16x21 +11x8x18 +6x10x23 +21x21x2 +13x27x28 +2x5x20 +23x16x20 +1x21x7 +22x2x13 +11x10x4 +7x3x4 +19x2x5 +21x11x1 +7x27x26 +12x4x23 +12x3x15 +25x7x4 +20x7x15 +16x5x11 +1x18x26 +11x27x10 +17x6x24 +19x13x16 +6x3x11 +4x19x18 +16x15x15 +1x11x17 +19x11x29 +18x19x1 +1x25x7 +8x22x14 +15x6x19 +5x30x18 +30x24x22 +11x16x2 +21x29x19 +20x29x11 +27x1x18 +20x5x30 +12x4x28 +3x9x30 +26x20x15 +18x25x18 +20x28x28 +21x5x3 +20x21x25 +19x27x22 +8x27x9 +1x5x15 +30x6x19 +16x5x15 +18x30x21 +4x15x8 +9x3x28 +18x15x27 +25x11x6 +17x22x15 +18x12x18 +14x30x30 +1x7x23 +27x21x12 +15x7x18 +16x17x24 +11x12x19 +18x15x21 +6x18x15 +2x21x4 +12x9x14 +19x7x25 +22x3x1 +29x19x7 +30x25x7 +6x27x27 +5x13x9 +21x4x18 +13x1x16 +11x21x25 +27x20x27 +14x25x9 +23x11x15 +22x10x26 +15x16x4 +14x16x21 +1x1x24 +17x27x3 +25x28x16 +12x2x29 +9x19x28 +12x7x17 +6x9x19 +15x14x24 +25x21x23 +26x27x25 +7x18x13 +15x10x6 +22x28x2 +15x2x14 +3x24x18 +30x22x7 +18x27x17 +29x18x7 +20x2x4 +4x20x26 +23x30x15 +5x7x3 +4x24x12 +24x30x20 +26x18x17 +6x28x3 +29x19x29 +14x10x4 +15x5x23 +12x25x4 +7x15x19 +26x21x19 +18x2x23 +19x20x3 +3x13x9 +29x21x24 +26x13x29 +30x27x4 +20x10x29 +21x18x8 +7x26x10 +29x16x21 +22x5x11 +17x15x2 +7x29x5 +6x18x15 +23x6x14 +10x30x14 +26x6x16 +24x13x25 +17x29x20 +4x27x19 +28x12x11 +23x20x3 +22x6x20 +29x9x19 +10x16x22 +30x26x4 +29x26x11 +2x11x15 +1x3x30 +30x30x29 +9x1x3 +30x13x16 +20x4x5 +23x28x11 +24x27x1 +4x25x10 +9x3x6 +14x4x15 +4x5x25 +27x14x13 +20x30x3 +28x15x25 +5x19x2 +10x24x29 +29x30x18 +30x1x25 +7x7x15 +1x13x16 +23x18x4 +1x28x8 +24x11x8 +22x26x19 +30x30x14 +2x4x13 +27x20x26 +16x20x17 +11x12x13 +28x2x17 +15x26x13 +29x15x25 +30x27x9 +2x6x25 +10x26x19 +16x8x23 +12x17x18 +26x14x22 +13x17x4 +27x27x29 +17x13x22 +9x8x3 +25x15x20 +14x13x16 +8x7x13 +12x4x21 +27x16x15 +6x14x5 +28x29x17 +23x17x25 +10x27x28 +1x28x21 +18x2x30 +25x30x16 +25x21x7 +2x3x4 +9x6x13 +19x6x10 +28x17x8 +13x24x28 +24x12x7 +5x19x5 +18x10x27 +16x1x6 +12x14x30 +1x2x28 +23x21x2 +13x3x23 +9x22x10 +10x17x2 +24x20x11 +30x6x14 +28x1x16 +24x20x1 +28x7x7 +1x24x21 +14x9x7 +22x8x15 +20x1x21 +6x3x7 +7x26x14 +5x7x28 +5x4x4 +15x7x28 +30x16x23 +7x26x2 +1x2x30 +24x28x20 +5x17x28 +4x15x20 +15x26x2 +1x3x23 +22x30x24 +9x20x16 +7x15x2 +6x21x18 +21x21x29 +29x10x10 +4x3x23 +23x2x18 +29x24x14 +29x29x16 +22x28x24 +21x18x24 +16x21x6 +3x9x22 +9x18x4 +22x9x9 +12x9x13 +18x21x14 +7x8x29 +28x28x14 +1x6x24 +11x11x3 +8x28x6 +11x16x10 +9x16x16 +6x6x19 +21x5x12 +15x17x12 +3x6x29 +19x1x26 +10x30x25 +24x26x21 +1x10x18 +6x1x16 +4x17x27 +17x11x27 +15x15x21 +14x23x1 +8x9x30 +22x22x25 +20x27x22 +12x7x9 +9x26x19 +26x25x12 +8x8x16 +28x15x10 +29x18x2 +25x22x6 +4x6x15 +12x18x4 +10x3x20 +17x28x17 +14x25x13 +14x10x3 +14x5x10 +7x7x22 +21x2x14 +1x21x5 +27x29x1 +6x20x4 +7x19x23 +28x19x27 +3x9x18 +13x17x17 +18x8x15 +26x23x17 +10x10x13 +11x5x21 +25x15x29 +6x23x24 +10x7x2 +19x10x30 +4x3x23 +22x12x6 +11x17x16 +6x8x12 +18x20x11 +6x2x2 +17x4x11 +20x23x22 +29x23x24 +25x11x21 +22x11x15 +29x3x9 +13x30x5 +17x10x12 +10x30x8 +21x16x17 +1x5x26 +22x15x16 +27x7x11 +16x8x18 +29x9x7 +25x4x17 +10x21x25 +2x19x21 +29x11x16 +18x26x21 +2x8x20 +17x29x27 +25x27x4 +14x3x14 +25x29x29 +26x18x11 +8x24x28 +7x30x24 +12x30x22 +29x20x6 +3x17x1 +6x15x14 +6x22x20 +13x26x26 +12x2x1 +7x14x12 +15x16x11 +3x21x4 +30x17x29 +9x18x27 +11x28x16 +22x3x25 +18x15x15 +2x30x12 +3x27x22 +10x8x8 +26x16x14 +15x2x29 +12x10x7 +21x20x15 +2x15x25 +4x14x13 +3x15x13 +29x8x3 +7x7x28 +15x10x24 +23x15x5 +5x7x14 +24x1x22 +1x11x13 +26x4x19 +19x16x26 +5x25x5 +17x25x14 +23x7x14 +24x6x17 +5x13x12 +20x20x5 +22x29x17 +11x17x29 +25x6x4 +29x8x16 +28x22x24 +24x23x17 +16x17x4 +17x8x25 +22x9x13 +24x4x8 +18x10x20 +21x23x21 +13x14x12 +23x26x4 +4x10x29 +2x18x18 +19x5x21 +2x27x23 +6x29x30 +21x9x20 +6x5x16 +25x10x27 +5x29x21 +24x14x19 +19x11x8 +2x28x6 +19x25x6 +27x1x11 +6x8x29 +18x25x30 +4x27x26 +8x12x1 +7x17x25 +7x14x27 +12x9x5 +14x29x13 +18x17x5 +23x1x3 +28x5x13 +3x2x26 +3x7x11 +1x8x7 +12x5x4 +2x30x21 +16x30x11 +3x26x4 +16x9x4 +11x9x22 +23x5x6 +13x20x3 +4x3x2 +14x10x29 +11x8x12 +26x15x16 +7x17x29 +18x19x18 +8x28x4 +22x6x13 +9x23x7 +11x23x20 +13x11x26 +15x30x13 +1x5x8 +5x10x24 +22x25x17 +27x20x25 +30x10x21 +16x28x24 +20x12x8 +17x25x1 +30x14x9 +14x18x6 +8x28x29 +12x18x29 +9x7x18 +6x12x25 +20x13x24 +22x3x12 +5x23x22 +8x10x17 +7x23x5 +10x26x27 +14x26x19 +10x18x24 +8x4x4 +16x15x11 +3x14x9 +18x5x30 +29x12x26 +16x13x12 +15x10x7 +18x5x26 +14x1x6 +10x8x29 +3x4x9 +19x4x23 +28x17x23 +30x7x17 +19x5x9 +26x29x28 +22x13x17 +28x2x1 +20x30x8 +15x13x21 +25x23x19 +27x23x1 +4x6x23 +29x29x24 +5x18x7 +4x6x30 +17x15x2 +27x4x2 +25x24x14 +28x8x30 +24x29x5 +14x30x14 +10x18x19 +15x26x22 +24x19x21 +29x23x27 +21x10x16 +7x4x29 +14x21x3 +21x4x28 +17x16x15 +24x7x13 +21x24x15 +25x11x16 +10x26x13 +23x20x14 +20x29x27 +14x24x14 +14x23x12 +18x6x5 +3x18x9 +8x18x19 +20x26x15 +16x14x13 +30x16x3 +17x13x4 +15x19x30 +20x3x8 +13x4x5 +12x10x15 +8x23x26 +16x8x15 +22x8x11 +12x11x18 +28x3x30 +15x8x4 +13x22x13 +21x26x21 +29x1x15 +28x9x5 +27x3x26 +22x19x30 +4x11x22 +21x27x20 +22x26x7 +19x28x20 +24x23x16 +26x12x9 +13x22x9 +5x6x23 +20x7x2 +18x26x30 +3x6x28 +24x18x13 +28x19x16 +25x21x25 +25x19x23 +22x29x10 +29x19x30 +4x7x27 +5x12x28 +8x26x6 +14x14x25 +17x17x2 +5x27x11 +8x2x2 +3x20x24 +26x10x9 +22x28x27 +18x15x20 +12x11x1 +5x14x30 +7x3x16 +2x16x16 +18x20x15 +13x14x29 +1x17x12 +13x5x23 +19x4x10 +25x19x11 +15x17x14 +1x28x27 +11x9x28 +9x10x18 +30x11x22 +21x21x20 +2x1x5 +2x25x1 +7x3x4 +22x15x29 +21x28x15 +12x12x4 +21x30x6 +15x10x7 +10x14x6 +21x26x18 +14x25x6 +9x7x11 +22x3x1 +1x16x27 +1x14x23 +2x13x8 +14x19x11 +21x26x1 +4x28x13 +12x16x20 +21x13x9 +3x4x13 +14x9x8 +21x21x12 +27x10x17 +6x20x6 +28x23x23 +2x28x12 +8x10x10 +3x9x2 +20x3x29 +19x4x16 +29x24x9 +26x20x8 +15x28x26 +18x17x10 +7x22x10 +20x15x9 +6x10x8 +7x26x21 +8x8x16 +15x6x29 +22x30x11 +18x25x8 +6x21x20 +7x23x25 +8x25x26 +11x25x27 +22x18x23 +3x2x14 +16x16x1 +15x13x11 +3x9x25 +29x25x24 +9x15x1 +12x4x1 +23x30x20 +3x1x23 +6x10x29 +28x13x24 +4x19x17 +6x6x25 +27x29x17 +12x13x2 +10x7x13 +14x15x8 +22x2x3 +27x17x19 +23x10x16 +5x9x25 +9x25x14 +11x18x6 +18x10x12 +9x4x15 +7x16x14 +17x24x10 +11x4x6 +12x9x17 +22x18x12 +6x24x24 +6x22x23 +5x17x30 +6x9x5 +17x20x10 +6x8x12 +14x17x13 +29x10x17 +22x4x5 +10x19x30 +22x29x11 +10x12x29 +21x22x26 +16x6x25 +1x26x24 +30x17x16 +27x28x5 +30x13x22 +7x26x12 +11x24x30 +1x17x25 +22x1x3 +29x24x6 +4x8x24 +13x9x20 +8x12x9 +21x25x4 +23x23x28 +5x2x19 +29x3x15 +22x1x14 +3x23x30 +8x25x3 +15x8x14 +30x14x6 +23x27x24 +19x1x2 +10x9x13 +13x8x7 +8x13x22 +5x15x20 +17x14x8 +5x11x20 +5x10x27 +24x17x19 +21x2x3 +15x30x26 +21x19x15 +2x7x23 +13x17x25 +30x15x19 +26x4x10 +2x25x8 +9x9x10 +2x25x8 +19x21x30 +17x26x12 +7x5x10 +2x22x14 +10x17x30 +1x8x5 +23x2x25 +22x29x8 +13x26x1 +26x3x30 +25x17x8 +25x18x26 +26x19x15 +8x28x10 +12x16x29 +30x6x29 +28x19x4 +27x26x18 +15x23x17 +5x21x30 +8x11x13 +2x26x7 +19x9x24 +3x22x23 +6x7x18 +4x26x30 +13x25x20 +17x3x15 +8x20x18 +23x18x23 +28x23x9 +16x3x4 +1x29x14 +20x26x22 +3x2x22 +23x8x17 +19x5x17 +21x18x20 +17x21x8 +30x28x1 +29x19x23 +12x12x11 +24x18x7 +21x18x14 +14x26x25 +9x11x3 +10x7x15 +27x6x28 +14x26x4 +28x4x1 +22x25x29 +6x26x6 +1x3x13 +26x22x12 +6x21x26 +23x4x27 +26x13x24 +5x24x28 +22x16x7 +3x27x24 +19x28x2 +11x13x9 +29x16x22 +30x10x24 +14x14x22 +22x23x16 +14x8x3 +20x5x14 +28x6x13 +3x15x25 +4x12x22 +15x12x25 +10x11x24 +7x7x6 +8x11x9 +21x10x29 +23x28x30 +8x29x26 +16x27x11 +1x10x2 +24x20x16 +7x12x28 +28x8x20 +14x10x30 +1x19x6 +4x12x20 +18x2x7 +24x18x17 +16x11x10 +1x12x22 +30x16x28 +18x12x11 +28x9x8 +23x6x17 +10x3x11 +5x12x8 +22x2x23 +9x19x14 +15x28x13 +27x20x23 +19x16x12 +19x30x15 +8x17x4 +10x22x18 +13x22x4 +3x12x19 +22x16x23 +11x8x19 +8x11x6 +7x14x7 +29x17x29 +21x8x12 +21x9x11 +20x1x27 +1x22x11 +5x28x4 +26x7x26 +30x12x18 +29x11x20 +3x12x15 +24x25x17 +14x6x11 \ No newline at end of file diff --git a/advent_of_code_2015/day2/main1.cc b/advent_of_code_2015/day2/main1.cc new file mode 100644 index 0000000..643f191 --- /dev/null +++ b/advent_of_code_2015/day2/main1.cc @@ -0,0 +1,63 @@ +#include +#include + +using namespace std; + +struct Present +{ + size_t length; + size_t width; + size_t height; + + size_t extra_wrap() + { + return min(length * width, min(length * height, width * height)); + } + + size_t wrap_required() + { + return 2 * length * width + + 2 * width * height + + 2 * height * length + + extra_wrap(); + } + + size_t bow_size() + { + return length * width * height; + } + + size_t ribbon_required() + { + size_t ribbon = min(length + width, min(length + height, width + height)) * 2; + return ribbon + bow_size(); + } +}; + +istream &operator>>(istream& in, Present &present) +{ + in >> present.length; + in.ignore(1); // ignore 'x'. + in >> present.width; + in.ignore(1); // ignore 'x'. + in >> present.height; + + return in; +} + +int main() +{ + size_t total_wrap = 0; + size_t total_ribbon = 0; + Present present; + + while(!cin.eof()) + { + cin >> present; + total_wrap += present.wrap_required(); + total_ribbon += present.ribbon_required(); + } + + cout << "Total wrap required: " << total_wrap << "\n"; + cout << "Total ribbon required: " << total_ribbon << "\n"; +} \ No newline at end of file diff --git a/advent_of_code_2015/day3/input.in b/advent_of_code_2015/day3/input.in new file mode 100644 index 0000000..783e28b --- /dev/null +++ b/advent_of_code_2015/day3/input.in @@ -0,0 +1 @@ +>^^v^<>v<<>v^^^^^><^<<^vv>>>^<<^>><>>><>v<><>^^<^^^<><>>vv>vv>v<<^>v<>^>vv>><>^v<<<v^>>>vv>v^^^<^^<>>v<^^v<>^<<>^>><^<>>><><>v<<<><><>v><<>^^^^v>>^>^^^v^^^^^v<><^v><<><^v^>v<<>^<>^^v^<>vv>^^<^<>^v<><^><><><<<<>^vv^>^vvvvv><><^v<<^<^^v^<>^>^^^v^>v<><^vv<<^<>v<>^^>^^>v^>^<<<v><^v>^>>v>>>>^v^^>v^>^vv^>vv^^v<<^<^^<>v>vv^v>><>>>v^>^>^^v<>^^vv>v^<v<<>^vvvv><<^<>>^v^>>^v<^<>>v^<>>v<>>v^^^><^>>vvvv>^v<^><<>>^<>^>vv>>^^>v^^^><^<<^^v>v<^<<>v>^^vvv^v^>v^<>^^<>v^v>v>vvv>^^v<>v>>^<>><>v>v^<^v<>>^>><>^vvv^>>vvv<>v>v>^>>v<<>^<>^<>>>^v<<<^<^v>vv^>><<>^v^^^v<>^^vv><>><>>^>v^v<>>^<<^v>^^^<>^v^><>v<vv^>vv<<>>><<^v^<>v>>^^<>^><<^>vv>>^<>>v><^>>^^<>>^<^v><>vv^^^v>vvv>^><<>^^>^<vvv<^<<>^>^vvvv>v>vv^<>>^vv<^^^vv><^vv<<^>^^>v^<>^v<<>v^>^>v<<^vvv<<^^>^<<<<>vv>>^<>^>>>v^^>>vv>^^v<<>>>^^v><<^^><><^<>>><^<><><^<>v>v^<><^^v^>^>^vv^>^^<vv<^vvv<>>^^<^>v^>^>^>>v<<<><^v<<><^v<^^vv>vvvvv<<>^v^v>vv>>>vvv^^<^<^<><>v><^v><^<<<>><<^>v<>^>^v>>^<>v^<^>><<>^^>^^^>^^>>><>^v^v><<<vv>v<>v^v><>>>v^<><^vvv>vv^<^<<^<^^v>^>>>v<^<^v^^<^<^>>>vv>^<<><>^>>v>^<<>><^<>v<>vv^^>^>vvv^v<<^<^^^vvv<^^v^vv^>>v<^>^^v<^<^vv>v<vv>^>vvv>>>^^>v<>^v>v^<^>>v>^^v>>>>v^v<^>v>^v<^^<^<>>^<>v<^v<>><^>vv>^^>>vv^<>>^vv<>vv<><<>>v>vv^><>>^^v^>>v^v^><<<>>^^<^v<<^<>>>>^<^>v^><<^>v<^v<^>>^^<<<<><^<^v^v<>>^v<^<<^^vv>^>>^>^vv^>^v<>>^v^^><>v>vv><^>>vvvvv^v^^<^<>v^^^^<><<>>>^v><^>^><^><<^vv<>>v^<v><>^>>v^<^^><>>><^>>>^^<^>vvvv<>^<<>^>>v<^v>^>v>>>vv>v>>v^^^<^^>^v>^>vv>vvv<>v<^>v>^^>>^v^^^^^v^vv><^<><>^>vv<^>>^vvvv^^^>^^v<<^><^^>^<>^^>^<>>^><<^^>v^v>>^>vvvv>^^v>>vv><<v>^^^v^vvv<^><<^>^<>^><<<<^<>v^>^>><>v^v<^vv^^>vv<vv^vvv<<<<>^vv<^^<>^vv^^>^>^v^vv^>>v^vv^^<v^v^^^^v<^<^>v>^>v>^vv^v^^^<^^^<^^<>^<>>>^<>>^^>v^^v^<<^v><^v>v<^><^>vv^^>v>^<><^^^>vv<<<<<^<>^v^v>^vv^<>v>v<^>vv<<^vv>vv<>>v>>><^<<><^^>^<^>>^>^^<^v>^vv><v<<>>^>v>>v>>v<^<<^<^>>>v>^^^v><^>^^>>v<<>^v>vvv^vv<<<>vvv<<>^>>>v^<^>v^^v<^^v<>>^^>^v^>v<<<<^<>v^><<>>><v>><>>^<<<^<^^>v<>>v<>vv<<^<<><<^>v^^^vv^>vvvv>>v>v^><vv^<<><^>>>^<<<^<^<^>v<>>v>>vv^^><<<<^^^v>><<^>>v<><><<>^><^><^v<>v^>>>v<^><^<>^v><^><^^^><^^v^<<><>>^>v^<^v^vv<><^>vv^>v^vvv^<>>^><^<^<>^<<>^v>^>>^v^vv>>^v<<>^><^>>>v<<^^v>>><><><v^^vv>vv^<^v<>^v>>v^v>v<^^vv><>^v<<>v^<>v^>>v>vvv<^><><^^>^vv^>>v^>^<^^<><>><<>^^^><^v^v><<<><<^v^vv>v>><^>>>v<>v^^>>v<<>v>v<>v^^<>>v<^vv<>^<<>v>vv^^<>>^^^<>^^>^v>v>>>^v^v>^^v^v<^<^^><^<>><<>^>>^>^^><>v<><>><<<>>>>vv>>>^>>^v<^>v^^^v<><<<^<<<>>>>>^>vv<^v^<>^^v>vvv<>>>^v^^^v<<<<>>^^^<>v<^<<<>><>>v<^<>^><><^^^>^^<^^v^>><<^vv>^v>>^v>^^>^v>^vvv<>v^v^^<>vv^>>><>v<^><<<>^v>^v<<<^>^>^>v^v<<>^>>>>>v^>vv<<^v^v<<><^v>>vv<>>>>^vv>v^<>vv>v^vvv<><<^<^^^vv^<>^^^^<^><^<>v^>^>>vvv<<>><^vvv^<<^^<<>>>^<>>>v^^><>><<>>>>>>><>>>v<>>v^<>vv<><^^^^v^<<^<<^^>v<^vvv^v>>v>^>>v>^^><v<>vv<^v^vv><>v^>>v<^^^>^><^><>v>>>vvv>^v^<^^^^^v><>v><>v^v^vvvvv<>vv<<^<^>^^v^<<>^<^><<>v^<<^<>v<<^v>>^v<>^>>^^><>v^<^^>^<<<<>vv>^v^v<^^^><>^^<>>v^v<<^^^^v^<><^^<^^^<^v>^>^vv><<<^vvv>v<>v^vv^>>>v^v<>^v<<>^vv>v>v>v^<^>v^^<^>^^^^vv>^^><^>vv^>>^^v>><<<<^><>v<>^^^><<^>v^>^^<^>>><>>>>>^>^><>v>v^v^^><<>vv^v>v^<^<>^^<^>v>^<><<^<^<^>^>^>^^v^<<^^v^^<^<>><^>v>>^^<>^^^<<<^v<^vv>^<<<vv>>>v><>>><>>v<<<>^v>v<^>><^><>^v^>^v>^v<<><<^<>>v>^><>^>><>><^<^^>^v^^<>v^^^^<^v><>^^<<<><<<<<^^>v^vvvv>v<>>vv<^>^v^>v<^vv^v<<><v^v>^^><><^v><>>><<>^vv<>v>>v<^v>>>vv>v>^vv<<>^^vvvv<>^<^<<>^>><^v>vv^^v<<^^><<>v^^<><>^>^>^>v<^^v^^>v<>vvv<^v<<<^^><^<v<>^>v><>^^<^^^>^v<<><<><>vv>v^<>v^><><v<>v>^<<<>vv>>vvv>^^vv^v^^<^^<>v^^<>v>>^^>^>^>v>><^>><>>^<<>><^>v<<<<<<<^v^v^<><v^>v^vv<<^^vv^>>>>^<>v<^v<>v>v^vv>vv>v>>>>vv^<<<v<<<<^^>^^v^><<^v^>^^vvv^>^<>vvvv^<><>v^^^>vv><><<<^^vvv<>><<^vv^>^<^>^^^<<vv^<^<<>^>^v><^>^^>>>vv^><^^vv><>^vv><<v^>v<^v^>>^^^^>vv>>vv^><^vv^vv<<^>vv>^v^^v^v>>>^vv<>v>^^^^<^>><>^v^^^>v<^^<<^^vvvv<^>><><^>>^><^<>v<><^>v><v<^vvv^^>v>^v^v^<>v>^>>vv>><^^^vv<><><<^vv<<>><^v>v^>vvv^v^<<^>^vv^>v^>v>^<<<<>v>^>^^>^<>^>^><<<^<<^<<^>^v>>>><<<>>>>>>^<^v<^>v<>vv<><>v>>^>>^>vv^^><<^>^^<<^>v<^>>vv>^<>v><^>v>>>>>^v<^<<>vv<<><<>v<^^^^v^^<^^^<^<<^>><>v<<>v>>><>v^vv>^>^>>vv^v<^v>vv^>v^v<^>vv<<^^v><^>>^^vv<^<>>v^^>>^v>>>^>>v>v<>v<^vv><>^<<^>vv>>><><>v^><>v^>v>v><^v<>^v<<^vv^><^^>><^^^<<<^>v>^v>>><^>><^>>>^^^<^>vv<><<^<^^>>^^^v^v^v>v>>><^>>>v>^vv<<^^^<^^vv>v<<>v>><<^>^<^>^v^>v><^<^vv>v>><>^<v^>^>><^^^v^v<><<>vvv<^^><>^>vvv>>>^><<>>>^vvv^v^>v<^<^>>^>v<^>^v<<><<<^>^<^^^>vv<^^^^vv<<>vv>>><^<^<>>>^>^>>^<<<<<^^v>^>^<>vvv^^<^><^>^^v>^vv^><^><^>>>v>^v>^>^v><^>v^>^<><<><>vvvv^>^>>v<>^><^>^>^^v^v>v<>^v^><^>>v>v^><<<^>>^<>^<>>v><>>v^>^>^^<>>v^>^>vv^^vv<>v<>^v>^^><^>vv^<^v^<<^<^<><>>>^v^<<^><^>vvv<^>vv^>v<<<>^<>v><^^<>^<^><>vvvv^v^^^>v<>>><<>vvv<<^^^>v>v>>v<^^v>^><^<><<>v^^^vv<>^>^^vv>^<<^v<^v>>>^>>><^<<>^v>>^>vv<<^v>v^^v^>><<^v<<<<>v>v>v^^<^><>^^<<vv<>>>^>>v<>^<>v>v^v>^>><<^^<^^v><<vvv^vv><>><<<^<<>^<^<>>vvv<>^<>v^v<><>>v^v><<>>>vvv>v<>^>>^><^>vv<<>>v<<^><>v>>^^^>^<<>><^<<>>>><^^>vv<>^<>vvvvv^vv<>>^<<><>^^vvv>>>vv<<^^><^v^^v<>^^>^><^>v^^^^v<^<vv^^>v^vv>v><>>vv>^<^>v^v^^v>^>vv^>v^v>^^v<<^>^^<<>^><^v>>>vv^>^^>vvvv>>v<^^>>>v^<><^<^^vv^^>v^<>^^^>>><^^v>v>^<<>^vvv^>^^^>>v>^v><<><<>v<^<<>^><>^>vv>^^^v<<^v^vvv^^>^vv^<^>^>^^v>v^>^<<><<^>v>>vv^vv>>^<<^<^^<^^>v^^^<^<>^<>>^v<^vvv^^v^<><^>>>>>v><><<<>vv<^v>><<>vvv<><v^^>>^>^v>><><^^v<>><>>v^>^<<<>><><^^<>>v<><^vv<^v>^<<<>^<><^>><<>^>v>^^^v>>^<^^v>^><<><>>^>>^<^v<>^>^>vv>^vvv<^>^<<^^<>^^^^vvv<>^vv^^<^>>><>v^<><^<<^>v^^v<>>^vv<>v^^<>>v^vvvvv<>>><^>vv>v^v^^^><^>^^^^v<><^v<<>v^>v>>vv<<>^vvv>^^vv^><>>^>>^>v><>>^^v>^>^>>>^>v<^v>v>^<^^^^^>>v>v<<^>^^^>><<^><>v<>^^^vv<>^^>><<^^>v>vv>vv>v^>^v>v^^<>>><>v><>vvv^^v>^^>^vvvv^>^<>^vvvv>>><>^<^vv<>^v<^v<>^vvv<<>>>^><^^^<^^v^>v<>v^v><>>>^vvv><^vv>v^<^<^v>>v^^>^vvv^v<^<>>^<>>>^^<><^^vv<>^vv^<>>>>^^<<^^<>vv^^><>^^^^v<><><>vvv>^v^>>vv<<^v<<>>^><^>>>^<^<^^>vv^<<^<>>^^><><^^>v<^v^vv>><^^<<^>>v>v<^^^<^><^^vv>^vv<^v><^<><^^^>>^<><^>>>v^>>>>v<><^^>v<^<^>>^>vv>^^v^v^<<<<^v^><<^<><<<><<<>v>>vv><<^<^<>^^^^<>v<<<vv<>vv^^^>><>vv^><>>^vv<<><^^vv<>v^>>^<<>^v< \ No newline at end of file diff --git a/advent_of_code_2015/day3/main1.cc b/advent_of_code_2015/day3/main1.cc new file mode 100644 index 0000000..b3e69bd --- /dev/null +++ b/advent_of_code_2015/day3/main1.cc @@ -0,0 +1,53 @@ +#include +#include +#include + +using namespace std; + +class Point +{ + public: + int x; + int y; +}; + + +bool operator<(Point const &lhs, Point const &rhs) +{ + if (lhs.x == rhs.x) + return lhs.y < rhs.y; + return lhs.x < rhs.x; +} + +int main() +{ + set delivered; + Point position{0, 0}; + delivered.insert(position); + + while (!cin.eof()) + { + switch (cin.get()) + { + case '>': + ++position.x; + break; + + case '<': + --position.x; + break; + + case '^': + --position.y; + break; + + case 'v': + ++position.y; + break; + } + + delivered.insert(position); + } + + cout << "Delivered count: " << delivered.size() << "\n"; +} \ No newline at end of file diff --git a/advent_of_code_2015/day3/main2.cc b/advent_of_code_2015/day3/main2.cc new file mode 100644 index 0000000..3c457bf --- /dev/null +++ b/advent_of_code_2015/day3/main2.cc @@ -0,0 +1,56 @@ +#include +#include +#include + +using namespace std; + +class Point +{ + public: + int x; + int y; +}; + + +bool operator<(Point const &lhs, Point const &rhs) +{ + if (lhs.x == rhs.x) + return lhs.y < rhs.y; + return lhs.x < rhs.x; +} + +int main() +{ + bool robo = false; + set delivered; + Point position{0, 0}; + Point robo_position{0, 0}; + delivered.insert(position); + + while (!cin.eof()) + { + switch (cin.get()) + { + case '>': + ++(robo ? robo_position : position).x; + break; + + case '<': + --(robo ? robo_position : position).x; + break; + + case '^': + --(robo ? robo_position : position).y; + break; + + case 'v': + ++(robo ? robo_position : position).y; + break; + } + + robo = !robo; + delivered.insert(robo ? robo_position : position); + } + + cout << "Delivered count: " << delivered.size() << "\n"; +} \ No newline at end of file diff --git a/advent_of_code_2015/day4/main1.cc b/advent_of_code_2015/day4/main1.cc new file mode 100644 index 0000000..5f3e75e --- /dev/null +++ b/advent_of_code_2015/day4/main1.cc @@ -0,0 +1,24 @@ +#include +#include + +#include "md5.hpp" + +using namespace std; + +int main() +{ + + string prefix = "bgvyzdsv"; + + for (size_t idx = 0; ; ++idx) + { + string test = prefix + to_string(idx); + + string hash = md5(test); + if (hash.find_first_not_of('0') == 6) //5 for solution 1 + { + cout << test << "\n"; + return 0; + } + } +} \ No newline at end of file diff --git a/advent_of_code_2015/day4/md5.cpp b/advent_of_code_2015/day4/md5.cpp new file mode 100644 index 0000000..1afdac7 --- /dev/null +++ b/advent_of_code_2015/day4/md5.cpp @@ -0,0 +1,362 @@ +/* MD5 + converted to C++ class by Frank Thilo (thilo@unix-ag.org) + for bzflag (http://www.bzflag.org) + + based on: + + md5.h and md5.c + reference implemantion of RFC 1321 + + Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. MD5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. MD5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. + +*/ + +/* interface header */ +#include "md5.hpp" + +/* system implementation headers */ +#include + + +// Constants for MD5Transform routine. +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + +/////////////////////////////////////////////// + +// F, G, H and I are basic MD5 functions. +inline MD5::uint4 MD5::F(uint4 x, uint4 y, uint4 z) { + return x&y | ~x&z; +} + +inline MD5::uint4 MD5::G(uint4 x, uint4 y, uint4 z) { + return x&z | y&~z; +} + +inline MD5::uint4 MD5::H(uint4 x, uint4 y, uint4 z) { + return x^y^z; +} + +inline MD5::uint4 MD5::I(uint4 x, uint4 y, uint4 z) { + return y ^ (x | ~z); +} + +// rotate_left rotates x left n bits. +inline MD5::uint4 MD5::rotate_left(uint4 x, int n) { + return (x << n) | (x >> (32-n)); +} + +// FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. +// Rotation is separate from addition to prevent recomputation. +inline void MD5::FF(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) { + a = rotate_left(a+ F(b,c,d) + x + ac, s) + b; +} + +inline void MD5::GG(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) { + a = rotate_left(a + G(b,c,d) + x + ac, s) + b; +} + +inline void MD5::HH(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) { + a = rotate_left(a + H(b,c,d) + x + ac, s) + b; +} + +inline void MD5::II(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) { + a = rotate_left(a + I(b,c,d) + x + ac, s) + b; +} + +////////////////////////////////////////////// + +// default ctor, just initailize +MD5::MD5() +{ + init(); +} + +////////////////////////////////////////////// + +// nifty shortcut ctor, compute MD5 for string and finalize it right away +MD5::MD5(const std::string &text) +{ + init(); + update(text.c_str(), text.length()); + finalize(); +} + +////////////////////////////// + +void MD5::init() +{ + finalized=false; + + count[0] = 0; + count[1] = 0; + + // load magic initialization constants. + state[0] = 0x67452301; + state[1] = 0xefcdab89; + state[2] = 0x98badcfe; + state[3] = 0x10325476; +} + +////////////////////////////// + +// decodes input (unsigned char) into output (uint4). Assumes len is a multiple of 4. +void MD5::decode(uint4 output[], const uint1 input[], size_type len) +{ + for (unsigned int i = 0, j = 0; j < len; i++, j += 4) + output[i] = ((uint4)input[j]) | (((uint4)input[j+1]) << 8) | + (((uint4)input[j+2]) << 16) | (((uint4)input[j+3]) << 24); +} + +////////////////////////////// + +// encodes input (uint4) into output (unsigned char). Assumes len is +// a multiple of 4. +void MD5::encode(uint1 output[], const uint4 input[], size_type len) +{ + for (size_type i = 0, j = 0; j < len; i++, j += 4) { + output[j] = input[i] & 0xff; + output[j+1] = (input[i] >> 8) & 0xff; + output[j+2] = (input[i] >> 16) & 0xff; + output[j+3] = (input[i] >> 24) & 0xff; + } +} + +////////////////////////////// + +// apply MD5 algo on a block +void MD5::transform(const uint1 block[blocksize]) +{ + uint4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; + decode (x, block, blocksize); + + /* Round 1 */ + FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ + GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ + HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ + HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ + II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + // Zeroize sensitive information. + memset(x, 0, sizeof x); +} + +////////////////////////////// + +// MD5 block update operation. Continues an MD5 message-digest +// operation, processing another message block +void MD5::update(const unsigned char input[], size_type length) +{ + // compute number of bytes mod 64 + size_type index = count[0] / 8 % blocksize; + + // Update number of bits + if ((count[0] += (length << 3)) < (length << 3)) + count[1]++; + count[1] += (length >> 29); + + // number of bytes we need to fill in buffer + size_type firstpart = 64 - index; + + size_type i; + + // transform as many times as possible. + if (length >= firstpart) + { + // fill buffer first, transform + memcpy(&buffer[index], input, firstpart); + transform(buffer); + + // transform chunks of blocksize (64 bytes) + for (i = firstpart; i + blocksize <= length; i += blocksize) + transform(&input[i]); + + index = 0; + } + else + i = 0; + + // buffer remaining input + memcpy(&buffer[index], &input[i], length-i); +} + +////////////////////////////// + +// for convenience provide a verson with signed char +void MD5::update(const char input[], size_type length) +{ + update((const unsigned char*)input, length); +} + +////////////////////////////// + +// MD5 finalization. Ends an MD5 message-digest operation, writing the +// the message digest and zeroizing the context. +MD5& MD5::finalize() +{ + static unsigned char padding[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + + if (!finalized) { + // Save number of bits + unsigned char bits[8]; + encode(bits, count, 8); + + // pad out to 56 mod 64. + size_type index = count[0] / 8 % 64; + size_type padLen = (index < 56) ? (56 - index) : (120 - index); + update(padding, padLen); + + // Append length (before padding) + update(bits, 8); + + // Store state in digest + encode(digest, state, 16); + + // Zeroize sensitive information. + memset(buffer, 0, sizeof buffer); + memset(count, 0, sizeof count); + + finalized=true; + } + + return *this; +} + +////////////////////////////// + +// return hex representation of digest as string +std::string MD5::hexdigest() const +{ + if (!finalized) + return ""; + + char buf[33]; + for (int i=0; i<16; i++) + sprintf(buf+i*2, "%02x", digest[i]); + buf[32]=0; + + return std::string(buf); +} + +////////////////////////////// + +std::ostream& operator<<(std::ostream& out, MD5 md5) +{ + return out << md5.hexdigest(); +} + +////////////////////////////// + +std::string md5(const std::string str) +{ + MD5 md5 = MD5(str); + + return md5.hexdigest(); +} \ No newline at end of file diff --git a/advent_of_code_2015/day4/md5.hpp b/advent_of_code_2015/day4/md5.hpp new file mode 100644 index 0000000..443895d --- /dev/null +++ b/advent_of_code_2015/day4/md5.hpp @@ -0,0 +1,93 @@ +/* MD5 + converted to C++ class by Frank Thilo (thilo@unix-ag.org) + for bzflag (http://www.bzflag.org) + + based on: + + md5.h and md5.c + reference implementation of RFC 1321 + + Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. MD5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. MD5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. + +*/ + +#ifndef BZF_MD5_H +#define BZF_MD5_H + +#include +#include + + +// a small class for calculating MD5 hashes of strings or byte arrays +// it is not meant to be fast or secure +// +// usage: 1) feed it blocks of uchars with update() +// 2) finalize() +// 3) get hexdigest() string +// or +// MD5(std::string).hexdigest() +// +// assumes that char is 8 bit and int is 32 bit +class MD5 +{ +public: + typedef unsigned int size_type; // must be 32bit + + MD5(); + MD5(const std::string& text); + void update(const unsigned char *buf, size_type length); + void update(const char *buf, size_type length); + MD5& finalize(); + std::string hexdigest() const; + friend std::ostream& operator<<(std::ostream&, MD5 md5); + +private: + void init(); + typedef unsigned char uint1; // 8bit + typedef unsigned int uint4; // 32bit + enum {blocksize = 64}; // VC6 won't eat a const static int here + + void transform(const uint1 block[blocksize]); + static void decode(uint4 output[], const uint1 input[], size_type len); + static void encode(uint1 output[], const uint4 input[], size_type len); + + bool finalized; + uint1 buffer[blocksize]; // bytes that didn't fit in last 64 byte chunk + uint4 count[2]; // 64bit counter for number of bits (lo, hi) + uint4 state[4]; // digest so far + uint1 digest[16]; // the result + + // low level logic operations + static inline uint4 F(uint4 x, uint4 y, uint4 z); + static inline uint4 G(uint4 x, uint4 y, uint4 z); + static inline uint4 H(uint4 x, uint4 y, uint4 z); + static inline uint4 I(uint4 x, uint4 y, uint4 z); + static inline uint4 rotate_left(uint4 x, int n); + static inline void FF(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); + static inline void GG(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); + static inline void HH(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); + static inline void II(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); +}; + +std::string md5(const std::string str); + +#endif \ No newline at end of file diff --git a/advent_of_code_2015/day5/input.in b/advent_of_code_2015/day5/input.in new file mode 100644 index 0000000..17f709f --- /dev/null +++ b/advent_of_code_2015/day5/input.in @@ -0,0 +1,1000 @@ +zgsnvdmlfuplrubt +vlhagaovgqjmgvwq +ffumlmqwfcsyqpss +zztdcqzqddaazdjp +eavfzjajkjesnlsb +urrvucyrzzzooxhx +xdwduffwgcptfwad +orbryxwrmvkrsxsr +jzfeybjlgqikjcow +mayoqiswqqryvqdi +iiyrkoujhgpgkcvx +egcgupjkqwfiwsjl +zbgtglaqqolttgng +eytquncjituzzhsx +dtfkgggvqadhqbwb +zettygjpcoedwyio +rwgwbwzebsnjmtln +esbplxhvzzgawctn +vnvshqgmbotvoine +wflxwmvbhflkqxvo +twdjikcgtpvlctte +minfkyocskvgubvm +sfxhhdhaopajbzof +sofkjdtalvhgwpql +uqfpeauqzumccnrc +tdflsbtiiepijanf +dhfespzrhecigzqb +xobfthcuuzhvhzpn +olgjglxaotocvrhw +jhkzpfcskutwlwge +zurkakkkpchzxjhq +hekxiofhalvmmkdl +azvxuwwfmjdpjskj +arsvmfznblsqngvb +ldhkzhejofreaucc +adrphwlkehqkrdmo +wmveqrezfkaivvaw +iyphmphgntinfezg +blomkvgslfnvspem +cgpaqjvzhbumckwo +ydhqjcuotkeyurpx +sbtzboxypnmdaefr +vxrkhvglynljgqrg +ttgrkjjrxnxherxd +hinyfrjdiwytetkw +sufltffwqbugmozk +tohmqlzxxqzinwxr +jbqkhxfokaljgrlg +fvjeprbxyjemyvuq +gmlondgqmlselwah +ubpwixgxdloqnvjp +lxjfhihcsajxtomj +qouairhvrgpjorgh +nloszcwcxgullvxb +myhsndsttanohnjn +zjvivcgtjwenyilz +qaqlyoyouotsmamm +tadsdceadifqthag +mafgrbmdhpnlbnks +aohjxahenxaermrq +ovvqestjhbuhrwlr +lnakerdnvequfnqb +agwpwsgjrtcjjikz +lhlysrshsmzryzes +xopwzoaqtlukwwdu +xsmfrfteyddrqufn +ohnxbykuvvlbbxpf +bbdlivmchvzfuhoc +vtacidimfcfyobhf +tinyzzddgcnmiabd +tcjzxftqcqrivqhn +vgnduqyfpokbmzim +revkvaxnsxospyow +ydpgwxxoxlywxcgi +wzuxupbzlpzmikel +nscghlafavnsycjh +xorwbquzmgmcapon +asmtiycegeobfxrn +eqjzvgkxgtlyuxok +mmjrskloposgjoqu +gceqosugbkvytfto +khivvoxkvhrgwzjl +qtmejuxbafroifjt +ttmukbmpoagthtfl +bxqkvuzdbehtduwv +gvblrpzjylanoggj +cltewhyjxdbmbtqj +fbkgedqvomdipklj +uxvuplhenqawfcjt +fkdjmayiawdkycva +gnloqfgbnibzyidh +kyzorvtopjiyyyqg +drckpekhpgrioblt +tvhrkmbnpmkkrtki +khaldwntissbijiz +aoojqakosnaxosom +xfptccznbgnpfyqw +moqdwobwhjxhtrow +chfwivedutskovri +gprkyalfnpljcrmi +pwyshpwjndasykst +xuejivogihttzimd +bugepxgpgahtsttl +zufmkmuujavcskpq +urybkdyvsrosrfro +isjxqmlxwtqmulbg +pxctldxgqjqhulgz +hclsekryiwhqqhir +hbuihpalwuidjpcq +ejyqcxmfczqfhbxa +xljdvbucuxnnaysv +irqceqtqwemostbb +anfziqtpqzqdttnz +cgfklbljeneeqfub +zudyqkuqqtdcpmuo +iuvhylvznmhbkbgg +mpgppmgfdzihulnd +argwmgcvqqkxkrdi +pdhrfvdldkfihlou +cbvqnjrvrsnqzfob +lkvovtsqanohzcmm +vxoxjdyoylqcnyzt +kurdpaqiaagiwjle +gwklwnazaxfkuekn +rbaamufphjsjhbdl +tzbrvaqvizhsisbd +pbcqlbfjvlideiub +hiwoetbfywaeddtx +fjirczxtuupfywyf +omeoegeyyospreem +ozbbpupqpsskvrjh +pzvcxkvjdiyeyhxa +odclumkenabcsfzr +npdyqezqdjqaszvm +yodkwzmrhtexfrqa +rjcmmggjtactfrxz +mioxfingsfoimual +aqskaxjjborspfaa +wientdsttkevjtkf +tdaswkzckmxnfnct +voucjhzvkkhuwoqk +boaaruhalgaamqmh +iufzxutxymorltvb +pfbyvbayvnrpijpo +obztirulgyfthgcg +ntrenvhwxypgtjwy +ephlkipjfnjfjrns +pkjhurzbmobhszpx +gqbnjvienzqfbzvj +wjelolsrbginwnno +votanpqpccxqricj +bxyuyiglnmbtvehi +qyophcjfknbcbjrb +anoqkkbcdropskhj +tcnyqaczcfffkrtl +rsvqimuqbuddozrf +meppxdrenexxksdt +tyfhfiynzwadcord +wayrnykevdmywycf +mhowloqnppswyzbu +tserychksuwrgkxz +xycjvvsuaxsbrqal +fkrdsgaoqdcqwlpn +vrabcmlhuktigecp +xgxtdsvpaymzhurx +ciabcqymnchhsxkc +eqxadalcxzocsgtr +tsligrgsjtrnzrex +qeqgmwipbspkbbfq +vzkzsjujltnqwliw +ldrohvodgbxokjxz +jkoricsxhipcibrq +qzquxawqmupeujrr +mizpuwqyzkdbahvk +suupfxbtoojqvdca +ywfmuogvicpywpwm +uevmznxmsxozhobl +vjbyhsemwfwdxfxk +iyouatgejvecmtin +tcchwpuouypllcxe +lgnacnphdiobdsef +uoxjfzmdrmpojgbf +lqbxsxbqqhpjhfxj +knpwpcnnimyjlsyz +fezotpoicsrshfnh +dkiwkgpmhudghyhk +yzptxekgldksridv +pckmzqzyiyzdbcts +oqshafncvftvwvsi +yynihvdywxupqmbt +iwmbeunfiuhjaaic +pkpkrqjvgocvaxjs +ieqspassuvquvlyz +xshhahjaxjoqsjtl +fxrrnaxlqezdcdvd +pksrohfwlaqzpkdd +ravytrdnbxvnnoyy +atkwaifeobgztbgo +inkcabgfdobyeeom +ywpfwectajohqizp +amcgorhxjcybbisv +mbbwmnznhafsofvr +wofcubucymnhuhrv +mrsamnwvftzqcgta +tlfyqoxmsiyzyvgv +ydceguvgotylwtea +btyvcjqhsygunvle +usquiquspcdppqeq +kifnymikhhehgote +ybvkayvtdpgxfpyn +oulxagvbavzmewnx +tvvpekhnbhjskzpj +azzxtstaevxurboa +nfmwtfgrggmqyhdf +ynyzypdmysfwyxgr +iaobtgubrcyqrgmk +uyxcauvpyzabbzgv +fbasfnwiguasoedc +mgmjoalkbvtljilq +szgkxiqkufdvtksb +xgfzborpavdmhiuj +hmuiwnsonvfgcrva +zolcffdtobfntifb +mvzgcsortkugvqjr +pbbpgraaldqvzwhs +zvsxegchksgnhpuv +kdpdboaxsuxfswhx +jdfggigejfupabth +tpeddioybqemyvqz +mxsntwuesonybjby +tzltdsiojfvocige +ubtdrneozoejiqrv +fusyucnhncoxqzql +nlifgomoftdvkpby +pyikzbxoapffbqjw +hzballplvzcsgjug +ymjyigsfehmdsvgz +vpqgyxknniunksko +ffkmaqsjxgzclsnq +jcuxthbedplxhslk +ymlevgofmharicfs +nyhbejkndhqcoisy +rjntxasfjhnlizgm +oqlnuxtzhyiwzeto +tntthdowhewszitu +rmxyoceuwhsvfcua +qpgsjzwenzbxyfgw +sumguxpdkocyagpu +ymfrbxwrawejkduu +hetgrtmojolbmsuf +qzqizpiyfasgttex +qnmoemcpuckzsshx +ddyqiihagcmnxccu +oirwxyfxxyktgheo +phpaoozbdogbushy +uctjdavsimsrnvjn +aurbbphvjtzipnuh +hpbtrubopljmltep +pyyvkthqfsxqhrxg +jdxaiqzkepxbfejk +ukgnwbnysrzvqzlw +lfkatkvcssnlpthd +ucsyecgshklhqmsc +rwdcbdchuahkvmga +rxkgqakawgpwokum +hbuyxeylddfgorgu +tbllspqozaqzglkz +rqfwizjlbwngdvvi +xuxduyzscovachew +kouiuxckkvmetvdy +ycyejrpwxyrweppd +trctlytzwiisjamx +vtvpjceydunjdbez +gmtlejdsrbfofgqy +jgfbgtkzavcjlffj +tyudxlpgraxzchdk +gyecxacqitgozzgd +rxaocylfabmmjcvt +tornfzkzhjyofzqa +kocjcrqcsvagmfqv +zfrswnskuupivzxb +cunkuvhbepztpdug +pmpfnmklqhcmrtmf +tfebzovjwxzumxap +xpsxgaswavnzkzye +lmwijdothmxclqbr +upqxhmctbltxkarl +axspehytmyicthmq +xdwrhwtuooikehbk +tpggalqsytvmwerj +jodysbwnymloeqjf +rxbazvwuvudqlydn +ibizqysweiezhlqa +uexgmotsqjfauhzp +ldymyvumyhyamopg +vbxvlvthgzgnkxnf +pyvbrwlnatxigbrp +azxynqididtrwokb +lwafybyhpfvoawto +ogqoivurfcgspytw +cinrzzradwymqcgu +sgruxdvrewgpmypu +snfnsbywuczrshtd +xfzbyqtyxuxdutpw +fmpvjwbulmncykbo +ljnwoslktrrnffwo +ceaouqquvvienszn +yjomrunrxjyljyge +xpmjsapbnsdnbkdi +uetoytptktkmewre +eixsvzegkadkfbua +afaefrwhcosurprw +bwzmmvkuaxiymzwc +gejyqhhzqgsrybni +gjriqsfrhyguoiiw +gtfyomppzsruhuac +ogemfvmsdqqkfymr +jgzbipsygirsnydh +zghvlhpjnvqmocgr +ngvssuwrbtoxtrka +ietahyupkbuisekn +gqxqwjizescbufvl +eiprekzrygkncxzl +igxfnxtwpyaamkxf +soqjdkxcupevbren +fspypobyzdwstxak +qstcgawvqwtyyidf +gsccjacboqvezxvd +bfsblokjvrqzphmc +srezeptvjmncqkec +opmopgyabjjjoygt +msvbufqexfrtecbf +uiaqweyjiulplelu +pbkwhjsibtwjvswi +xwwzstmozqarurrq +nytptwddwivtbgyq +ejxvsufbzwhzpabr +jouozvzuwlfqzdgh +gfgugjihbklbenrk +lwmnnhiuxqsfvthv +bzvwbknfmaeahzhi +cgyqswikclozyvnu +udmkpvrljsjiagzi +zzuhqokgmisguyna +ekwcdnjzuctsdoua +eueqkdrnzqcaecyd +lnibwxmokbxhlris +fdrbftgjljpzwhea +iabvuhhjsxmqfwld +qgogzkynrgejakta +mfcqftytemgnpupp +klvhlhuqhosvjuqk +gdokmxcgoqvzvaup +juududyojcazzgvr +fyszciheodgmnotg +yfpngnofceqfvtfs +cahndkfehjumwavc +dxsvscqukljxcqyi +cqukcjtucxwrusji +vevmmqlehvgebmid +ahswsogfrumzdofy +ftasbklvdquaxhxb +tsdeumygukferuif +ybfgbwxaaitpwryg +djyaoycbymezglio +trzrgxdjqnmlnzpn +rumwchfihhihpqui +ffrvnsgrnzemksif +oizlksxineqknwzd +cirqcprftpjzrxhk +zrhemeqegmzrpufd +kqgatudhxgzlgkey +syjugymeajlzffhq +nlildhmgnwlopohp +flcszztfbesqhnyz +ohzicmqsajyqptrw +ebyszucgozsjbelq +enxbgvvcuqeloxud +ubwnvecbsmhkxwuk +noifliyxvlkqphbo +hazlqpetgugxxsiz +ihdzoerqwqhgajzb +ivrdwdquxzhdrzar +synwycdvrupablib +mqkdjkntblnmtvxj +qmmvoylxymyovrnq +pjtuxskkowutltlq +gchrqtloggkrjciz +namzqovvsdipazae +yfokqhkmakyjzmys +iapxlbuoiwqfnozm +fbcmlcekgfdurqxe +ednzgtczbplwxjlq +gdvsltzpywffelsp +oaitrrmpqdvduqej +gseupzwowmuuibjo +dfzsffsqpaqoixhh +tclhzqpcvbshxmgx +cfqkptjrulxiabgo +iraiysmwcpmtklhf +znwjlzodhktjqwlm +lcietjndlbgxzjht +gdkcluwjhtaaprfo +vbksxrfznjzwvmmt +vpfftxjfkeltcojl +thrmzmeplpdespnh +yafopikiqswafsit +xxbqgeblfruklnhs +qiufjijzbcpfdgig +ikksmllfyvhyydmi +sknufchjdvccccta +wpdcrramajdoisxr +grnqkjfxofpwjmji +lkffhxonjskyccoh +npnzshnoaqayhpmb +fqpvaamqbrnatjia +oljkoldhfggkfnfc +ihpralzpqfrijynm +gvaxadkuyzgbjpod +onchdguuhrhhspen +uefjmufwlioenaus +thifdypigyihgnzo +ugqblsonqaxycvkg +yevmbiyrqdqrmlbw +bvpvwrhoyneorcmm +gbyjqzcsheaxnyib +knhsmdjssycvuoqf +nizjxiwdakpfttyh +nwrkbhorhfqqoliz +ynsqwvwuwzqpzzwp +yitscrgexjfclwwh +dhajwxqdbtrfltzz +bmrfylxhthiaozpv +frvatcvgknjhcndw +xlvtdmpvkpcnmhya +pxpemuzuqzjlmtoc +dijdacfteteypkoq +knrcdkrvywagglnf +fviuajtspnvnptia +xvlqzukmwbcjgwho +bazlsjdsjoeuvgoz +nslzmlhosrjarndj +menvuwiuymknunwm +uavfnvyrjeiwqmuu +yrfowuvasupngckz +taevqhlrcohlnwye +skcudnogbncusorn +omtnmkqnqedsajfv +yqmgsqdgsuysqcts +odsnbtyimikkbmdd +vuryaohxdvjllieb +dhaxldeywwsfamlo +opobvtchezqnxpak +pzfnegouvsrfgvro +rzkcgpxdslzrdktu +ksztdtqzxvhuryam +ctnqnhkcooqipgkh +pyqbbvrzdittqbgm +koennvmolejeftij +rvzlreqikqlgyczj +xrnujfoyhonzkdgd +mmsmhkxaiqupfjil +ypjwoemqizddvyfd +qgugcxnbhvgahykj +cviodlsrtimbkgmy +xbfbbechhmrjxhnw +psuipaoucfczfxkp +hdhwcpeuptgqqvim +gsxlruhjeaareilr +vgyqonnljuznyrhk +eewezahlumervpyu +iiolebrxfadtnigy +tdadlrodykrdfscn +ocvdtzjxrhtjurpo +gidljbuvuovkhhrf +qwfcpilbjwzboohd +xzohxonlezuiupbg +vslpbkkqgvgbcbix +pivzqrzfxosbstzn +fyqcfboevcqmbhhs +yqsrneacnlxswojx +heicqpxxyrwcbsjz +yzynmnnoumkmlbeh +bncadbjdvvmczylw +hlnjskgfzbgmigfn +fphpszymugpcykka +zbifcktanxpmufvy +saklpkhoyfeqbguy +nqtqfcfxmpivnjyo +locygrwerxlsvzqm +qqflecydqvlogjme +njklmixvgkzpgppf +ugzkpjwjflaswyma +lriousvkbeftslcy +nsvsauxzfbbotgmh +tblcpuhjyybrlica +hqwshxcilwtmxrsf +xojwroydfeoqupup +tikuzsrogpnohpib +layenyqgxdfggloc +nqsvjvbrpuxkqvmq +ivchgxkdlfjdzxmk +uoghiuosiiwiwdws +twsgsfzyszsfinlc +waixcmadmhtqvcmd +zkgitozgrqehtjkw +xbkmyxkzqyktmpfi +qlyapfmlybmatwxn +ntawlvcpuaebuypf +clhebxqdkcyndyof +nrcxuceywiklpemc +lmurgiminxpapzmq +obalwqlkykzflxou +huvcudpiryefbcye +zlxbddpnyuyapach +gqfwzfislmwzyegy +jhynkjtxedmemlob +hmrnvjodnsfiukex +pstmikjykzyavfef +wuwpnscrwzsyalyt +hksvadripgdgwynm +tvpfthzjleqfxwkh +xpmrxxepkrosnrco +qjkqecsnevlhqsly +jjnrfsxzzwkhnwdm +pehmzrzsjngccale +bsnansnfxduritrr +ejzxkefwmzmbxhlb +pceatehnizeujfrs +jtidrtgxopyeslzl +sytaoidnamfwtqcr +iabjnikomkgmyirr +eitavndozoezojsi +wtsbhaftgrbqfsmm +vvusvrivsmhtfild +qifbtzszfyzsjzyx +ifhhjpaqatpbxzau +etjqdimpyjxiuhty +fvllmbdbsjozxrip +tjtgkadqkdtdlkpi +xnydmjleowezrecn +vhcbhxqalroaryfn +scgvfqsangfbhtay +lbufpduxwvdkwhmb +tshipehzspkhmdoi +gtszsebsulyajcfl +dlrzswhxajcivlgg +kgjruggcikrfrkrw +xxupctxtmryersbn +hljjqfjrubzozxts +giaxjhcwazrenjzs +tyffxtpufpxylpye +jfugdxxyfwkzqmgv +kbgufbosjghahacw +xpbhhssgegmthwxb +npefofiharjypyzk +velxsseyxuhrpycy +sglslryxsiwwqzfw +susohnlpelojhklv +lfnpqfvptqhogdmk +vtcrzetlekguqyle +jlyggqdtamcjiuxn +olxxqfgizjmvigvl +cyypypveppxxxfuq +hewmxtlzfqoqznwd +jzgxxybfeqfyzsmp +xzvvndrhuejnzesx +esiripjpvtqqwjkv +xnhrwhjtactofwrd +knuzpuogbzplofqx +tihycsdwqggxntqk +xkfywvvugkdalehs +cztwdivxagtqjjel +dsaslcagopsbfioy +gmowqtkgrlqjimbl +ctcomvdbiatdvbsd +gujyrnpsssxmqjhz +nygeovliqjfauhjf +mmgmcvnuppkbnonz +bhipnkoxhzcotwel +wkwpgedgxvpltqid +mliajvpdocyzcbot +kqjhsipuibyjuref +zqdczykothbgxwsy +koirtljkuqzxioaz +audpjvhmqzvhzqas +cxyhxlhntyidldfx +iasgocejboxjgtkx +abehujmqotwcufxp +fmlrzqmazajxeedl +knswpkekbacuxfby +yvyalnvrxgstqhxm +sjnrljfrfuyqfwuw +ssaqruwarlvxrqzm +iaxbpeqqzlcwfqjz +uwyxshjutkanvvsc +uxwrlwbblcianvnb +nodtifgrxdojhneh +mloxjfusriktxrms +lkfzrwulbctupggc +gcrjljatfhitcgfj +tkdfxeanwskaivqs +ypyjxqtmitwubbgt +ssxbygzbjsltedjj +zdrsnoorwqfalnha +xlgmissaiqmowppd +azhbwhiopwpguiuo +fydlahgxtekbweet +qtaveuqpifprdoiy +kpubqyepxqleucem +wlqrgqmnupwiuory +rwyocktuqkuhdwxz +abzjfsdevoygctqv +zsofhaqqghncmzuw +lqbjwjqxqbfgdckc +bkhyxjkrqbbunido +yepxfjnnhldidsjb +builayfduxbppafc +wedllowzeuswkuez +gverfowxwtnvgrmo +tpxycfumxdqgntwf +lqzokaoglwnfcolw +yqsksyheyspmcdqt +vufvchcjjcltwddl +saeatqmuvnoacddt +dxjngeydvsjbobjs +ucrcxoakevhsgcep +cajgwjsfxkasbayt +hknzmteafsfemwuv +xxwhxwiinchqqudr +usfenmavvuevevgr +kxcobcwhsgyizjok +vhqnydeboeunnvyk +bgxbwbxypnxvaacw +bwjzdypacwgervgk +rrioqjluawwwnjcr +fiaeyggmgijnasot +xizotjsoqmkvhbzm +uzphtrpxwfnaiidz +kihppzgvgyoncptg +hfbkfrxwejdeuwbz +zgqthtuaqyrxicdy +zitqdjnnwhznftze +jnzlplsrwovxlqsn +bmwrobuhwnwivpca +uuwsvcdnoyovxuhn +nmfvoqgoppoyosaj +hxjkcppaisezygpe +icvnysgixapvtoos +vbvzajjgrmjygkhu +jinptbqkyqredaos +dpmknzhkhleawfvz +ouwwkfhcedsgqqxe +owroouiyptrijzgv +bewnckpmnbrmhfyu +evdqxevdacsbfbjb +catppmrovqavxstn +dqsbjibugjkhgazg +mkcldhjochtnvvne +sblkmhtifwtfnmsx +lynnaujghehmpfpt +vrseaozoheawffoq +ytysdzbpbazorqes +sezawbudymfvziff +vrlfhledogbgxbau +bipdlplesdezbldn +ermaenjunjtbekeo +eyaedubkthdecxjq +gbzurepoojlwucuy +rsiaqiiipjlouecx +beqjhvroixhiemtw +buzlowghhqbcbdwv +ldexambveeosaimo +fpyjzachgrhxcvnx +komgvqejojpnykol +fxebehjoxdujwmfu +jnfgvheocgtvmvkx +qmcclxxgnclkuspx +rsbelzrfdblatmzu +vexzwqjqrsenlrhm +tnfbkclwetommqmh +lzoskleonvmprdri +nnahplxqscvtgfwi +ubqdsflhnmiayzrp +xtiyqxhfyqonqzrn +omdtmjeqhmlfojfr +cnimgkdbxkkcnmkb +tapyijgmxzbmqnks +byacsxavjboovukk +awugnhcrygaoppjq +yxcnwrvhojpuxehg +btjdudofhxmgqbao +nzqlfygiysfuilou +nubwfjdxavunrliq +vqxmmhsbmhlewceh +ygavmcybepzfevrp +kgflmrqsvxprkqgq +iaqyqmcaedscmakk +cvbojnbfmrawxzkh +jjjrprbnlijzatuw +lcsudrrfnnggbrmk +qzgxbiavunawfibc +gnnalgfvefdfdwwg +nokmiitzrigxavsc +etzoxwzxqkkhvais +urxxfacgjccieufi +lqrioqhuvgcotuec +dydbaeyoypsbftra +hhrotenctylggzaf +evctqvzjnozpdxzu +tbpvithmorujxlcp +pllbtcbrtkfpvxcw +fzyxdqilyvqreowv +xdleeddxwvqjfmmt +fcldzthqqpbswoin +sgomzrpjfmvgwlzi +axjyskmtdjbxpwoz +hcvaevqxsmabvswh +lfdlsfcwkwicizfk +isjbwpzdognhoxvm +oqnexibqxlyxpluh +zqfbgodsfzwgcwuf +kvmnwruwsjllbldz +kghazimdyiyhmokj +uiktgpsxpoahofxn +zkdwawxargcmidct +ftbixlyiprshrjup +nofhmbxififwroeg +mcdaqrhplffxrcdt +fbjxnwojcvlawmlb +rizoftvwfdhiwyac +eduogrtyhxfwyars +zoikunqxgjwfqqwr +zxwbbpmvctzezaqh +nghujwyeabwdqnop +vcxamijpoyyksogn +jnckdbuteoqlsdae +jurfqqawafmsiqwv +inepmztrzehfafie +tznzkyvzodbrtscf +xewbavjeppflwscl +ucndzsorexjlnplo +jpxbctscngxgusvu +mfmygcllauzuoaok +oibkuxhjmhxhhzby +zjkslwagmeoisunw +avnnxmopdgvmukuu +jmaargejcwboqhkt +yacmpeosarsrfkrv +iqhgupookcaovwgh +ebjkdnxwtikqzufc +imdhbarytcscbsvb +ifyibukeffkbqvcr +aloighmyvwybtxhx +yszqwrutbkiwkxjg +xyholyzlltjhsuhp +gykhmrwucneoxcrf +badkdgqrpjzbabet +sunaucaucykwtkjj +pumqkglgfdhneero +usgtyuestahlydxq +xmfhflphzeudjsjm +knywgmclisgpootg +mtojnyrnvxtweuzb +uuxufbwfegysabww +vobhwwocqttlbsik +yuydfezeqgqxqmnd +wbqgqkwbibiilhzc +sfdmgxsbuzsawush +ilhbxcfgordyxwvp +ahqoavuysblnqaeg +plwgtvpgotskmsey +ewjcmzkcnautrrmp +tyekgzbznlikcyqj +bqzctiuaxpriuiga +bimvbfjkiupyqiys +mpqtbcxfhwymxncw +htemlptvqhharjgb +mqbsmsruwzzxgcxc +zjyedjwhnvteuaid +pzoelkoidwglpttc +efydnsvlfimvwxhx +gfyhgoeiyjcgfyze +deqtomhwopmzvjlt +casafubtkoopuaju +yylsfarntbucfulg +mgjwsormkjsrrxan +lkkenpupgmjpnqqd +tegweszyohsoluot +lihsfdwxmxvwdxna +rrefrjjxerphejwb +guuazonjoebhymtm +ysofqzmfmyneziki +lmjgaliatcpduoal +qzthcpjwtgahbebr +wvakvephyukmpemm +simxacxxzfoaeddw +aetgqmiqzxbvbviz +jxlmhdmqggevrxes +mmuglnjmuddzgaik +svopsqhtrslgycgc +xnvcsiiqrcjkvecn +kkvumxtvashxcops +bduflsdyeectvcgl +vfrxbwmmytjvqnsj +eeqtdneiyiaiofxw +crtbgknfacjtwkfl +uuutuoxdsxolpbhd +lcrztwzreaswovtn +htorkvnvujmjdqzj +wttzuzvrzlyhfzyf +oraewznfwgdsnhuk +rctlkqqvkwbgrcgk +cfehrsrqhzyiwtmz +kbvxwcumjkhvjpui +xxlocexbmniiakfo +gtknkkzvykmlqghl +kcjuxvkuimhwqrtk +vohekwkuyuoacuww +vorctgughscysyfo +zmjevqplngzswxyq +qhswdrhrijnatkyo +joakcwpfggtitizs +juzlwjijcmtswdtq +icbyaqohpkemhkip +rpdxgpzxncedmvzh +rozkmimbqhbhcddv +wkkypomlvyglpfpf +jcaqyaqvsefwtaya +ghvmtecoxlebdwnf +lqrcyiykkkpkxvqt +eqlarfazchmzotev +vqwndafvmpguggef +dbfxzrdkkrusmdke +cmjpjjgndozcmefj +hbrdcwjuyxapyhlo +mmforetykbosdwce +zynfntqwblbnfqik +sodwujfwlasznaiz +yyvrivjiqnxzqkfp +uldbskmmjbqllpnm +fyhhrmrsukeptynl +hpfjekktvdkgdkzl +bozhkoekcxzeorob +uvpptyfrzkvmtoky +hkhfprmjdpjvfkcb +igxzwktwsqhsivqu +qceomwysgkcylipb +cglateoynluyeqgc +xcsdfkpeguxgvpfh +owjhxlcncdgkqyia +rpbmrpcesiakqpna +lueszxiourxsmezb +zelvsowimzkxliwc +vzxbttoobtvdtkca +pfxvzphzwscqkzsi +edsjorainowytbzu +ipsegdaluoiphmnz +mkhueokfpemywvuw +urxdnumhylpafdlc +ggluurzavsxkvwkl +ctclphidqgteakox +tfobosynxsktajuk +jzrmemhxqmzhllif +eemwekimdfvqslsx +yjkwpzrbanoaajgq +rlxghzanuyeimfhx +hozbgdoorhthlqpv +obkbmflhyanxilnx +xojrippyxjmpzmsz +ukykmbfheixuviue +qivlmdexwucqkres +rmyxxipqkarpjmox +fgaftctbvcvnrror +raawxozucfqvasru +dinpjbdfjfizexdh +gybxubwnnbuyvjcr +qrqitdvyoneqyxcg +jqzcfggayzyoqteo +cikqpvxizpdbmppm +stfpldgyhfmucjjv +slzbcuihmimpduri +aufajwfrsorqqsnl +iylmzraibygmgmqj +lcdyfpcqlktudfmu +pmomzzsdpvgkkliw +zpplirgtscfhbrkj +mvhyerxfiljlotjl +ofkvrorwwhusyxjx +xngzmvcgkqfltjpe +yxfxaqipmysahqqq +sdqafdzgfdjuabup +qcqajmerahcdgxfv +xqimrqtupbapawro +qfvkqwidzzrehsbl +himixxvueksiqfdf +vgtfqpuzxxmhrvvd +adiioqeiejguaost +jnzxuycjxvxehbvm +xedbpxdhphamoodk +jsrioscmwlsfuxrg +mtsynnfxunuohbnf +enamqzfzjunnnkpe +uwcvfecunobyhces +ciygixtgbsccpftq +ewjgcronizkcsfjy +wztjkoipxsikoimv +jrgalyvfelwxforw +imylyalawbqwkrwb +yflwqfnuuvgjsgcj +wkysyzusldlojoue +zopllxnidcffcuau +bscgwxuprxaerskj +zvnvprxxjkhnkkpq +nejwxbhjxxdbenid +chryiccsebdbcnkc +guoeefaeafhlgvxh +nzapxrfrrqhsingx +mkzvquzvqvwsejqs +kozmlmbchydtxeeo +keylygnoqhmfzrfp +srwzoxccndoxylxe +uqjzalppoorosxxo +potmkinyuqxsfdfw +qkkwrhpbhypxhiun +wgfvnogarjmdbxyh +gkidtvepcvxopzuf +atwhvmmdvmewhzty +pybxizvuiwwngqej +zfumwnazxwwxtiry +keboraqttctosemx +vtlzxaqdetbhclib +wjiecykptzexuayl +ejatfnyjjdawepyk +mpcrobansyssvmju +gqukndzganeueabm +ukzscvomorucdnqd +wfydhtbzehgwfazx +mtwqdzlephqvxqmx +dltmlfxbjopefibh +atcfrowdflluqtbi +vowawlophlxaqonw +vblgdjzvwnocdipw +uzerzksmkvnlvlhm +ytjwhpaylohorvxd +siprvfxvnxcdgofz +cbhjupewcyjhvtgs +apqtozaofusmfqli +tmssrtlxfouowqnr +ntutrvwnzzgmokes +zrsgpwdzokztdpis +nrobvmsxtfmrqdhv +kadkaftffaziqdze +yrovbgcyqtlsnoux +modheiwuhntdecqs +gzhjypwddizemnys +gaputpwpcsvzxjho +bgmouxwoajgaozau +oxuapfrjcpyakiwt +kntwbvhuaahdixzj +epqjdjbnkxdnaccx +dspltdvznhypykri +tdrgqmbnagrxdwtt +njfqawzjggmemtbg +chpemsgwpzjpdnkk +fpsrobmbqbmigmwk +flxptsrqaazmprnl +nzdunrxlcbfklshm +miuwljvtkgzdlbnn +xbhjakklmbhsdmdt +xwxhsbnrwnegwcov +pwosflhodjaiexwq +fhgepuluczttfvqh +tldxcacbvxyamvkt +gffxatrjglkcehim +tzotkdrpxkucsdps +wxheftdepysvmzbe +qfooyczdzoewrmku +rvlwikuqdbpjuvoo +bcbrnbtfrdgijtzt +vaxqmvuogsxonlgq +ibsolflngegravgo +txntccjmqakcoorp +vrrbmqaxfbarmlmc +dzspqmttgsuhczto +pikcscjunxlwqtiw +lwzyogwxqitqfqlv +gsgjsuaqejtzglym +feyeqguxbgmcmgpp +gmttebyebdwvprkn +mzuuwbhzdjfdryxu +fganrbnplymqbzjx +cvsrbdcvhtxxdmro +scmgkjlkqukoamyp +fkgrqbyqpqcworqc +hjsrvkdibdjarxxb +sztzziuqroeidcus +pxdfvcpvwaddrzwv +phdqqxleqdjfgfbg +cqfikbgxvjmnfncy \ No newline at end of file diff --git a/advent_of_code_2015/day5/main1.cc b/advent_of_code_2015/day5/main1.cc new file mode 100644 index 0000000..6a41828 --- /dev/null +++ b/advent_of_code_2015/day5/main1.cc @@ -0,0 +1,59 @@ +#include +#include +#include + +using namespace std; + +bool has_forbidden(string const &str) +{ + if (str.find("ab") != string::npos) return true; + if (str.find("cd") != string::npos) return true; + if (str.find("pq") != string::npos) return true; + if (str.find("xy") != string::npos) return true; + return false; +} + +bool has_repeating(string const &str) +{ + for (size_t idx = 0; idx != str.size() - 1; ++idx) + { + if (str[idx] == str[idx + 1]) + return true; + } + + return false; +} + +bool vowels_ok(string const &str) +{ + size_t vowels = 0; + + vowels += count(str.begin(), str.end(), 'a'); + vowels += count(str.begin(), str.end(), 'e'); + vowels += count(str.begin(), str.end(), 'i'); + vowels += count(str.begin(), str.end(), 'o'); + vowels += count(str.begin(), str.end(), 'u'); + + return vowels >= 3; +} + +int main() +{ + + string buffer; + size_t count = 0; + + while(getline(cin, buffer)) + { + cout << "'" << buffer << "'\n"; + + if (vowels_ok(buffer) + && has_repeating(buffer) + && !has_forbidden(buffer)) + { + ++count; + } + } + + cout << "Nice strings: " << count << "\n"; +} \ No newline at end of file diff --git a/advent_of_code_2015/day5/main2.cc b/advent_of_code_2015/day5/main2.cc new file mode 100644 index 0000000..136f9b5 --- /dev/null +++ b/advent_of_code_2015/day5/main2.cc @@ -0,0 +1,50 @@ +#include +#include +#include + +using namespace std; + +bool has_repeating_pair(string const &text) +{ + for (size_t idx = 0; idx < text.size() - 2; ++idx) + { + if (text.find(text.substr(idx, 2), idx + 2) != string::npos) + { + cout << "'" << text << "' has repeating pair: '"; + cout << text.substr(idx, 2) << "'\n"; + return true; + } + } + + // cout << "'" << text << "' has no repeating pair\n"; + return false; +} + +bool repeats_plus_one(string const &text) +{ + for (size_t idx = 0; idx < text.size() - 2; ++idx) + { + if (text[idx] == text[idx + 2]) + return true; + } + + return false; +} + +int main() +{ + string buffer; + size_t count = 0; + + while (getline(cin, buffer)) + { + if (has_repeating_pair(buffer) + && repeats_plus_one(buffer)) + { + ++count; + } + } + + cout << "Nice strings: " << count << "\n"; + +} \ No newline at end of file diff --git a/advent_of_code_2015/day6/input.in b/advent_of_code_2015/day6/input.in new file mode 100644 index 0000000..657e45d --- /dev/null +++ b/advent_of_code_2015/day6/input.in @@ -0,0 +1,300 @@ +turn off 660,55 through 986,197 +turn off 341,304 through 638,850 +turn off 199,133 through 461,193 +toggle 322,558 through 977,958 +toggle 537,781 through 687,941 +turn on 226,196 through 599,390 +turn on 240,129 through 703,297 +turn on 317,329 through 451,798 +turn on 957,736 through 977,890 +turn on 263,530 through 559,664 +turn on 158,270 through 243,802 +toggle 223,39 through 454,511 +toggle 544,218 through 979,872 +turn on 313,306 through 363,621 +toggle 173,401 through 496,407 +toggle 333,60 through 748,159 +turn off 87,577 through 484,608 +turn on 809,648 through 826,999 +toggle 352,432 through 628,550 +turn off 197,408 through 579,569 +turn off 1,629 through 802,633 +turn off 61,44 through 567,111 +toggle 880,25 through 903,973 +turn on 347,123 through 864,746 +toggle 728,877 through 996,975 +turn on 121,895 through 349,906 +turn on 888,547 through 931,628 +toggle 398,782 through 834,882 +turn on 966,850 through 989,953 +turn off 891,543 through 914,991 +toggle 908,77 through 916,117 +turn on 576,900 through 943,934 +turn off 580,170 through 963,206 +turn on 184,638 through 192,944 +toggle 940,147 through 978,730 +turn off 854,56 through 965,591 +toggle 717,172 through 947,995 +toggle 426,987 through 705,998 +turn on 987,157 through 992,278 +toggle 995,774 through 997,784 +turn off 796,96 through 845,182 +turn off 451,87 through 711,655 +turn off 380,93 through 968,676 +turn on 263,468 through 343,534 +turn on 917,936 through 928,959 +toggle 478,7 through 573,148 +turn off 428,339 through 603,624 +turn off 400,880 through 914,953 +toggle 679,428 through 752,779 +turn off 697,981 through 709,986 +toggle 482,566 through 505,725 +turn off 956,368 through 993,516 +toggle 735,823 through 783,883 +turn off 48,487 through 892,496 +turn off 116,680 through 564,819 +turn on 633,865 through 729,930 +turn off 314,618 through 571,922 +toggle 138,166 through 936,266 +turn on 444,732 through 664,960 +turn off 109,337 through 972,497 +turn off 51,432 through 77,996 +turn off 259,297 through 366,744 +toggle 801,130 through 917,544 +toggle 767,982 through 847,996 +turn on 216,507 through 863,885 +turn off 61,441 through 465,731 +turn on 849,970 through 944,987 +toggle 845,76 through 852,951 +toggle 732,615 through 851,936 +toggle 251,128 through 454,778 +turn on 324,429 through 352,539 +toggle 52,450 through 932,863 +turn off 449,379 through 789,490 +turn on 317,319 through 936,449 +toggle 887,670 through 957,838 +toggle 671,613 through 856,664 +turn off 186,648 through 985,991 +turn off 471,689 through 731,717 +toggle 91,331 through 750,758 +toggle 201,73 through 956,524 +toggle 82,614 through 520,686 +toggle 84,287 through 467,734 +turn off 132,367 through 208,838 +toggle 558,684 through 663,920 +turn on 237,952 through 265,997 +turn on 694,713 through 714,754 +turn on 632,523 through 862,827 +turn on 918,780 through 948,916 +turn on 349,586 through 663,976 +toggle 231,29 through 257,589 +toggle 886,428 through 902,993 +turn on 106,353 through 236,374 +turn on 734,577 through 759,684 +turn off 347,843 through 696,912 +turn on 286,699 through 964,883 +turn on 605,875 through 960,987 +turn off 328,286 through 869,461 +turn off 472,569 through 980,848 +toggle 673,573 through 702,884 +turn off 398,284 through 738,332 +turn on 158,50 through 284,411 +turn off 390,284 through 585,663 +turn on 156,579 through 646,581 +turn on 875,493 through 989,980 +toggle 486,391 through 924,539 +turn on 236,722 through 272,964 +toggle 228,282 through 470,581 +toggle 584,389 through 750,761 +turn off 899,516 through 900,925 +turn on 105,229 through 822,846 +turn off 253,77 through 371,877 +turn on 826,987 through 906,992 +turn off 13,152 through 615,931 +turn on 835,320 through 942,399 +turn on 463,504 through 536,720 +toggle 746,942 through 786,998 +turn off 867,333 through 965,403 +turn on 591,477 through 743,692 +turn off 403,437 through 508,908 +turn on 26,723 through 368,814 +turn on 409,485 through 799,809 +turn on 115,630 through 704,705 +turn off 228,183 through 317,220 +toggle 300,649 through 382,842 +turn off 495,365 through 745,562 +turn on 698,346 through 744,873 +turn on 822,932 through 951,934 +toggle 805,30 through 925,421 +toggle 441,152 through 653,274 +toggle 160,81 through 257,587 +turn off 350,781 through 532,917 +toggle 40,583 through 348,636 +turn on 280,306 through 483,395 +toggle 392,936 through 880,955 +toggle 496,591 through 851,934 +turn off 780,887 through 946,994 +turn off 205,735 through 281,863 +toggle 100,876 through 937,915 +turn on 392,393 through 702,878 +turn on 956,374 through 976,636 +toggle 478,262 through 894,775 +turn off 279,65 through 451,677 +turn on 397,541 through 809,847 +turn on 444,291 through 451,586 +toggle 721,408 through 861,598 +turn on 275,365 through 609,382 +turn on 736,24 through 839,72 +turn off 86,492 through 582,712 +turn on 676,676 through 709,703 +turn off 105,710 through 374,817 +toggle 328,748 through 845,757 +toggle 335,79 through 394,326 +toggle 193,157 through 633,885 +turn on 227,48 through 769,743 +toggle 148,333 through 614,568 +toggle 22,30 through 436,263 +toggle 547,447 through 688,969 +toggle 576,621 through 987,740 +turn on 711,334 through 799,515 +turn on 541,448 through 654,951 +toggle 792,199 through 798,990 +turn on 89,956 through 609,960 +toggle 724,433 through 929,630 +toggle 144,895 through 201,916 +toggle 226,730 through 632,871 +turn off 760,819 through 828,974 +toggle 887,180 through 940,310 +toggle 222,327 through 805,590 +turn off 630,824 through 885,963 +turn on 940,740 through 954,946 +turn on 193,373 through 779,515 +toggle 304,955 through 469,975 +turn off 405,480 through 546,960 +turn on 662,123 through 690,669 +turn off 615,238 through 750,714 +turn on 423,220 through 930,353 +turn on 329,769 through 358,970 +toggle 590,151 through 704,722 +turn off 884,539 through 894,671 +toggle 449,241 through 984,549 +toggle 449,260 through 496,464 +turn off 306,448 through 602,924 +turn on 286,805 through 555,901 +toggle 722,177 through 922,298 +toggle 491,554 through 723,753 +turn on 80,849 through 174,996 +turn off 296,561 through 530,856 +toggle 653,10 through 972,284 +toggle 529,236 through 672,614 +toggle 791,598 through 989,695 +turn on 19,45 through 575,757 +toggle 111,55 through 880,871 +turn off 197,897 through 943,982 +turn on 912,336 through 977,605 +toggle 101,221 through 537,450 +turn on 101,104 through 969,447 +toggle 71,527 through 587,717 +toggle 336,445 through 593,889 +toggle 214,179 through 575,699 +turn on 86,313 through 96,674 +toggle 566,427 through 906,888 +turn off 641,597 through 850,845 +turn on 606,524 through 883,704 +turn on 835,775 through 867,887 +toggle 547,301 through 897,515 +toggle 289,930 through 413,979 +turn on 361,122 through 457,226 +turn on 162,187 through 374,746 +turn on 348,461 through 454,675 +turn off 966,532 through 985,537 +turn on 172,354 through 630,606 +turn off 501,880 through 680,993 +turn off 8,70 through 566,592 +toggle 433,73 through 690,651 +toggle 840,798 through 902,971 +toggle 822,204 through 893,760 +turn off 453,496 through 649,795 +turn off 969,549 through 990,942 +turn off 789,28 through 930,267 +toggle 880,98 through 932,434 +toggle 568,674 through 669,753 +turn on 686,228 through 903,271 +turn on 263,995 through 478,999 +toggle 534,675 through 687,955 +turn off 342,434 through 592,986 +toggle 404,768 through 677,867 +toggle 126,723 through 978,987 +toggle 749,675 through 978,959 +turn off 445,330 through 446,885 +turn off 463,205 through 924,815 +turn off 417,430 through 915,472 +turn on 544,990 through 912,999 +turn off 201,255 through 834,789 +turn off 261,142 through 537,862 +turn off 562,934 through 832,984 +turn off 459,978 through 691,980 +turn off 73,911 through 971,972 +turn on 560,448 through 723,810 +turn on 204,630 through 217,854 +turn off 91,259 through 611,607 +turn on 877,32 through 978,815 +turn off 950,438 through 974,746 +toggle 426,30 through 609,917 +toggle 696,37 through 859,201 +toggle 242,417 through 682,572 +turn off 388,401 through 979,528 +turn off 79,345 through 848,685 +turn off 98,91 through 800,434 +toggle 650,700 through 972,843 +turn off 530,450 through 538,926 +turn on 428,559 through 962,909 +turn on 78,138 through 92,940 +toggle 194,117 through 867,157 +toggle 785,355 through 860,617 +turn off 379,441 through 935,708 +turn off 605,133 through 644,911 +toggle 10,963 through 484,975 +turn off 359,988 through 525,991 +turn off 509,138 through 787,411 +toggle 556,467 through 562,773 +turn on 119,486 through 246,900 +turn on 445,561 through 794,673 +turn off 598,681 through 978,921 +turn off 974,230 through 995,641 +turn off 760,75 through 800,275 +toggle 441,215 through 528,680 +turn off 701,636 through 928,877 +turn on 165,753 through 202,780 +toggle 501,412 through 998,516 +toggle 161,105 through 657,395 +turn on 113,340 through 472,972 +toggle 384,994 through 663,999 +turn on 969,994 through 983,997 +turn on 519,600 through 750,615 +turn off 363,899 through 948,935 +turn on 271,845 through 454,882 +turn off 376,528 through 779,640 +toggle 767,98 through 854,853 +toggle 107,322 through 378,688 +turn off 235,899 through 818,932 +turn on 445,611 through 532,705 +toggle 629,387 through 814,577 +toggle 112,414 through 387,421 +toggle 319,184 through 382,203 +turn on 627,796 through 973,940 +toggle 602,45 through 763,151 +turn off 441,375 through 974,545 +toggle 871,952 through 989,998 +turn on 717,272 through 850,817 +toggle 475,711 through 921,882 +toggle 66,191 through 757,481 +turn off 50,197 through 733,656 +toggle 83,575 through 915,728 +turn on 777,812 through 837,912 +turn on 20,984 through 571,994 +turn off 446,432 through 458,648 +turn on 715,871 through 722,890 +toggle 424,675 through 740,862 +toggle 580,592 through 671,900 +toggle 296,687 through 906,775 \ No newline at end of file diff --git a/advent_of_code_2015/day6/main.ih b/advent_of_code_2015/day6/main.ih new file mode 100644 index 0000000..47e2929 --- /dev/null +++ b/advent_of_code_2015/day6/main.ih @@ -0,0 +1,54 @@ +#include +#include +#include + +using namespace std; + +enum Action +{ + TURN_OFF, + TURN_ON, + TOGGLE +}; + +struct Point +{ + size_t x; + size_t y; + + Point() + : x(0), y(0) + { } +}; + +struct Instruction +{ + Action action; + Point from; + Point through; +}; + +istream &operator>>(istream &in, Point &point) +{ + cin >> point.x; + cin.ignore(1); // ignore ',' + cin >> point.y; + + return in; +} + +// thrash tier parsing function +istream &operator>>(istream &in, Instruction &instruction) +{ + cin.ignore(5); + string command; + cin >> command; + if (command == "le") + instruction.action = TOGGLE; + else instruction.action = command == "on" ? TURN_ON : TURN_OFF; + cin >> instruction.from; + cin.ignore(9); //ignore ' through ' + cin >> instruction.through; + + return in; +} \ No newline at end of file diff --git a/advent_of_code_2015/day6/main1.cc b/advent_of_code_2015/day6/main1.cc new file mode 100644 index 0000000..bec4aa9 --- /dev/null +++ b/advent_of_code_2015/day6/main1.cc @@ -0,0 +1,56 @@ +#include "main.ih" + +int main() +{ + vector instructions; + + while(!cin.eof()) + { + Instruction instr; + cin >> instr; + + instructions.push_back(instr); + cout << "Instruction set " << instr.action << "\n"; + cout << " from: [" << instr.from.x << ", " << instr.from.y << "]\n"; + cout << " througn: [" << instr.through.x << ", " << instr.through.y << "]\n"; + } + + vector> lights; + lights.resize(1000, vector(1000, false)); + + for (Instruction const &instr : instructions) + { + for (size_t idx = instr.from.x; idx <= instr.through.x; ++idx) + { + for (size_t idy = instr.from.y; idy <= instr.through.y; ++idy) + { + switch(instr.action) + { + case TURN_OFF: + lights[idx][idy] = false; + break; + + case TURN_ON: + lights[idx][idy] = true; + break; + + case TOGGLE: + lights[idx][idy] = !lights[idx][idy]; + break; + } + } + } + } + + size_t lights_on = 0; + for (size_t idx = 0; idx != lights.size(); ++idx) + { + for (size_t idy = 0; idy != lights[idx].size(); ++idy) + { + if (lights[idx][idy]) + ++lights_on; + } + } + + cout << "There are " << lights_on << " lights turned on!\n"; +} \ No newline at end of file diff --git a/advent_of_code_2015/day6/main2.cc b/advent_of_code_2015/day6/main2.cc new file mode 100644 index 0000000..08ad668 --- /dev/null +++ b/advent_of_code_2015/day6/main2.cc @@ -0,0 +1,54 @@ +#include "main.ih" + +int main() +{ + vector instructions; + + while(!cin.eof()) + { + Instruction instr; + cin >> instr; + + instructions.push_back(instr); + cout << "Instruction set " << instr.action << "\n"; + cout << " from: [" << instr.from.x << ", " << instr.from.y << "]\n"; + cout << " througn: [" << instr.through.x << ", " << instr.through.y << "]\n"; + } + + vector> lights; + lights.resize(1000, vector(1000, 0)); + + for (Instruction const &instr : instructions) + { + for (size_t idx = instr.from.x; idx <= instr.through.x; ++idx) + { + for (size_t idy = instr.from.y; idy <= instr.through.y; ++idy) + { + switch(instr.action) + { + case TURN_OFF: + lights[idx][idy] + = lights[idx][idy] ? lights[idx][idy] - 1 : 0; + break; + + case TURN_ON: + lights[idx][idy] += 1; + break; + + case TOGGLE: + lights[idx][idy] += 2; + break; + } + } + } + } + + size_t brightness = 0; + for (size_t idx = 0; idx != lights.size(); ++idx) + { + for (size_t idy = 0; idy != lights[idx].size(); ++idy) + brightness += lights[idx][idy]; + } + + cout << "Total brightness: " << brightness << "\n"; +} \ No newline at end of file diff --git a/advent_of_code_2018/day1/input.in b/advent_of_code_2018/day1/input.in new file mode 100755 index 0000000..893f4f9 --- /dev/null +++ b/advent_of_code_2018/day1/input.in @@ -0,0 +1,994 @@ ++5 +-11 +-1 +-16 ++12 ++9 +-15 ++20 ++4 ++17 +-4 +-14 ++6 +-17 ++6 +-19 +-12 ++17 +-6 +-18 ++1 ++15 +-14 ++10 +-4 +-2 ++5 ++6 ++8 ++3 ++17 +-9 ++18 +-1 ++17 +-15 ++7 +-6 +-17 +-17 ++19 ++19 +-13 ++18 +-15 ++16 ++7 +-10 +-5 ++22 ++8 +-13 ++4 ++3 ++19 ++17 +-19 +-1 +-11 ++2 ++1 +-13 ++1 ++3 +-14 ++16 +-9 ++19 ++13 +-20 ++6 ++22 ++10 ++6 ++15 +-13 +-13 +-8 ++16 ++20 +-5 ++1 ++7 ++11 +-13 ++5 +-16 +-2 +-4 ++25 +-5 +-10 +-12 +-9 ++16 +-2 +-19 +-3 +-12 ++5 ++17 ++16 ++11 ++16 ++10 ++4 ++3 ++11 +-12 ++19 ++3 ++17 ++15 +-6 +-6 +-4 ++3 ++10 ++8 ++15 +-7 ++13 ++3 ++6 ++2 ++16 ++20 ++3 +-11 ++3 +-11 ++12 ++6 ++3 ++11 ++5 ++2 ++12 +-4 +-2 ++4 ++3 +-4 ++20 ++1 ++19 ++14 ++5 +-16 +-15 +-16 +-4 +-10 +-13 +-10 +-18 ++10 +-6 +-7 +-3 +-2 +-14 ++12 +-2 +-6 +-11 +-5 +-6 ++20 +-11 +-1 ++9 +-1 ++5 ++6 ++11 +-19 +-9 +-14 +-4 +-6 +-1 ++2 +-6 +-12 ++20 +-12 +-13 +-9 +-3 +-7 +-17 ++14 +-9 ++20 +-4 +-8 +-1 +-6 ++16 ++6 +-18 +-12 ++6 +-22 +-15 ++10 ++6 ++20 +-16 ++1 +-18 ++4 ++19 ++9 +-17 ++1 ++13 ++21 ++23 +-4 ++7 +-16 ++3 +-4 +-3 +-17 +-20 +-10 +-20 ++16 ++3 ++14 +-11 ++3 +-29 +-1 ++7 +-18 ++5 +-7 +-16 ++6 +-7 +-15 ++9 ++22 +-2 +-21 +-18 ++1 ++10 ++13 ++13 +-24 +-6 +-22 +-10 ++9 ++4 +-8 +-16 ++3 +-5 +-19 +-6 +-11 ++3 +-8 +-16 +-14 +-16 +-15 +-6 ++3 ++13 ++8 +-19 +-18 +-8 ++9 +-15 +-14 +-2 ++18 +-17 ++2 ++18 +-6 +-3 +-19 ++16 +-4 ++6 ++21 +-6 ++7 ++17 +-8 +-4 ++6 ++19 +-2 ++5 ++20 +-3 +-6 ++5 ++5 +-17 +-18 ++16 ++4 ++7 ++6 ++8 ++6 +-1 ++10 +-13 +-4 +-10 ++8 +-14 ++17 ++9 ++2 +-7 +-22 +-16 ++20 +-13 ++8 +-17 ++1 ++19 ++14 ++19 ++11 +-6 ++25 ++18 ++19 ++5 ++20 ++17 ++4 +-10 ++47 ++4 +-1 ++23 ++24 +-8 +-10 ++31 ++19 +-11 +-17 ++8 +-24 ++9 ++32 ++18 +-1 ++4 +-13 ++4 ++17 +-2 ++11 ++11 ++4 +-3 +-3 ++22 ++19 ++14 +-21 ++13 ++9 +-14 +-16 ++20 ++16 +-14 ++5 +-15 ++12 +-11 ++1 ++3 +-24 +-9 +-9 +-22 +-12 +-10 +-7 +-3 ++12 ++13 ++17 +-11 ++35 ++12 +-9 ++16 ++22 +-18 +-18 ++19 +-8 ++23 ++19 ++3 ++8 ++15 +-2 ++11 ++14 ++10 ++15 ++8 +-1 ++13 ++1 ++18 +-11 ++4 ++4 ++11 ++9 +-18 +-9 ++13 +-18 ++10 ++3 +-6 +-5 +-10 +-11 +-14 +-2 +-9 ++3 +-4 +-6 ++13 +-2 +-17 +-4 ++7 ++6 +-12 +-7 ++14 +-6 +-18 ++19 +-18 +-2 +-13 ++6 +-15 ++14 ++7 ++9 +-14 ++9 +-19 ++1 ++13 +-2 +-10 +-11 ++13 +-6 +-6 ++19 ++10 ++17 +-8 +-7 ++19 ++16 +-1 ++7 ++16 +-15 +-17 ++12 ++16 +-2 ++14 +-3 +-16 +-17 +-5 ++16 ++29 +-3 +-2 ++13 +-18 ++15 +-4 +-14 +-12 +-16 +-19 ++39 +-9 ++19 ++3 +-11 ++10 ++12 ++19 +-4 ++12 ++13 ++19 ++3 +-19 ++9 +-16 ++10 ++18 ++12 +-6 +-2 +-11 ++20 ++15 ++15 ++4 ++12 +-38 ++9 ++33 ++24 ++6 ++4 +-36 +-47 +-15 +-13 +-3 ++1 ++12 ++14 ++9 +-32 ++7 +-16 +-5 +-29 ++12 +-2 ++15 +-12 +-11 +-39 +-40 ++3 +-34 +-5 ++78 ++4 ++52 ++1 ++90 ++112 ++152 +-80 ++81800 +-18 ++15 +-9 ++11 ++2 +-5 ++16 +-5 ++15 +-1 ++2 +-14 +-7 ++12 +-10 +-9 ++20 ++14 +-9 ++12 ++9 ++13 ++3 ++11 ++14 +-3 ++10 ++8 ++12 ++5 ++10 ++1 ++14 +-5 ++1 +-4 +-13 ++9 ++18 ++17 ++16 ++9 +-1 +-10 ++13 ++13 ++11 +-18 ++15 +-9 +-13 ++3 ++1 ++11 +-3 +-10 ++19 +-11 ++13 ++12 +-8 +-10 +-6 ++13 ++5 +-13 +-7 +-1 ++18 ++7 ++14 +-2 ++5 ++1 ++16 +-7 ++18 ++13 +-6 ++18 +-1 ++12 +-4 +-10 ++7 +-15 +-9 +-7 +-7 +-6 ++11 +-16 ++7 +-4 ++11 +-4 +-6 +-14 ++1 ++6 +-3 ++2 ++21 ++12 +-16 ++18 +-5 ++17 ++4 ++19 ++6 +-13 ++17 +-3 +-2 +-17 ++7 +-3 +-7 ++14 ++17 ++8 ++7 +-17 ++18 +-15 +-4 ++7 ++2 ++1 +-14 +-1 +-6 ++9 +-10 +-4 ++15 +-14 +-18 +-14 +-9 +-11 ++9 ++3 ++12 ++1 ++3 +-10 +-15 ++7 ++6 ++13 ++9 ++7 +-4 ++9 +-14 ++21 +-9 ++24 ++10 ++6 ++6 +-19 ++22 +-10 +-18 ++10 ++14 +-4 ++3 ++7 ++14 ++11 ++16 +-10 ++11 +-9 +-5 +-6 +-2 +-15 ++3 +-16 ++19 ++8 ++2 +-17 ++3 ++5 ++14 +-16 +-4 +-5 ++1 +-3 ++4 ++6 ++18 ++16 ++4 +-18 ++6 ++10 +-6 ++1 ++6 ++9 ++17 +-8 +-15 +-12 ++1 +-6 ++4 ++12 ++2 ++17 +-9 +-7 ++10 ++12 ++17 ++8 ++15 ++7 +-18 +-1 ++4 ++13 +-3 ++16 ++4 ++2 +-8 +-5 ++14 ++10 ++18 +-15 ++19 +-11 +-4 +-16 ++13 ++16 +-15 ++10 +-20 +-7 +-15 +-10 +-2 +-6 ++19 +-3 +-9 +-18 ++12 +-8 ++3 ++13 ++20 ++18 +-16 ++15 ++12 ++1 +-18 ++10 +-14 +-17 +-7 +-9 +-20 ++8 +-9 ++7 +-11 +-19 ++7 +-14 ++6 ++4 ++14 ++8 +-11 ++2 +-1 +-19 ++16 ++9 +-10 ++20 ++12 ++11 ++13 +-3 +-2 ++3 +-20 ++6 +-17 ++3 +-9 +-6 +-16 ++7 ++7 +-23 +-6 ++14 +-3 +-31 +-18 +-19 +-12 +-26 ++23 ++9 +-7 +-10 ++22 ++17 ++17 +-7 +-8 ++9 ++28 ++5 ++24 +-28 ++36 ++37 ++7 ++12 ++19 ++15 +-3 +-20 ++17 ++18 ++4 +-8 ++9 +-4 +-2 +-19 ++11 +-1 ++3 +-7 ++8 ++9 +-8 ++19 ++9 ++12 +-11 +-5 +-13 ++9 +-6 ++7 ++17 +-13 ++16 ++10 +-5 ++20 ++6 +-1 ++17 +-14 ++10 ++18 +-1 ++3 +-10 +-4 +-10 +-10 +-16 +-2 ++7 ++16 +-12 ++6 ++8 ++22 ++7 +-6 +-13 +-14 ++10 +-1 +-21 +-1 ++8 +-15 ++9 +-17 +-2 +-21 ++4 +-19 +-13 +-8 ++26 ++4 +-27 +-8 ++2 ++30 +-11 +-82484 \ No newline at end of file diff --git a/advent_of_code_2018/day1/main2.cc b/advent_of_code_2018/day1/main2.cc new file mode 100755 index 0000000..8e39e83 --- /dev/null +++ b/advent_of_code_2018/day1/main2.cc @@ -0,0 +1,46 @@ +#include +#include +#include +#include + +using namespace std; + +int read() +{ + string line; + getline(cin, line); + + bool plus = line[0] == '+'; + int val = stoi(line.substr(1)); + + return plus ? val : -val; +} + +int main() +{ + vector sequence; + while (!cin.eof()) + sequence.push_back(read()); + + // cout << "Buffered " << sequence.size() << " frequencies\n"; + + int total = 0; + set used; + used.insert(0); + + while (true) + { + for (int i : sequence) + { + total += i; + + if (used.find(total) != used.end()) + { + cout << "Found first repeating frequency: " << total << "\n"; + return 0; + } + + used.insert(total); + } + } +} \ No newline at end of file diff --git a/advent_of_code_2018/day10/input.in b/advent_of_code_2018/day10/input.in new file mode 100644 index 0000000..7c6e6a9 --- /dev/null +++ b/advent_of_code_2018/day10/input.in @@ -0,0 +1,385 @@ +position=<-52592, 31869> velocity=< 5, -3> +position=<-20934, 52988> velocity=< 2, -5> +position=<-20910, 31871> velocity=< 2, -3> +position=<-31503, -52596> velocity=< 3, 5> +position=<-42061, -10364> velocity=< 4, 1> +position=< 10776, -31475> velocity=<-1, 3> +position=<-10348, 31875> velocity=< 1, -3> +position=< 52969, 52985> velocity=<-5, -5> +position=< 31848, -10366> velocity=<-3, 1> +position=<-10376, -10366> velocity=< 1, 1> +position=<-10376, -31474> velocity=< 1, 3> +position=<-42058, 52990> velocity=< 4, -5> +position=<-52628, -10358> velocity=< 5, 1> +position=<-52630, 52985> velocity=< 5, -5> +position=< 31888, -31474> velocity=<-3, 3> +position=<-31492, 42429> velocity=< 3, -4> +position=< 31892, 52988> velocity=<-3, -5> +position=< 52961, 52989> velocity=<-5, -5> +position=<-20908, -42031> velocity=< 2, 4> +position=<-52627, 10759> velocity=< 5, -1> +position=< 21307, -42034> velocity=<-2, 4> +position=<-20937, -31475> velocity=< 2, 3> +position=< 21315, -52594> velocity=<-2, 5> +position=< 10744, -10366> velocity=<-1, 1> +position=< 21287, -10358> velocity=<-2, 1> +position=< 21298, -31478> velocity=<-2, 3> +position=<-10384, 31866> velocity=< 1, -3> +position=< 52953, -10364> velocity=<-5, 1> +position=<-42029, -52597> velocity=< 4, 5> +position=< 21319, 10757> velocity=<-2, -1> +position=<-10352, 21310> velocity=< 1, -2> +position=<-10395, -42034> velocity=< 1, 4> +position=< 10756, 31873> velocity=<-1, -3> +position=<-10384, 42425> velocity=< 1, -4> +position=<-42050, 42427> velocity=< 4, -4> +position=< 31866, 10759> velocity=<-3, -1> +position=<-52592, -10357> velocity=< 5, 1> +position=<-42066, 31874> velocity=< 4, -3> +position=<-52605, -20924> velocity=< 5, 2> +position=< 21274, 10753> velocity=<-2, -1> +position=<-20933, 42433> velocity=< 2, -4> +position=< 52961, -10365> velocity=<-5, 1> +position=<-20913, -20923> velocity=< 2, 2> +position=< 10716, -42039> velocity=<-1, 4> +position=<-42070, 21315> velocity=< 4, -2> +position=<-42040, 31875> velocity=< 4, -3> +position=<-42029, 52989> velocity=< 4, -5> +position=< 52953, -20917> velocity=<-5, 2> +position=<-42058, -10364> velocity=< 4, 1> +position=<-52574, -42031> velocity=< 5, 4> +position=<-52600, -42032> velocity=< 5, 4> +position=< 10740, -52598> velocity=<-1, 5> +position=< 42438, -20919> velocity=<-4, 2> +position=<-20937, -31477> velocity=< 2, 3> +position=<-42072, 42427> velocity=< 4, -4> +position=<-20921, -52598> velocity=< 2, 5> +position=<-52619, -20918> velocity=< 5, 2> +position=<-31467, -20915> velocity=< 3, 2> +position=<-42066, -10366> velocity=< 4, 1> +position=< 21334, -42035> velocity=<-2, 4> +position=< 21309, 21317> velocity=<-2, -2> +position=< 42414, -10364> velocity=<-4, 1> +position=< 21290, 21311> velocity=<-2, -2> +position=< 52972, -20917> velocity=<-5, 2> +position=< 10776, 10755> velocity=<-1, -1> +position=< 21298, -10363> velocity=<-2, 1> +position=< 42430, 52986> velocity=<-4, -5> +position=< 21294, 21312> velocity=<-2, -2> +position=< 10752, -10357> velocity=<-1, 1> +position=< 42438, 21315> velocity=<-4, -2> +position=<-42050, -20915> velocity=< 4, 2> +position=<-31504, -52598> velocity=< 3, 5> +position=< 52999, 21317> velocity=<-5, -2> +position=<-10390, -10362> velocity=< 1, 1> +position=< 21300, 10754> velocity=<-2, -1> +position=<-20933, -10366> velocity=< 2, 1> +position=< 10725, -10366> velocity=<-1, 1> +position=< 10737, 31874> velocity=<-1, -3> +position=<-20913, 10758> velocity=< 2, -1> +position=<-42063, 21312> velocity=< 4, -2> +position=<-10358, 10754> velocity=< 1, -1> +position=< 21334, 52986> velocity=<-2, -5> +position=< 42430, 31871> velocity=<-4, -3> +position=< 21319, 21310> velocity=<-2, -2> +position=< 21290, -52592> velocity=<-2, 5> +position=< 21295, 10753> velocity=<-2, -1> +position=< 42390, -42036> velocity=<-4, 4> +position=< 10721, 52990> velocity=<-1, -5> +position=< 21285, -52598> velocity=<-2, 5> +position=< 31837, -42037> velocity=<-3, 4> +position=<-42018, 52989> velocity=< 4, -5> +position=<-10355, 31871> velocity=< 1, -3> +position=< 42411, -31477> velocity=<-4, 3> +position=<-52632, 42428> velocity=< 5, -4> +position=< 42441, 10759> velocity=<-4, -1> +position=<-52624, -10365> velocity=< 5, 1> +position=<-10360, -42038> velocity=< 1, 4> +position=< 21314, 21311> velocity=<-2, -2> +position=< 52988, 42430> velocity=<-5, -4> +position=<-10350, -31482> velocity=< 1, 3> +position=<-52592, 10753> velocity=< 5, -1> +position=<-20954, -52590> velocity=< 2, 5> +position=<-52611, -42033> velocity=< 5, 4> +position=< 31841, 42424> velocity=<-3, -4> +position=< 10729, 52990> velocity=<-1, -5> +position=< 31837, 42426> velocity=<-3, -4> +position=<-20958, 42429> velocity=< 2, -4> +position=< 10737, 42432> velocity=<-1, -4> +position=<-52624, -31477> velocity=< 5, 3> +position=<-20949, 10754> velocity=< 2, -1> +position=< 10729, -20923> velocity=<-1, 2> +position=< 31892, -52597> velocity=<-3, 5> +position=<-10355, 21314> velocity=< 1, -2> +position=< 52960, 42428> velocity=<-5, -4> +position=<-52587, 42424> velocity=< 5, -4> +position=<-52592, 52983> velocity=< 5, -5> +position=< 31832, 21315> velocity=<-3, -2> +position=< 52956, -10362> velocity=<-5, 1> +position=< 52992, 42428> velocity=<-5, -4> +position=< 10749, -20924> velocity=<-1, 2> +position=<-31504, 21308> velocity=< 3, -2> +position=<-20950, -42032> velocity=< 2, 4> +position=<-20907, 31866> velocity=< 2, -3> +position=<-52624, 42432> velocity=< 5, -4> +position=< 31865, -10357> velocity=<-3, 1> +position=<-52611, 52988> velocity=< 5, -5> +position=< 42441, 31866> velocity=<-4, -3> +position=< 42438, 21309> velocity=<-4, -2> +position=< 42398, 21310> velocity=<-4, -2> +position=<-10352, -10360> velocity=< 1, 1> +position=<-42050, -42036> velocity=< 4, 4> +position=< 52948, 42429> velocity=<-5, -4> +position=< 52993, 21311> velocity=<-5, -2> +position=<-10384, -52598> velocity=< 1, 5> +position=<-42029, -31473> velocity=< 4, 3> +position=<-10375, -52589> velocity=< 1, 5> +position=<-31460, -31475> velocity=< 3, 3> +position=< 42418, -31473> velocity=<-4, 3> +position=<-10392, 52984> velocity=< 1, -5> +position=< 10767, 10750> velocity=<-1, -1> +position=<-52573, 52991> velocity=< 5, -5> +position=<-52611, 52984> velocity=< 5, -5> +position=<-52592, 42431> velocity=< 5, -4> +position=<-10380, 21312> velocity=< 1, -2> +position=<-42029, -42038> velocity=< 4, 4> +position=<-42056, -10362> velocity=< 4, 1> +position=<-42041, -20915> velocity=< 4, 2> +position=<-10395, 31868> velocity=< 1, -3> +position=<-42045, 52991> velocity=< 4, -5> +position=< 21319, 21313> velocity=<-2, -2> +position=< 31844, -20920> velocity=<-3, 2> +position=<-20918, 52990> velocity=< 2, -5> +position=<-31514, -52595> velocity=< 3, 5> +position=< 10752, 31869> velocity=<-1, -3> +position=<-42034, -52597> velocity=< 4, 5> +position=< 10733, -20920> velocity=<-1, 2> +position=<-31476, 21309> velocity=< 3, -2> +position=< 10716, -42037> velocity=<-1, 4> +position=< 10720, 42431> velocity=<-1, -4> +position=<-20909, -20915> velocity=< 2, 2> +position=<-52627, 10750> velocity=< 5, -1> +position=<-31489, -52589> velocity=< 3, 5> +position=< 10756, -20915> velocity=<-1, 2> +position=<-31483, -20918> velocity=< 3, 2> +position=< 31861, 10759> velocity=<-3, -1> +position=<-31471, 21308> velocity=< 3, -2> +position=< 52948, -42040> velocity=<-5, 4> +position=< 21302, -31478> velocity=<-2, 3> +position=<-52587, -31476> velocity=< 5, 3> +position=< 21308, -31477> velocity=<-2, 3> +position=<-31492, 42429> velocity=< 3, -4> +position=<-31513, -31476> velocity=< 3, 3> +position=<-10388, -52598> velocity=< 1, 5> +position=<-20953, 31867> velocity=< 2, -3> +position=<-42038, -20921> velocity=< 4, 2> +position=< 10732, 31870> velocity=<-1, -3> +position=< 52964, -52595> velocity=<-5, 5> +position=< 21284, 10750> velocity=<-2, -1> +position=< 21299, 21317> velocity=<-2, -2> +position=<-42041, 31872> velocity=< 4, -3> +position=<-10360, 10750> velocity=< 1, -1> +position=< 10774, 10759> velocity=<-1, -1> +position=< 42406, 42429> velocity=<-4, -4> +position=<-42022, 42433> velocity=< 4, -4> +position=<-52606, 42428> velocity=< 5, -4> +position=< 31832, -31476> velocity=<-3, 3> +position=< 21295, -20923> velocity=<-2, 2> +position=<-42050, -42039> velocity=< 4, 4> +position=< 21284, -52594> velocity=<-2, 5> +position=<-42034, -42035> velocity=< 4, 4> +position=< 21279, 21313> velocity=<-2, -2> +position=< 31880, 42427> velocity=<-3, -4> +position=<-31484, 21317> velocity=< 3, -2> +position=< 42391, -20922> velocity=<-4, 2> +position=<-42058, -10365> velocity=< 4, 1> +position=< 42409, 52986> velocity=<-4, -5> +position=<-20918, 42431> velocity=< 2, -4> +position=< 31851, 21312> velocity=<-3, -2> +position=<-10387, -31479> velocity=< 1, 3> +position=<-42033, -31478> velocity=< 4, 3> +position=<-42047, -42036> velocity=< 4, 4> +position=< 21301, -31482> velocity=<-2, 3> +position=<-10365, -31473> velocity=< 1, 3> +position=<-31471, -42031> velocity=< 3, 4> +position=<-42074, -10357> velocity=< 4, 1> +position=<-31500, 10758> velocity=< 3, -1> +position=< 21311, 10751> velocity=<-2, -1> +position=< 42398, -10362> velocity=<-4, 1> +position=<-20921, 42424> velocity=< 2, -4> +position=< 52985, -52597> velocity=<-5, 5> +position=<-42073, 52983> velocity=< 4, -5> +position=< 42390, 31874> velocity=<-4, -3> +position=<-42061, -10360> velocity=< 4, 1> +position=< 21301, 42428> velocity=<-2, -4> +position=<-20942, -20917> velocity=< 2, 2> +position=<-10350, -52589> velocity=< 1, 5> +position=<-52595, 31875> velocity=< 5, -3> +position=< 42432, -52594> velocity=<-4, 5> +position=<-20937, -20924> velocity=< 2, 2> +position=< 42395, 31873> velocity=<-4, -3> +position=<-31508, 42433> velocity=< 3, -4> +position=< 10751, -31473> velocity=<-1, 3> +position=<-42032, 52986> velocity=< 4, -5> +position=< 42447, -10357> velocity=<-4, 1> +position=<-42048, 42428> velocity=< 4, -4> +position=<-10344, -42032> velocity=< 1, 4> +position=< 21290, -42034> velocity=<-2, 4> +position=<-42014, -42037> velocity=< 4, 4> +position=<-20906, -42040> velocity=< 2, 4> +position=< 10721, -20920> velocity=<-1, 2> +position=<-10379, 42433> velocity=< 1, -4> +position=< 21319, 52986> velocity=<-2, -5> +position=<-10368, 42431> velocity=< 1, -4> +position=<-20950, -20924> velocity=< 2, 2> +position=< 31877, -52595> velocity=<-3, 5> +position=<-31482, 42429> velocity=< 3, -4> +position=< 21334, 42432> velocity=<-2, -4> +position=<-10364, 42427> velocity=< 1, -4> +position=<-42074, 10755> velocity=< 4, -1> +position=< 21300, -10366> velocity=<-2, 1> +position=< 42408, 10754> velocity=<-4, -1> +position=< 10732, 10753> velocity=<-1, -1> +position=<-52632, 21310> velocity=< 5, -2> +position=< 10740, -20920> velocity=<-1, 2> +position=< 52956, 42429> velocity=<-5, -4> +position=< 10756, -52598> velocity=<-1, 5> +position=<-31506, 52991> velocity=< 3, -5> +position=< 10724, 10751> velocity=<-1, -1> +position=<-20921, 21310> velocity=< 2, -2> +position=<-20946, -42031> velocity=< 2, 4> +position=< 42435, 52986> velocity=<-4, -5> +position=<-42037, -31473> velocity=< 4, 3> +position=< 21287, -52592> velocity=<-2, 5> +position=< 10717, -42039> velocity=<-1, 4> +position=<-52627, 31872> velocity=< 5, -3> +position=< 31875, 52986> velocity=<-3, -5> +position=< 42411, -42036> velocity=<-4, 4> +position=< 52964, -20915> velocity=<-5, 2> +position=<-31488, 42428> velocity=< 3, -4> +position=< 42426, 21308> velocity=<-4, -2> +position=<-52579, 10751> velocity=< 5, -1> +position=<-42014, 10753> velocity=< 4, -1> +position=<-42034, 10752> velocity=< 4, -1> +position=< 21275, 42425> velocity=<-2, -4> +position=<-10350, -10366> velocity=< 1, 1> +position=<-52628, -52591> velocity=< 5, 5> +position=< 31845, -52591> velocity=<-3, 5> +position=< 21285, -31473> velocity=<-2, 3> +position=< 21319, 21312> velocity=<-2, -2> +position=< 42427, -31480> velocity=<-4, 3> +position=< 52956, -52591> velocity=<-5, 5> +position=<-10389, 52986> velocity=< 1, -5> +position=< 42400, 10754> velocity=<-4, -1> +position=<-31508, -10362> velocity=< 3, 1> +position=< 10740, 10756> velocity=<-1, -1> +position=<-20898, 42424> velocity=< 2, -4> +position=< 21319, -42031> velocity=<-2, 4> +position=<-52574, 10759> velocity=< 5, -1> +position=< 21274, -31476> velocity=<-2, 3> +position=<-31463, -10358> velocity=< 3, 1> +position=<-20950, 21311> velocity=< 2, -2> +position=<-52600, -31474> velocity=< 5, 3> +position=< 31864, 42431> velocity=<-3, -4> +position=< 21279, 21316> velocity=<-2, -2> +position=< 21287, 42426> velocity=<-2, -4> +position=< 10716, 10754> velocity=<-1, -1> +position=<-42042, 52989> velocity=< 4, -5> +position=<-31492, 42427> velocity=< 3, -4> +position=< 21298, -10364> velocity=<-2, 1> +position=<-42040, 21308> velocity=< 4, -2> +position=<-42045, 10750> velocity=< 4, -1> +position=< 31835, -20919> velocity=<-3, 2> +position=< 10773, 42433> velocity=<-1, -4> +position=< 42443, 10758> velocity=<-4, -1> +position=< 52973, -52598> velocity=<-5, 5> +position=< 21295, -52592> velocity=<-2, 5> +position=<-10392, 31868> velocity=< 1, -3> +position=< 21282, -42031> velocity=<-2, 4> +position=< 10737, -20920> velocity=<-1, 2> +position=< 52985, 31875> velocity=<-5, -3> +position=<-42049, -20920> velocity=< 4, 2> +position=< 52992, 10754> velocity=<-5, -1> +position=< 10716, 31866> velocity=<-1, -3> +position=< 31884, -20924> velocity=<-3, 2> +position=< 42442, -20924> velocity=<-4, 2> +position=< 10732, -10361> velocity=<-1, 1> +position=<-31508, 10756> velocity=< 3, -1> +position=< 31872, 21314> velocity=<-3, -2> +position=<-42042, 10750> velocity=< 4, -1> +position=<-42069, 21315> velocity=< 4, -2> +position=<-20898, -10365> velocity=< 2, 1> +position=<-42071, -20918> velocity=< 4, 2> +position=< 10752, -10357> velocity=<-1, 1> +position=<-20946, -10362> velocity=< 2, 1> +position=<-52572, -10358> velocity=< 5, 1> +position=< 10716, 42424> velocity=<-1, -4> +position=<-52611, 42426> velocity=< 5, -4> +position=< 31856, 52991> velocity=<-3, -5> +position=< 10750, 52982> velocity=<-1, -5> +position=<-31495, -52598> velocity=< 3, 5> +position=< 52975, 21308> velocity=<-5, -2> +position=< 10729, -20919> velocity=<-1, 2> +position=<-52620, 10759> velocity=< 5, -1> +position=< 10751, -10366> velocity=<-1, 1> +position=<-20898, -52591> velocity=< 2, 5> +position=<-42023, 52991> velocity=< 4, -5> +position=<-31500, 31875> velocity=< 3, -3> +position=<-52584, 52990> velocity=< 5, -5> +position=< 21314, 52990> velocity=<-2, -5> +position=< 10776, 21309> velocity=<-1, -2> +position=<-10376, 31875> velocity=< 1, -3> +position=<-20946, -52589> velocity=< 2, 5> +position=<-52628, -52590> velocity=< 5, 5> +position=< 52988, -31474> velocity=<-5, 3> +position=<-31491, -42040> velocity=< 3, 4> +position=<-20918, -42036> velocity=< 2, 4> +position=<-20947, 10754> velocity=< 2, -1> +position=< 52953, -31474> velocity=<-5, 3> +position=<-42031, 31870> velocity=< 4, -3> +position=<-52583, 42424> velocity=< 5, -4> +position=< 42393, -20919> velocity=<-4, 2> +position=< 42411, 10750> velocity=<-4, -1> +position=< 10716, -42032> velocity=<-1, 4> +position=<-31503, 42429> velocity=< 3, -4> +position=<-42053, 10753> velocity=< 4, -1> +position=<-31481, -20920> velocity=< 3, 2> +position=<-31468, -31481> velocity=< 3, 3> +position=< 21284, -20924> velocity=<-2, 2> +position=< 42409, -42036> velocity=<-4, 4> +position=<-42063, 31875> velocity=< 4, -3> +position=< 42450, -10358> velocity=<-4, 1> +position=<-20897, -52598> velocity=< 2, 5> +position=< 42407, -10362> velocity=<-4, 1> +position=< 52983, 10754> velocity=<-5, -1> +position=< 52969, -31477> velocity=<-5, 3> +position=< 53000, -10357> velocity=<-5, 1> +position=<-52619, -31475> velocity=< 5, 3> +position=< 10756, 10756> velocity=<-1, -1> +position=< 31889, -42031> velocity=<-3, 4> +position=<-31511, 52985> velocity=< 3, -5> +position=<-31511, 42425> velocity=< 3, -4> +position=< 21322, -31476> velocity=<-2, 3> +position=< 10764, 21312> velocity=<-1, -2> +position=< 10724, 21314> velocity=<-1, -2> +position=< 53001, 10758> velocity=<-5, -1> +position=<-52607, -10362> velocity=< 5, 1> +position=<-31482, -20919> velocity=< 3, 2> +position=< 21276, 10754> velocity=<-2, -1> +position=< 42426, 21317> velocity=<-4, -2> +position=< 21299, -10362> velocity=<-2, 1> +position=< 42450, -20922> velocity=<-4, 2> +position=< 10719, 10755> velocity=<-1, -1> +position=<-52623, 10759> velocity=< 5, -1> +position=< 31840, -42040> velocity=<-3, 4> +position=< 10724, -20918> velocity=<-1, 2> +position=<-10341, 21308> velocity=< 1, -2> +position=< 42403, -10365> velocity=<-4, 1> +position=< 31877, 31866> velocity=<-3, -3> +position=<-42048, 31875> velocity=< 4, -3> +position=< 52953, 52986> velocity=<-5, -5> +position=<-10340, -10360> velocity=< 1, 1> +position=< 31869, 10752> velocity=<-3, -1> +position=<-52612, 21312> velocity=< 5, -2> +position=<-42053, -52592> velocity=< 4, 5> +position=<-31490, 10750> velocity=< 3, -1> \ No newline at end of file diff --git a/advent_of_code_2018/day10/main.ih b/advent_of_code_2018/day10/main.ih new file mode 100644 index 0000000..9b89f22 --- /dev/null +++ b/advent_of_code_2018/day10/main.ih @@ -0,0 +1,49 @@ +#include +#include +#include +#include + +using namespace std; + +struct Position +{ + int xpos; + int ypos; + + Position() : xpos(0), ypos(0) {} +}; + +struct Velocity +{ + int dx; + int dy; + + Velocity() : dx(0), dy(0) {} +}; + +inline istream &operator>>(istream &in, Position &position) +{ + cin.ignore(10); //ignore 'position=<' + cin >> position.xpos; + cin.ignore(2); //ignore ', ' + cin >> position.ypos; + cin.ignore(2); //ignore '> ' + return in; +} + +inline istream &operator>>(istream &in, Velocity &velocity) +{ + cin.ignore(10); //ignore 'velocity=<' + cin >> velocity.dx; + cin.ignore(2); //ignore ', ' + cin >> velocity.dy; + cin.ignore(2); // ignore '>\n' + return in; +} + +inline Position operator+(Position pos, Velocity const &vel) +{ + pos.xpos += vel.dx; + pos.ypos += vel.dy; + return pos; +} \ No newline at end of file diff --git a/advent_of_code_2018/day10/main1.cc b/advent_of_code_2018/day10/main1.cc new file mode 100644 index 0000000..0ab9b1a --- /dev/null +++ b/advent_of_code_2018/day10/main1.cc @@ -0,0 +1,101 @@ +#include "main.ih" + +struct Star +{ + Position pos; + Velocity vel; + + void update() + { + pos = pos + vel; + } +}; + +Star read_star() +{ + Star rval; + cin >> rval.pos; + cin >> rval.vel; + return rval; +} + +size_t grid_size(vector const &stars) +{ + int minx = numeric_limits::max(); + int maxx = numeric_limits::min(); + int miny = minx; + int maxy = maxx; + + for (Star const &star : stars) + { + minx = min(minx, star.pos.xpos); + maxx = max(maxx, star.pos.xpos); + miny = min(miny, star.pos.ypos); + maxy = max(maxy, star.pos.ypos); + } + + size_t width = maxx - minx + 1; + size_t height = maxy - miny + 1; + return width * height; +} + +void write_to_console(vector const &stars) +{ + int minx = numeric_limits::max(); + int maxx = numeric_limits::min(); + int miny = minx; + int maxy = maxx; + + for (Star const &star : stars) + { + minx = min(minx, star.pos.xpos); + maxx = max(maxx, star.pos.xpos); + miny = min(miny, star.pos.ypos); + maxy = max(maxy, star.pos.ypos); + } + + int xpos = minx; + int ypos = miny; + int width = maxx - minx + 1; + int height = maxy - miny + 1; + vector> grid; + grid.resize(width, vector(height)); + + for (Star const &star : stars) + grid[star.pos.xpos - xpos][star.pos.ypos - ypos] = true; + + for (int idy = 0; idy < height; ++idy) + { + for (int idx = 0; idx < width; ++idx) + cout << (grid[idx][idy] ? '#' : ' '); + cout << "\n"; + } +} + +int main() +{ + vector stars; + + while (!cin.eof()) + stars.push_back(read_star()); + + size_t size = grid_size(stars); + for (size_t time = 0; true; ++time) + { + vector next_position(stars); + for (Star &star : next_position) + star.update(); + + size_t next_size = grid_size(next_position); + + if (next_size > size) + { + write_to_console(stars); + cout << "That took " << time << " seconds!\n"; // part 2 + return 0; + } + + stars.swap(next_position); + size = next_size; + } +} \ No newline at end of file diff --git a/advent_of_code_2018/day10/test.in b/advent_of_code_2018/day10/test.in new file mode 100644 index 0000000..794273a --- /dev/null +++ b/advent_of_code_2018/day10/test.in @@ -0,0 +1,31 @@ +position=< 9, 1> velocity=< 0, 2> +position=< 7, 0> velocity=<-1, 0> +position=< 3, -2> velocity=<-1, 1> +position=< 6, 10> velocity=<-2, -1> +position=< 2, -4> velocity=< 2, 2> +position=<-6, 10> velocity=< 2, -2> +position=< 1, 8> velocity=< 1, -1> +position=< 1, 7> velocity=< 1, 0> +position=<-3, 11> velocity=< 1, -2> +position=< 7, 6> velocity=<-1, -1> +position=<-2, 3> velocity=< 1, 0> +position=<-4, 3> velocity=< 2, 0> +position=<10, -3> velocity=<-1, 1> +position=< 5, 11> velocity=< 1, -2> +position=< 4, 7> velocity=< 0, -1> +position=< 8, -2> velocity=< 0, 1> +position=<15, 0> velocity=<-2, 0> +position=< 1, 6> velocity=< 1, 0> +position=< 8, 9> velocity=< 0, -1> +position=< 3, 3> velocity=<-1, 1> +position=< 0, 5> velocity=< 0, -1> +position=<-2, 2> velocity=< 2, 0> +position=< 5, -2> velocity=< 1, 2> +position=< 1, 4> velocity=< 2, 1> +position=<-2, 7> velocity=< 2, -2> +position=< 3, 6> velocity=<-1, -1> +position=< 5, 0> velocity=< 1, 0> +position=<-6, 0> velocity=< 2, 0> +position=< 5, 9> velocity=< 1, -2> +position=<14, 7> velocity=<-2, 0> +position=<-3, 6> velocity=< 2, -1> \ No newline at end of file diff --git a/advent_of_code_2018/day11/input.in b/advent_of_code_2018/day11/input.in new file mode 100644 index 0000000..31c173c --- /dev/null +++ b/advent_of_code_2018/day11/input.in @@ -0,0 +1,3 @@ +8199 +300 +300 \ No newline at end of file diff --git a/advent_of_code_2018/day11/main.cc b/advent_of_code_2018/day11/main.cc new file mode 100644 index 0000000..7665aaa --- /dev/null +++ b/advent_of_code_2018/day11/main.cc @@ -0,0 +1,80 @@ +#include +#include +#include +#include + +using namespace std; + +int evaluate_square(vector> const &grid, size_t topx, size_t lefty, size_t size = 3) +{ + int sum = 0; + + for (size_t idx = 0; idx != size; ++idx) + { + for (size_t idy = 0; idy != size; ++idy) + sum += grid[topx + idx][lefty + idy]; + } + + return sum; +} + +int main() +{ + size_t grid_width; + size_t grid_height; + int grid_serial_number; + + cin >> grid_serial_number; + cin >> grid_width; + cin >> grid_height; + + vector> grid; + grid.resize(grid_width, vector(grid_height, 0)); + + for (size_t idy = 0; idy < grid_height; ++idy) + { + for (size_t idx = 0; idx < grid_width; ++idx) + { + int rack_id = idx + 11; + int powerlevel = rack_id * (idy + 1); + + powerlevel += grid_serial_number; + powerlevel *= rack_id; + + string text = to_string(powerlevel); + powerlevel = text.size() >= 3 ? (text[text.size() - 3] - '0') : 0; + powerlevel -= 5; + + grid[idx][idy] = powerlevel; + // cout << setw(4) << powerlevel; + } + // cout << "\n"; + } + + int top_value = numeric_limits::min(); + size_t top_size; + size_t top_x; + size_t top_y; + for (size_t size = 0; size != 300; ++size) + { + cout << "Size " << setw(3) << size << "/300\r" << flush; + for (size_t idx = 1; idx != (grid_width - (size - 1)); ++idx) + { + for (size_t idy = 0; idy != (grid_width - (size - 1)); ++idy) + { + int value = evaluate_square(grid, idx, idy, size); + if (value > top_value) + { + top_value = value; + top_size = size; + top_x = idx + 1; + top_y = idy + 1; + } + } + } + } + + cout << "Top x,y,size is " << top_x << "," << top_y << "," << top_size + << " with " << top_value << " power\n"; + +} \ No newline at end of file diff --git a/advent_of_code_2018/day11/test.in b/advent_of_code_2018/day11/test.in new file mode 100644 index 0000000..9c98cb0 --- /dev/null +++ b/advent_of_code_2018/day11/test.in @@ -0,0 +1,3 @@ +18 +300 +300 \ No newline at end of file diff --git a/advent_of_code_2018/day12/input.in b/advent_of_code_2018/day12/input.in new file mode 100644 index 0000000..7e6d21d --- /dev/null +++ b/advent_of_code_2018/day12/input.in @@ -0,0 +1,34 @@ +initial state: ##.######...#.##.#...#...##.####..###.#.##.#.##...##..#...##.#..##....##...........#.#.#..###.# + +.###. => # +#.##. => . +.#.## => # +...## => . +###.# => # +##.## => . +..... => . +#..#. => # +..#.. => # +#.### => # +##.#. => . +..#.# => # +#.#.# => # +.##.# => # +.#..# => # +#..## => # +##..# => # +#...# => . +...#. => # +##### => . +###.. => # +#.#.. => . +....# => . +.#### => # +..### => . +..##. => # +.##.. => . +#.... => . +####. => # +.#.#. => . +.#... => # +##... => # \ No newline at end of file diff --git a/advent_of_code_2018/day12/main.cc b/advent_of_code_2018/day12/main.cc new file mode 100644 index 0000000..e46b217 --- /dev/null +++ b/advent_of_code_2018/day12/main.cc @@ -0,0 +1,127 @@ +#include +#include +#include +#include +#include +#include + +using namespace std; + +unordered_map read_rules() +{ + unordered_map rules; + + while(!cin.eof()) + { + char result; + string rule; + + cin >> rule; + cin.ignore(4); //ignore ' => ' + cin >> result; + cin.ignore(1); //ignore '\n' + + rules[rule] = result; + } + + return rules; +} + +vector initial_state() +{ + cin.ignore(15); // ignore 'initial state: ' + string buf; + getline(cin, buf); + + return vector(buf.begin(), buf.end()); +} + +string environment(vector const &plants, size_t idx) +{ + string sig; + + switch(idx) + { + case 0: + sig += ".."; + sig += string(plants.begin(), plants.begin() + 3); + return sig; + + case 1: + + sig += "."; + sig += string(plants.begin(), plants.begin() + 4); + return sig; + + default: + break; + } + + if (idx == (plants.size() - 2)) + { + auto it = plants.begin() + idx; + return string(it - 2, it + 2) + '.'; + } + else if (idx == (plants.size() - 1)) + { + auto it = plants.begin() + idx; + return string(it - 2, it + 1) + ".."; + } + + auto it = plants.begin() + idx; + return string(it - 2, it + 3); +} + +int main() +{ + int first = 0; + vector plants = initial_state(); + unordered_map rules = read_rules(); + + string original = string(plants.begin(), plants.end()); + cout << original << "\n"; + + for (size_t iterations = 20; iterations--; ) + { + if (find(plants.begin(), plants.begin() + 3, '#') + != plants.begin() + 3) + { + first -= 2; + plants.insert(plants.begin(), {'.', '.'}); + } + + if (find(plants.end() - 3, plants.end(), '#') + != plants.end()) + { + plants.insert(plants.end(), {'.', '.'}); + } + vector nextgen(plants.size(), '.'); + + // cout << "\n\n # now env new\n"; + for (size_t idx = 0; idx != plants.size(); ++idx) + { + // cout << setw(3) << first + static_cast(idx) << " "; + // cout << "[" << plants[idx] << "]: "; + string env = environment(plants, idx); + // cout << env << " => "; + + char result = '?'; + if (auto it = rules.find(env); it != rules.end()) + result = it->second; + // cout << result << "\n"; + nextgen[idx] = result; + } + plants.swap(nextgen); + } + + // cout << string(-first, ' ') << original << "\n"; + // cout << string(plants.begin(), plants.end()) << "\n"; + + int score = 0; + for (size_t idx = 0; idx < plants.size(); ++idx) + { + score += (plants[idx] == '#' ? idx + first : 0); + } + cout << "score: " << score << "\n"; + +} \ No newline at end of file diff --git a/advent_of_code_2018/day12/out.txt b/advent_of_code_2018/day12/out.txt new file mode 100644 index 0000000..d00f3a1 --- /dev/null +++ b/advent_of_code_2018/day12/out.txt @@ -0,0 +1,2328 @@ +##.######...#.##.#...#...##.####..###.#.##.#.##...##..#...##.#..##....##...........#.#.#..###.# + + + # now env new + -2 [.]: ....# => . + -1 [.]: ...## => . + 0 [#]: ..##. => # + 1 [#]: .##.# => # + 2 [.]: ##.## => . + 3 [#]: #.### => # + 4 [#]: .#### => # + 5 [#]: ##### => . + 6 [#]: ##### => . + 7 [#]: ####. => # + 8 [#]: ###.. => # + 9 [.]: ##... => # + 10 [.]: #...# => . + 11 [.]: ...#. => # + 12 [#]: ..#.# => # + 13 [.]: .#.## => # + 14 [#]: #.##. => . + 15 [#]: .##.# => # + 16 [.]: ##.#. => . + 17 [#]: #.#.. => . + 18 [.]: .#... => # + 19 [.]: #...# => . + 20 [.]: ...#. => # + 21 [#]: ..#.. => # + 22 [.]: .#... => # + 23 [.]: #...# => . + 24 [.]: ...## => . + 25 [#]: ..##. => # + 26 [#]: .##.# => # + 27 [.]: ##.## => . + 28 [#]: #.### => # + 29 [#]: .#### => # + 30 [#]: ####. => # + 31 [#]: ###.. => # + 32 [.]: ##..# => # + 33 [.]: #..## => # + 34 [#]: ..### => . + 35 [#]: .###. => # + 36 [#]: ###.# => # + 37 [.]: ##.#. => . + 38 [#]: #.#.# => # + 39 [.]: .#.## => # + 40 [#]: #.##. => . + 41 [#]: .##.# => # + 42 [.]: ##.#. => . + 43 [#]: #.#.# => # + 44 [.]: .#.## => # + 45 [#]: #.##. => . + 46 [#]: .##.. => . + 47 [.]: ##... => # + 48 [.]: #...# => . + 49 [.]: ...## => . + 50 [#]: ..##. => # + 51 [#]: .##.. => . + 52 [.]: ##..# => # + 53 [.]: #..#. => # + 54 [#]: ..#.. => # + 55 [.]: .#... => # + 56 [.]: #...# => . + 57 [.]: ...## => . + 58 [#]: ..##. => # + 59 [#]: .##.# => # + 60 [.]: ##.#. => . + 61 [#]: #.#.. => . + 62 [.]: .#..# => # + 63 [.]: #..## => # + 64 [#]: ..##. => # + 65 [#]: .##.. => . + 66 [.]: ##... => # + 67 [.]: #.... => . + 68 [.]: ....# => . + 69 [.]: ...## => . + 70 [#]: ..##. => # + 71 [#]: .##.. => . + 72 [.]: ##... => # + 73 [.]: #.... => . + 74 [.]: ..... => . + 75 [.]: ..... => . + 76 [.]: ..... => . + 77 [.]: ..... => . + 78 [.]: ..... => . + 79 [.]: ..... => . + 80 [.]: ..... => . + 81 [.]: ....# => . + 82 [.]: ...#. => # + 83 [#]: ..#.# => # + 84 [.]: .#.#. => . + 85 [#]: #.#.# => # + 86 [.]: .#.#. => . + 87 [#]: #.#.. => . + 88 [.]: .#..# => # + 89 [.]: #..## => # + 90 [#]: ..### => . + 91 [#]: .###. => # + 92 [#]: ###.# => # + 93 [.]: ##.#. => . + 94 [#]: #.#.. => . + 95 [.]: .#... => # + 96 [.]: #.... => . + + + # now env new + -4 [.]: ..... => . + -3 [.]: ..... => . + -2 [.]: ....# => . + -1 [.]: ...## => . + 0 [#]: ..##. => # + 1 [#]: .##.# => # + 2 [.]: ##.## => . + 3 [#]: #.##. => . + 4 [#]: .##.. => . + 5 [.]: ##..# => # + 6 [.]: #..## => # + 7 [#]: ..### => . + 8 [#]: .###. => # + 9 [#]: ###.# => # + 10 [.]: ##.## => . + 11 [#]: #.### => # + 12 [#]: .###. => # + 13 [#]: ###.# => # + 14 [.]: ##.#. => . + 15 [#]: #.#.. => . + 16 [.]: .#..# => # + 17 [.]: #..#. => # + 18 [#]: ..#.# => # + 19 [.]: .#.## => # + 20 [#]: #.### => # + 21 [#]: .###. => # + 22 [#]: ###.. => # + 23 [.]: ##..# => # + 24 [.]: #..## => # + 25 [#]: ..##. => # + 26 [#]: .##.# => # + 27 [.]: ##.## => . + 28 [#]: #.### => # + 29 [#]: .#### => # + 30 [#]: ##### => . + 31 [#]: ##### => . + 32 [#]: ####. => # + 33 [#]: ###.# => # + 34 [.]: ##.## => . + 35 [#]: #.##. => . + 36 [#]: .##.# => # + 37 [.]: ##.## => . + 38 [#]: #.##. => . + 39 [#]: .##.# => # + 40 [.]: ##.#. => . + 41 [#]: #.#.# => # + 42 [.]: .#.## => # + 43 [#]: #.##. => . + 44 [#]: .##.. => . + 45 [.]: ##..# => # + 46 [.]: #..#. => # + 47 [#]: ..#.. => # + 48 [.]: .#..# => # + 49 [.]: #..#. => # + 50 [#]: ..#.# => # + 51 [.]: .#.## => # + 52 [#]: #.### => # + 53 [#]: .#### => # + 54 [#]: ####. => # + 55 [#]: ###.. => # + 56 [.]: ##..# => # + 57 [.]: #..## => # + 58 [#]: ..##. => # + 59 [#]: .##.. => . + 60 [.]: ##..# => # + 61 [.]: #..## => # + 62 [#]: ..### => . + 63 [#]: .###. => # + 64 [#]: ###.# => # + 65 [.]: ##.#. => . + 66 [#]: #.#.. => . + 67 [.]: .#... => # + 68 [.]: #...# => . + 69 [.]: ...#. => # + 70 [#]: ..#.# => # + 71 [.]: .#.#. => . + 72 [#]: #.#.. => . + 73 [.]: .#... => # + 74 [.]: #.... => . + 75 [.]: ..... => . + 76 [.]: ..... => . + 77 [.]: ..... => . + 78 [.]: ..... => . + 79 [.]: ..... => . + 80 [.]: ....# => . + 81 [.]: ...## => . + 82 [#]: ..##. => # + 83 [#]: .##.# => # + 84 [.]: ##.#. => . + 85 [#]: #.#.. => . + 86 [.]: .#..# => # + 87 [.]: #..## => # + 88 [#]: ..##. => # + 89 [#]: .##.# => # + 90 [.]: ##.## => . + 91 [#]: #.##. => . + 92 [#]: .##.. => . + 93 [.]: ##..# => # + 94 [.]: #..#. => # + 95 [#]: ..#.. => # + 96 [.]: .#... => # + 97 [.]: #.... => . + 98 [.]: ..... => . + + + # now env new + -4 [.]: ..... => . + -3 [.]: ..... => . + -2 [.]: ....# => . + -1 [.]: ...## => . + 0 [#]: ..##. => # + 1 [#]: .##.. => . + 2 [.]: ##... => # + 3 [.]: #...# => . + 4 [.]: ...## => . + 5 [#]: ..##. => # + 6 [#]: .##.# => # + 7 [.]: ##.## => . + 8 [#]: #.##. => . + 9 [#]: .##.# => # + 10 [.]: ##.## => . + 11 [#]: #.### => # + 12 [#]: .###. => # + 13 [#]: ###.. => # + 14 [.]: ##..# => # + 15 [.]: #..## => # + 16 [#]: ..### => . + 17 [#]: .#### => # + 18 [#]: ##### => . + 19 [#]: ##### => . + 20 [#]: ##### => . + 21 [#]: ##### => . + 22 [#]: ##### => . + 23 [#]: ##### => . + 24 [#]: ##### => . + 25 [#]: ####. => # + 26 [#]: ###.# => # + 27 [.]: ##.## => . + 28 [#]: #.##. => . + 29 [#]: .##.. => . + 30 [.]: ##..# => # + 31 [.]: #..## => # + 32 [#]: ..##. => # + 33 [#]: .##.. => . + 34 [.]: ##..# => # + 35 [.]: #..#. => # + 36 [#]: ..#.. => # + 37 [.]: .#..# => # + 38 [.]: #..#. => # + 39 [#]: ..#.# => # + 40 [.]: .#.## => # + 41 [#]: #.##. => . + 42 [#]: .##.. => . + 43 [.]: ##..# => # + 44 [.]: #..## => # + 45 [#]: ..### => . + 46 [#]: .#### => # + 47 [#]: ##### => . + 48 [#]: ##### => . + 49 [#]: ##### => . + 50 [#]: ##### => . + 51 [#]: ##### => . + 52 [#]: ##### => . + 53 [#]: ##### => . + 54 [#]: ##### => . + 55 [#]: ##### => . + 56 [#]: ##### => . + 57 [#]: ####. => # + 58 [#]: ###.# => # + 59 [.]: ##.## => . + 60 [#]: #.##. => . + 61 [#]: .##.# => # + 62 [.]: ##.## => . + 63 [#]: #.##. => . + 64 [#]: .##.. => . + 65 [.]: ##..# => # + 66 [.]: #..#. => # + 67 [#]: ..#.# => # + 68 [.]: .#.## => # + 69 [#]: #.##. => . + 70 [#]: .##.. => . + 71 [.]: ##..# => # + 72 [.]: #..#. => # + 73 [#]: ..#.. => # + 74 [.]: .#... => # + 75 [.]: #.... => . + 76 [.]: ..... => . + 77 [.]: ..... => . + 78 [.]: ..... => . + 79 [.]: ..... => . + 80 [.]: ....# => . + 81 [.]: ...## => . + 82 [#]: ..##. => # + 83 [#]: .##.. => . + 84 [.]: ##..# => # + 85 [.]: #..## => # + 86 [#]: ..### => . + 87 [#]: .#### => # + 88 [#]: ####. => # + 89 [#]: ###.. => # + 90 [.]: ##... => # + 91 [.]: #...# => . + 92 [.]: ...## => . + 93 [#]: ..### => . + 94 [#]: .#### => # + 95 [#]: ####. => # + 96 [#]: ###.. => # + 97 [.]: ##... => # + 98 [.]: #.... => . + 99 [.]: ..... => . +100 [.]: ..... => . + + + # now env new + -4 [.]: ..... => . + -3 [.]: ..... => . + -2 [.]: ....# => . + -1 [.]: ...#. => # + 0 [#]: ..#.# => # + 1 [.]: .#.#. => . + 2 [#]: #.#.. => . + 3 [.]: .#..# => # + 4 [.]: #..## => # + 5 [#]: ..##. => # + 6 [#]: .##.. => . + 7 [.]: ##..# => # + 8 [.]: #..#. => # + 9 [#]: ..#.# => # + 10 [.]: .#.## => # + 11 [#]: #.### => # + 12 [#]: .#### => # + 13 [#]: ##### => . + 14 [#]: ####. => # + 15 [#]: ###.# => # + 16 [.]: ##.#. => . + 17 [#]: #.#.. => . + 18 [.]: .#... => # + 19 [.]: #.... => . + 20 [.]: ..... => . + 21 [.]: ..... => . + 22 [.]: ..... => . + 23 [.]: ....# => . + 24 [.]: ...## => . + 25 [#]: ..##. => # + 26 [#]: .##.. => . + 27 [.]: ##... => # + 28 [.]: #...# => . + 29 [.]: ...## => . + 30 [#]: ..### => . + 31 [#]: .###. => # + 32 [#]: ###.# => # + 33 [.]: ##.## => . + 34 [#]: #.### => # + 35 [#]: .#### => # + 36 [#]: ##### => . + 37 [#]: ##### => . + 38 [#]: ##### => . + 39 [#]: ####. => # + 40 [#]: ###.. => # + 41 [.]: ##..# => # + 42 [.]: #..## => # + 43 [#]: ..##. => # + 44 [#]: .##.# => # + 45 [.]: ##.#. => . + 46 [#]: #.#.. => . + 47 [.]: .#... => # + 48 [.]: #.... => . + 49 [.]: ..... => . + 50 [.]: ..... => . + 51 [.]: ..... => . + 52 [.]: ..... => . + 53 [.]: ..... => . + 54 [.]: ..... => . + 55 [.]: ....# => . + 56 [.]: ...## => . + 57 [#]: ..##. => # + 58 [#]: .##.. => . + 59 [.]: ##..# => # + 60 [.]: #..#. => # + 61 [#]: ..#.. => # + 62 [.]: .#... => # + 63 [.]: #...# => . + 64 [.]: ...## => . + 65 [#]: ..### => . + 66 [#]: .#### => # + 67 [#]: ####. => # + 68 [#]: ###.. => # + 69 [.]: ##..# => # + 70 [.]: #..## => # + 71 [#]: ..### => . + 72 [#]: .#### => # + 73 [#]: ####. => # + 74 [#]: ###.. => # + 75 [.]: ##... => # + 76 [.]: #.... => . + 77 [.]: ..... => . + 78 [.]: ..... => . + 79 [.]: ..... => . + 80 [.]: ....# => . + 81 [.]: ...#. => # + 82 [#]: ..#.# => # + 83 [.]: .#.## => # + 84 [#]: #.##. => . + 85 [#]: .##.# => # + 86 [.]: ##.## => . + 87 [#]: #.### => # + 88 [#]: .#### => # + 89 [#]: ####. => # + 90 [#]: ###.. => # + 91 [.]: ##... => # + 92 [.]: #...# => . + 93 [.]: ...## => . + 94 [#]: ..### => . + 95 [#]: .#### => # + 96 [#]: ####. => # + 97 [#]: ###.. => # + 98 [.]: ##... => # + 99 [.]: #.... => . +100 [.]: ..... => . + + + # now env new + -4 [.]: ..... => . + -3 [.]: ....# => . + -2 [.]: ...## => . + -1 [#]: ..##. => # + 0 [#]: .##.. => . + 1 [.]: ##..# => # + 2 [.]: #..## => # + 3 [#]: ..### => . + 4 [#]: .###. => # + 5 [#]: ###.# => # + 6 [.]: ##.## => . + 7 [#]: #.### => # + 8 [#]: .#### => # + 9 [#]: ##### => . + 10 [#]: ##### => . + 11 [#]: ####. => # + 12 [#]: ###.# => # + 13 [.]: ##.## => . + 14 [#]: #.##. => . + 15 [#]: .##.. => . + 16 [.]: ##..# => # + 17 [.]: #..#. => # + 18 [#]: ..#.. => # + 19 [.]: .#... => # + 20 [.]: #.... => . + 21 [.]: ..... => . + 22 [.]: ..... => . + 23 [.]: ....# => . + 24 [.]: ...#. => # + 25 [#]: ..#.# => # + 26 [.]: .#.#. => . + 27 [#]: #.#.. => . + 28 [.]: .#... => # + 29 [.]: #...# => . + 30 [.]: ...## => . + 31 [#]: ..##. => # + 32 [#]: .##.# => # + 33 [.]: ##.## => . + 34 [#]: #.##. => . + 35 [#]: .##.. => . + 36 [.]: ##... => # + 37 [.]: #...# => . + 38 [.]: ...## => . + 39 [#]: ..### => . + 40 [#]: .#### => # + 41 [#]: ##### => . + 42 [#]: ##### => . + 43 [#]: ####. => # + 44 [#]: ###.. => # + 45 [.]: ##..# => # + 46 [.]: #..#. => # + 47 [#]: ..#.. => # + 48 [.]: .#... => # + 49 [.]: #.... => . + 50 [.]: ..... => . + 51 [.]: ..... => . + 52 [.]: ..... => . + 53 [.]: ..... => . + 54 [.]: ..... => . + 55 [.]: ....# => . + 56 [.]: ...#. => # + 57 [#]: ..#.# => # + 58 [.]: .#.## => # + 59 [#]: #.### => # + 60 [#]: .#### => # + 61 [#]: ####. => # + 62 [#]: ###.. => # + 63 [.]: ##... => # + 64 [.]: #...# => . + 65 [.]: ...## => . + 66 [#]: ..### => . + 67 [#]: .#### => # + 68 [#]: ##### => . + 69 [#]: ####. => # + 70 [#]: ###.# => # + 71 [.]: ##.## => . + 72 [#]: #.### => # + 73 [#]: .#### => # + 74 [#]: ####. => # + 75 [#]: ###.. => # + 76 [.]: ##... => # + 77 [.]: #.... => . + 78 [.]: ..... => . + 79 [.]: ....# => . + 80 [.]: ...## => . + 81 [#]: ..### => . + 82 [#]: .###. => # + 83 [#]: ###.# => # + 84 [.]: ##.#. => . + 85 [#]: #.#.# => # + 86 [.]: .#.## => # + 87 [#]: #.### => # + 88 [#]: .#### => # + 89 [#]: ##### => . + 90 [#]: ####. => # + 91 [#]: ###.. => # + 92 [.]: ##... => # + 93 [.]: #...# => . + 94 [.]: ...## => . + 95 [#]: ..### => . + 96 [#]: .#### => # + 97 [#]: ####. => # + 98 [#]: ###.. => # + 99 [.]: ##... => # +100 [.]: #.... => . +101 [.]: ..... => . +102 [.]: ..... => . + + + # now env new + -4 [.]: ..... => . + -3 [.]: ....# => . + -2 [.]: ...#. => # + -1 [#]: ..#.# => # + 0 [.]: .#.## => # + 1 [#]: #.##. => . + 2 [#]: .##.# => # + 3 [.]: ##.## => . + 4 [#]: #.##. => . + 5 [#]: .##.# => # + 6 [.]: ##.## => . + 7 [#]: #.##. => . + 8 [#]: .##.. => . + 9 [.]: ##..# => # + 10 [.]: #..## => # + 11 [#]: ..##. => # + 12 [#]: .##.. => . + 13 [.]: ##... => # + 14 [.]: #...# => . + 15 [.]: ...## => . + 16 [#]: ..### => . + 17 [#]: .#### => # + 18 [#]: ####. => # + 19 [#]: ###.. => # + 20 [.]: ##... => # + 21 [.]: #.... => . + 22 [.]: ....# => . + 23 [.]: ...## => . + 24 [#]: ..##. => # + 25 [#]: .##.. => . + 26 [.]: ##..# => # + 27 [.]: #..#. => # + 28 [#]: ..#.. => # + 29 [.]: .#..# => # + 30 [.]: #..## => # + 31 [#]: ..##. => # + 32 [#]: .##.. => . + 33 [.]: ##... => # + 34 [.]: #...# => . + 35 [.]: ...#. => # + 36 [#]: ..#.. => # + 37 [.]: .#... => # + 38 [.]: #...# => . + 39 [.]: ...#. => # + 40 [#]: ..#.. => # + 41 [.]: .#..# => # + 42 [.]: #..## => # + 43 [#]: ..### => . + 44 [#]: .#### => # + 45 [#]: ##### => . + 46 [#]: ##### => . + 47 [#]: ####. => # + 48 [#]: ###.. => # + 49 [.]: ##... => # + 50 [.]: #.... => . + 51 [.]: ..... => . + 52 [.]: ..... => . + 53 [.]: ..... => . + 54 [.]: ....# => . + 55 [.]: ...## => . + 56 [#]: ..### => . + 57 [#]: .#### => # + 58 [#]: ##### => . + 59 [#]: ##### => . + 60 [#]: ##### => . + 61 [#]: ##### => . + 62 [#]: ####. => # + 63 [#]: ###.. => # + 64 [.]: ##... => # + 65 [.]: #...# => . + 66 [.]: ...#. => # + 67 [#]: ..#.# => # + 68 [.]: .#.## => # + 69 [#]: #.##. => . + 70 [#]: .##.# => # + 71 [.]: ##.## => . + 72 [#]: #.### => # + 73 [#]: .#### => # + 74 [#]: ##### => . + 75 [#]: ####. => # + 76 [#]: ###.. => # + 77 [.]: ##... => # + 78 [.]: #.... => . + 79 [.]: ..... => . + 80 [.]: ....# => . + 81 [.]: ...## => . + 82 [#]: ..##. => # + 83 [#]: .##.# => # + 84 [.]: ##.## => . + 85 [#]: #.### => # + 86 [#]: .#### => # + 87 [#]: ####. => # + 88 [#]: ###.# => # + 89 [.]: ##.## => . + 90 [#]: #.### => # + 91 [#]: .###. => # + 92 [#]: ###.. => # + 93 [.]: ##... => # + 94 [.]: #...# => . + 95 [.]: ...## => . + 96 [#]: ..### => . + 97 [#]: .#### => # + 98 [#]: ####. => # + 99 [#]: ###.. => # +100 [.]: ##... => # +101 [.]: #.... => . +102 [.]: ..... => . + + + # now env new + -6 [.]: ..... => . + -5 [.]: ..... => . + -4 [.]: ....# => . + -3 [.]: ...## => . + -2 [#]: ..### => . + -1 [#]: .###. => # + 0 [#]: ###.# => # + 1 [.]: ##.#. => . + 2 [#]: #.#.. => . + 3 [.]: .#..# => # + 4 [.]: #..#. => # + 5 [#]: ..#.. => # + 6 [.]: .#... => # + 7 [.]: #...# => . + 8 [.]: ...## => . + 9 [#]: ..### => . + 10 [#]: .###. => # + 11 [#]: ###.# => # + 12 [.]: ##.#. => . + 13 [#]: #.#.. => . + 14 [.]: .#... => # + 15 [.]: #...# => . + 16 [.]: ...## => . + 17 [#]: ..### => . + 18 [#]: .#### => # + 19 [#]: ####. => # + 20 [#]: ###.. => # + 21 [.]: ##... => # + 22 [.]: #...# => . + 23 [.]: ...#. => # + 24 [#]: ..#.# => # + 25 [.]: .#.## => # + 26 [#]: #.### => # + 27 [#]: .#### => # + 28 [#]: ##### => . + 29 [#]: ##### => . + 30 [#]: ####. => # + 31 [#]: ###.# => # + 32 [.]: ##.#. => . + 33 [#]: #.#.# => # + 34 [.]: .#.## => # + 35 [#]: #.### => # + 36 [#]: .###. => # + 37 [#]: ###.# => # + 38 [.]: ##.## => . + 39 [#]: #.### => # + 40 [#]: .#### => # + 41 [#]: ####. => # + 42 [#]: ###.# => # + 43 [.]: ##.#. => . + 44 [#]: #.#.. => . + 45 [.]: .#..# => # + 46 [.]: #..## => # + 47 [#]: ..### => . + 48 [#]: .###. => # + 49 [#]: ###.. => # + 50 [.]: ##... => # + 51 [.]: #.... => . + 52 [.]: ..... => . + 53 [.]: ..... => . + 54 [.]: ..... => . + 55 [.]: ....# => . + 56 [.]: ...#. => # + 57 [#]: ..#.. => # + 58 [.]: .#... => # + 59 [.]: #.... => . + 60 [.]: ....# => . + 61 [.]: ...## => . + 62 [#]: ..### => . + 63 [#]: .###. => # + 64 [#]: ###.# => # + 65 [.]: ##.## => . + 66 [#]: #.### => # + 67 [#]: .###. => # + 68 [#]: ###.# => # + 69 [.]: ##.#. => . + 70 [#]: #.#.# => # + 71 [.]: .#.## => # + 72 [#]: #.##. => . + 73 [#]: .##.# => # + 74 [.]: ##.## => . + 75 [#]: #.### => # + 76 [#]: .###. => # + 77 [#]: ###.. => # + 78 [.]: ##... => # + 79 [.]: #.... => . + 80 [.]: ....# => . + 81 [.]: ...## => . + 82 [#]: ..##. => # + 83 [#]: .##.# => # + 84 [.]: ##.## => . + 85 [#]: #.### => # + 86 [#]: .#### => # + 87 [#]: ####. => # + 88 [#]: ###.# => # + 89 [.]: ##.## => . + 90 [#]: #.### => # + 91 [#]: .#### => # + 92 [#]: ####. => # + 93 [#]: ###.. => # + 94 [.]: ##... => # + 95 [.]: #...# => . + 96 [.]: ...## => . + 97 [#]: ..### => . + 98 [#]: .#### => # + 99 [#]: ####. => # +100 [#]: ###.. => # +101 [.]: ##... => # +102 [.]: #.... => . +103 [.]: ..... => . +104 [.]: ..... => . + + + # now env new + -6 [.]: ..... => . + -5 [.]: ..... => . + -4 [.]: ..... => . + -3 [.]: ....# => . + -2 [.]: ...## => . + -1 [#]: ..##. => # + 0 [#]: .##.. => . + 1 [.]: ##..# => # + 2 [.]: #..## => # + 3 [#]: ..### => . + 4 [#]: .#### => # + 5 [#]: ####. => # + 6 [#]: ###.. => # + 7 [.]: ##... => # + 8 [.]: #...# => . + 9 [.]: ...## => . + 10 [#]: ..##. => # + 11 [#]: .##.. => . + 12 [.]: ##..# => # + 13 [.]: #..#. => # + 14 [#]: ..#.. => # + 15 [.]: .#... => # + 16 [.]: #...# => . + 17 [.]: ...## => . + 18 [#]: ..### => . + 19 [#]: .#### => # + 20 [#]: ####. => # + 21 [#]: ###.# => # + 22 [.]: ##.## => . + 23 [#]: #.### => # + 24 [#]: .#### => # + 25 [#]: ##### => . + 26 [#]: ####. => # + 27 [#]: ###.. => # + 28 [.]: ##..# => # + 29 [.]: #..## => # + 30 [#]: ..##. => # + 31 [#]: .##.# => # + 32 [.]: ##.## => . + 33 [#]: #.### => # + 34 [#]: .#### => # + 35 [#]: ##### => . + 36 [#]: ####. => # + 37 [#]: ###.# => # + 38 [.]: ##.## => . + 39 [#]: #.### => # + 40 [#]: .#### => # + 41 [#]: ####. => # + 42 [#]: ###.. => # + 43 [.]: ##..# => # + 44 [.]: #..## => # + 45 [#]: ..##. => # + 46 [#]: .##.# => # + 47 [.]: ##.## => . + 48 [#]: #.### => # + 49 [#]: .###. => # + 50 [#]: ###.. => # + 51 [.]: ##... => # + 52 [.]: #.... => . + 53 [.]: ..... => . + 54 [.]: ....# => . + 55 [.]: ...## => . + 56 [#]: ..### => . + 57 [#]: .###. => # + 58 [#]: ###.. => # + 59 [.]: ##... => # + 60 [.]: #.... => . + 61 [.]: ....# => . + 62 [.]: ...## => . + 63 [#]: ..##. => # + 64 [#]: .##.# => # + 65 [.]: ##.## => . + 66 [#]: #.### => # + 67 [#]: .###. => # + 68 [#]: ###.# => # + 69 [.]: ##.## => . + 70 [#]: #.##. => . + 71 [#]: .##.# => # + 72 [.]: ##.#. => . + 73 [#]: #.#.# => # + 74 [.]: .#.## => # + 75 [#]: #.### => # + 76 [#]: .#### => # + 77 [#]: ####. => # + 78 [#]: ###.. => # + 79 [.]: ##... => # + 80 [.]: #...# => . + 81 [.]: ...## => . + 82 [#]: ..##. => # + 83 [#]: .##.# => # + 84 [.]: ##.## => . + 85 [#]: #.### => # + 86 [#]: .#### => # + 87 [#]: ####. => # + 88 [#]: ###.# => # + 89 [.]: ##.## => . + 90 [#]: #.### => # + 91 [#]: .#### => # + 92 [#]: ##### => . + 93 [#]: ####. => # + 94 [#]: ###.. => # + 95 [.]: ##... => # + 96 [.]: #...# => . + 97 [.]: ...## => . + 98 [#]: ..### => . + 99 [#]: .#### => # +100 [#]: ####. => # +101 [#]: ###.. => # +102 [.]: ##... => # +103 [.]: #.... => . +104 [.]: ..... => . + + + # now env new + -6 [.]: ..... => . + -5 [.]: ..... => . + -4 [.]: ..... => . + -3 [.]: ....# => . + -2 [.]: ...#. => # + -1 [#]: ..#.# => # + 0 [.]: .#.## => # + 1 [#]: #.##. => . + 2 [#]: .##.# => # + 3 [.]: ##.## => . + 4 [#]: #.### => # + 5 [#]: .#### => # + 6 [#]: ####. => # + 7 [#]: ###.. => # + 8 [.]: ##..# => # + 9 [.]: #..#. => # + 10 [#]: ..#.# => # + 11 [.]: .#.## => # + 12 [#]: #.### => # + 13 [#]: .#### => # + 14 [#]: ####. => # + 15 [#]: ###.. => # + 16 [.]: ##... => # + 17 [.]: #...# => . + 18 [.]: ...## => . + 19 [#]: ..### => . + 20 [#]: .###. => # + 21 [#]: ###.# => # + 22 [.]: ##.## => . + 23 [#]: #.##. => . + 24 [#]: .##.# => # + 25 [.]: ##.## => . + 26 [#]: #.### => # + 27 [#]: .#### => # + 28 [#]: ##### => . + 29 [#]: ##### => . + 30 [#]: ####. => # + 31 [#]: ###.# => # + 32 [.]: ##.## => . + 33 [#]: #.##. => . + 34 [#]: .##.# => # + 35 [.]: ##.## => . + 36 [#]: #.##. => . + 37 [#]: .##.# => # + 38 [.]: ##.## => . + 39 [#]: #.### => # + 40 [#]: .#### => # + 41 [#]: ##### => . + 42 [#]: ##### => . + 43 [#]: ##### => . + 44 [#]: ##### => . + 45 [#]: ####. => # + 46 [#]: ###.# => # + 47 [.]: ##.## => . + 48 [#]: #.### => # + 49 [#]: .#### => # + 50 [#]: ####. => # + 51 [#]: ###.. => # + 52 [.]: ##... => # + 53 [.]: #.... => . + 54 [.]: ..... => . + 55 [.]: ....# => . + 56 [.]: ...## => . + 57 [#]: ..### => . + 58 [#]: .###. => # + 59 [#]: ###.. => # + 60 [.]: ##... => # + 61 [.]: #...# => . + 62 [.]: ...## => . + 63 [#]: ..##. => # + 64 [#]: .##.# => # + 65 [.]: ##.## => . + 66 [#]: #.### => # + 67 [#]: .###. => # + 68 [#]: ###.. => # + 69 [.]: ##..# => # + 70 [.]: #..#. => # + 71 [#]: ..#.# => # + 72 [.]: .#.## => # + 73 [#]: #.### => # + 74 [#]: .#### => # + 75 [#]: ##### => . + 76 [#]: ##### => . + 77 [#]: ##### => . + 78 [#]: ####. => # + 79 [#]: ###.. => # + 80 [.]: ##..# => # + 81 [.]: #..## => # + 82 [#]: ..##. => # + 83 [#]: .##.# => # + 84 [.]: ##.## => . + 85 [#]: #.### => # + 86 [#]: .#### => # + 87 [#]: ####. => # + 88 [#]: ###.# => # + 89 [.]: ##.## => . + 90 [#]: #.##. => . + 91 [#]: .##.# => # + 92 [.]: ##.## => . + 93 [#]: #.### => # + 94 [#]: .###. => # + 95 [#]: ###.. => # + 96 [.]: ##... => # + 97 [.]: #...# => . + 98 [.]: ...## => . + 99 [#]: ..### => . +100 [#]: .#### => # +101 [#]: ####. => # +102 [#]: ###.. => # +103 [.]: ##... => # +104 [.]: #.... => . +105 [.]: ..... => . +106 [.]: ..... => . + + + # now env new + -6 [.]: ..... => . + -5 [.]: ..... => . + -4 [.]: ....# => . + -3 [.]: ...## => . + -2 [#]: ..### => . + -1 [#]: .###. => # + 0 [#]: ###.# => # + 1 [.]: ##.#. => . + 2 [#]: #.#.# => # + 3 [.]: .#.## => # + 4 [#]: #.### => # + 5 [#]: .#### => # + 6 [#]: ##### => . + 7 [#]: ##### => . + 8 [#]: ##### => . + 9 [#]: ##### => . + 10 [#]: ##### => . + 11 [#]: ##### => . + 12 [#]: ##### => . + 13 [#]: ##### => . + 14 [#]: ##### => . + 15 [#]: ####. => # + 16 [#]: ###.. => # + 17 [.]: ##... => # + 18 [.]: #...# => . + 19 [.]: ...## => . + 20 [#]: ..##. => # + 21 [#]: .##.. => . + 22 [.]: ##..# => # + 23 [.]: #..#. => # + 24 [#]: ..#.# => # + 25 [.]: .#.## => # + 26 [#]: #.##. => . + 27 [#]: .##.. => . + 28 [.]: ##..# => # + 29 [.]: #..## => # + 30 [#]: ..##. => # + 31 [#]: .##.. => . + 32 [.]: ##..# => # + 33 [.]: #..#. => # + 34 [#]: ..#.. => # + 35 [.]: .#..# => # + 36 [.]: #..#. => # + 37 [#]: ..#.# => # + 38 [.]: .#.## => # + 39 [#]: #.##. => . + 40 [#]: .##.. => . + 41 [.]: ##... => # + 42 [.]: #.... => . + 43 [.]: ....# => . + 44 [.]: ...## => . + 45 [#]: ..##. => # + 46 [#]: .##.# => # + 47 [.]: ##.## => . + 48 [#]: #.### => # + 49 [#]: .#### => # + 50 [#]: ##### => . + 51 [#]: ####. => # + 52 [#]: ###.. => # + 53 [.]: ##... => # + 54 [.]: #.... => . + 55 [.]: ..... => . + 56 [.]: ....# => . + 57 [.]: ...## => . + 58 [#]: ..### => . + 59 [#]: .###. => # + 60 [#]: ###.. => # + 61 [.]: ##..# => # + 62 [.]: #..## => # + 63 [#]: ..##. => # + 64 [#]: .##.# => # + 65 [.]: ##.## => . + 66 [#]: #.### => # + 67 [#]: .#### => # + 68 [#]: ##### => . + 69 [#]: ##### => . + 70 [#]: ##### => . + 71 [#]: ##### => . + 72 [#]: ##### => . + 73 [#]: ####. => # + 74 [#]: ###.. => # + 75 [.]: ##... => # + 76 [.]: #...# => . + 77 [.]: ...## => . + 78 [#]: ..### => . + 79 [#]: .#### => # + 80 [#]: ##### => . + 81 [#]: ##### => . + 82 [#]: ####. => # + 83 [#]: ###.# => # + 84 [.]: ##.## => . + 85 [#]: #.### => # + 86 [#]: .#### => # + 87 [#]: ####. => # + 88 [#]: ###.. => # + 89 [.]: ##..# => # + 90 [.]: #..#. => # + 91 [#]: ..#.# => # + 92 [.]: .#.## => # + 93 [#]: #.### => # + 94 [#]: .#### => # + 95 [#]: ####. => # + 96 [#]: ###.. => # + 97 [.]: ##... => # + 98 [.]: #...# => . + 99 [.]: ...## => . +100 [#]: ..### => . +101 [#]: .#### => # +102 [#]: ####. => # +103 [#]: ###.. => # +104 [.]: ##... => # +105 [.]: #.... => . +106 [.]: ..... => . + + + # now env new + -6 [.]: ..... => . + -5 [.]: ..... => . + -4 [.]: ..... => . + -3 [.]: ....# => . + -2 [.]: ...## => . + -1 [#]: ..##. => # + 0 [#]: .##.# => # + 1 [.]: ##.## => . + 2 [#]: #.### => # + 3 [#]: .#### => # + 4 [#]: ####. => # + 5 [#]: ###.. => # + 6 [.]: ##... => # + 7 [.]: #.... => . + 8 [.]: ..... => . + 9 [.]: ..... => . + 10 [.]: ..... => . + 11 [.]: ..... => . + 12 [.]: ..... => . + 13 [.]: ....# => . + 14 [.]: ...## => . + 15 [#]: ..### => . + 16 [#]: .###. => # + 17 [#]: ###.. => # + 18 [.]: ##..# => # + 19 [.]: #..#. => # + 20 [#]: ..#.# => # + 21 [.]: .#.## => # + 22 [#]: #.### => # + 23 [#]: .#### => # + 24 [#]: ####. => # + 25 [#]: ###.. => # + 26 [.]: ##..# => # + 27 [.]: #..## => # + 28 [#]: ..### => . + 29 [#]: .###. => # + 30 [#]: ###.# => # + 31 [.]: ##.## => . + 32 [#]: #.### => # + 33 [#]: .#### => # + 34 [#]: ##### => . + 35 [#]: ##### => . + 36 [#]: ##### => . + 37 [#]: ####. => # + 38 [#]: ###.. => # + 39 [.]: ##..# => # + 40 [.]: #..#. => # + 41 [#]: ..#.. => # + 42 [.]: .#... => # + 43 [.]: #...# => . + 44 [.]: ...## => . + 45 [#]: ..##. => # + 46 [#]: .##.# => # + 47 [.]: ##.## => . + 48 [#]: #.##. => . + 49 [#]: .##.# => # + 50 [.]: ##.## => . + 51 [#]: #.### => # + 52 [#]: .###. => # + 53 [#]: ###.. => # + 54 [.]: ##... => # + 55 [.]: #.... => . + 56 [.]: ..... => . + 57 [.]: ....# => . + 58 [.]: ...## => . + 59 [#]: ..### => . + 60 [#]: .#### => # + 61 [#]: ##### => . + 62 [#]: ##### => . + 63 [#]: ####. => # + 64 [#]: ###.# => # + 65 [.]: ##.## => . + 66 [#]: #.##. => . + 67 [#]: .##.. => . + 68 [.]: ##... => # + 69 [.]: #.... => . + 70 [.]: ..... => . + 71 [.]: ....# => . + 72 [.]: ...## => . + 73 [#]: ..### => . + 74 [#]: .###. => # + 75 [#]: ###.. => # + 76 [.]: ##... => # + 77 [.]: #...# => . + 78 [.]: ...#. => # + 79 [#]: ..#.. => # + 80 [.]: .#..# => # + 81 [.]: #..## => # + 82 [#]: ..##. => # + 83 [#]: .##.# => # + 84 [.]: ##.## => . + 85 [#]: #.### => # + 86 [#]: .#### => # + 87 [#]: ##### => . + 88 [#]: ##### => . + 89 [#]: ##### => . + 90 [#]: ##### => . + 91 [#]: ##### => . + 92 [#]: ##### => . + 93 [#]: ##### => . + 94 [#]: ##### => . + 95 [#]: ##### => . + 96 [#]: ####. => # + 97 [#]: ###.. => # + 98 [.]: ##... => # + 99 [.]: #...# => . +100 [.]: ...## => . +101 [#]: ..### => . +102 [#]: .#### => # +103 [#]: ####. => # +104 [#]: ###.. => # +105 [.]: ##... => # +106 [.]: #.... => . +107 [.]: ..... => . +108 [.]: ..... => . + + + # now env new + -6 [.]: ..... => . + -5 [.]: ..... => . + -4 [.]: ..... => . + -3 [.]: ....# => . + -2 [.]: ...## => . + -1 [#]: ..##. => # + 0 [#]: .##.# => # + 1 [.]: ##.## => . + 2 [#]: #.### => # + 3 [#]: .#### => # + 4 [#]: ##### => . + 5 [#]: ####. => # + 6 [#]: ###.. => # + 7 [.]: ##... => # + 8 [.]: #.... => . + 9 [.]: ..... => . + 10 [.]: ..... => . + 11 [.]: ..... => . + 12 [.]: ..... => . + 13 [.]: ..... => . + 14 [.]: ....# => . + 15 [.]: ...## => . + 16 [#]: ..### => . + 17 [#]: .#### => # + 18 [#]: ##### => . + 19 [#]: ##### => . + 20 [#]: ##### => . + 21 [#]: ##### => . + 22 [#]: ##### => . + 23 [#]: ##### => . + 24 [#]: ##### => . + 25 [#]: ##### => . + 26 [#]: ####. => # + 27 [#]: ###.# => # + 28 [.]: ##.## => . + 29 [#]: #.##. => . + 30 [#]: .##.# => # + 31 [.]: ##.## => . + 32 [#]: #.##. => . + 33 [#]: .##.. => . + 34 [.]: ##... => # + 35 [.]: #...# => . + 36 [.]: ...## => . + 37 [#]: ..### => . + 38 [#]: .#### => # + 39 [#]: ##### => . + 40 [#]: ##### => . + 41 [#]: ####. => # + 42 [#]: ###.. => # + 43 [.]: ##..# => # + 44 [.]: #..## => # + 45 [#]: ..##. => # + 46 [#]: .##.. => . + 47 [.]: ##..# => # + 48 [.]: #..#. => # + 49 [#]: ..#.# => # + 50 [.]: .#.## => # + 51 [#]: #.### => # + 52 [#]: .#### => # + 53 [#]: ####. => # + 54 [#]: ###.. => # + 55 [.]: ##... => # + 56 [.]: #.... => . + 57 [.]: ..... => . + 58 [.]: ....# => . + 59 [.]: ...#. => # + 60 [#]: ..#.. => # + 61 [.]: .#..# => # + 62 [.]: #..## => # + 63 [#]: ..##. => # + 64 [#]: .##.. => . + 65 [.]: ##... => # + 66 [.]: #...# => . + 67 [.]: ...#. => # + 68 [#]: ..#.. => # + 69 [.]: .#... => # + 70 [.]: #.... => . + 71 [.]: ..... => . + 72 [.]: ....# => . + 73 [.]: ...## => . + 74 [#]: ..### => . + 75 [#]: .###. => # + 76 [#]: ###.# => # + 77 [.]: ##.## => . + 78 [#]: #.### => # + 79 [#]: .#### => # + 80 [#]: ##### => . + 81 [#]: ##### => . + 82 [#]: ####. => # + 83 [#]: ###.# => # + 84 [.]: ##.## => . + 85 [#]: #.##. => . + 86 [#]: .##.. => . + 87 [.]: ##... => # + 88 [.]: #.... => . + 89 [.]: ..... => . + 90 [.]: ..... => . + 91 [.]: ..... => . + 92 [.]: ..... => . + 93 [.]: ..... => . + 94 [.]: ....# => . + 95 [.]: ...## => . + 96 [#]: ..### => . + 97 [#]: .###. => # + 98 [#]: ###.. => # + 99 [.]: ##... => # +100 [.]: #...# => . +101 [.]: ...## => . +102 [#]: ..### => . +103 [#]: .#### => # +104 [#]: ####. => # +105 [#]: ###.. => # +106 [.]: ##... => # +107 [.]: #.... => . +108 [.]: ..... => . + + + # now env new + -6 [.]: ..... => . + -5 [.]: ..... => . + -4 [.]: ..... => . + -3 [.]: ....# => . + -2 [.]: ...## => . + -1 [#]: ..##. => # + 0 [#]: .##.# => # + 1 [.]: ##.## => . + 2 [#]: #.##. => . + 3 [#]: .##.# => # + 4 [.]: ##.## => . + 5 [#]: #.### => # + 6 [#]: .###. => # + 7 [#]: ###.. => # + 8 [.]: ##... => # + 9 [.]: #.... => . + 10 [.]: ..... => . + 11 [.]: ..... => . + 12 [.]: ..... => . + 13 [.]: ..... => . + 14 [.]: ..... => . + 15 [.]: ....# => . + 16 [.]: ...#. => # + 17 [#]: ..#.. => # + 18 [.]: .#... => # + 19 [.]: #.... => . + 20 [.]: ..... => . + 21 [.]: ..... => . + 22 [.]: ..... => . + 23 [.]: ..... => . + 24 [.]: ....# => . + 25 [.]: ...## => . + 26 [#]: ..##. => # + 27 [#]: .##.. => . + 28 [.]: ##..# => # + 29 [.]: #..#. => # + 30 [#]: ..#.. => # + 31 [.]: .#... => # + 32 [.]: #...# => . + 33 [.]: ...#. => # + 34 [#]: ..#.. => # + 35 [.]: .#... => # + 36 [.]: #...# => . + 37 [.]: ...#. => # + 38 [#]: ..#.. => # + 39 [.]: .#..# => # + 40 [.]: #..## => # + 41 [#]: ..### => . + 42 [#]: .#### => # + 43 [#]: ##### => . + 44 [#]: ####. => # + 45 [#]: ###.# => # + 46 [.]: ##.## => . + 47 [#]: #.### => # + 48 [#]: .#### => # + 49 [#]: ##### => . + 50 [#]: ##### => . + 51 [#]: ##### => . + 52 [#]: ##### => . + 53 [#]: ##### => . + 54 [#]: ####. => # + 55 [#]: ###.. => # + 56 [.]: ##... => # + 57 [.]: #...# => . + 58 [.]: ...## => . + 59 [#]: ..### => . + 60 [#]: .#### => # + 61 [#]: ##### => . + 62 [#]: ####. => # + 63 [#]: ###.# => # + 64 [.]: ##.#. => . + 65 [#]: #.#.# => # + 66 [.]: .#.## => # + 67 [#]: #.### => # + 68 [#]: .###. => # + 69 [#]: ###.. => # + 70 [.]: ##... => # + 71 [.]: #.... => . + 72 [.]: ..... => . + 73 [.]: ....# => . + 74 [.]: ...## => . + 75 [#]: ..##. => # + 76 [#]: .##.# => # + 77 [.]: ##.## => . + 78 [#]: #.##. => . + 79 [#]: .##.. => . + 80 [.]: ##..# => # + 81 [.]: #..## => # + 82 [#]: ..##. => # + 83 [#]: .##.. => . + 84 [.]: ##... => # + 85 [.]: #...# => . + 86 [.]: ...#. => # + 87 [#]: ..#.. => # + 88 [.]: .#... => # + 89 [.]: #.... => . + 90 [.]: ..... => . + 91 [.]: ..... => . + 92 [.]: ..... => . + 93 [.]: ..... => . + 94 [.]: ..... => . + 95 [.]: ....# => . + 96 [.]: ...## => . + 97 [#]: ..### => . + 98 [#]: .###. => # + 99 [#]: ###.. => # +100 [.]: ##... => # +101 [.]: #...# => . +102 [.]: ...## => . +103 [#]: ..### => . +104 [#]: .#### => # +105 [#]: ####. => # +106 [#]: ###.. => # +107 [.]: ##... => # +108 [.]: #.... => . +109 [.]: ..... => . +110 [.]: ..... => . + + + # now env new + -6 [.]: ..... => . + -5 [.]: ..... => . + -4 [.]: ..... => . + -3 [.]: ....# => . + -2 [.]: ...## => . + -1 [#]: ..##. => # + 0 [#]: .##.. => . + 1 [.]: ##..# => # + 2 [.]: #..#. => # + 3 [#]: ..#.# => # + 4 [.]: .#.## => # + 5 [#]: #.### => # + 6 [#]: .#### => # + 7 [#]: ####. => # + 8 [#]: ###.. => # + 9 [.]: ##... => # + 10 [.]: #.... => . + 11 [.]: ..... => . + 12 [.]: ..... => . + 13 [.]: ..... => . + 14 [.]: ....# => . + 15 [.]: ...## => . + 16 [#]: ..### => . + 17 [#]: .###. => # + 18 [#]: ###.. => # + 19 [.]: ##... => # + 20 [.]: #.... => . + 21 [.]: ..... => . + 22 [.]: ..... => . + 23 [.]: ..... => . + 24 [.]: ....# => . + 25 [.]: ...#. => # + 26 [#]: ..#.# => # + 27 [.]: .#.## => # + 28 [#]: #.### => # + 29 [#]: .#### => # + 30 [#]: ####. => # + 31 [#]: ###.# => # + 32 [.]: ##.## => . + 33 [#]: #.### => # + 34 [#]: .###. => # + 35 [#]: ###.# => # + 36 [.]: ##.## => . + 37 [#]: #.### => # + 38 [#]: .#### => # + 39 [#]: ####. => # + 40 [#]: ###.# => # + 41 [.]: ##.#. => . + 42 [#]: #.#.# => # + 43 [.]: .#.## => # + 44 [#]: #.##. => . + 45 [#]: .##.# => # + 46 [.]: ##.## => . + 47 [#]: #.##. => . + 48 [#]: .##.. => . + 49 [.]: ##... => # + 50 [.]: #.... => . + 51 [.]: ..... => . + 52 [.]: ....# => . + 53 [.]: ...## => . + 54 [#]: ..### => . + 55 [#]: .###. => # + 56 [#]: ###.. => # + 57 [.]: ##... => # + 58 [.]: #...# => . + 59 [.]: ...#. => # + 60 [#]: ..#.# => # + 61 [.]: .#.## => # + 62 [#]: #.##. => . + 63 [#]: .##.# => # + 64 [.]: ##.## => . + 65 [#]: #.### => # + 66 [#]: .#### => # + 67 [#]: ##### => . + 68 [#]: ##### => . + 69 [#]: ####. => # + 70 [#]: ###.. => # + 71 [.]: ##... => # + 72 [.]: #.... => . + 73 [.]: ....# => . + 74 [.]: ...## => . + 75 [#]: ..##. => # + 76 [#]: .##.. => . + 77 [.]: ##... => # + 78 [.]: #...# => . + 79 [.]: ...## => . + 80 [#]: ..### => . + 81 [#]: .###. => # + 82 [#]: ###.# => # + 83 [.]: ##.#. => . + 84 [#]: #.#.# => # + 85 [.]: .#.## => # + 86 [#]: #.### => # + 87 [#]: .###. => # + 88 [#]: ###.. => # + 89 [.]: ##... => # + 90 [.]: #.... => . + 91 [.]: ..... => . + 92 [.]: ..... => . + 93 [.]: ..... => . + 94 [.]: ..... => . + 95 [.]: ..... => . + 96 [.]: ....# => . + 97 [.]: ...## => . + 98 [#]: ..### => . + 99 [#]: .###. => # +100 [#]: ###.. => # +101 [.]: ##... => # +102 [.]: #...# => . +103 [.]: ...## => . +104 [#]: ..### => . +105 [#]: .#### => # +106 [#]: ####. => # +107 [#]: ###.. => # +108 [.]: ##... => # +109 [.]: #.... => . +110 [.]: ..... => . + + + # now env new + -6 [.]: ..... => . + -5 [.]: ..... => . + -4 [.]: ..... => . + -3 [.]: ....# => . + -2 [.]: ...#. => # + -1 [#]: ..#.# => # + 0 [.]: .#.## => # + 1 [#]: #.### => # + 2 [#]: .#### => # + 3 [#]: ##### => . + 4 [#]: ##### => . + 5 [#]: ##### => . + 6 [#]: ##### => . + 7 [#]: ##### => . + 8 [#]: ####. => # + 9 [#]: ###.. => # + 10 [.]: ##... => # + 11 [.]: #.... => . + 12 [.]: ..... => . + 13 [.]: ..... => . + 14 [.]: ..... => . + 15 [.]: ....# => . + 16 [.]: ...## => . + 17 [#]: ..### => . + 18 [#]: .###. => # + 19 [#]: ###.. => # + 20 [.]: ##... => # + 21 [.]: #.... => . + 22 [.]: ..... => . + 23 [.]: ....# => . + 24 [.]: ...## => . + 25 [#]: ..### => . + 26 [#]: .#### => # + 27 [#]: ##### => . + 28 [#]: ##### => . + 29 [#]: ##### => . + 30 [#]: ####. => # + 31 [#]: ###.# => # + 32 [.]: ##.## => . + 33 [#]: #.### => # + 34 [#]: .###. => # + 35 [#]: ###.# => # + 36 [.]: ##.## => . + 37 [#]: #.### => # + 38 [#]: .#### => # + 39 [#]: ####. => # + 40 [#]: ###.# => # + 41 [.]: ##.## => . + 42 [#]: #.##. => . + 43 [#]: .##.# => # + 44 [.]: ##.#. => . + 45 [#]: #.#.. => . + 46 [.]: .#... => # + 47 [.]: #...# => . + 48 [.]: ...#. => # + 49 [#]: ..#.. => # + 50 [.]: .#... => # + 51 [.]: #.... => . + 52 [.]: ..... => . + 53 [.]: ....# => . + 54 [.]: ...## => . + 55 [#]: ..### => . + 56 [#]: .###. => # + 57 [#]: ###.# => # + 58 [.]: ##.## => . + 59 [#]: #.### => # + 60 [#]: .###. => # + 61 [#]: ###.# => # + 62 [.]: ##.#. => . + 63 [#]: #.#.# => # + 64 [.]: .#.## => # + 65 [#]: #.##. => . + 66 [#]: .##.. => . + 67 [.]: ##..# => # + 68 [.]: #..## => # + 69 [#]: ..### => . + 70 [#]: .###. => # + 71 [#]: ###.. => # + 72 [.]: ##... => # + 73 [.]: #...# => . + 74 [.]: ...#. => # + 75 [#]: ..#.# => # + 76 [.]: .#.#. => . + 77 [#]: #.#.. => . + 78 [.]: .#... => # + 79 [.]: #...# => . + 80 [.]: ...## => . + 81 [#]: ..##. => # + 82 [#]: .##.# => # + 83 [.]: ##.## => . + 84 [#]: #.### => # + 85 [#]: .#### => # + 86 [#]: ##### => . + 87 [#]: ##### => . + 88 [#]: ####. => # + 89 [#]: ###.. => # + 90 [.]: ##... => # + 91 [.]: #.... => . + 92 [.]: ..... => . + 93 [.]: ..... => . + 94 [.]: ..... => . + 95 [.]: ..... => . + 96 [.]: ..... => . + 97 [.]: ....# => . + 98 [.]: ...## => . + 99 [#]: ..### => . +100 [#]: .###. => # +101 [#]: ###.. => # +102 [.]: ##... => # +103 [.]: #...# => . +104 [.]: ...## => . +105 [#]: ..### => . +106 [#]: .#### => # +107 [#]: ####. => # +108 [#]: ###.. => # +109 [.]: ##... => # +110 [.]: #.... => . +111 [.]: ..... => . +112 [.]: ..... => . + + + # now env new + -6 [.]: ..... => . + -5 [.]: ..... => . + -4 [.]: ....# => . + -3 [.]: ...## => . + -2 [#]: ..### => . + -1 [#]: .#### => # + 0 [#]: ##### => . + 1 [#]: ####. => # + 2 [#]: ###.. => # + 3 [.]: ##... => # + 4 [.]: #.... => . + 5 [.]: ..... => . + 6 [.]: ....# => . + 7 [.]: ...## => . + 8 [#]: ..### => . + 9 [#]: .###. => # + 10 [#]: ###.. => # + 11 [.]: ##... => # + 12 [.]: #.... => . + 13 [.]: ..... => . + 14 [.]: ..... => . + 15 [.]: ..... => . + 16 [.]: ....# => . + 17 [.]: ...## => . + 18 [#]: ..### => . + 19 [#]: .###. => # + 20 [#]: ###.. => # + 21 [.]: ##... => # + 22 [.]: #.... => . + 23 [.]: ..... => . + 24 [.]: ....# => . + 25 [.]: ...#. => # + 26 [#]: ..#.. => # + 27 [.]: .#... => # + 28 [.]: #...# => . + 29 [.]: ...## => . + 30 [#]: ..##. => # + 31 [#]: .##.# => # + 32 [.]: ##.## => . + 33 [#]: #.### => # + 34 [#]: .###. => # + 35 [#]: ###.# => # + 36 [.]: ##.## => . + 37 [#]: #.### => # + 38 [#]: .#### => # + 39 [#]: ####. => # + 40 [#]: ###.. => # + 41 [.]: ##..# => # + 42 [.]: #..#. => # + 43 [#]: ..#.. => # + 44 [.]: .#..# => # + 45 [.]: #..#. => # + 46 [#]: ..#.# => # + 47 [.]: .#.## => # + 48 [#]: #.### => # + 49 [#]: .###. => # + 50 [#]: ###.. => # + 51 [.]: ##... => # + 52 [.]: #.... => . + 53 [.]: ..... => . + 54 [.]: ....# => . + 55 [.]: ...## => . + 56 [#]: ..##. => # + 57 [#]: .##.# => # + 58 [.]: ##.## => . + 59 [#]: #.### => # + 60 [#]: .###. => # + 61 [#]: ###.# => # + 62 [.]: ##.## => . + 63 [#]: #.##. => . + 64 [#]: .##.. => . + 65 [.]: ##..# => # + 66 [.]: #..## => # + 67 [#]: ..##. => # + 68 [#]: .##.# => # + 69 [.]: ##.## => . + 70 [#]: #.### => # + 71 [#]: .###. => # + 72 [#]: ###.# => # + 73 [.]: ##.## => . + 74 [#]: #.##. => . + 75 [#]: .##.. => . + 76 [.]: ##..# => # + 77 [.]: #..#. => # + 78 [#]: ..#.. => # + 79 [.]: .#..# => # + 80 [.]: #..## => # + 81 [#]: ..##. => # + 82 [#]: .##.# => # + 83 [.]: ##.## => . + 84 [#]: #.##. => . + 85 [#]: .##.. => . + 86 [.]: ##..# => # + 87 [.]: #..## => # + 88 [#]: ..### => . + 89 [#]: .###. => # + 90 [#]: ###.. => # + 91 [.]: ##... => # + 92 [.]: #.... => . + 93 [.]: ..... => . + 94 [.]: ..... => . + 95 [.]: ..... => . + 96 [.]: ..... => . + 97 [.]: ..... => . + 98 [.]: ....# => . + 99 [.]: ...## => . +100 [#]: ..### => . +101 [#]: .###. => # +102 [#]: ###.. => # +103 [.]: ##... => # +104 [.]: #...# => . +105 [.]: ...## => . +106 [#]: ..### => . +107 [#]: .#### => # +108 [#]: ####. => # +109 [#]: ###.. => # +110 [.]: ##... => # +111 [.]: #.... => . +112 [.]: ..... => . + + + # now env new + -6 [.]: ..... => . + -5 [.]: ..... => . + -4 [.]: ..... => . + -3 [.]: ....# => . + -2 [.]: ...#. => # + -1 [#]: ..#.# => # + 0 [.]: .#.## => # + 1 [#]: #.### => # + 2 [#]: .###. => # + 3 [#]: ###.. => # + 4 [.]: ##... => # + 5 [.]: #.... => . + 6 [.]: ..... => . + 7 [.]: ....# => . + 8 [.]: ...## => . + 9 [#]: ..### => . + 10 [#]: .###. => # + 11 [#]: ###.. => # + 12 [.]: ##... => # + 13 [.]: #.... => . + 14 [.]: ..... => . + 15 [.]: ..... => . + 16 [.]: ..... => . + 17 [.]: ....# => . + 18 [.]: ...## => . + 19 [#]: ..### => . + 20 [#]: .###. => # + 21 [#]: ###.. => # + 22 [.]: ##... => # + 23 [.]: #...# => . + 24 [.]: ...## => . + 25 [#]: ..### => . + 26 [#]: .###. => # + 27 [#]: ###.. => # + 28 [.]: ##..# => # + 29 [.]: #..## => # + 30 [#]: ..##. => # + 31 [#]: .##.# => # + 32 [.]: ##.## => . + 33 [#]: #.### => # + 34 [#]: .###. => # + 35 [#]: ###.# => # + 36 [.]: ##.## => . + 37 [#]: #.### => # + 38 [#]: .#### => # + 39 [#]: ##### => . + 40 [#]: ##### => . + 41 [#]: ##### => . + 42 [#]: ##### => . + 43 [#]: ##### => . + 44 [#]: ##### => . + 45 [#]: ##### => . + 46 [#]: ##### => . + 47 [#]: ##### => . + 48 [#]: ##### => . + 49 [#]: ##### => . + 50 [#]: ####. => # + 51 [#]: ###.. => # + 52 [.]: ##... => # + 53 [.]: #.... => . + 54 [.]: ....# => . + 55 [.]: ...## => . + 56 [#]: ..##. => # + 57 [#]: .##.# => # + 58 [.]: ##.## => . + 59 [#]: #.### => # + 60 [#]: .###. => # + 61 [#]: ###.. => # + 62 [.]: ##... => # + 63 [.]: #...# => . + 64 [.]: ...## => . + 65 [#]: ..### => . + 66 [#]: .#### => # + 67 [#]: ####. => # + 68 [#]: ###.# => # + 69 [.]: ##.## => . + 70 [#]: #.### => # + 71 [#]: .###. => # + 72 [#]: ###.. => # + 73 [.]: ##... => # + 74 [.]: #...# => . + 75 [.]: ...## => . + 76 [#]: ..### => . + 77 [#]: .#### => # + 78 [#]: ##### => . + 79 [#]: ##### => . + 80 [#]: ##### => . + 81 [#]: ####. => # + 82 [#]: ###.. => # + 83 [.]: ##... => # + 84 [.]: #...# => . + 85 [.]: ...## => . + 86 [#]: ..##. => # + 87 [#]: .##.# => # + 88 [.]: ##.## => . + 89 [#]: #.### => # + 90 [#]: .###. => # + 91 [#]: ###.. => # + 92 [.]: ##... => # + 93 [.]: #.... => . + 94 [.]: ..... => . + 95 [.]: ..... => . + 96 [.]: ..... => . + 97 [.]: ..... => . + 98 [.]: ..... => . + 99 [.]: ....# => . +100 [.]: ...## => . +101 [#]: ..### => . +102 [#]: .###. => # +103 [#]: ###.. => # +104 [.]: ##... => # +105 [.]: #...# => . +106 [.]: ...## => . +107 [#]: ..### => . +108 [#]: .#### => # +109 [#]: ####. => # +110 [#]: ###.. => # +111 [.]: ##... => # +112 [.]: #.... => . +113 [.]: ..... => . +114 [.]: ..... => . + + + # now env new + -6 [.]: ..... => . + -5 [.]: ..... => . + -4 [.]: ....# => . + -3 [.]: ...## => . + -2 [#]: ..### => . + -1 [#]: .#### => # + 0 [#]: ##### => . + 1 [#]: ##### => . + 2 [#]: ##### => . + 3 [#]: ####. => # + 4 [#]: ###.. => # + 5 [.]: ##... => # + 6 [.]: #.... => . + 7 [.]: ..... => . + 8 [.]: ....# => . + 9 [.]: ...## => . + 10 [#]: ..### => . + 11 [#]: .###. => # + 12 [#]: ###.. => # + 13 [.]: ##... => # + 14 [.]: #.... => . + 15 [.]: ..... => . + 16 [.]: ..... => . + 17 [.]: ..... => . + 18 [.]: ....# => . + 19 [.]: ...## => . + 20 [#]: ..### => . + 21 [#]: .###. => # + 22 [#]: ###.. => # + 23 [.]: ##... => # + 24 [.]: #...# => . + 25 [.]: ...## => . + 26 [#]: ..### => . + 27 [#]: .#### => # + 28 [#]: ##### => . + 29 [#]: ##### => . + 30 [#]: ####. => # + 31 [#]: ###.# => # + 32 [.]: ##.## => . + 33 [#]: #.### => # + 34 [#]: .###. => # + 35 [#]: ###.# => # + 36 [.]: ##.## => . + 37 [#]: #.##. => . + 38 [#]: .##.. => . + 39 [.]: ##... => # + 40 [.]: #.... => . + 41 [.]: ..... => . + 42 [.]: ..... => . + 43 [.]: ..... => . + 44 [.]: ..... => . + 45 [.]: ..... => . + 46 [.]: ..... => . + 47 [.]: ..... => . + 48 [.]: ....# => . + 49 [.]: ...## => . + 50 [#]: ..### => . + 51 [#]: .###. => # + 52 [#]: ###.. => # + 53 [.]: ##... => # + 54 [.]: #...# => . + 55 [.]: ...## => . + 56 [#]: ..##. => # + 57 [#]: .##.# => # + 58 [.]: ##.## => . + 59 [#]: #.### => # + 60 [#]: .#### => # + 61 [#]: ####. => # + 62 [#]: ###.. => # + 63 [.]: ##... => # + 64 [.]: #...# => . + 65 [.]: ...## => . + 66 [#]: ..### => . + 67 [#]: .###. => # + 68 [#]: ###.# => # + 69 [.]: ##.## => . + 70 [#]: #.### => # + 71 [#]: .#### => # + 72 [#]: ####. => # + 73 [#]: ###.. => # + 74 [.]: ##... => # + 75 [.]: #...# => . + 76 [.]: ...#. => # + 77 [#]: ..#.. => # + 78 [.]: .#... => # + 79 [.]: #...# => . + 80 [.]: ...## => . + 81 [#]: ..### => . + 82 [#]: .###. => # + 83 [#]: ###.. => # + 84 [.]: ##..# => # + 85 [.]: #..## => # + 86 [#]: ..##. => # + 87 [#]: .##.# => # + 88 [.]: ##.## => . + 89 [#]: #.### => # + 90 [#]: .#### => # + 91 [#]: ####. => # + 92 [#]: ###.. => # + 93 [.]: ##... => # + 94 [.]: #.... => . + 95 [.]: ..... => . + 96 [.]: ..... => . + 97 [.]: ..... => . + 98 [.]: ..... => . + 99 [.]: ..... => . +100 [.]: ....# => . +101 [.]: ...## => . +102 [#]: ..### => . +103 [#]: .###. => # +104 [#]: ###.. => # +105 [.]: ##... => # +106 [.]: #...# => . +107 [.]: ...## => . +108 [#]: ..### => . +109 [#]: .#### => # +110 [#]: ####. => # +111 [#]: ###.. => # +112 [.]: ##... => # +113 [.]: #.... => . +114 [.]: ..... => . + + + # now env new + -6 [.]: ..... => . + -5 [.]: ..... => . + -4 [.]: ..... => . + -3 [.]: ....# => . + -2 [.]: ...#. => # + -1 [#]: ..#.. => # + 0 [.]: .#... => # + 1 [.]: #...# => . + 2 [.]: ...## => . + 3 [#]: ..### => . + 4 [#]: .###. => # + 5 [#]: ###.. => # + 6 [.]: ##... => # + 7 [.]: #.... => . + 8 [.]: ..... => . + 9 [.]: ....# => . + 10 [.]: ...## => . + 11 [#]: ..### => . + 12 [#]: .###. => # + 13 [#]: ###.. => # + 14 [.]: ##... => # + 15 [.]: #.... => . + 16 [.]: ..... => . + 17 [.]: ..... => . + 18 [.]: ..... => . + 19 [.]: ....# => . + 20 [.]: ...## => . + 21 [#]: ..### => . + 22 [#]: .###. => # + 23 [#]: ###.. => # + 24 [.]: ##... => # + 25 [.]: #...# => . + 26 [.]: ...#. => # + 27 [#]: ..#.. => # + 28 [.]: .#..# => # + 29 [.]: #..## => # + 30 [#]: ..##. => # + 31 [#]: .##.# => # + 32 [.]: ##.## => . + 33 [#]: #.### => # + 34 [#]: .###. => # + 35 [#]: ###.. => # + 36 [.]: ##... => # + 37 [.]: #...# => . + 38 [.]: ...#. => # + 39 [#]: ..#.. => # + 40 [.]: .#... => # + 41 [.]: #.... => . + 42 [.]: ..... => . + 43 [.]: ..... => . + 44 [.]: ..... => . + 45 [.]: ..... => . + 46 [.]: ..... => . + 47 [.]: ..... => . + 48 [.]: ..... => . + 49 [.]: ....# => . + 50 [.]: ...## => . + 51 [#]: ..### => . + 52 [#]: .###. => # + 53 [#]: ###.. => # + 54 [.]: ##..# => # + 55 [.]: #..## => # + 56 [#]: ..##. => # + 57 [#]: .##.# => # + 58 [.]: ##.## => . + 59 [#]: #.### => # + 60 [#]: .#### => # + 61 [#]: ##### => . + 62 [#]: ####. => # + 63 [#]: ###.. => # + 64 [.]: ##... => # + 65 [.]: #...# => . + 66 [.]: ...## => . + 67 [#]: ..##. => # + 68 [#]: .##.# => # + 69 [.]: ##.## => . + 70 [#]: #.### => # + 71 [#]: .#### => # + 72 [#]: ##### => . + 73 [#]: ####. => # + 74 [#]: ###.# => # + 75 [.]: ##.## => . + 76 [#]: #.### => # + 77 [#]: .###. => # + 78 [#]: ###.. => # + 79 [.]: ##... => # + 80 [.]: #...# => . + 81 [.]: ...## => . + 82 [#]: ..### => . + 83 [#]: .#### => # + 84 [#]: ##### => . + 85 [#]: ##### => . + 86 [#]: ####. => # + 87 [#]: ###.# => # + 88 [.]: ##.## => . + 89 [#]: #.### => # + 90 [#]: .#### => # + 91 [#]: ##### => . + 92 [#]: ####. => # + 93 [#]: ###.. => # + 94 [.]: ##... => # + 95 [.]: #.... => . + 96 [.]: ..... => . + 97 [.]: ..... => . + 98 [.]: ..... => . + 99 [.]: ..... => . +100 [.]: ..... => . +101 [.]: ....# => . +102 [.]: ...## => . +103 [#]: ..### => . +104 [#]: .###. => # +105 [#]: ###.. => # +106 [.]: ##... => # +107 [.]: #...# => . +108 [.]: ...## => . +109 [#]: ..### => . +110 [#]: .#### => # +111 [#]: ####. => # +112 [#]: ###.. => # +113 [.]: ##... => # +114 [.]: #.... => . +115 [.]: ..... => . +116 [.]: ..... => . + + + # now env new + -6 [.]: ..... => . + -5 [.]: ..... => . + -4 [.]: ....# => . + -3 [.]: ...## => . + -2 [#]: ..### => . + -1 [#]: .###. => # + 0 [#]: ###.. => # + 1 [.]: ##... => # + 2 [.]: #...# => . + 3 [.]: ...## => . + 4 [#]: ..### => . + 5 [#]: .###. => # + 6 [#]: ###.. => # + 7 [.]: ##... => # + 8 [.]: #.... => . + 9 [.]: ..... => . + 10 [.]: ....# => . + 11 [.]: ...## => . + 12 [#]: ..### => . + 13 [#]: .###. => # + 14 [#]: ###.. => # + 15 [.]: ##... => # + 16 [.]: #.... => . + 17 [.]: ..... => . + 18 [.]: ..... => . + 19 [.]: ..... => . + 20 [.]: ....# => . + 21 [.]: ...## => . + 22 [#]: ..### => . + 23 [#]: .###. => # + 24 [#]: ###.# => # + 25 [.]: ##.## => . + 26 [#]: #.### => # + 27 [#]: .#### => # + 28 [#]: ##### => . + 29 [#]: ##### => . + 30 [#]: ####. => # + 31 [#]: ###.# => # + 32 [.]: ##.## => . + 33 [#]: #.### => # + 34 [#]: .#### => # + 35 [#]: ####. => # + 36 [#]: ###.# => # + 37 [.]: ##.## => . + 38 [#]: #.### => # + 39 [#]: .###. => # + 40 [#]: ###.. => # + 41 [.]: ##... => # + 42 [.]: #.... => . + 43 [.]: ..... => . + 44 [.]: ..... => . + 45 [.]: ..... => . + 46 [.]: ..... => . + 47 [.]: ..... => . + 48 [.]: ..... => . + 49 [.]: ..... => . + 50 [.]: ....# => . + 51 [.]: ...## => . + 52 [#]: ..### => . + 53 [#]: .#### => # + 54 [#]: ##### => . + 55 [#]: ##### => . + 56 [#]: ####. => # + 57 [#]: ###.# => # + 58 [.]: ##.## => . + 59 [#]: #.##. => . + 60 [#]: .##.# => # + 61 [.]: ##.## => . + 62 [#]: #.### => # + 63 [#]: .###. => # + 64 [#]: ###.. => # + 65 [.]: ##..# => # + 66 [.]: #..## => # + 67 [#]: ..##. => # + 68 [#]: .##.# => # + 69 [.]: ##.## => . + 70 [#]: #.##. => . + 71 [#]: .##.# => # + 72 [.]: ##.## => . + 73 [#]: #.##. => . + 74 [#]: .##.# => # + 75 [.]: ##.## => . + 76 [#]: #.### => # + 77 [#]: .#### => # + 78 [#]: ####. => # + 79 [#]: ###.. => # + 80 [.]: ##... => # + 81 [.]: #...# => . + 82 [.]: ...#. => # + 83 [#]: ..#.. => # + 84 [.]: .#..# => # + 85 [.]: #..## => # + 86 [#]: ..##. => # + 87 [#]: .##.# => # + 88 [.]: ##.## => . + 89 [#]: #.##. => . + 90 [#]: .##.# => # + 91 [.]: ##.## => . + 92 [#]: #.### => # + 93 [#]: .###. => # + 94 [#]: ###.. => # + 95 [.]: ##... => # + 96 [.]: #.... => . + 97 [.]: ..... => . + 98 [.]: ..... => . + 99 [.]: ..... => . +100 [.]: ..... => . +101 [.]: ..... => . +102 [.]: ....# => . +103 [.]: ...## => . +104 [#]: ..### => . +105 [#]: .###. => # +106 [#]: ###.. => # +107 [.]: ##... => # +108 [.]: #...# => . +109 [.]: ...## => . +110 [#]: ..### => . +111 [#]: .#### => # +112 [#]: ####. => # +113 [#]: ###.. => # +114 [.]: ##... => # +115 [.]: #.... => . +116 [.]: ..... => . + ##.######...#.##.#...#...##.####..###.#.##.#.##...##..#...##.#..##....##...........#.#.#..###.# +.....###...###.....###.......##.##..##.####.####...........#..##..#.#######..#..#.#####.######..#.####.........###...####.. +score: 3472 diff --git a/advent_of_code_2018/day2/input.in b/advent_of_code_2018/day2/input.in new file mode 100644 index 0000000..f058249 --- /dev/null +++ b/advent_of_code_2018/day2/input.in @@ -0,0 +1,250 @@ +jplenqtlagxhivmwmscfukzodp +jbrehqtlagxhivmeyscfuvzodp +jbreaqtlagxzivmwysofukzodp +jxrgnqtlagxhivmwyscfukwodp +jbrenqtwagjhivmwysxfukzodp +jbrenqplagxhivmwyscfuazoip +jbrenqtlagxhivzwyscfldzodp +jbrefqtlagxhizmwyfcfukzodp +jbrenqtlagxhevmwfsafukzodp +jbrunqtlagxrivmsyscfukzodp +jbrenqtlaguhivmwyhlfukzodp +jbrcnstsagxhivmwyscfukzodp +jbrenqtlagozivmwyscbukzodp +jbrenqwlagxhivswysrfukzodp +jbrenstlagxhuvmiyscfukzodp +jbranqtlhgxhivmwysnfukzodp +jbrenqtvagxhinmxyscfukzodp +jbrenqtlagdhivmwyscfukxody +jbrenqtlagelavmwyscfukzodp +jbrenqtlagxhtvmwyhcfukzbdp +jbrenqwlagxhivmwyscfutzopp +jbrenqtlavxhibmtyscfukzodp +jbronqtlagxnivmwyscfuzzodp +jbredqtlagxhppmwyscfukzodp +jbrcnqtlogxhivmwysxfukzodp +jbremqtlagehivswyscfukzodp +jbrenqolagxhivmcyscfukzokp +jbrehqtlacxhgvmwyscfukzodp +fbrlnqtlagxhivmwyscbukzodp +zbrfnqtlagxhivrwyscfukzodp +jbregqtlagxnivmwyscfhkzodp +jbrenqtllgxnivmwystfukzodp +jurenqtlagxhivmwyscfulzoup +jbrenitdagxhivmwyxcfukzodp +jbrenqtlagxqivmwyscvuszodp +jbqenqwlagxhivmwyscfckzodp +jbrenqtlagxhivmwxscqupzodp +jbrenqtlagxhivmwysciuqiodp +jbrjnjtlagxhivmwyscfukzode +jbrenqtlagxhuvmwqscfukzods +jbrenqtlagxhuvmuyscfukzudp +ibrenqtlagxhivmwyscfuktokp +jbsenqtlagxhivcwyscfuksodp +jbrfnntlagxhivmwnscfukzodp +jzrenqulagxhivmwyscfukzodx +jbrenqtqygxhivmwyscfukzwdp +jbrenqtlagxfixmwyscfukzcdp +jbrenqaoagxhivmwyshfukzodp +jbrenqtlazxhivmworcfukzodp +jbrenqtlagxhicowyscfukrodp +jbrqnqtlagxhivzwyzcfukzodp +jbrenqtlalxhuvxwyscfukzodp +jbrenqtlqgxhhviwyscfukzodp +jbrenqtuggxhivmoyscfukzodp +jbrenqtlagxpivmwyscfukkodw +zbrenqhlagxhivmwyscdukzodp +jbrenutlagxxivmwyscfukzoqp +obrenqtlagxhivmwxscfuszodp +jbrenqtlagxhlvmwyscfuixodp +rbrenqtlagdhixmwyscfukzodp +jbrenqtlagxhivmwescfyszodp +jbrfnqtlagxhivmwyscaukzhdp +jbrenqtiagxhivmbyscfuxzodp +cbrrnqtuagxhivmwyscfukzodp +jbkenqtlagxhigmwysufukzodp +jbjewqtlagxhivmwyscfuqzodp +jbrznqtlagxvivmwyscfukzovp +jbrenttlacxhivmwyscfhkzodp +jblenqtlagxhivmwylcfukaodp +jbrenqtlagxhivmqysiftkzodp +jbrenqtlagwhikmwyscfukqodp +jbrenqtlegxhivmwvsckukzodp +jbrenqwzagxhiamwyscfukzodp +jbrenqtlagxhivcwyscfgkzodc +jbrenqtlagxxhvmwxscfukzodp +jbrenqtlngxhivmwyscfukoowp +jbreomtlagxhivmwpscfukzodp +jfrenqtlagxhivmwyscnumzodp +jbrenqtlagphipmwyscfukfodp +jvrenqtlagxhivmwyscfmkzodw +jbrenqtlaxxoiemwyscfukzodp +jbrenqtlagxhivmwyscemkzpdp +jbrenyjldgxhivmwyscfukzodp +jbrenqtlagxhivfvyspfukzodp +kbrenctlakxhivmwyscfukzodp +jbrmhqtlagxhivmwyscfuizodp +jbjenqtlagxlivmbyscfukzodp +jbrenqtlaaxhivmmyshfukzodp +jbronqtlagxhirmvyscfukzodp +jbcrnqtlagxwivmwyscfukzodp +jxrenszlagxhivmwyscfukzodp +jbpenqtlagxhivmwyscfukkody +jbrewqtlawxhivmwyscfukzhdp +jbrenqylagxhivmwlxcfukzodp +jbrenqtlagxxivtwywcfukzodp +jbrenqtlagxhcvgayscfukzodp +jbrenitlagxhivmwiscfukzohp +jbrenutlagxhivmwyscbukvodp +nbrenqtlagxhivmwysnfujzodp +jbrenqtlagxhivmwyqcfupzoop +jbrenqtrarxhijmwyscfukzodp +jbrenqtlagxhivmwysdfukzovy +jbrrnqtlagxhivmwyvcfukzocp +jbrenqtlagxhivmwyscfuvzzhp +jbhenitlagxhivmwysufukzodp +jbrenqtlagxhivmwyscfuwzoqx +kbrenqtlagxhivmwysqfdkzodp +jbrenqtlagxhivmwyxmfukzodx +jbcenatlagxxivmwyscfukzodp +jbrenhtlagvhdvmwyscfukzodp +jxrenqtlafxhivfwyscfukzodp +jbreaztlpgxhivmwyscfukzodp +tqrenqtlagxfivmwyscfukzodp +jbrenqgllgxhwvmwyscfukzodp +jbrejjtlagxhivmgyscfukzodp +jbrenqtlagxhivmwyscvukzoqv +jbrvnqtlagxsibmwyscfukzodp +jbrenqttagxhuvmwyscfukvodp +jbrenqteagxhivmwcscfukqodp +jbrenqtsabxhivmwyspfukzodp +jbbenqtlagxhivmwyscjukztdp +jnrenqtlagxhiimwydcfukzodp +jbrenqtlagxhfvmwyscxukzodu +jbrenqtluyxhiomwyscfukzodp +jbrenqvlagxhivmwyscuukzolp +ebrenqtlagxnivmwysrfukzodp +jbreeqtlatxhigmwyscfukzodp +jbrenqtvxgxhivmwyscfukzedp +jbrmnqtlagxhivmwywcfuklodp +jbreeqtvagxhivmwyscfukzody +jbrenptlagxhivmxyscfumzodp +jbrenqtlagxhivmwysgfukzfsp +jurenqtlagjhivmwkscfukzodp +jbrenntlagxhivmwtscffkzodp +jbrenqglagxhivmwyocfokzodp +wbrenqtlagxhivmwhscfukiodp +jbrenqtligxhivmqascfukzodp +jbrenqtlagxhivmwxscfukpojp +jurenqtlagxhivmmyscfbkzodp +jbrenqtmagxhivmwyscfrbzodp +jcrenqtlagxhivmwysefukzodm +jbrenqtlagxhicmwywcfukzodl +jbvanqtlagfhivmwyscfukzodp +jbmenqjlagxhivmwyscfdkzodp +jbrenqtlagohivvwysctukzodp +jbrenqtdagxdivmwyscfckzodp +kbrefqtlagxhivmwyscfuazodp +jbrwnqtoagxhivmwyswfukzodp +jjhenqtlagxhivmwyscfukzorp +jbgsnqtlagxhivkwyscfukzodp +jbrynqtlagxhivmsyspfukzodp +jbrenftlmkxhivmwyscfukzodp +nbrenqtxagxhmvmwyscfukzodp +jbrunqtlagxhijmwysmfukzodp +jbrenqtlagmaivmwyscfukzowp +jbrerqtlagxhihmwyscfukzudp +jbrenqtlagahivmwysckukzokp +kbrenqtlagxhirmwyscfupzodp +jbrrnqtlagxhivmwyecfukzodz +jbrenqtlavxhivmwyscfusiodp +jnrenqtlagxhivmwyhcfukzodw +jbretqtlagfhivmwyscfukzrdp +jbreoqtnagxhivmwyscfukzopp +jbrenbtllgxhivmwsscfukzodp +jbrenqtlmgxhivmwyscfuwzedp +jbnenqtlagxhivbwyscfukzokp +jbrenqslagxhivmvyscfukzndp +jbrenqtlagxzivmwuscfukztdp +gbrenqtlagxhyvmwyscfukjodp +jbrenqteagxhivmwyscfuszedp +jbrenqtlaglhivmwysafukkodp +jbrenqtlagxhcvmwascfukzogp +jbrenqtlagxhsvmkcscfukzodp +jbrenqslbgxhivmwyscfufzodp +cbrenqtlagxhivkwtscfukzodp +jbrenqtltgxhivmzyscfukzodj +jbrgnqtlagihivmwyycfukzodp +vbrenqauagxhivmwyscfukzodp +jbrqnqtlagjhivmwyscfqkzodp +jbrenqtlakxhivmwyscfukvobp +jcrenqelagxhivmwtscfukzodp +jbrrnqtlagxhlvmwyscfukzodw +jbrenqtlagxhivmwkscaumzodp +jbrenqdlagxhivmiescfukzodp +jhrenqtlagxhqvmwyscmukzodp +jbrenqtlaghhivmwyscfukkoyp +jowenqtlagxyivmwyscfukzodp +jbrenitaagxhivmwyscfqkzodp +jbrenqtlagxhivmwyscfnkbudp +jbyenqtlagxhivmiyscfukzhdp +jbrenitlagxhibjwyscfukzodp +jbrenqtlavxhjvmwpscfukzodp +jbrenqyaagxhivmwyscflkzodp +jbrenqylagxhivmwyicfupzodp +jbrenqtlagxmevmwylcfukzodp +lbrenqtlagxhiqmwyscfikzodp +jbrenqtnarxhivmwyscfmkzodp +jbrenqtlamxhivmwyscfnkzorp +jbbenqtlavxhivmwyscjukztdp +jbrenqtlagxhivmwyscfnliodp +jbwenetlagxhivmwyscfukzodt +jbrenatlagxhivmwysmfujzodp +jbrsnstlagxhivmwyscfukgodp +jbwvnitlagxhivmwyscfukzodp +jbrenqtbagxhkvmwypcfukzodp +jbrlnqtlafxhivmwyscfukdodp +jbrenztlanxhivmwyscjukzodp +jbrepqtlagxhivmwudcfukzodp +jbrenqtlagxiivmwdscfskzodp +jbrdjqtlagxhivmwyschukzodp +jbrenqtoaguhivmwyccfukzodp +jdrexqjlagxhivmwyscfukzodp +jbrenqtlagxhovmwysckukaodp +pbrfnqblagxhivmwyscfukzodp +jbrenqtlagxrivgiyscfukzodp +jbrelqtgagxhivmryscfukzodp +jbrenqtlagxhicmwjscfikzodp +jbrenqjlagxhivmwyscfmkjodp +jbrenqtlagxpivmwzscgukzodp +jbienqzlagxpivmwyscfukzodp +jbrenqvlagxhivmwdscfukzodx +owrenqtlagxhivmwyicfukzodp +gbrenqtlaathivmwyscfukzodp +jbgenqtlafxhivmwysqfukzodp +jbrenqtlagxhivtwsscfukzokp +jbrnnqylanxhivmwyscfukzodp +ebrenqolagxhivmcyscfukzodp +jbrenqtlarnhivgwyscfukzodp +jbmenqtlagxhivmvyscfukzgdp +jbrevqtlaglhivmwystfukzodp +jbrenqplanthivmwyscfukzodp +jbrenqtlagxhivmkyscbukzosp +jbrenqtlagxaivmwyscfugzodo +jbrenqplagxhnvmwyscfjkzodp +jbrenqtlagxhivgwyscfusrodp +cbrenqtlagxhivmwysmfukzody +jbrenquwaexhivmwyscfukzodp +jbredqtlagxhdvmwyscfukzoup +jbrxnqtlagxhivmwysczukaodp +jbrenqtlafnhivmwyscfuczodp +jbbdkqtlagxhivmwyscfukzodp +ubrenqtlagxhivkwyucfukzodp +ebjenqtlagxhivmwyscfukzodj +jbgenqtlugxxivmwyscfukzodp +jbrenqtoagxqivmwdscfukzodp +bbeenqtlagxhivmwyscfumzodp +jbfeeqtlagxhivmwmscfukzodp +jbrlnqtlagxhiimwescfukzodp +jbrenqtlagwoivmwyscfukhodp +jbrenqtlagnhivmwyscfuszovp \ No newline at end of file diff --git a/advent_of_code_2018/day2/main1.cc b/advent_of_code_2018/day2/main1.cc new file mode 100644 index 0000000..87d9026 --- /dev/null +++ b/advent_of_code_2018/day2/main1.cc @@ -0,0 +1,40 @@ +#include +#include +#include + +using namespace std; + +int main() +{ + size_t dubbles = 0; + size_t tripples = 0; + + string buffer; + + while(getline(cin, buffer)) + { + bool twice = false; + bool thrice = false; + size_t letters[26] = { }; + + for (char c : buffer) + { + ++letters[c - 'a']; + } + + for (size_t idx = 0; idx < 26; ++idx) + { + if (letters[idx] == 2) + twice = true; + if (letters[idx] == 3) + thrice = true; + } + + if (twice) + ++dubbles; + if (thrice) + ++tripples; + } + + cout << "checsum: " << dubbles * tripples << "\n"; +} \ No newline at end of file diff --git a/advent_of_code_2018/day2/main2.cc b/advent_of_code_2018/day2/main2.cc new file mode 100644 index 0000000..b98045f --- /dev/null +++ b/advent_of_code_2018/day2/main2.cc @@ -0,0 +1,56 @@ +#include +#include +#include +#include + +using namespace std; + +size_t label_diff(string const &lhs, string const &rhs) +{ + size_t diff = 0; + for (size_t idx = 0; idx != lhs.size(); ++idx) + diff += lhs[idx] - rhs[idx] ? 1 : 0; + return diff; +} + +string equal_part(string const &lhs, string const &rhs) +{ + string rval; + rval.reserve(lhs.size() - 1); + + for (size_t idx = 0; idx != lhs.size(); ++idx) + { + if (lhs[idx] == rhs[idx]) + rval.push_back(lhs[idx]); + } + + return rval; +} + +int main() +{ + size_t dubbles = 0; + size_t tripples = 0; + + string buffer; + vector labels; + + while (getline(cin, buffer)) + labels.push_back(buffer); + + for (string const &lhs : labels) + { + for (string const &rhs : labels) + { + size_t difference = label_diff(rhs, lhs); + + if (difference == 1) + { + cout << "Equal part: " << equal_part(lhs, rhs) << "\n"; + return 0; + } + } + } +} + +//jbbenqtlaxhivmwyscjukztdp correct \ No newline at end of file diff --git a/advent_of_code_2018/day25/input1.in b/advent_of_code_2018/day25/input1.in new file mode 100644 index 0000000..aade430 --- /dev/null +++ b/advent_of_code_2018/day25/input1.in @@ -0,0 +1,1216 @@ +-6,-5,7,7 +-4,5,-1,3 +-1,-6,-7,8 +-1,-1,-4,-4 +-3,-2,2,-4 +-1,8,0,0 +2,1,-3,-4 +-3,-1,4,0 +-3,3,-7,-1 +-4,4,0,4 +2,-7,-5,3 +0,-8,-4,-6 +4,5,6,7 +7,0,8,-2 +-5,8,1,4 +-4,6,7,-2 +-4,-6,5,0 +-2,-3,1,-2 +0,3,3,2 +7,3,-1,-8 +-2,8,2,6 +0,-2,4,-6 +-3,7,1,2 +8,-8,-6,-1 +6,-6,-2,0 +5,2,2,8 +4,0,-3,-1 +-8,7,5,-3 +-6,-2,-5,-2 +-2,5,-2,7 +8,1,-1,7 +-1,1,5,-2 +1,0,-8,0 +2,2,2,5 +-6,6,4,2 +-2,0,-2,-3 +-2,3,4,-6 +0,0,6,-8 +-6,1,8,0 +4,8,0,1 +4,7,-2,8 +0,-1,-5,6 +0,0,0,4 +8,5,2,8 +0,-1,7,7 +-5,-3,0,-3 +6,1,7,-8 +5,5,-4,-3 +2,2,-5,-6 +2,1,-1,-1 +-5,0,5,-3 +5,0,-6,-4 +6,3,-7,-7 +-7,0,-5,-3 +3,5,6,-4 +6,0,-2,-7 +3,0,6,-2 +2,-3,1,-4 +-2,8,-4,7 +3,7,-7,-4 +0,0,1,7 +5,3,-2,-4 +4,2,-4,4 +8,0,1,-6 +7,-5,0,7 +-8,0,-5,-1 +-5,-6,-6,-3 +4,8,-2,-7 +-3,5,-6,7 +0,-3,6,-6 +-5,1,5,5 +4,1,-1,5 +0,-4,-2,-5 +2,-3,8,2 +0,8,8,-4 +-1,-4,5,4 +-4,4,6,6 +4,3,-2,-3 +-2,6,3,-4 +-6,-7,7,3 +0,-4,-7,-2 +-3,-1,7,3 +1,-2,0,5 +6,8,2,2 +-7,-3,-2,-1 +6,-8,-6,2 +-7,0,5,6 +-1,5,2,0 +1,-1,-8,2 +0,-5,6,3 +0,1,3,0 +5,-6,-8,-2 +-8,7,-5,0 +2,-5,-6,5 +-7,0,0,0 +1,-2,-7,6 +5,-2,3,-7 +2,-4,-2,-8 +8,6,0,-7 +-7,-3,-8,-1 +2,7,1,3 +0,-3,0,7 +-7,3,3,-5 +6,4,-8,3 +8,8,-8,4 +-5,6,0,-7 +0,-3,0,0 +-2,5,2,-2 +-2,3,-3,-6 +-2,7,-3,-7 +-6,-8,4,0 +-3,-6,6,4 +3,-1,-4,-4 +-4,-7,-6,7 +5,-8,-1,-4 +1,1,-5,4 +-2,3,-5,7 +-3,-4,2,1 +-6,-4,-7,8 +-6,8,4,6 +0,-8,5,-1 +3,6,3,5 +-5,7,-7,3 +5,-2,6,-2 +1,-6,0,-5 +0,-7,-3,-8 +3,4,7,-8 +3,-7,4,5 +2,-4,-3,1 +2,3,8,-7 +6,0,8,-6 +0,-5,-2,-4 +-1,7,-8,1 +7,-8,-4,6 +7,0,5,7 +6,-2,-6,0 +-2,5,-8,8 +7,8,1,1 +-1,7,6,7 +-2,8,7,0 +2,0,6,4 +5,4,-3,5 +-3,0,-5,3 +-5,-1,2,8 +3,6,-4,0 +0,6,-1,0 +8,-2,-1,2 +2,4,4,-4 +3,3,-6,5 +2,-1,-5,-5 +0,-3,4,6 +-3,3,-3,0 +-2,8,-4,4 +6,0,-5,-1 +7,-7,-3,-7 +8,-4,-6,2 +0,-7,4,6 +-4,7,4,0 +-8,-7,1,6 +-5,0,7,1 +1,0,3,8 +0,7,5,5 +3,-5,-8,-6 +-4,-3,-5,-4 +-3,0,-8,8 +0,8,7,0 +-5,-1,2,3 +7,0,4,-4 +-1,7,0,-5 +2,0,0,0 +-7,-1,-2,-6 +-7,-8,8,7 +1,4,0,2 +8,-3,0,7 +8,-5,1,-5 +-7,6,8,-8 +1,5,3,6 +0,5,-7,7 +-2,4,1,-5 +-2,0,-4,0 +-3,8,7,4 +2,-8,-6,-6 +4,0,-5,-6 +-4,-1,-2,-5 +-4,1,1,7 +6,7,1,-1 +-3,7,-6,3 +-4,-7,-8,0 +2,-7,3,2 +6,8,-4,0 +-6,-5,6,0 +6,0,-1,8 +-6,3,0,-8 +-8,-8,0,0 +1,-4,-3,2 +-1,0,7,-8 +-4,-3,1,-8 +-2,-1,6,-4 +4,6,6,-4 +6,-6,-1,2 +-3,-5,4,-4 +8,8,-2,0 +0,0,-8,2 +2,0,-5,6 +0,0,-4,-8 +-5,2,4,-3 +-2,-8,2,-5 +2,1,-2,4 +6,-3,-7,5 +-6,-5,5,-5 +4,8,-8,2 +5,-3,0,3 +3,-3,-7,0 +-4,4,-2,3 +-4,-8,-7,6 +3,-2,0,0 +5,4,0,5 +-2,4,8,0 +4,6,7,3 +6,-4,-6,7 +3,-7,-7,-7 +-5,3,6,-8 +0,-6,0,8 +3,0,8,6 +-8,4,6,-4 +-8,4,2,6 +6,5,2,-1 +5,-8,2,3 +-5,-3,-6,-8 +-3,8,5,5 +1,-6,1,0 +1,1,5,6 +-2,-4,-3,1 +-5,0,-7,4 +-5,-5,3,5 +-8,-3,-2,0 +-2,3,2,8 +1,-5,4,7 +-3,0,0,7 +0,2,-1,8 +8,-7,-6,1 +-1,0,-5,-4 +0,-1,-2,3 +-8,-2,-5,-1 +-4,5,-3,8 +4,8,4,-2 +3,5,-2,-3 +7,-8,-7,-4 +0,0,2,-5 +7,-2,5,2 +-1,-1,7,-1 +-3,-5,5,-1 +1,4,-3,4 +4,-2,2,2 +4,-2,0,-4 +-7,-5,6,8 +8,5,1,-4 +-7,-4,4,0 +1,-4,-7,8 +4,6,-6,-8 +7,4,4,5 +7,0,-5,0 +-2,-8,-3,-2 +-7,-3,-6,1 +6,4,7,-7 +4,7,0,4 +3,-5,6,7 +-4,4,0,-3 +-7,7,-3,2 +-2,6,-8,4 +-2,-1,2,-4 +-7,4,3,-2 +-3,-7,-2,5 +-2,5,-3,-2 +-2,-3,-5,0 +1,5,-8,-8 +-6,6,-5,8 +6,-2,3,-7 +-7,1,2,-6 +-6,5,-8,6 +6,0,-4,0 +0,0,-5,-6 +7,-7,8,7 +6,4,5,-7 +0,7,1,0 +-2,7,7,2 +-1,-7,-2,0 +-5,7,-2,8 +0,8,7,-4 +-3,4,-2,-2 +2,0,-7,6 +3,-2,7,-3 +6,-4,-8,-5 +0,-4,4,0 +1,0,8,0 +-8,3,7,4 +3,0,7,-5 +1,8,-8,-2 +-1,4,7,5 +1,1,-3,-2 +6,8,-4,4 +8,-4,-3,7 +-2,0,-7,-6 +1,2,8,1 +6,-4,0,5 +1,0,-5,0 +5,6,2,6 +3,5,4,-4 +7,-1,1,0 +-1,5,1,8 +-1,8,2,3 +4,5,7,6 +3,-5,3,5 +0,5,7,-1 +-5,3,6,0 +3,-8,3,0 +0,-4,-8,-6 +-4,-1,-7,2 +4,-7,-8,3 +-6,7,-1,-3 +1,3,4,-1 +-2,-8,8,6 +-5,4,-3,-4 +-2,-7,-6,-6 +5,-4,-6,-2 +-6,-6,-8,0 +-8,-5,7,0 +7,-2,-2,2 +-1,-2,2,-2 +-4,0,-1,-1 +-1,7,8,8 +7,2,-2,-6 +5,3,8,-8 +0,0,8,-4 +-5,8,-4,6 +0,7,5,6 +-4,6,0,-7 +0,7,0,3 +0,-2,-8,8 +-3,1,-7,-7 +2,-3,-2,-8 +-4,4,1,-3 +1,5,5,6 +1,-3,-5,-5 +0,5,7,2 +-5,3,-2,-5 +-6,-2,-6,8 +-4,8,0,-3 +1,6,0,-3 +-2,5,7,0 +0,-6,7,4 +-2,-6,8,-5 +3,4,3,-6 +5,-4,-5,4 +4,-6,5,8 +-8,-3,-7,0 +5,4,7,-5 +1,-8,8,8 +4,-1,8,2 +-3,-4,5,3 +2,7,-4,0 +-5,0,7,8 +-5,6,-7,-2 +-7,-1,-6,-4 +0,-2,-7,1 +5,-7,2,1 +3,-1,-8,-1 +-2,6,-3,-4 +-7,5,-5,3 +-1,-3,-6,1 +6,8,5,7 +-3,-8,0,-8 +3,-8,5,-4 +8,-3,8,7 +-3,0,6,4 +5,0,-7,8 +6,7,2,6 +-1,7,-3,-5 +1,-8,-7,3 +7,-5,-8,1 +3,2,-4,1 +6,-6,7,-3 +6,7,3,-4 +-4,-1,6,3 +-1,0,0,-7 +5,0,-8,0 +5,3,0,2 +5,7,6,8 +8,-2,-1,5 +4,-1,0,4 +-6,5,0,-2 +-3,-3,3,0 +-5,1,-7,8 +-3,2,-6,0 +-6,4,-3,2 +7,2,7,-4 +-7,-6,2,-3 +-3,-3,5,-4 +8,3,-4,-7 +-6,-1,5,3 +5,0,1,-7 +-4,4,-7,-3 +-7,7,5,-6 +3,-5,-3,-1 +5,0,-7,-8 +-2,6,-1,-2 +0,-2,7,1 +-7,5,6,7 +-3,-8,1,-4 +-2,4,4,-6 +-1,5,-8,6 +-2,-4,-4,-3 +0,-1,0,-5 +6,-6,0,4 +-1,0,-2,5 +3,5,-6,0 +-2,0,7,-8 +1,4,5,4 +-8,-7,-5,3 +0,7,-5,-4 +-4,-8,0,-4 +4,-3,-2,-2 +-8,-6,7,-6 +-8,-5,-6,-3 +2,1,-6,-4 +0,6,8,8 +-1,-1,-6,-4 +-1,7,-8,-8 +6,-1,5,0 +-7,4,0,-5 +1,3,8,-1 +7,7,2,-2 +-3,-2,8,5 +2,-5,-1,-1 +0,-2,-6,-1 +-3,1,-6,5 +2,2,0,5 +3,4,-7,-6 +-8,5,7,1 +1,-3,-2,-6 +8,-3,3,-1 +3,-5,4,6 +4,3,2,8 +0,3,-8,-3 +4,3,8,5 +0,3,0,5 +-8,6,-1,-1 +-7,5,-7,-2 +1,-5,-8,4 +8,6,0,6 +-3,8,5,8 +-8,-5,5,6 +3,5,1,6 +-7,1,8,-8 +1,-5,-3,-2 +8,-1,0,3 +0,-2,2,-1 +-7,-2,-3,5 +-5,6,-2,-7 +-7,-2,2,3 +-2,5,2,3 +-6,5,4,-4 +-6,-1,6,1 +0,0,-2,7 +6,0,-8,0 +-4,8,-5,4 +5,7,7,-6 +-6,-1,2,-7 +1,-3,4,-5 +5,5,0,-8 +0,6,1,0 +-8,0,-3,-8 +-4,-3,0,4 +-5,1,0,-1 +4,1,-8,-5 +-8,-3,-8,-5 +-7,-2,6,5 +-3,5,4,-8 +-7,-5,2,-8 +6,-2,-6,-2 +-6,4,-6,-1 +-6,-5,4,0 +-8,-4,7,3 +-7,1,-2,6 +6,-4,-4,-2 +-1,6,0,-5 +1,5,-2,-6 +7,3,6,0 +-6,-4,8,5 +-6,5,-8,-7 +1,6,-1,7 +7,-8,-3,4 +6,8,8,8 +3,3,2,5 +4,2,1,-8 +-5,0,4,2 +8,-4,-8,-6 +0,-3,7,3 +6,-5,0,4 +-5,-4,6,4 +1,-3,5,4 +-2,7,5,-7 +-1,8,-5,6 +0,8,4,-3 +2,0,-8,4 +3,0,-2,0 +-2,1,-7,2 +-6,1,-7,3 +-1,1,-4,2 +-1,-6,-3,-8 +1,5,0,6 +7,1,-2,5 +-6,0,-3,-5 +-1,1,7,-3 +1,6,-8,7 +-5,0,-3,-6 +-7,-6,-5,2 +-1,-2,0,8 +-2,-6,3,-2 +2,-8,-5,7 +-8,-8,3,-3 +6,0,5,7 +-8,-7,8,0 +-1,-5,-3,-2 +8,-6,4,2 +4,-8,8,-8 +6,8,8,0 +2,-3,-7,-1 +-4,2,6,-7 +-4,-3,1,7 +-2,5,-1,-1 +2,-2,7,-5 +-1,-8,0,0 +-2,7,4,-5 +-6,6,-5,3 +-7,2,0,0 +-2,7,-1,8 +2,5,1,2 +0,-1,0,-8 +0,-1,-6,-3 +-8,-4,8,-3 +7,-2,-8,8 +3,-1,4,-5 +8,8,4,3 +0,0,-6,4 +-8,0,4,-5 +0,-1,2,0 +7,-5,8,6 +2,-5,2,1 +4,-8,-1,-7 +8,-3,-4,-2 +8,6,2,-6 +-1,-3,-2,-2 +4,0,0,-2 +4,8,5,-4 +-1,-2,-2,-2 +3,0,-6,-3 +8,2,-5,-1 +-2,-1,0,8 +-2,7,4,-6 +-3,-3,4,6 +5,1,5,-1 +3,7,2,8 +-4,5,-1,-2 +8,-2,7,5 +-5,7,4,-6 +4,-5,4,5 +3,6,3,8 +-4,8,0,7 +-8,5,0,-8 +-5,0,-6,5 +-7,-8,8,-2 +7,2,-7,1 +-7,-8,1,8 +1,-5,8,-4 +2,-1,-7,-3 +-8,-3,-4,3 +7,-7,2,6 +-7,-8,-4,3 +-3,2,0,4 +-5,5,7,7 +3,-1,-3,8 +3,-4,8,-5 +0,-8,0,2 +0,-4,7,3 +8,-4,7,-2 +0,-7,7,-7 +3,-1,6,5 +-7,-6,-2,2 +-5,-6,0,-6 +-5,-8,0,-7 +-1,4,2,-7 +1,-3,0,-5 +0,5,3,0 +0,5,-8,7 +0,4,-2,7 +2,5,7,1 +-3,-1,-8,-4 +8,7,-5,-2 +-8,3,0,6 +-2,5,-7,6 +-5,1,1,0 +-7,8,-2,-7 +2,-6,5,5 +-8,-4,-2,6 +4,7,-4,0 +-6,-5,-6,-1 +-8,1,-8,2 +0,-3,5,-7 +-1,1,0,-6 +-6,3,0,1 +-8,7,5,1 +7,2,-8,-3 +-8,-5,6,-3 +8,-6,-3,-7 +-2,-6,-7,1 +1,-4,-4,1 +1,-5,-5,0 +-1,7,-5,1 +-7,6,6,-1 +-5,2,-7,0 +2,5,6,-4 +0,4,-8,0 +-1,-5,-8,-2 +6,-1,1,4 +-1,-2,-6,0 +7,2,-5,-4 +8,-4,-7,5 +-1,4,7,7 +7,-1,0,8 +-1,-1,4,4 +-8,6,-4,8 +8,-4,8,-8 +-1,6,-2,-5 +0,-6,5,-2 +5,8,5,-5 +3,-4,5,-7 +-1,-6,8,5 +-8,-7,-7,4 +4,5,-6,0 +-4,8,-7,0 +-3,-4,-7,0 +6,-8,6,1 +4,-1,7,0 +3,-3,8,-7 +2,-7,4,-4 +-8,-4,4,5 +6,2,8,-5 +2,1,1,-5 +7,-3,-1,-4 +-8,2,-6,3 +-8,-8,-8,7 +0,1,-7,0 +-5,5,6,0 +4,6,-1,6 +-2,-5,1,-4 +1,8,7,-5 +0,-5,0,2 +5,-7,4,-4 +0,6,-3,2 +-2,3,-7,-6 +7,3,4,4 +-6,3,4,7 +8,8,-3,2 +-6,-5,7,-5 +6,0,2,3 +5,0,5,0 +5,6,-1,1 +3,-1,-5,0 +7,-5,2,-4 +7,1,-8,-8 +-1,0,-8,-6 +-5,3,6,7 +-6,1,0,-4 +2,-6,-4,0 +-3,3,3,3 +4,6,0,-4 +0,-7,-4,-4 +7,-1,-5,-5 +0,-8,6,-4 +-4,-5,-4,-6 +2,8,6,-2 +-1,1,-5,4 +-2,7,4,1 +-6,-4,2,-2 +3,-2,-8,-2 +-4,4,0,-4 +-7,-8,0,2 +6,1,-8,-7 +8,-5,7,-4 +-7,6,8,3 +6,-1,-3,7 +3,-7,-7,3 +0,5,-2,8 +1,-1,-1,4 +-7,5,3,3 +3,2,1,3 +-2,-2,-4,5 +6,1,-8,2 +-7,5,-5,-1 +2,-3,4,6 +-8,-1,6,5 +-8,2,-5,6 +2,-7,-6,5 +-1,-1,-5,2 +1,0,6,-5 +1,8,-1,-1 +-3,8,7,-4 +0,5,1,-3 +0,2,0,6 +8,5,5,-3 +4,5,4,0 +-5,-7,-7,7 +-1,-2,-7,-3 +6,-8,-5,-3 +-5,6,-6,-3 +-1,-1,-8,-1 +-4,-8,1,2 +-4,0,-1,0 +-3,8,-5,0 +-6,3,-3,3 +-4,-6,-6,0 +5,3,-5,-1 +-2,-2,4,4 +-4,8,0,6 +-4,-2,2,-7 +-4,-4,-3,-3 +-3,-2,-7,-5 +5,6,6,-1 +-7,3,-3,1 +-8,5,5,-3 +-3,-5,-6,-3 +-4,0,-3,6 +0,3,-7,0 +-7,0,-4,-5 +4,-3,-8,3 +-6,-3,2,-5 +2,0,3,5 +4,-5,1,0 +4,-7,0,-5 +-5,-1,6,-3 +6,3,1,4 +8,3,-4,-6 +0,7,6,7 +0,-6,7,7 +3,0,5,4 +4,5,-4,-7 +1,-6,-6,0 +1,8,-3,2 +0,1,4,4 +-2,0,-7,7 +0,4,-7,-7 +-7,-3,1,7 +6,8,5,-8 +6,1,0,0 +4,8,8,-8 +2,2,0,8 +0,-8,4,-8 +0,4,8,3 +-6,8,8,4 +-8,0,0,1 +0,8,-4,-8 +2,6,7,6 +7,0,-3,-2 +3,5,-2,0 +5,-7,4,0 +5,3,7,3 +1,-1,-6,6 +-6,-3,-7,-6 +6,5,0,6 +0,4,6,-6 +-6,1,-1,0 +8,1,-3,0 +-3,-6,-4,1 +-1,5,-2,5 +-2,4,2,-4 +7,5,-4,-1 +0,-3,-8,7 +-7,6,6,4 +-1,0,0,7 +2,-1,1,5 +5,-1,2,-4 +4,-1,0,-5 +-6,0,2,3 +-5,0,0,-2 +-8,7,-5,-1 +6,5,-3,-7 +-6,-2,4,7 +3,-6,-4,-5 +0,6,5,5 +-3,6,-6,5 +-1,1,2,7 +4,8,0,5 +7,0,2,-2 +-6,-1,6,7 +-6,4,-4,-1 +5,-6,-6,6 +5,2,-7,-7 +-6,2,-2,-6 +-5,-6,-6,-4 +-6,6,-6,-6 +7,0,0,1 +1,0,5,1 +-8,-5,0,0 +-4,-3,3,1 +3,0,-1,6 +6,-5,2,-6 +5,-3,-7,-2 +7,2,1,0 +-4,-8,-8,5 +2,-5,4,-5 +-6,-2,0,3 +-2,2,3,7 +1,1,-7,-4 +0,-1,5,-1 +-3,-4,-3,2 +7,-2,0,-8 +0,4,-1,2 +0,-3,1,-7 +0,2,-1,-5 +0,-5,-1,-3 +6,0,6,1 +-4,3,2,-2 +-7,6,-4,0 +-3,-5,4,6 +0,-5,0,0 +0,-8,3,6 +1,1,4,3 +-2,-8,-3,6 +0,2,-4,0 +0,-2,7,5 +2,-8,4,-3 +7,3,2,4 +-1,2,3,-2 +2,-8,-7,-8 +6,3,6,3 +7,2,-7,-4 +4,0,5,8 +-3,8,5,3 +2,-2,-4,4 +-2,-8,-5,7 +-2,-6,-4,6 +0,0,5,-4 +1,2,1,1 +6,8,-5,2 +4,-8,-6,6 +4,0,5,-7 +5,-3,4,-5 +-1,4,0,-4 +-7,1,3,-1 +4,-3,-8,6 +4,3,6,5 +2,8,6,0 +5,-6,5,7 +-8,-5,6,-7 +0,-5,5,0 +4,6,-7,-5 +-1,-1,-5,7 +-6,-4,-8,-8 +-3,0,3,-4 +-8,6,0,5 +-4,7,0,-7 +8,-1,4,-2 +0,-4,-6,0 +2,1,-8,6 +-4,-8,6,1 +3,8,-1,-1 +8,-6,-5,7 +-5,3,-3,5 +-4,1,4,4 +0,7,-2,6 +1,1,-2,1 +1,-4,6,-5 +-1,6,0,7 +0,-8,-7,0 +8,0,4,2 +-6,7,4,8 +-8,-7,5,-7 +-5,7,-5,2 +-7,-8,-6,6 +0,-8,4,2 +-5,-7,-5,-6 +-3,-2,8,1 +6,-3,5,1 +6,0,5,0 +3,-6,-3,0 +0,7,4,4 +5,-1,-7,-8 +3,-1,3,-7 +2,-7,3,-2 +-6,1,-1,3 +-5,2,6,4 +1,-3,-7,-2 +4,6,-5,8 +7,-1,3,-2 +0,8,-4,2 +-1,-5,0,5 +-1,7,0,-4 +0,8,8,5 +-5,1,-4,-1 +6,-5,6,-2 +3,6,3,-7 +-4,-3,-3,-8 +3,-8,8,-8 +-4,-7,6,-4 +2,-6,7,-3 +-8,5,-4,6 +0,-6,3,-3 +7,-2,-7,-4 +-5,3,0,-5 +-7,2,3,-6 +0,1,-5,4 +4,8,-4,-7 +1,-4,-3,-1 +-7,-2,-1,-7 +0,-2,4,2 +2,-8,0,4 +-7,-2,0,8 +4,2,0,-3 +1,8,1,-7 +5,-1,4,-7 +-3,6,3,-2 +-1,-8,3,4 +-5,7,0,-6 +6,7,-5,-4 +5,-4,-7,-3 +-8,8,-8,-1 +6,5,2,-6 +1,-3,1,-4 +-3,-7,-7,-4 +3,3,4,1 +8,-2,-8,1 +-4,-4,-1,-4 +3,-8,-4,2 +0,5,-6,-4 +-2,-1,3,2 +4,-5,-7,4 +8,7,6,2 +6,-2,-7,3 +0,5,4,-6 +0,-1,2,7 +2,-3,7,3 +2,-1,-3,-8 +7,-6,1,1 +6,5,-2,-6 +1,-5,-1,-8 +-4,-6,3,0 +-2,8,5,2 +-3,6,-5,6 +0,6,5,6 +-8,8,-7,8 +7,-2,-3,3 +7,4,3,0 +-7,-3,0,-7 +0,7,-5,-8 +-3,-1,0,4 +1,3,-6,1 +-3,2,0,1 +0,-2,-8,0 +-7,-3,-1,-2 +-5,-7,6,-1 +-5,-2,-2,-6 +3,7,2,-8 +0,-1,1,-4 +0,-6,6,8 +-6,-2,-2,8 +8,-3,-5,-5 +-8,-2,1,0 +3,-2,-6,2 +-2,-8,-6,-7 +-2,6,8,-1 +-2,7,2,6 +0,5,-7,6 +-3,8,0,-2 +3,8,8,-6 +4,-5,0,-1 +5,0,-5,2 +-7,-8,0,0 +-7,7,5,-8 +-5,3,-7,0 +2,-7,-4,4 +3,5,7,4 +4,-1,1,5 +-7,5,-7,7 +0,-7,1,-4 +-4,6,1,-8 +-1,-1,5,7 +-5,-4,6,0 +6,4,4,2 +7,6,-7,-7 +8,6,5,-2 +7,-6,0,4 +6,-7,-1,-1 +5,6,0,5 +-6,1,5,3 +-5,-8,-3,-1 +2,3,0,-2 +0,3,-8,3 +7,8,3,-6 +8,5,-7,0 +2,-5,-4,6 +5,-6,-6,-3 +4,-4,0,-8 +2,6,3,0 +-4,8,-6,0 +-3,-2,5,7 +-6,7,6,-4 +6,1,4,-2 +7,-4,-4,-6 +6,0,7,1 +-4,-2,-1,-4 +3,6,8,-7 +-8,-6,0,-7 +4,-5,-4,-7 +3,-7,0,7 +-1,-3,-7,1 +0,4,6,2 +-4,-5,1,8 +6,3,6,0 +-6,-4,-1,-6 +3,-2,8,-8 +-8,-3,-1,8 +-6,7,-8,4 +0,-4,5,6 +7,-5,0,-3 +-6,1,5,-8 +5,8,-2,5 +4,0,-3,-6 +6,0,-2,4 +2,-6,0,-1 +-5,0,-8,-4 +2,-7,1,-3 +7,-7,1,-4 +1,-7,-4,-5 +-7,1,-8,-1 +-2,-7,-1,6 +5,6,-7,-2 +3,2,1,-6 +1,0,2,4 +7,-5,-1,-4 +-6,-8,-8,1 +3,1,-5,0 +-8,2,5,-5 +-6,2,4,-8 +-8,8,4,0 +-2,4,5,-3 +-5,-2,8,-7 +-6,-1,7,7 +-1,-8,4,-8 +-1,-5,-4,3 +-2,-5,-5,7 +-7,-1,5,-3 +-3,0,8,4 +-8,-6,8,3 +8,-2,-4,-1 +5,3,5,2 +7,0,6,6 +3,6,-1,-7 +4,0,0,1 +-3,-8,0,5 +2,-3,7,4 +-2,-4,-3,7 +-6,8,6,3 +3,2,5,-6 +0,-8,0,7 +-6,0,7,-1 +0,-5,8,-6 +0,-7,-3,-6 +-2,-4,6,-4 +7,-6,-6,0 +-2,5,7,-1 +-7,5,4,-1 +5,8,2,3 +6,5,3,-1 +0,4,4,1 +3,4,5,-5 +1,0,-7,-5 +-1,-8,1,0 +-2,6,-1,6 +8,6,3,-4 +3,6,6,-2 +-4,3,7,-1 +7,-7,0,1 +1,0,-6,-8 +0,-2,0,-3 +6,6,7,8 +7,-5,-5,-4 +7,0,-1,7 +3,0,-2,7 +3,-5,-5,4 +-7,-8,5,0 +-1,1,0,3 +3,3,-1,2 +-5,3,-8,2 +0,-6,1,0 +8,1,-1,-7 +-6,-7,-5,3 +-6,-7,7,-3 +7,-5,-7,-7 +2,5,0,-5 +0,-8,0,-8 +4,4,-7,-8 +-1,0,-1,-7 +-7,-8,-2,8 +-8,7,-6,1 +1,-5,-6,-1 +-6,0,7,7 +4,3,-3,-3 +4,1,1,-2 +-3,7,0,-8 +-3,-4,-8,-3 +5,5,2,-6 +-4,-4,0,0 +5,-5,-4,-2 +4,-7,7,7 +-3,5,-5,5 +6,-7,-2,-1 +6,-6,-3,-1 +-6,5,4,5 +-5,-4,-2,5 +8,-6,0,7 +0,7,-6,-6 +8,3,6,3 +1,-4,5,8 +8,1,1,-6 +-6,5,0,-7 +-2,-1,-4,-1 +-8,3,0,-2 +5,-5,-2,0 +8,4,-6,3 +-7,-6,-3,0 +5,3,-4,-6 +0,-4,5,8 +6,8,8,-2 +8,0,-7,8 +3,3,-7,-4 +-8,-4,1,-8 +-2,-8,-8,-4 +7,4,-1,0 +-4,6,4,-8 +0,1,0,1 +-1,-2,-1,0 +0,-1,1,-7 +4,3,4,7 +-6,-2,4,1 +5,-2,4,4 +-7,3,4,2 +-5,-5,-7,-2 +0,-3,5,7 +2,-3,5,3 +0,0,1,-4 +-6,-4,-8,-6 +3,4,4,0 +-1,-4,2,0 +-1,1,-4,5 +7,-7,7,-1 +-2,-3,3,-2 +0,-7,-3,5 +-2,2,-8,-6 +4,4,1,8 +8,5,7,7 +-8,8,5,3 +-5,5,0,0 +4,-1,0,5 +8,-4,0,0 +0,6,6,8 +5,3,-4,0 +0,-8,4,8 +-6,-6,-1,0 +7,1,2,7 +4,6,-5,4 +1,-6,-3,-3 +-6,-7,-8,5 +8,6,1,8 +0,-8,-4,8 +3,3,-6,2 +-6,8,8,2 +8,0,1,7 +6,6,0,-8 +1,4,0,-6 +-4,-8,-4,8 +-7,-1,-1,-7 +5,5,8,-6 +-7,-2,-5,-3 +1,0,5,-2 +3,-1,-2,4 +7,-5,8,5 +5,7,2,3 +-4,-7,7,-5 +0,1,-6,6 +4,6,1,-1 +-8,-1,5,-1 +1,6,3,2 +8,-7,-7,-1 +-8,8,-6,7 +7,1,-6,1 +-7,3,-3,8 +-2,6,-8,-4 +-8,1,-2,0 +-1,-2,1,7 +0,7,-6,-2 +-7,0,-6,0 +-8,-2,-3,1 +-7,0,1,-6 +-2,-5,-4,6 +3,1,-8,-4 +0,2,-6,0 +4,-5,-6,1 +7,-6,0,-7 +-5,-4,-3,-4 +2,-7,0,6 +5,-4,5,-3 +-2,-5,-8,-7 +-4,7,7,6 +8,-6,2,-7 +-7,-7,3,4 \ No newline at end of file diff --git a/advent_of_code_2018/day25/main.cc b/advent_of_code_2018/day25/main.cc new file mode 100644 index 0000000..701f68f --- /dev/null +++ b/advent_of_code_2018/day25/main.cc @@ -0,0 +1,137 @@ +#include +#include +#include + +using namespace std; + +struct Star +{ + int x; + int y; + int z; + int t; +}; + +istream& operator>>(istream& in, Star &star) +{ + in >> star.x; + in.ignore(); //ignore ',' + in >> star.y; + in.ignore(); + in >> star.z; + in.ignore(); + in >> star.t; + in.ignore(); + + return in; +} + +ostream &operator<<(ostream &out, Star const &star) +{ + out << "[" << star.x << ", " << star.y << ", " << star.z << ", " << star.t << "]"; + return out; +} + + +size_t distance(Star const &lhs, Star const &rhs) +{ + int dist = abs(lhs.x - rhs.x) + + abs(lhs.y - rhs.y) + + abs(lhs.z - rhs.z) + + abs(lhs.t - rhs.t); + + return dist; +} + +bool in_cluster(vector const &cluster, Star const &star) +{ + for (Star clst : cluster) + { + if (distance(clst, star) <= 3) + return true; + } + + return false; +} + +bool same_cluster(vector const &lhs, vector const &rhs) +{ + for (Star left : lhs) + { + for (Star right : rhs) + { + if (distance(left, right) <= 3) + return true; + } + } + + return false; +} + +int main() +{ + + vector stars; + + while (cin) + { + Star star; + cin >> star; + stars.push_back(star); + } + + // kickstart 1st cluster + vector> clusters; + + for (Star star : stars) + { + bool matched = false; + + for (vector &cluster : clusters) + { + if (in_cluster(cluster, star)) + { + cluster.push_back(star); + matched = true; + break; + } + } + + if (!matched) + { + clusters.push_back({}); + clusters.back().push_back(star); + } + } + + bool merged = true; + while (merged) + { + merged = false; + for (size_t idx = 0; idx < clusters.size(); ++idx) + { + for (size_t jdx = idx + 1; jdx < clusters.size(); ++jdx) + { + if (same_cluster(clusters[idx], clusters[jdx])) + { + clusters[idx].insert(clusters[idx].end(), clusters[jdx].begin(), clusters[jdx].end()); + clusters.erase(clusters.begin() + jdx); + merged = true; + break; + } + } + if (merged) break; + } + } + + for (vector cluster : clusters) + { + cout << "\n\nCluster:\n"; + for (Star star : cluster) + { + cout << " Star: " << star << "\n"; + } + } + + cout << "Num clusters: " << clusters.size() << "\n"; +} \ No newline at end of file diff --git a/advent_of_code_2018/day25/test.in b/advent_of_code_2018/day25/test.in new file mode 100644 index 0000000..2f7c6fe --- /dev/null +++ b/advent_of_code_2018/day25/test.in @@ -0,0 +1,10 @@ +1,-1,0,1 +2,0,-1,0 +3,2,-1,0 +0,0,3,1 +0,0,-1,-1 +2,3,-2,0 +-2,2,0,0 +2,-2,0,-1 +1,-1,0,-1 +3,2,0,2 \ No newline at end of file diff --git a/advent_of_code_2018/day3/input.in b/advent_of_code_2018/day3/input.in new file mode 100644 index 0000000..2c0ecdc --- /dev/null +++ b/advent_of_code_2018/day3/input.in @@ -0,0 +1,1237 @@ +#1 @ 338,764: 20x24 +#2 @ 80,667: 12x26 +#3 @ 625,36: 17x22 +#4 @ 196,235: 25x13 +#5 @ 610,700: 25x21 +#6 @ 590,831: 20x13 +#7 @ 253,201: 29x22 +#8 @ 921,577: 15x13 +#9 @ 495,85: 20x19 +#10 @ 397,589: 17x22 +#11 @ 238,651: 13x17 +#12 @ 143,939: 28x19 +#13 @ 211,227: 26x12 +#14 @ 81,818: 22x19 +#15 @ 121,270: 18x10 +#16 @ 414,117: 16x25 +#17 @ 450,597: 11x13 +#18 @ 875,694: 25x13 +#19 @ 348,301: 19x14 +#20 @ 427,302: 20x28 +#21 @ 295,935: 29x22 +#22 @ 488,347: 21x10 +#23 @ 724,809: 24x24 +#24 @ 529,746: 23x22 +#25 @ 674,555: 29x17 +#26 @ 807,871: 29x19 +#27 @ 170,203: 11x13 +#28 @ 340,446: 21x11 +#29 @ 534,294: 28x17 +#30 @ 136,271: 22x22 +#31 @ 672,965: 29x10 +#32 @ 767,638: 22x10 +#33 @ 927,196: 11x23 +#34 @ 349,305: 22x12 +#35 @ 616,903: 27x22 +#36 @ 761,453: 16x15 +#37 @ 682,835: 26x20 +#38 @ 799,723: 27x17 +#39 @ 623,807: 21x20 +#40 @ 334,886: 16x27 +#41 @ 953,561: 15x28 +#42 @ 318,469: 23x16 +#43 @ 498,718: 16x12 +#44 @ 634,788: 22x26 +#45 @ 150,190: 13x28 +#46 @ 814,124: 22x24 +#47 @ 524,741: 20x26 +#48 @ 931,336: 19x20 +#49 @ 200,506: 14x20 +#50 @ 849,225: 16x11 +#51 @ 602,494: 19x20 +#52 @ 362,128: 14x13 +#53 @ 680,571: 19x19 +#54 @ 354,45: 29x27 +#55 @ 908,894: 10x27 +#56 @ 204,219: 10x18 +#57 @ 328,28: 11x28 +#58 @ 604,789: 11x25 +#59 @ 288,827: 29x15 +#60 @ 945,443: 14x12 +#61 @ 294,845: 8x8 +#62 @ 756,365: 20x23 +#63 @ 570,493: 17x14 +#64 @ 144,372: 23x12 +#65 @ 374,58: 13x19 +#66 @ 331,305: 12x11 +#67 @ 603,282: 19x19 +#68 @ 755,875: 12x13 +#69 @ 147,709: 26x10 +#70 @ 445,408: 13x17 +#71 @ 816,215: 24x13 +#72 @ 28,225: 15x29 +#73 @ 167,253: 10x25 +#74 @ 788,845: 18x10 +#75 @ 834,230: 26x24 +#76 @ 874,277: 17x24 +#77 @ 250,805: 11x24 +#78 @ 267,610: 13x11 +#79 @ 813,860: 24x20 +#80 @ 119,585: 10x18 +#81 @ 494,941: 12x25 +#82 @ 816,550: 12x28 +#83 @ 620,799: 17x12 +#84 @ 705,754: 24x21 +#85 @ 297,16: 15x21 +#86 @ 650,808: 19x20 +#87 @ 251,138: 20x15 +#88 @ 834,516: 19x20 +#89 @ 229,266: 24x13 +#90 @ 524,827: 20x25 +#91 @ 186,405: 20x28 +#92 @ 448,795: 13x18 +#93 @ 508,388: 25x27 +#94 @ 74,831: 19x19 +#95 @ 444,548: 12x22 +#96 @ 893,230: 17x24 +#97 @ 380,437: 14x25 +#98 @ 511,272: 10x13 +#99 @ 261,922: 12x23 +#100 @ 215,120: 27x27 +#101 @ 190,202: 23x29 +#102 @ 954,691: 11x24 +#103 @ 916,207: 17x29 +#104 @ 441,890: 23x16 +#105 @ 322,455: 11x22 +#106 @ 28,0: 22x19 +#107 @ 101,633: 19x24 +#108 @ 214,399: 20x11 +#109 @ 882,829: 25x11 +#110 @ 336,33: 21x26 +#111 @ 805,278: 13x21 +#112 @ 98,522: 12x29 +#113 @ 261,706: 25x26 +#114 @ 706,369: 21x13 +#115 @ 281,23: 23x12 +#116 @ 505,410: 25x13 +#117 @ 147,514: 12x12 +#118 @ 555,888: 11x13 +#119 @ 687,852: 22x25 +#120 @ 46,609: 5x12 +#121 @ 431,119: 24x13 +#122 @ 843,984: 24x15 +#123 @ 313,524: 25x12 +#124 @ 213,231: 17x18 +#125 @ 167,935: 21x11 +#126 @ 719,738: 22x23 +#127 @ 692,840: 29x13 +#128 @ 948,580: 19x21 +#129 @ 558,303: 14x14 +#130 @ 890,328: 10x23 +#131 @ 934,563: 23x12 +#132 @ 757,18: 22x22 +#133 @ 615,947: 21x20 +#134 @ 712,439: 26x18 +#135 @ 219,134: 28x28 +#136 @ 373,270: 26x23 +#137 @ 87,844: 29x13 +#138 @ 937,454: 23x27 +#139 @ 482,802: 23x14 +#140 @ 687,970: 29x13 +#141 @ 983,139: 12x20 +#142 @ 268,656: 21x17 +#143 @ 940,913: 18x20 +#144 @ 328,588: 10x17 +#145 @ 217,915: 23x21 +#146 @ 92,841: 17x17 +#147 @ 962,683: 24x17 +#148 @ 857,468: 12x17 +#149 @ 438,644: 20x10 +#150 @ 516,283: 21x17 +#151 @ 429,847: 24x29 +#152 @ 761,679: 10x5 +#153 @ 471,59: 26x12 +#154 @ 223,650: 21x19 +#155 @ 80,555: 25x18 +#156 @ 455,328: 26x28 +#157 @ 723,634: 27x11 +#158 @ 565,862: 14x25 +#159 @ 381,670: 23x16 +#160 @ 293,838: 12x23 +#161 @ 168,190: 25x24 +#162 @ 91,18: 28x29 +#163 @ 470,715: 29x24 +#164 @ 124,216: 13x14 +#165 @ 360,133: 25x10 +#166 @ 983,145: 10x10 +#167 @ 577,420: 15x10 +#168 @ 297,949: 17x23 +#169 @ 789,129: 29x27 +#170 @ 545,711: 16x20 +#171 @ 965,81: 20x23 +#172 @ 944,584: 26x23 +#173 @ 139,971: 16x12 +#174 @ 453,561: 26x16 +#175 @ 591,967: 11x24 +#176 @ 130,552: 22x24 +#177 @ 643,365: 18x10 +#178 @ 205,830: 29x11 +#179 @ 536,151: 12x28 +#180 @ 771,455: 14x18 +#181 @ 699,596: 13x23 +#182 @ 964,498: 19x24 +#183 @ 964,563: 17x26 +#184 @ 760,627: 10x14 +#185 @ 832,457: 18x25 +#186 @ 274,661: 12x25 +#187 @ 9,788: 26x15 +#188 @ 548,689: 16x25 +#189 @ 478,927: 19x21 +#190 @ 598,127: 21x17 +#191 @ 417,6: 19x15 +#192 @ 891,495: 26x28 +#193 @ 532,862: 23x16 +#194 @ 340,579: 10x15 +#195 @ 816,103: 10x17 +#196 @ 646,394: 21x20 +#197 @ 234,827: 22x12 +#198 @ 658,954: 28x17 +#199 @ 491,4: 24x27 +#200 @ 467,411: 11x11 +#201 @ 683,88: 16x26 +#202 @ 717,124: 22x16 +#203 @ 325,577: 13x16 +#204 @ 545,852: 19x10 +#205 @ 58,535: 13x20 +#206 @ 483,57: 21x28 +#207 @ 287,762: 27x14 +#208 @ 990,223: 6x12 +#209 @ 878,768: 17x21 +#210 @ 800,761: 24x12 +#211 @ 971,661: 16x15 +#212 @ 290,296: 10x13 +#213 @ 67,852: 11x16 +#214 @ 303,627: 27x18 +#215 @ 150,89: 22x27 +#216 @ 336,535: 29x21 +#217 @ 603,198: 26x21 +#218 @ 145,263: 27x19 +#219 @ 332,793: 29x19 +#220 @ 326,738: 19x22 +#221 @ 277,828: 12x25 +#222 @ 227,729: 14x20 +#223 @ 863,900: 10x21 +#224 @ 914,2: 15x11 +#225 @ 535,507: 14x14 +#226 @ 91,144: 21x21 +#227 @ 454,437: 29x19 +#228 @ 878,506: 26x20 +#229 @ 467,873: 23x25 +#230 @ 899,36: 17x14 +#231 @ 490,959: 25x20 +#232 @ 482,830: 22x18 +#233 @ 233,662: 19x19 +#234 @ 429,33: 28x21 +#235 @ 884,537: 25x22 +#236 @ 636,135: 11x10 +#237 @ 196,303: 27x27 +#238 @ 801,301: 12x24 +#239 @ 522,444: 29x13 +#240 @ 737,417: 18x29 +#241 @ 603,706: 19x17 +#242 @ 792,51: 17x18 +#243 @ 241,740: 15x27 +#244 @ 383,767: 23x20 +#245 @ 735,647: 25x25 +#246 @ 863,880: 22x23 +#247 @ 20,966: 29x16 +#248 @ 538,425: 14x28 +#249 @ 108,844: 19x15 +#250 @ 384,201: 28x25 +#251 @ 932,593: 13x14 +#252 @ 282,535: 29x23 +#253 @ 822,550: 14x15 +#254 @ 190,231: 29x23 +#255 @ 602,217: 12x24 +#256 @ 97,259: 18x21 +#257 @ 40,24: 11x12 +#258 @ 147,206: 14x10 +#259 @ 738,864: 29x23 +#260 @ 42,3: 10x23 +#261 @ 668,581: 25x17 +#262 @ 452,664: 25x12 +#263 @ 688,493: 13x11 +#264 @ 324,309: 27x19 +#265 @ 460,696: 17x13 +#266 @ 354,943: 20x11 +#267 @ 959,576: 22x14 +#268 @ 637,848: 12x29 +#269 @ 685,606: 16x11 +#270 @ 294,503: 20x13 +#271 @ 689,398: 19x10 +#272 @ 791,114: 13x16 +#273 @ 881,910: 24x12 +#274 @ 598,625: 11x16 +#275 @ 863,668: 28x25 +#276 @ 677,97: 25x21 +#277 @ 310,767: 12x10 +#278 @ 226,589: 11x17 +#279 @ 41,761: 18x12 +#280 @ 632,82: 14x21 +#281 @ 978,549: 14x10 +#282 @ 153,25: 26x22 +#283 @ 397,240: 14x18 +#284 @ 614,883: 20x23 +#285 @ 980,7: 13x27 +#286 @ 58,158: 22x21 +#287 @ 188,5: 14x26 +#288 @ 941,152: 19x15 +#289 @ 547,853: 12x28 +#290 @ 292,612: 16x23 +#291 @ 725,945: 13x10 +#292 @ 886,244: 15x27 +#293 @ 665,745: 25x20 +#294 @ 621,835: 20x21 +#295 @ 462,252: 19x20 +#296 @ 150,769: 20x11 +#297 @ 119,439: 10x11 +#298 @ 902,497: 14x20 +#299 @ 805,772: 20x15 +#300 @ 495,553: 19x24 +#301 @ 789,754: 12x22 +#302 @ 501,798: 28x12 +#303 @ 949,746: 21x17 +#304 @ 204,462: 24x14 +#305 @ 543,30: 21x25 +#306 @ 135,652: 21x22 +#307 @ 314,157: 26x15 +#308 @ 481,970: 12x19 +#309 @ 593,972: 6x6 +#310 @ 597,71: 22x24 +#311 @ 373,400: 13x19 +#312 @ 113,482: 23x16 +#313 @ 720,925: 17x13 +#314 @ 967,659: 16x23 +#315 @ 352,66: 26x20 +#316 @ 289,375: 14x13 +#317 @ 405,405: 14x10 +#318 @ 688,962: 16x29 +#319 @ 684,863: 25x14 +#320 @ 530,906: 17x25 +#321 @ 384,719: 12x26 +#322 @ 984,198: 10x22 +#323 @ 673,273: 11x18 +#324 @ 662,328: 22x14 +#325 @ 571,653: 25x22 +#326 @ 432,12: 10x27 +#327 @ 842,672: 22x14 +#328 @ 691,52: 16x17 +#329 @ 216,327: 22x10 +#330 @ 942,508: 11x11 +#331 @ 698,200: 27x14 +#332 @ 123,480: 27x24 +#333 @ 68,611: 27x21 +#334 @ 660,468: 15x22 +#335 @ 709,372: 5x6 +#336 @ 431,405: 19x17 +#337 @ 143,276: 29x15 +#338 @ 21,224: 27x28 +#339 @ 880,402: 17x29 +#340 @ 598,928: 21x28 +#341 @ 233,180: 17x14 +#342 @ 875,815: 14x19 +#343 @ 963,130: 24x24 +#344 @ 690,604: 17x18 +#345 @ 713,638: 14x22 +#346 @ 776,41: 27x29 +#347 @ 138,341: 13x28 +#348 @ 896,88: 29x24 +#349 @ 967,829: 12x25 +#350 @ 820,618: 29x10 +#351 @ 805,176: 18x14 +#352 @ 715,813: 16x29 +#353 @ 686,194: 26x23 +#354 @ 615,271: 29x12 +#355 @ 515,387: 16x12 +#356 @ 22,763: 12x13 +#357 @ 528,572: 26x12 +#358 @ 359,477: 18x18 +#359 @ 290,430: 26x23 +#360 @ 296,18: 24x11 +#361 @ 886,543: 18x5 +#362 @ 251,134: 25x14 +#363 @ 927,583: 22x15 +#364 @ 865,454: 22x28 +#365 @ 669,322: 11x21 +#366 @ 429,777: 25x22 +#367 @ 325,432: 21x21 +#368 @ 132,554: 24x15 +#369 @ 917,7: 20x25 +#370 @ 175,932: 25x10 +#371 @ 954,72: 15x19 +#372 @ 574,198: 25x15 +#373 @ 333,23: 14x10 +#374 @ 134,572: 14x17 +#375 @ 775,386: 21x26 +#376 @ 906,668: 19x12 +#377 @ 695,566: 19x15 +#378 @ 950,662: 25x28 +#379 @ 714,376: 18x18 +#380 @ 928,899: 29x19 +#381 @ 802,376: 24x22 +#382 @ 369,787: 13x25 +#383 @ 75,261: 29x26 +#384 @ 562,883: 10x16 +#385 @ 321,26: 11x14 +#386 @ 631,265: 26x27 +#387 @ 519,451: 17x28 +#388 @ 62,159: 12x18 +#389 @ 693,41: 28x28 +#390 @ 933,632: 10x11 +#391 @ 246,257: 14x11 +#392 @ 183,504: 22x26 +#393 @ 555,924: 17x26 +#394 @ 828,867: 21x28 +#395 @ 775,874: 27x17 +#396 @ 475,557: 17x24 +#397 @ 535,645: 16x16 +#398 @ 650,767: 23x29 +#399 @ 453,242: 25x16 +#400 @ 481,436: 24x15 +#401 @ 195,982: 22x10 +#402 @ 458,807: 12x13 +#403 @ 386,728: 4x7 +#404 @ 476,486: 22x11 +#405 @ 674,631: 11x21 +#406 @ 20,981: 10x19 +#407 @ 471,551: 14x15 +#408 @ 610,84: 13x10 +#409 @ 899,118: 25x23 +#410 @ 719,705: 27x22 +#411 @ 458,280: 14x15 +#412 @ 327,436: 14x25 +#413 @ 635,145: 19x12 +#414 @ 967,574: 12x13 +#415 @ 517,356: 21x10 +#416 @ 719,723: 16x24 +#417 @ 661,755: 11x17 +#418 @ 310,902: 19x24 +#419 @ 432,516: 12x25 +#420 @ 695,693: 26x28 +#421 @ 518,653: 28x28 +#422 @ 869,514: 28x22 +#423 @ 730,402: 24x13 +#424 @ 412,550: 11x27 +#425 @ 688,234: 25x11 +#426 @ 663,819: 10x20 +#427 @ 209,219: 10x21 +#428 @ 369,699: 24x22 +#429 @ 770,731: 15x29 +#430 @ 291,723: 19x16 +#431 @ 978,582: 20x27 +#432 @ 489,481: 15x12 +#433 @ 287,41: 15x25 +#434 @ 2,908: 10x26 +#435 @ 827,150: 23x25 +#436 @ 30,635: 28x19 +#437 @ 178,391: 14x29 +#438 @ 657,168: 23x13 +#439 @ 378,461: 10x15 +#440 @ 325,30: 10x25 +#441 @ 757,462: 21x12 +#442 @ 704,135: 17x28 +#443 @ 815,393: 25x11 +#444 @ 367,733: 17x23 +#445 @ 542,705: 12x13 +#446 @ 346,907: 17x13 +#447 @ 16,809: 28x24 +#448 @ 800,255: 21x16 +#449 @ 192,9: 4x17 +#450 @ 387,514: 13x12 +#451 @ 625,137: 24x13 +#452 @ 339,746: 25x17 +#453 @ 758,32: 10x20 +#454 @ 955,716: 19x15 +#455 @ 987,3: 10x12 +#456 @ 661,821: 23x25 +#457 @ 636,969: 11x14 +#458 @ 697,908: 13x20 +#459 @ 178,919: 20x14 +#460 @ 167,951: 22x20 +#461 @ 284,211: 5x11 +#462 @ 5,820: 20x24 +#463 @ 884,516: 18x28 +#464 @ 811,174: 19x21 +#465 @ 38,229: 11x28 +#466 @ 160,203: 29x28 +#467 @ 286,107: 16x17 +#468 @ 336,30: 20x28 +#469 @ 959,4: 15x10 +#470 @ 374,812: 11x10 +#471 @ 605,748: 13x27 +#472 @ 126,578: 19x20 +#473 @ 151,127: 26x20 +#474 @ 680,150: 28x25 +#475 @ 266,842: 14x26 +#476 @ 602,292: 21x12 +#477 @ 220,702: 24x22 +#478 @ 49,19: 21x20 +#479 @ 208,750: 23x14 +#480 @ 328,410: 23x15 +#481 @ 65,501: 25x16 +#482 @ 411,409: 17x28 +#483 @ 709,935: 16x10 +#484 @ 915,218: 28x22 +#485 @ 722,661: 11x16 +#486 @ 579,329: 25x14 +#487 @ 338,352: 21x22 +#488 @ 351,0: 13x12 +#489 @ 254,867: 13x29 +#490 @ 569,249: 24x11 +#491 @ 592,742: 11x18 +#492 @ 26,234: 11x23 +#493 @ 602,590: 16x13 +#494 @ 311,415: 20x22 +#495 @ 979,551: 13x25 +#496 @ 15,950: 17x10 +#497 @ 397,722: 10x10 +#498 @ 468,797: 18x13 +#499 @ 961,835: 15x26 +#500 @ 965,696: 23x23 +#501 @ 811,96: 19x10 +#502 @ 60,966: 12x20 +#503 @ 425,104: 27x20 +#504 @ 221,913: 18x29 +#505 @ 441,787: 10x12 +#506 @ 225,740: 20x11 +#507 @ 162,110: 13x14 +#508 @ 680,88: 26x21 +#509 @ 344,40: 28x17 +#510 @ 779,13: 27x28 +#511 @ 258,387: 28x26 +#512 @ 90,55: 12x23 +#513 @ 406,120: 15x26 +#514 @ 618,460: 13x12 +#515 @ 660,495: 14x20 +#516 @ 680,102: 11x16 +#517 @ 588,664: 17x26 +#518 @ 350,682: 25x24 +#519 @ 304,41: 11x18 +#520 @ 601,294: 14x15 +#521 @ 395,680: 10x27 +#522 @ 599,318: 17x27 +#523 @ 953,279: 10x24 +#524 @ 935,893: 11x18 +#525 @ 150,965: 13x11 +#526 @ 575,652: 12x22 +#527 @ 328,282: 26x27 +#528 @ 960,581: 10x16 +#529 @ 451,523: 28x29 +#530 @ 249,929: 14x13 +#531 @ 787,347: 10x18 +#532 @ 728,940: 21x16 +#533 @ 501,489: 15x27 +#534 @ 956,85: 15x15 +#535 @ 29,956: 28x13 +#536 @ 508,4: 12x16 +#537 @ 115,211: 20x19 +#538 @ 889,341: 15x10 +#539 @ 755,56: 25x16 +#540 @ 409,587: 12x12 +#541 @ 669,166: 20x10 +#542 @ 633,143: 21x19 +#543 @ 614,163: 12x14 +#544 @ 302,832: 16x23 +#545 @ 436,25: 11x23 +#546 @ 129,173: 16x22 +#547 @ 273,439: 29x11 +#548 @ 313,114: 15x15 +#549 @ 698,822: 12x18 +#550 @ 223,645: 27x25 +#551 @ 311,280: 10x21 +#552 @ 937,841: 16x18 +#553 @ 382,979: 16x12 +#554 @ 405,279: 17x23 +#555 @ 588,413: 14x20 +#556 @ 849,948: 21x24 +#557 @ 374,548: 22x16 +#558 @ 535,573: 12x15 +#559 @ 603,764: 10x29 +#560 @ 888,8: 13x26 +#561 @ 884,386: 22x16 +#562 @ 442,536: 11x6 +#563 @ 159,189: 26x12 +#564 @ 296,368: 26x29 +#565 @ 165,918: 11x23 +#566 @ 91,229: 26x24 +#567 @ 964,821: 17x12 +#568 @ 192,859: 19x12 +#569 @ 540,835: 28x10 +#570 @ 884,663: 17x25 +#571 @ 726,640: 12x29 +#572 @ 884,337: 23x10 +#573 @ 142,924: 16x22 +#574 @ 954,756: 13x12 +#575 @ 745,633: 29x15 +#576 @ 198,937: 29x11 +#577 @ 966,574: 14x26 +#578 @ 183,211: 27x22 +#579 @ 885,202: 23x11 +#580 @ 929,460: 23x28 +#581 @ 308,288: 10x25 +#582 @ 272,104: 15x20 +#583 @ 580,697: 28x23 +#584 @ 558,862: 11x12 +#585 @ 408,511: 28x21 +#586 @ 523,926: 13x27 +#587 @ 752,411: 26x17 +#588 @ 457,418: 21x24 +#589 @ 734,404: 4x8 +#590 @ 857,839: 29x16 +#591 @ 694,101: 11x15 +#592 @ 382,250: 21x19 +#593 @ 760,683: 4x4 +#594 @ 900,917: 11x22 +#595 @ 688,599: 11x21 +#596 @ 616,423: 23x27 +#597 @ 788,737: 23x27 +#598 @ 222,762: 22x25 +#599 @ 133,672: 29x17 +#600 @ 191,212: 10x23 +#601 @ 253,117: 26x16 +#602 @ 288,644: 12x21 +#603 @ 167,131: 20x24 +#604 @ 888,535: 10x29 +#605 @ 918,397: 20x11 +#606 @ 897,934: 15x18 +#607 @ 252,807: 6x17 +#608 @ 614,495: 25x13 +#609 @ 360,540: 24x26 +#610 @ 705,192: 16x19 +#611 @ 19,672: 15x19 +#612 @ 173,227: 16x29 +#613 @ 579,885: 23x15 +#614 @ 497,390: 28x29 +#615 @ 435,783: 24x20 +#616 @ 337,492: 21x29 +#617 @ 114,251: 16x22 +#618 @ 917,820: 28x10 +#619 @ 690,812: 25x18 +#620 @ 63,138: 23x26 +#621 @ 47,232: 20x11 +#622 @ 497,408: 21x29 +#623 @ 97,223: 26x10 +#624 @ 751,558: 26x16 +#625 @ 920,299: 13x26 +#626 @ 0,249: 16x20 +#627 @ 319,766: 14x19 +#628 @ 967,520: 24x18 +#629 @ 580,496: 11x28 +#630 @ 185,960: 16x11 +#631 @ 947,434: 13x23 +#632 @ 712,447: 11x16 +#633 @ 71,49: 15x15 +#634 @ 58,962: 11x27 +#635 @ 451,389: 19x27 +#636 @ 280,665: 25x20 +#637 @ 210,330: 28x14 +#638 @ 221,269: 20x22 +#639 @ 338,174: 11x10 +#640 @ 36,747: 17x18 +#641 @ 163,387: 24x19 +#642 @ 273,244: 10x19 +#643 @ 280,236: 15x23 +#644 @ 475,964: 13x11 +#645 @ 688,450: 11x26 +#646 @ 913,291: 27x20 +#647 @ 382,72: 13x12 +#648 @ 939,641: 28x24 +#649 @ 297,743: 11x23 +#650 @ 247,168: 26x14 +#651 @ 644,741: 22x26 +#652 @ 99,220: 28x12 +#653 @ 360,941: 17x21 +#654 @ 285,550: 28x26 +#655 @ 739,414: 21x14 +#656 @ 434,973: 23x14 +#657 @ 886,925: 11x28 +#658 @ 451,670: 16x16 +#659 @ 654,458: 24x18 +#660 @ 35,594: 11x10 +#661 @ 934,0: 15x26 +#662 @ 39,90: 5x15 +#663 @ 745,609: 25x22 +#664 @ 357,329: 12x22 +#665 @ 328,170: 27x19 +#666 @ 661,130: 28x29 +#667 @ 212,972: 20x12 +#668 @ 788,881: 19x22 +#669 @ 936,827: 14x13 +#670 @ 785,426: 29x19 +#671 @ 778,181: 28x14 +#672 @ 326,115: 19x14 +#673 @ 939,211: 19x24 +#674 @ 844,866: 26x24 +#675 @ 309,515: 15x25 +#676 @ 351,787: 15x10 +#677 @ 444,582: 22x11 +#678 @ 285,719: 28x25 +#679 @ 643,531: 26x21 +#680 @ 671,204: 21x20 +#681 @ 657,507: 17x28 +#682 @ 335,678: 23x25 +#683 @ 45,633: 16x13 +#684 @ 522,437: 19x13 +#685 @ 161,945: 28x15 +#686 @ 510,507: 21x23 +#687 @ 497,552: 18x22 +#688 @ 788,847: 25x29 +#689 @ 199,918: 19x13 +#690 @ 339,373: 24x10 +#691 @ 334,356: 3x7 +#692 @ 293,226: 19x17 +#693 @ 417,71: 28x12 +#694 @ 74,54: 22x19 +#695 @ 530,729: 25x17 +#696 @ 227,259: 25x24 +#697 @ 43,629: 12x16 +#698 @ 58,526: 10x17 +#699 @ 66,626: 23x21 +#700 @ 714,799: 18x23 +#701 @ 126,651: 10x10 +#702 @ 398,698: 27x20 +#703 @ 786,400: 15x16 +#704 @ 361,840: 15x20 +#705 @ 571,535: 18x29 +#706 @ 442,319: 11x27 +#707 @ 495,280: 19x21 +#708 @ 91,854: 20x28 +#709 @ 309,155: 17x17 +#710 @ 9,235: 23x22 +#711 @ 145,412: 20x19 +#712 @ 598,331: 19x10 +#713 @ 902,179: 25x28 +#714 @ 315,574: 22x11 +#715 @ 626,750: 18x27 +#716 @ 894,416: 24x20 +#717 @ 299,827: 23x20 +#718 @ 301,814: 16x26 +#719 @ 561,870: 25x24 +#720 @ 607,483: 15x26 +#721 @ 405,221: 25x20 +#722 @ 845,237: 27x28 +#723 @ 788,281: 28x10 +#724 @ 790,99: 13x24 +#725 @ 39,303: 27x13 +#726 @ 837,232: 28x23 +#727 @ 59,976: 27x22 +#728 @ 313,836: 11x24 +#729 @ 644,549: 11x19 +#730 @ 961,206: 10x21 +#731 @ 784,114: 28x14 +#732 @ 482,60: 19x21 +#733 @ 380,230: 19x12 +#734 @ 17,224: 15x19 +#735 @ 91,953: 29x13 +#736 @ 957,485: 22x14 +#737 @ 162,397: 27x19 +#738 @ 696,569: 14x27 +#739 @ 366,756: 15x18 +#740 @ 604,921: 25x23 +#741 @ 896,924: 27x25 +#742 @ 168,486: 15x28 +#743 @ 750,564: 13x18 +#744 @ 642,304: 24x27 +#745 @ 298,687: 10x26 +#746 @ 397,710: 12x17 +#747 @ 461,15: 26x24 +#748 @ 927,334: 14x17 +#749 @ 727,642: 17x12 +#750 @ 426,236: 16x18 +#751 @ 346,960: 29x27 +#752 @ 478,870: 13x27 +#753 @ 698,127: 24x28 +#754 @ 119,921: 28x18 +#755 @ 221,447: 24x17 +#756 @ 229,682: 25x21 +#757 @ 712,238: 21x26 +#758 @ 594,577: 19x17 +#759 @ 130,659: 28x18 +#760 @ 65,25: 16x17 +#761 @ 680,829: 12x17 +#762 @ 213,125: 19x14 +#763 @ 13,902: 12x26 +#764 @ 520,454: 12x13 +#765 @ 712,477: 23x27 +#766 @ 670,265: 24x27 +#767 @ 399,297: 17x23 +#768 @ 83,964: 29x11 +#769 @ 343,307: 14x26 +#770 @ 633,146: 25x24 +#771 @ 337,574: 26x15 +#772 @ 794,234: 17x18 +#773 @ 438,328: 24x26 +#774 @ 762,765: 26x21 +#775 @ 761,353: 25x19 +#776 @ 824,614: 13x15 +#777 @ 232,974: 12x19 +#778 @ 156,121: 22x24 +#779 @ 458,606: 21x23 +#780 @ 370,959: 29x21 +#781 @ 690,815: 25x27 +#782 @ 865,918: 12x27 +#783 @ 875,503: 13x17 +#784 @ 592,794: 28x16 +#785 @ 903,876: 19x23 +#786 @ 8,796: 18x16 +#787 @ 692,433: 11x21 +#788 @ 735,509: 16x25 +#789 @ 24,768: 26x26 +#790 @ 725,457: 21x15 +#791 @ 26,8: 21x18 +#792 @ 557,728: 12x13 +#793 @ 778,45: 10x23 +#794 @ 381,220: 12x13 +#795 @ 3,922: 29x25 +#796 @ 706,197: 13x12 +#797 @ 425,967: 17x29 +#798 @ 666,764: 16x20 +#799 @ 774,640: 10x14 +#800 @ 581,310: 21x13 +#801 @ 771,249: 24x16 +#802 @ 772,36: 24x20 +#803 @ 362,333: 17x19 +#804 @ 803,861: 27x20 +#805 @ 352,751: 25x28 +#806 @ 880,770: 12x14 +#807 @ 418,130: 25x27 +#808 @ 601,292: 20x24 +#809 @ 331,347: 10x25 +#810 @ 181,929: 29x20 +#811 @ 80,632: 27x23 +#812 @ 4,136: 15x13 +#813 @ 904,899: 13x24 +#814 @ 61,828: 14x28 +#815 @ 265,305: 28x18 +#816 @ 753,32: 27x22 +#817 @ 106,343: 26x20 +#818 @ 655,323: 20x25 +#819 @ 421,523: 16x15 +#820 @ 143,251: 15x13 +#821 @ 426,846: 15x26 +#822 @ 705,144: 11x14 +#823 @ 414,217: 16x22 +#824 @ 368,399: 10x21 +#825 @ 753,449: 24x10 +#826 @ 452,396: 11x20 +#827 @ 401,361: 11x25 +#828 @ 483,320: 22x12 +#829 @ 471,825: 17x28 +#830 @ 816,250: 15x17 +#831 @ 772,394: 29x17 +#832 @ 922,400: 11x4 +#833 @ 65,298: 18x11 +#834 @ 613,805: 22x22 +#835 @ 521,281: 29x12 +#836 @ 333,852: 19x22 +#837 @ 18,585: 26x17 +#838 @ 150,34: 22x20 +#839 @ 217,756: 27x21 +#840 @ 36,88: 22x20 +#841 @ 800,412: 12x27 +#842 @ 202,911: 23x27 +#843 @ 151,865: 16x25 +#844 @ 929,817: 19x27 +#845 @ 632,25: 14x29 +#846 @ 125,256: 17x20 +#847 @ 674,954: 20x29 +#848 @ 106,362: 20x28 +#849 @ 868,880: 27x29 +#850 @ 635,9: 17x24 +#851 @ 107,222: 17x27 +#852 @ 805,889: 16x24 +#853 @ 550,284: 14x18 +#854 @ 441,642: 23x18 +#855 @ 888,852: 24x25 +#856 @ 161,224: 22x13 +#857 @ 25,759: 11x17 +#858 @ 683,916: 26x24 +#859 @ 436,705: 28x22 +#860 @ 615,429: 25x10 +#861 @ 758,670: 16x21 +#862 @ 376,472: 16x10 +#863 @ 953,96: 17x20 +#864 @ 118,678: 11x21 +#865 @ 308,239: 17x19 +#866 @ 314,581: 20x16 +#867 @ 218,477: 24x11 +#868 @ 229,100: 23x26 +#869 @ 2,239: 15x23 +#870 @ 589,356: 27x18 +#871 @ 434,73: 7x7 +#872 @ 988,221: 11x21 +#873 @ 276,100: 19x27 +#874 @ 625,766: 10x27 +#875 @ 246,408: 17x26 +#876 @ 973,521: 14x26 +#877 @ 851,8: 27x22 +#878 @ 624,32: 12x11 +#879 @ 896,359: 26x28 +#880 @ 317,923: 11x24 +#881 @ 179,510: 21x14 +#882 @ 143,742: 16x29 +#883 @ 291,843: 27x13 +#884 @ 170,901: 18x20 +#885 @ 540,490: 17x12 +#886 @ 216,964: 17x17 +#887 @ 191,949: 19x15 +#888 @ 682,648: 10x11 +#889 @ 78,521: 24x12 +#890 @ 19,679: 12x14 +#891 @ 17,907: 20x11 +#892 @ 489,837: 29x11 +#893 @ 388,519: 27x10 +#894 @ 588,53: 19x24 +#895 @ 149,695: 28x27 +#896 @ 150,364: 16x15 +#897 @ 112,654: 20x21 +#898 @ 709,465: 20x23 +#899 @ 941,2: 26x10 +#900 @ 542,90: 24x19 +#901 @ 663,951: 18x29 +#902 @ 244,515: 16x16 +#903 @ 146,13: 25x25 +#904 @ 499,36: 28x25 +#905 @ 442,293: 20x14 +#906 @ 351,855: 13x16 +#907 @ 812,144: 27x28 +#908 @ 505,21: 13x13 +#909 @ 85,135: 14x14 +#910 @ 185,145: 21x29 +#911 @ 573,744: 29x24 +#912 @ 726,763: 17x13 +#913 @ 635,958: 10x14 +#914 @ 395,337: 20x26 +#915 @ 933,152: 14x26 +#916 @ 315,549: 14x25 +#917 @ 57,980: 28x13 +#918 @ 427,974: 11x13 +#919 @ 562,747: 25x25 +#920 @ 514,290: 28x26 +#921 @ 856,939: 25x18 +#922 @ 686,692: 22x19 +#923 @ 414,530: 27x22 +#924 @ 949,281: 10x18 +#925 @ 270,280: 20x22 +#926 @ 474,348: 23x23 +#927 @ 635,395: 20x19 +#928 @ 105,430: 23x10 +#929 @ 578,192: 26x12 +#930 @ 506,482: 18x29 +#931 @ 599,934: 22x11 +#932 @ 746,193: 29x14 +#933 @ 94,782: 18x27 +#934 @ 24,226: 18x26 +#935 @ 9,144: 16x24 +#936 @ 290,633: 13x21 +#937 @ 912,234: 17x24 +#938 @ 354,518: 14x22 +#939 @ 943,692: 29x27 +#940 @ 867,134: 11x23 +#941 @ 908,93: 10x15 +#942 @ 174,400: 15x24 +#943 @ 518,419: 29x17 +#944 @ 460,770: 19x16 +#945 @ 916,507: 22x29 +#946 @ 251,165: 19x19 +#947 @ 490,871: 10x29 +#948 @ 220,589: 18x13 +#949 @ 530,376: 10x15 +#950 @ 307,31: 11x27 +#951 @ 78,686: 11x27 +#952 @ 950,464: 29x24 +#953 @ 138,225: 29x27 +#954 @ 281,294: 17x15 +#955 @ 214,230: 16x22 +#956 @ 929,513: 21x14 +#957 @ 377,986: 12x11 +#958 @ 282,200: 26x28 +#959 @ 206,509: 23x28 +#960 @ 528,451: 16x16 +#961 @ 960,146: 13x12 +#962 @ 255,378: 14x12 +#963 @ 890,331: 29x11 +#964 @ 216,692: 29x11 +#965 @ 42,604: 20x24 +#966 @ 710,371: 12x21 +#967 @ 106,789: 27x21 +#968 @ 693,480: 15x20 +#969 @ 671,847: 16x11 +#970 @ 345,839: 18x26 +#971 @ 267,927: 27x17 +#972 @ 954,214: 14x10 +#973 @ 229,634: 10x27 +#974 @ 264,389: 15x10 +#975 @ 278,479: 19x26 +#976 @ 299,756: 18x10 +#977 @ 750,502: 18x29 +#978 @ 317,549: 17x14 +#979 @ 234,772: 18x16 +#980 @ 855,937: 10x28 +#981 @ 877,297: 20x11 +#982 @ 234,752: 14x24 +#983 @ 20,250: 27x11 +#984 @ 869,830: 21x11 +#985 @ 255,865: 15x20 +#986 @ 907,216: 24x13 +#987 @ 805,176: 27x14 +#988 @ 786,354: 22x24 +#989 @ 600,867: 22x26 +#990 @ 121,270: 14x21 +#991 @ 199,849: 19x25 +#992 @ 842,593: 22x24 +#993 @ 915,507: 27x20 +#994 @ 583,821: 27x29 +#995 @ 482,973: 14x26 +#996 @ 147,588: 11x14 +#997 @ 684,84: 21x25 +#998 @ 772,112: 19x19 +#999 @ 610,159: 22x22 +#1000 @ 458,443: 19x17 +#1001 @ 575,537: 8x20 +#1002 @ 970,820: 12x28 +#1003 @ 79,771: 20x28 +#1004 @ 64,160: 11x25 +#1005 @ 698,710: 23x14 +#1006 @ 866,823: 22x23 +#1007 @ 623,473: 26x26 +#1008 @ 660,952: 15x21 +#1009 @ 108,936: 12x14 +#1010 @ 312,76: 13x13 +#1011 @ 211,811: 22x27 +#1012 @ 895,306: 21x10 +#1013 @ 599,646: 12x24 +#1014 @ 152,580: 10x11 +#1015 @ 692,495: 19x28 +#1016 @ 636,543: 17x10 +#1017 @ 306,502: 25x28 +#1018 @ 432,529: 25x17 +#1019 @ 563,118: 27x23 +#1020 @ 705,386: 24x21 +#1021 @ 328,325: 22x29 +#1022 @ 468,861: 12x19 +#1023 @ 189,307: 13x15 +#1024 @ 193,185: 20x18 +#1025 @ 404,244: 29x18 +#1026 @ 682,821: 12x21 +#1027 @ 844,99: 27x29 +#1028 @ 972,860: 10x12 +#1029 @ 627,719: 15x14 +#1030 @ 287,476: 12x11 +#1031 @ 211,780: 15x28 +#1032 @ 892,688: 12x13 +#1033 @ 888,500: 12x17 +#1034 @ 890,9: 29x17 +#1035 @ 604,480: 23x17 +#1036 @ 284,20: 14x24 +#1037 @ 706,960: 24x18 +#1038 @ 221,823: 16x22 +#1039 @ 370,260: 19x17 +#1040 @ 221,146: 21x27 +#1041 @ 157,158: 22x19 +#1042 @ 215,742: 16x17 +#1043 @ 532,295: 27x20 +#1044 @ 643,535: 29x24 +#1045 @ 804,848: 28x12 +#1046 @ 867,4: 29x28 +#1047 @ 636,801: 10x27 +#1048 @ 935,579: 29x21 +#1049 @ 827,971: 27x19 +#1050 @ 638,132: 29x27 +#1051 @ 372,429: 17x17 +#1052 @ 889,7: 23x25 +#1053 @ 91,36: 19x24 +#1054 @ 472,850: 19x27 +#1055 @ 426,515: 14x19 +#1056 @ 170,498: 12x10 +#1057 @ 176,153: 10x18 +#1058 @ 695,382: 26x24 +#1059 @ 863,936: 10x16 +#1060 @ 358,815: 21x15 +#1061 @ 31,87: 25x29 +#1062 @ 344,541: 17x25 +#1063 @ 115,181: 17x17 +#1064 @ 541,760: 17x25 +#1065 @ 316,222: 14x24 +#1066 @ 284,499: 29x10 +#1067 @ 887,224: 17x20 +#1068 @ 233,902: 24x21 +#1069 @ 529,93: 19x10 +#1070 @ 378,743: 12x16 +#1071 @ 471,287: 28x26 +#1072 @ 885,582: 24x13 +#1073 @ 495,71: 27x25 +#1074 @ 923,134: 19x16 +#1075 @ 628,672: 13x27 +#1076 @ 303,503: 12x24 +#1077 @ 638,488: 26x12 +#1078 @ 351,617: 10x25 +#1079 @ 867,820: 15x18 +#1080 @ 802,552: 21x13 +#1081 @ 256,609: 17x15 +#1082 @ 214,154: 24x12 +#1083 @ 824,571: 19x13 +#1084 @ 518,510: 25x11 +#1085 @ 115,798: 23x27 +#1086 @ 298,462: 18x29 +#1087 @ 36,300: 16x24 +#1088 @ 49,101: 26x20 +#1089 @ 158,208: 23x15 +#1090 @ 490,47: 14x14 +#1091 @ 762,778: 12x16 +#1092 @ 858,147: 16x25 +#1093 @ 53,491: 19x22 +#1094 @ 848,101: 19x20 +#1095 @ 847,465: 11x21 +#1096 @ 376,682: 19x23 +#1097 @ 241,221: 13x19 +#1098 @ 545,922: 29x11 +#1099 @ 470,321: 25x12 +#1100 @ 381,397: 22x21 +#1101 @ 226,396: 12x15 +#1102 @ 79,10: 12x27 +#1103 @ 128,559: 18x11 +#1104 @ 165,149: 12x28 +#1105 @ 806,207: 16x21 +#1106 @ 289,928: 10x17 +#1107 @ 754,201: 22x21 +#1108 @ 318,401: 16x18 +#1109 @ 594,751: 15x29 +#1110 @ 307,57: 10x26 +#1111 @ 370,755: 14x19 +#1112 @ 927,295: 27x15 +#1113 @ 772,733: 29x29 +#1114 @ 889,916: 15x17 +#1115 @ 442,898: 10x19 +#1116 @ 856,613: 12x10 +#1117 @ 961,663: 24x29 +#1118 @ 512,500: 24x21 +#1119 @ 974,376: 14x24 +#1120 @ 907,221: 10x17 +#1121 @ 518,404: 23x15 +#1122 @ 880,256: 10x20 +#1123 @ 676,838: 17x10 +#1124 @ 528,515: 19x18 +#1125 @ 919,656: 19x29 +#1126 @ 734,172: 13x11 +#1127 @ 425,247: 29x12 +#1128 @ 281,20: 23x16 +#1129 @ 631,663: 14x17 +#1130 @ 908,28: 15x13 +#1131 @ 93,853: 11x24 +#1132 @ 423,971: 25x23 +#1133 @ 187,932: 14x25 +#1134 @ 431,575: 27x15 +#1135 @ 674,491: 27x16 +#1136 @ 546,861: 22x15 +#1137 @ 287,236: 17x15 +#1138 @ 270,653: 21x25 +#1139 @ 969,389: 25x20 +#1140 @ 156,32: 20x16 +#1141 @ 111,663: 27x16 +#1142 @ 654,747: 17x25 +#1143 @ 95,848: 22x11 +#1144 @ 771,589: 27x25 +#1145 @ 446,779: 15x13 +#1146 @ 329,786: 26x29 +#1147 @ 312,4: 17x15 +#1148 @ 785,297: 17x24 +#1149 @ 814,112: 20x18 +#1150 @ 621,450: 12x24 +#1151 @ 158,866: 19x10 +#1152 @ 890,85: 28x23 +#1153 @ 812,514: 27x13 +#1154 @ 48,297: 26x19 +#1155 @ 297,480: 18x27 +#1156 @ 60,629: 10x25 +#1157 @ 960,805: 14x20 +#1158 @ 606,923: 23x27 +#1159 @ 309,765: 19x18 +#1160 @ 345,5: 11x24 +#1161 @ 593,54: 26x19 +#1162 @ 591,128: 26x24 +#1163 @ 364,713: 19x17 +#1164 @ 351,618: 21x11 +#1165 @ 125,644: 15x14 +#1166 @ 531,498: 13x24 +#1167 @ 967,76: 28x19 +#1168 @ 975,79: 10x14 +#1169 @ 834,880: 14x20 +#1170 @ 567,224: 12x26 +#1171 @ 660,349: 10x20 +#1172 @ 314,4: 14x10 +#1173 @ 287,718: 16x14 +#1174 @ 776,773: 18x16 +#1175 @ 305,395: 19x23 +#1176 @ 29,227: 26x27 +#1177 @ 132,353: 20x25 +#1178 @ 85,559: 13x5 +#1179 @ 361,65: 16x16 +#1180 @ 492,3: 29x21 +#1181 @ 557,765: 23x14 +#1182 @ 796,45: 18x10 +#1183 @ 767,603: 26x27 +#1184 @ 961,466: 22x16 +#1185 @ 542,165: 21x23 +#1186 @ 688,218: 15x14 +#1187 @ 483,33: 17x22 +#1188 @ 903,219: 22x22 +#1189 @ 449,114: 11x28 +#1190 @ 846,528: 12x18 +#1191 @ 684,591: 19x17 +#1192 @ 559,128: 15x23 +#1193 @ 874,234: 22x18 +#1194 @ 226,185: 15x29 +#1195 @ 616,982: 25x15 +#1196 @ 508,441: 24x26 +#1197 @ 225,496: 27x25 +#1198 @ 425,553: 29x22 +#1199 @ 232,487: 21x13 +#1200 @ 213,826: 15x12 +#1201 @ 643,819: 13x24 +#1202 @ 515,485: 19x28 +#1203 @ 559,19: 22x14 +#1204 @ 367,478: 12x23 +#1205 @ 367,397: 28x22 +#1206 @ 192,930: 15x10 +#1207 @ 912,607: 28x29 +#1208 @ 637,92: 20x22 +#1209 @ 331,322: 21x29 +#1210 @ 869,680: 26x20 +#1211 @ 369,799: 10x11 +#1212 @ 708,382: 18x19 +#1213 @ 33,7: 26x28 +#1214 @ 751,669: 28x22 +#1215 @ 222,640: 21x24 +#1216 @ 322,400: 28x12 +#1217 @ 35,741: 20x11 +#1218 @ 587,371: 22x24 +#1219 @ 726,654: 22x14 +#1220 @ 589,629: 24x15 +#1221 @ 304,674: 20x22 +#1222 @ 197,153: 22x27 +#1223 @ 804,131: 26x24 +#1224 @ 547,894: 17x18 +#1225 @ 742,469: 20x17 +#1226 @ 860,592: 29x23 +#1227 @ 834,542: 18x26 +#1228 @ 739,174: 3x4 +#1229 @ 956,920: 24x16 +#1230 @ 191,787: 27x29 +#1231 @ 958,186: 10x27 +#1232 @ 113,19: 21x17 +#1233 @ 975,185: 10x17 +#1234 @ 488,19: 23x21 +#1235 @ 890,74: 13x29 +#1236 @ 145,523: 23x11 +#1237 @ 245,671: 18x23 \ No newline at end of file diff --git a/advent_of_code_2018/day3/main1.cc b/advent_of_code_2018/day3/main1.cc new file mode 100644 index 0000000..1719ee8 --- /dev/null +++ b/advent_of_code_2018/day3/main1.cc @@ -0,0 +1,83 @@ +#include +#include +#include + +using namespace std; + +struct Claim +{ + size_t id; + size_t px; + size_t py; + size_t width; + size_t height; +}; + +istream &operator>>(istream &in, Claim &claim) +{ + // reading into char in favor if in.ignore(), to automatically + // toss any present whitespace. + char at; + + cin >> at; //ignore '#' + in >> claim.id; + + in >> at; //ignore '@' + in >> claim.px; + cin >> at; //ignore ',' + in >> claim.py; + + in >> at; //ignore ':' + in >> claim.width; + in >> at; //ignore 'x' + in >> claim.height; + + return in; +} + +void layout_claim(vector> &canvas, Claim const &claim) +{ + size_t end_x = claim.px + claim.width; + size_t end_y = claim.py + claim.height; + + for (size_t px = claim.px; px != end_x; ++px) + { + for (size_t py = claim.py; py != end_y; ++py) + ++canvas[px][py]; + } +} + +int main() +{ + size_t total_width = 0; + size_t total_height = 0; + vector claims; + vector> canvas; + + while (!cin.eof()) + { + Claim claim; + cin >> claim; + + total_width = max(total_width, claim.px + claim.width); + total_height = max(total_height, claim.py + claim.height); + + claims.push_back(claim); + } + + canvas.resize(total_width, vector(total_height, 0)); + for (Claim const &claim : claims) + layout_claim(canvas, claim); + + size_t overlap = 0; + for (size_t py = 0; py < total_height; ++py) + { + for (size_t px = 0; px < total_width; ++px) + { + if (canvas[px][py] > 1) + ++overlap; + } + } + + cout << "Overlap: " << overlap << "\n"; +} \ No newline at end of file diff --git a/advent_of_code_2018/day3/main2.cc b/advent_of_code_2018/day3/main2.cc new file mode 100644 index 0000000..149110e --- /dev/null +++ b/advent_of_code_2018/day3/main2.cc @@ -0,0 +1,105 @@ +#include +#include +#include + +using namespace std; + +struct Claim +{ + size_t id; + size_t px; + size_t py; + size_t width; + size_t height; +}; + +istream &operator>>(istream &in, Claim &claim) +{ + // reading into char in favor if in.ignore(), to automatically + // toss any present whitespace. + char at; + + cin >> at; //ignore '#' + in >> claim.id; + + in >> at; //ignore '@' + in >> claim.px; + cin >> at; //ignore ',' + in >> claim.py; + + in >> at; //ignore ':' + in >> claim.width; + in >> at; //ignore 'x' + in >> claim.height; + + return in; +} + +void layout_claim(vector> &canvas, Claim const &claim) +{ + size_t end_x = claim.px + claim.width; + size_t end_y = claim.py + claim.height; + + for (size_t px = claim.px; px != end_x; ++px) + { + for (size_t py = claim.py; py != end_y; ++py) + ++canvas[px][py]; + } +} + +bool overlaps(vector> &canvas, Claim const &claim) +{ + size_t end_x = claim.px + claim.width; + size_t end_y = claim.py + claim.height; + + for (size_t px = claim.px; px != end_x; ++px) + { + for (size_t py = claim.py; py != end_y; ++py) + { + if (canvas[px][py] != 1) + return true; + } + } + + return false; +} + +int main() +{ + size_t total_width = 0; + size_t total_height = 0; + vector claims; + vector> canvas; + + while (!cin.eof()) + { + Claim claim; + cin >> claim; + + total_width = max(total_width, claim.px + claim.width); + total_height = max(total_height, claim.py + claim.height); + + claims.push_back(claim); + } + + canvas.resize(total_width, vector(total_height, 0)); + for (Claim const &claim : claims) + layout_claim(canvas, claim); + + size_t overlap = 0; + for (size_t py = 0; py < total_height; ++py) + { + for (size_t px = 0; px < total_width; ++px) + { + if (canvas[px][py] > 1) + ++overlap; + } + } + + for (size_t idx = 0; idx != claims.size(); ++idx) + { + if (!overlaps(canvas, claims[idx])) + cout << "No overlap for " << idx << "\n"; + } + +} \ No newline at end of file diff --git a/advent_of_code_2018/day3/test.in b/advent_of_code_2018/day3/test.in new file mode 100644 index 0000000..98b5ae9 --- /dev/null +++ b/advent_of_code_2018/day3/test.in @@ -0,0 +1,3 @@ +#1 @ 1,3: 4x4 +#2 @ 3,1: 4x4 +#3 @ 5,5: 2x2 \ No newline at end of file diff --git a/advent_of_code_2018/day4/input.in b/advent_of_code_2018/day4/input.in new file mode 100644 index 0000000..c1add12 --- /dev/null +++ b/advent_of_code_2018/day4/input.in @@ -0,0 +1,1002 @@ +[1518-04-21 00:57] wakes up +[1518-09-03 00:12] falls asleep +[1518-04-21 00:04] Guard #3331 begins shift +[1518-10-29 00:51] falls asleep +[1518-06-12 00:02] Guard #3109 begins shift +[1518-06-01 00:46] wakes up +[1518-03-07 00:02] Guard #653 begins shift +[1518-10-06 00:00] Guard #2339 begins shift +[1518-05-20 00:47] wakes up +[1518-10-08 00:58] wakes up +[1518-04-19 00:57] wakes up +[1518-04-16 00:28] falls asleep +[1518-04-12 00:33] wakes up +[1518-04-21 00:19] falls asleep +[1518-08-04 00:52] wakes up +[1518-07-09 00:02] falls asleep +[1518-03-24 00:22] wakes up +[1518-11-19 00:28] falls asleep +[1518-09-18 00:38] falls asleep +[1518-07-28 00:00] Guard #3331 begins shift +[1518-09-18 00:39] wakes up +[1518-07-13 23:59] Guard #653 begins shift +[1518-05-15 00:16] wakes up +[1518-03-31 00:53] wakes up +[1518-05-06 23:46] Guard #2543 begins shift +[1518-04-09 00:28] falls asleep +[1518-04-12 00:23] falls asleep +[1518-05-18 00:50] wakes up +[1518-03-16 00:01] Guard #1117 begins shift +[1518-06-13 00:19] falls asleep +[1518-09-15 00:45] wakes up +[1518-03-23 00:58] wakes up +[1518-08-25 00:18] falls asleep +[1518-03-16 00:23] falls asleep +[1518-10-16 00:41] wakes up +[1518-11-09 00:37] wakes up +[1518-07-05 00:03] falls asleep +[1518-09-24 00:16] falls asleep +[1518-05-18 23:49] Guard #3079 begins shift +[1518-09-03 00:28] wakes up +[1518-03-12 00:47] falls asleep +[1518-09-01 00:47] wakes up +[1518-06-23 23:48] Guard #971 begins shift +[1518-03-27 00:34] wakes up +[1518-06-18 00:40] falls asleep +[1518-03-02 00:48] wakes up +[1518-04-11 00:48] wakes up +[1518-03-31 00:46] wakes up +[1518-08-07 00:57] wakes up +[1518-03-04 00:22] falls asleep +[1518-04-10 00:57] wakes up +[1518-05-16 00:00] Guard #2179 begins shift +[1518-06-06 00:14] wakes up +[1518-03-20 00:54] wakes up +[1518-08-01 00:55] wakes up +[1518-07-03 00:00] Guard #1069 begins shift +[1518-10-14 00:47] falls asleep +[1518-06-01 00:03] falls asleep +[1518-07-10 00:35] falls asleep +[1518-11-12 23:56] Guard #3461 begins shift +[1518-09-04 00:39] falls asleep +[1518-03-15 00:47] wakes up +[1518-04-10 00:30] wakes up +[1518-03-21 00:52] wakes up +[1518-05-09 00:03] Guard #1877 begins shift +[1518-09-29 00:45] wakes up +[1518-03-25 00:37] wakes up +[1518-10-11 00:57] wakes up +[1518-11-09 00:16] wakes up +[1518-08-10 00:18] falls asleep +[1518-06-24 00:30] falls asleep +[1518-08-01 00:54] falls asleep +[1518-08-14 00:12] falls asleep +[1518-10-21 00:46] wakes up +[1518-03-18 00:48] falls asleep +[1518-03-25 23:59] Guard #3331 begins shift +[1518-06-05 23:47] Guard #1117 begins shift +[1518-07-18 00:04] falls asleep +[1518-11-05 00:48] falls asleep +[1518-11-19 00:43] wakes up +[1518-04-16 00:39] wakes up +[1518-09-30 00:46] wakes up +[1518-10-31 00:01] Guard #3079 begins shift +[1518-07-13 00:11] falls asleep +[1518-07-05 00:47] wakes up +[1518-03-22 23:59] Guard #1877 begins shift +[1518-04-18 00:45] wakes up +[1518-08-15 00:49] falls asleep +[1518-04-03 23:57] Guard #2543 begins shift +[1518-07-08 00:29] falls asleep +[1518-06-21 00:41] wakes up +[1518-07-18 00:38] wakes up +[1518-04-29 00:20] wakes up +[1518-10-31 00:56] wakes up +[1518-08-05 00:26] wakes up +[1518-10-03 00:15] falls asleep +[1518-10-05 00:51] wakes up +[1518-04-19 00:43] falls asleep +[1518-10-18 00:30] falls asleep +[1518-10-03 00:04] Guard #2543 begins shift +[1518-03-15 00:40] falls asleep +[1518-06-15 00:16] falls asleep +[1518-06-11 00:00] Guard #1093 begins shift +[1518-05-13 00:00] Guard #919 begins shift +[1518-07-25 00:05] falls asleep +[1518-03-05 00:03] Guard #3079 begins shift +[1518-04-05 00:53] wakes up +[1518-06-16 23:56] Guard #727 begins shift +[1518-07-25 23:50] Guard #2339 begins shift +[1518-04-11 00:09] wakes up +[1518-11-14 00:27] falls asleep +[1518-10-28 00:57] wakes up +[1518-07-11 00:53] falls asleep +[1518-06-27 00:35] wakes up +[1518-10-23 23:47] Guard #3331 begins shift +[1518-11-10 00:36] falls asleep +[1518-08-13 00:46] wakes up +[1518-03-02 00:02] Guard #3079 begins shift +[1518-04-05 00:00] Guard #683 begins shift +[1518-10-17 00:28] wakes up +[1518-10-17 00:48] wakes up +[1518-06-25 00:18] wakes up +[1518-06-21 00:11] falls asleep +[1518-07-09 00:51] wakes up +[1518-03-28 00:45] wakes up +[1518-09-21 23:46] Guard #3079 begins shift +[1518-07-18 23:57] Guard #971 begins shift +[1518-03-22 00:29] falls asleep +[1518-06-24 00:49] wakes up +[1518-09-30 23:50] Guard #2179 begins shift +[1518-06-13 00:07] falls asleep +[1518-07-16 00:04] Guard #2179 begins shift +[1518-11-17 00:51] wakes up +[1518-04-28 00:29] falls asleep +[1518-11-11 00:54] wakes up +[1518-10-07 00:46] falls asleep +[1518-11-18 00:15] falls asleep +[1518-05-22 00:51] wakes up +[1518-03-22 00:54] falls asleep +[1518-10-29 00:04] Guard #1931 begins shift +[1518-10-22 00:21] falls asleep +[1518-07-26 00:02] falls asleep +[1518-03-27 00:54] wakes up +[1518-09-04 00:00] Guard #653 begins shift +[1518-06-24 00:05] falls asleep +[1518-10-15 00:53] wakes up +[1518-05-07 00:54] wakes up +[1518-07-30 23:59] Guard #2179 begins shift +[1518-05-07 00:37] falls asleep +[1518-05-09 00:07] falls asleep +[1518-07-03 00:47] wakes up +[1518-03-28 00:02] Guard #653 begins shift +[1518-08-11 00:19] falls asleep +[1518-05-19 23:59] Guard #2339 begins shift +[1518-10-21 00:56] wakes up +[1518-05-26 23:56] Guard #1117 begins shift +[1518-11-18 00:16] wakes up +[1518-10-11 00:24] wakes up +[1518-08-11 00:11] falls asleep +[1518-03-20 00:18] falls asleep +[1518-09-29 00:34] falls asleep +[1518-04-11 23:59] Guard #1069 begins shift +[1518-05-24 00:35] falls asleep +[1518-11-15 00:36] falls asleep +[1518-05-15 00:51] falls asleep +[1518-09-20 00:13] falls asleep +[1518-08-01 00:20] falls asleep +[1518-09-01 00:01] Guard #1877 begins shift +[1518-06-15 00:00] Guard #919 begins shift +[1518-08-09 00:00] Guard #2179 begins shift +[1518-03-12 00:11] falls asleep +[1518-04-23 00:01] Guard #3331 begins shift +[1518-03-23 00:43] falls asleep +[1518-03-14 00:00] falls asleep +[1518-10-29 00:52] wakes up +[1518-05-08 00:18] falls asleep +[1518-10-20 00:34] falls asleep +[1518-05-05 23:47] Guard #1093 begins shift +[1518-11-01 23:58] Guard #1409 begins shift +[1518-07-05 23:56] Guard #3319 begins shift +[1518-11-03 00:49] wakes up +[1518-09-12 00:59] wakes up +[1518-07-16 00:17] falls asleep +[1518-08-02 00:05] falls asleep +[1518-03-02 00:52] wakes up +[1518-03-04 00:46] wakes up +[1518-09-16 00:40] falls asleep +[1518-05-15 00:15] falls asleep +[1518-07-22 00:46] wakes up +[1518-05-05 00:16] falls asleep +[1518-03-10 23:53] Guard #3079 begins shift +[1518-03-14 00:42] wakes up +[1518-10-26 00:06] falls asleep +[1518-04-11 00:07] falls asleep +[1518-08-23 00:48] wakes up +[1518-05-06 00:49] wakes up +[1518-05-14 00:40] wakes up +[1518-06-02 23:51] Guard #1117 begins shift +[1518-03-09 00:53] wakes up +[1518-05-02 00:43] wakes up +[1518-08-06 00:01] Guard #2953 begins shift +[1518-03-01 00:54] wakes up +[1518-04-16 00:57] wakes up +[1518-09-08 00:02] Guard #727 begins shift +[1518-03-11 00:54] wakes up +[1518-03-30 00:17] falls asleep +[1518-11-22 00:53] falls asleep +[1518-11-07 00:41] wakes up +[1518-03-24 00:41] wakes up +[1518-03-10 00:47] wakes up +[1518-04-18 23:58] Guard #919 begins shift +[1518-08-01 00:51] wakes up +[1518-10-09 00:28] falls asleep +[1518-06-17 00:20] falls asleep +[1518-10-23 00:49] wakes up +[1518-07-14 00:18] falls asleep +[1518-08-31 00:20] falls asleep +[1518-06-11 00:56] falls asleep +[1518-10-22 00:00] Guard #3079 begins shift +[1518-06-08 00:24] wakes up +[1518-09-30 00:51] falls asleep +[1518-10-19 00:08] falls asleep +[1518-04-05 00:32] wakes up +[1518-05-13 00:46] wakes up +[1518-09-17 00:52] wakes up +[1518-04-17 00:50] wakes up +[1518-11-15 00:00] Guard #1877 begins shift +[1518-06-22 00:59] wakes up +[1518-07-25 00:46] wakes up +[1518-04-30 23:48] Guard #1877 begins shift +[1518-09-12 00:03] Guard #1069 begins shift +[1518-09-21 00:54] wakes up +[1518-07-10 00:56] wakes up +[1518-03-08 00:30] wakes up +[1518-07-13 00:52] wakes up +[1518-05-23 00:44] wakes up +[1518-10-28 00:51] falls asleep +[1518-06-25 00:03] Guard #919 begins shift +[1518-10-29 00:31] wakes up +[1518-10-10 00:25] wakes up +[1518-05-23 00:58] wakes up +[1518-05-14 00:52] falls asleep +[1518-10-04 00:55] falls asleep +[1518-09-20 23:56] Guard #3319 begins shift +[1518-03-17 23:50] Guard #1093 begins shift +[1518-03-08 00:52] falls asleep +[1518-06-26 00:33] falls asleep +[1518-05-30 00:58] wakes up +[1518-05-27 23:56] Guard #3461 begins shift +[1518-05-31 00:58] wakes up +[1518-11-11 23:56] Guard #3301 begins shift +[1518-03-11 00:15] wakes up +[1518-09-14 00:58] wakes up +[1518-10-15 00:21] falls asleep +[1518-11-06 00:06] falls asleep +[1518-10-28 00:00] Guard #1877 begins shift +[1518-08-18 00:54] falls asleep +[1518-04-07 00:49] falls asleep +[1518-06-27 00:46] falls asleep +[1518-04-14 00:53] falls asleep +[1518-03-11 00:41] falls asleep +[1518-07-08 00:39] wakes up +[1518-10-04 00:03] Guard #2179 begins shift +[1518-04-06 00:57] wakes up +[1518-09-03 00:36] falls asleep +[1518-06-12 00:24] falls asleep +[1518-08-11 23:58] Guard #727 begins shift +[1518-03-18 23:59] Guard #641 begins shift +[1518-11-09 00:01] Guard #2179 begins shift +[1518-05-31 00:52] falls asleep +[1518-05-24 00:57] wakes up +[1518-05-12 00:40] falls asleep +[1518-08-24 23:59] Guard #1931 begins shift +[1518-10-15 00:03] Guard #3319 begins shift +[1518-05-04 00:21] falls asleep +[1518-10-09 00:00] Guard #1069 begins shift +[1518-09-13 00:31] falls asleep +[1518-08-25 00:35] wakes up +[1518-04-20 00:17] falls asleep +[1518-06-10 00:56] wakes up +[1518-06-05 00:37] falls asleep +[1518-10-20 23:56] Guard #1931 begins shift +[1518-09-14 23:59] Guard #2179 begins shift +[1518-10-14 00:32] wakes up +[1518-04-11 00:03] Guard #2953 begins shift +[1518-03-24 00:00] Guard #3461 begins shift +[1518-03-08 00:47] wakes up +[1518-11-19 00:07] falls asleep +[1518-07-19 00:38] falls asleep +[1518-08-22 00:40] wakes up +[1518-06-07 00:04] falls asleep +[1518-04-07 00:59] wakes up +[1518-05-24 00:44] wakes up +[1518-08-08 00:02] falls asleep +[1518-09-20 00:37] wakes up +[1518-08-03 00:35] falls asleep +[1518-03-13 23:47] Guard #3461 begins shift +[1518-06-17 00:50] wakes up +[1518-08-24 00:51] wakes up +[1518-06-02 00:26] wakes up +[1518-06-16 00:41] falls asleep +[1518-08-11 00:42] falls asleep +[1518-07-22 00:41] falls asleep +[1518-11-07 00:58] wakes up +[1518-05-08 00:03] Guard #683 begins shift +[1518-05-13 00:08] falls asleep +[1518-05-25 00:55] wakes up +[1518-11-18 00:44] wakes up +[1518-06-30 00:32] wakes up +[1518-08-07 00:40] wakes up +[1518-07-13 00:00] Guard #3079 begins shift +[1518-04-01 00:40] wakes up +[1518-03-03 23:58] Guard #3319 begins shift +[1518-09-23 00:35] wakes up +[1518-08-28 00:57] wakes up +[1518-04-15 00:52] falls asleep +[1518-05-27 00:14] falls asleep +[1518-11-07 00:13] falls asleep +[1518-03-14 23:57] Guard #3109 begins shift +[1518-10-30 00:54] wakes up +[1518-10-30 00:00] Guard #727 begins shift +[1518-08-20 00:22] falls asleep +[1518-04-01 00:04] falls asleep +[1518-03-12 00:54] wakes up +[1518-03-07 00:44] wakes up +[1518-09-26 00:39] wakes up +[1518-03-06 00:49] wakes up +[1518-10-29 00:14] falls asleep +[1518-08-25 00:28] falls asleep +[1518-09-25 00:32] falls asleep +[1518-06-06 23:47] Guard #2339 begins shift +[1518-09-19 00:34] wakes up +[1518-08-16 00:50] wakes up +[1518-10-07 00:28] wakes up +[1518-11-17 00:21] falls asleep +[1518-07-28 00:14] falls asleep +[1518-09-13 00:50] falls asleep +[1518-09-14 00:26] falls asleep +[1518-09-18 23:56] Guard #919 begins shift +[1518-03-03 00:35] falls asleep +[1518-08-31 00:03] Guard #1093 begins shift +[1518-10-19 00:00] Guard #2339 begins shift +[1518-09-28 23:59] Guard #1877 begins shift +[1518-07-11 23:58] Guard #2179 begins shift +[1518-06-19 00:56] falls asleep +[1518-10-22 00:45] wakes up +[1518-09-02 00:49] falls asleep +[1518-04-08 00:48] falls asleep +[1518-07-19 00:58] wakes up +[1518-03-07 00:36] falls asleep +[1518-05-26 00:00] Guard #919 begins shift +[1518-03-15 00:53] falls asleep +[1518-03-02 23:58] Guard #653 begins shift +[1518-07-20 00:55] wakes up +[1518-08-28 00:48] falls asleep +[1518-05-21 00:10] wakes up +[1518-08-25 23:49] Guard #1931 begins shift +[1518-03-26 23:46] Guard #1877 begins shift +[1518-08-19 00:25] falls asleep +[1518-04-22 00:03] Guard #1277 begins shift +[1518-09-08 00:54] falls asleep +[1518-04-05 00:18] falls asleep +[1518-09-14 00:46] wakes up +[1518-08-03 00:47] wakes up +[1518-07-04 00:47] wakes up +[1518-11-11 00:21] falls asleep +[1518-09-05 00:42] falls asleep +[1518-08-16 00:41] falls asleep +[1518-05-06 00:34] falls asleep +[1518-08-12 00:54] wakes up +[1518-07-20 00:15] falls asleep +[1518-09-30 00:04] Guard #3079 begins shift +[1518-10-27 00:02] falls asleep +[1518-11-09 23:56] Guard #3109 begins shift +[1518-04-14 23:56] Guard #2953 begins shift +[1518-08-28 23:48] Guard #1877 begins shift +[1518-03-16 00:38] wakes up +[1518-10-01 00:39] wakes up +[1518-08-02 23:57] Guard #971 begins shift +[1518-04-20 00:20] wakes up +[1518-08-27 00:04] Guard #3301 begins shift +[1518-03-26 00:45] wakes up +[1518-09-16 00:57] wakes up +[1518-06-02 00:51] wakes up +[1518-06-19 00:59] wakes up +[1518-09-09 00:50] wakes up +[1518-05-02 00:14] falls asleep +[1518-04-10 00:50] falls asleep +[1518-09-08 00:51] wakes up +[1518-05-02 23:58] Guard #727 begins shift +[1518-05-14 00:04] Guard #919 begins shift +[1518-08-24 00:24] falls asleep +[1518-04-13 00:18] wakes up +[1518-04-10 00:45] wakes up +[1518-08-08 00:42] falls asleep +[1518-03-26 00:27] falls asleep +[1518-04-04 00:50] falls asleep +[1518-10-01 00:03] falls asleep +[1518-05-23 00:39] falls asleep +[1518-08-25 00:59] wakes up +[1518-04-27 23:57] Guard #1117 begins shift +[1518-10-04 00:39] wakes up +[1518-08-25 00:40] falls asleep +[1518-07-17 00:40] wakes up +[1518-11-03 00:01] Guard #919 begins shift +[1518-04-02 00:27] falls asleep +[1518-09-10 00:19] falls asleep +[1518-06-23 00:36] falls asleep +[1518-09-25 00:00] Guard #1931 begins shift +[1518-09-25 00:18] wakes up +[1518-08-12 00:47] falls asleep +[1518-04-23 00:56] wakes up +[1518-08-26 00:27] wakes up +[1518-11-16 00:29] wakes up +[1518-03-18 00:41] wakes up +[1518-06-18 00:00] Guard #2953 begins shift +[1518-11-13 00:49] wakes up +[1518-04-30 00:56] wakes up +[1518-03-28 23:57] Guard #2953 begins shift +[1518-04-06 23:59] Guard #3319 begins shift +[1518-08-14 00:59] wakes up +[1518-11-19 23:48] Guard #971 begins shift +[1518-04-10 00:43] falls asleep +[1518-06-24 00:23] wakes up +[1518-10-31 00:53] falls asleep +[1518-11-04 00:54] falls asleep +[1518-08-12 00:43] wakes up +[1518-03-13 00:52] falls asleep +[1518-07-08 23:48] Guard #3461 begins shift +[1518-11-05 00:57] wakes up +[1518-05-14 00:33] wakes up +[1518-07-24 00:58] wakes up +[1518-03-03 00:55] wakes up +[1518-05-21 00:45] falls asleep +[1518-03-12 23:58] Guard #3109 begins shift +[1518-06-27 00:07] falls asleep +[1518-10-17 00:46] falls asleep +[1518-07-21 00:55] wakes up +[1518-08-06 00:57] wakes up +[1518-09-23 00:02] falls asleep +[1518-07-14 23:58] Guard #2339 begins shift +[1518-08-07 00:00] Guard #3109 begins shift +[1518-03-14 00:19] falls asleep +[1518-11-21 00:28] falls asleep +[1518-08-21 00:55] wakes up +[1518-11-21 00:04] Guard #1931 begins shift +[1518-04-09 23:57] Guard #3079 begins shift +[1518-06-05 00:04] Guard #727 begins shift +[1518-07-19 00:39] wakes up +[1518-10-11 00:29] falls asleep +[1518-05-09 00:22] wakes up +[1518-11-01 00:57] wakes up +[1518-03-17 00:02] falls asleep +[1518-08-29 00:43] falls asleep +[1518-06-07 00:06] wakes up +[1518-07-02 00:53] falls asleep +[1518-08-06 00:54] falls asleep +[1518-10-25 00:50] falls asleep +[1518-03-13 00:42] wakes up +[1518-04-15 23:57] Guard #2953 begins shift +[1518-05-21 23:50] Guard #971 begins shift +[1518-08-26 00:04] falls asleep +[1518-09-18 00:01] Guard #1877 begins shift +[1518-04-13 23:57] Guard #683 begins shift +[1518-06-27 23:59] Guard #2953 begins shift +[1518-04-25 23:56] Guard #653 begins shift +[1518-05-28 00:07] falls asleep +[1518-06-14 00:56] wakes up +[1518-09-30 00:28] falls asleep +[1518-05-05 00:26] wakes up +[1518-05-24 00:54] falls asleep +[1518-11-16 00:05] falls asleep +[1518-07-15 00:55] wakes up +[1518-11-04 00:02] Guard #3319 begins shift +[1518-04-24 00:38] wakes up +[1518-08-08 00:39] wakes up +[1518-08-09 00:54] wakes up +[1518-10-14 00:31] falls asleep +[1518-07-12 00:44] falls asleep +[1518-10-26 00:03] Guard #2953 begins shift +[1518-05-03 23:56] Guard #641 begins shift +[1518-09-03 00:04] Guard #1069 begins shift +[1518-06-08 00:36] wakes up +[1518-11-22 00:58] wakes up +[1518-04-06 00:18] falls asleep +[1518-04-12 00:53] wakes up +[1518-04-04 00:52] wakes up +[1518-06-29 00:58] wakes up +[1518-04-19 00:36] wakes up +[1518-03-18 00:00] falls asleep +[1518-08-16 00:02] Guard #641 begins shift +[1518-09-01 00:52] wakes up +[1518-05-19 00:01] falls asleep +[1518-09-22 00:45] falls asleep +[1518-03-07 00:24] falls asleep +[1518-03-13 00:22] falls asleep +[1518-04-17 00:01] Guard #971 begins shift +[1518-04-08 00:53] wakes up +[1518-03-17 00:58] wakes up +[1518-06-11 00:16] falls asleep +[1518-06-07 23:54] Guard #3079 begins shift +[1518-11-10 23:56] Guard #3109 begins shift +[1518-07-21 00:53] falls asleep +[1518-05-20 00:52] wakes up +[1518-09-09 00:25] falls asleep +[1518-08-10 00:43] wakes up +[1518-04-17 23:59] Guard #1117 begins shift +[1518-08-07 00:55] falls asleep +[1518-05-24 00:02] Guard #3109 begins shift +[1518-08-18 00:46] wakes up +[1518-05-03 00:59] wakes up +[1518-05-20 00:50] falls asleep +[1518-10-13 00:02] falls asleep +[1518-06-02 00:43] falls asleep +[1518-05-30 00:27] falls asleep +[1518-04-19 23:57] Guard #653 begins shift +[1518-10-18 00:01] Guard #971 begins shift +[1518-04-03 00:03] Guard #3301 begins shift +[1518-11-01 00:17] falls asleep +[1518-07-27 00:49] wakes up +[1518-08-01 00:38] falls asleep +[1518-07-23 00:50] wakes up +[1518-11-10 00:44] wakes up +[1518-08-20 00:46] wakes up +[1518-10-21 00:40] falls asleep +[1518-04-09 00:48] wakes up +[1518-07-30 00:33] falls asleep +[1518-09-28 00:07] falls asleep +[1518-04-13 00:00] Guard #919 begins shift +[1518-08-19 00:57] wakes up +[1518-05-25 00:04] Guard #683 begins shift +[1518-09-14 00:04] Guard #3109 begins shift +[1518-06-28 00:58] wakes up +[1518-10-12 00:01] Guard #683 begins shift +[1518-08-11 00:34] wakes up +[1518-06-20 00:24] falls asleep +[1518-11-16 00:54] wakes up +[1518-08-02 00:43] wakes up +[1518-10-31 00:50] wakes up +[1518-03-16 00:50] wakes up +[1518-10-06 00:54] wakes up +[1518-07-17 00:20] falls asleep +[1518-03-19 00:29] wakes up +[1518-10-30 00:22] falls asleep +[1518-11-15 00:48] wakes up +[1518-08-15 00:12] falls asleep +[1518-10-06 00:41] falls asleep +[1518-05-01 00:04] falls asleep +[1518-03-31 00:15] falls asleep +[1518-08-09 23:58] Guard #1931 begins shift +[1518-06-04 00:30] falls asleep +[1518-05-22 00:08] wakes up +[1518-07-20 00:02] Guard #1877 begins shift +[1518-04-12 00:17] wakes up +[1518-08-31 00:26] wakes up +[1518-04-17 00:39] falls asleep +[1518-10-02 00:35] wakes up +[1518-07-23 00:11] falls asleep +[1518-09-26 23:58] Guard #2179 begins shift +[1518-06-06 00:39] falls asleep +[1518-08-25 00:22] wakes up +[1518-07-04 23:53] Guard #3109 begins shift +[1518-09-01 00:57] falls asleep +[1518-07-01 00:04] Guard #3301 begins shift +[1518-09-03 00:41] wakes up +[1518-09-09 23:57] Guard #971 begins shift +[1518-03-08 00:59] wakes up +[1518-09-11 00:58] wakes up +[1518-04-24 00:16] falls asleep +[1518-10-19 00:49] wakes up +[1518-10-23 00:55] falls asleep +[1518-10-27 00:10] wakes up +[1518-10-15 23:58] Guard #2953 begins shift +[1518-10-02 00:02] Guard #919 begins shift +[1518-10-23 00:56] wakes up +[1518-07-10 00:29] falls asleep +[1518-11-19 00:11] wakes up +[1518-11-07 00:27] wakes up +[1518-07-15 00:54] falls asleep +[1518-09-26 00:26] falls asleep +[1518-05-05 00:00] Guard #1931 begins shift +[1518-05-01 00:45] wakes up +[1518-10-30 00:46] wakes up +[1518-08-01 23:53] Guard #1093 begins shift +[1518-05-04 00:40] wakes up +[1518-09-04 00:43] wakes up +[1518-05-10 00:22] wakes up +[1518-07-29 00:24] falls asleep +[1518-07-21 23:56] Guard #1877 begins shift +[1518-03-09 23:46] Guard #727 begins shift +[1518-07-12 00:25] falls asleep +[1518-06-08 00:49] falls asleep +[1518-07-23 00:03] Guard #3079 begins shift +[1518-03-19 23:56] Guard #2339 begins shift +[1518-05-14 00:58] wakes up +[1518-11-03 00:47] falls asleep +[1518-09-26 00:01] Guard #3461 begins shift +[1518-07-20 00:46] falls asleep +[1518-06-03 00:12] wakes up +[1518-11-16 00:32] falls asleep +[1518-09-22 00:06] wakes up +[1518-06-16 00:49] wakes up +[1518-10-12 00:28] falls asleep +[1518-07-27 00:00] Guard #3461 begins shift +[1518-06-20 00:38] wakes up +[1518-11-18 00:32] falls asleep +[1518-03-27 00:02] falls asleep +[1518-05-10 23:50] Guard #1117 begins shift +[1518-07-27 00:43] falls asleep +[1518-03-27 00:43] falls asleep +[1518-03-23 00:56] falls asleep +[1518-06-03 00:02] falls asleep +[1518-04-29 23:56] Guard #3319 begins shift +[1518-11-04 00:57] wakes up +[1518-06-03 00:37] falls asleep +[1518-05-09 00:41] falls asleep +[1518-11-15 23:50] Guard #1069 begins shift +[1518-09-25 00:12] falls asleep +[1518-11-05 00:01] Guard #1117 begins shift +[1518-07-27 00:27] wakes up +[1518-10-18 00:34] wakes up +[1518-11-22 00:44] wakes up +[1518-08-09 00:13] falls asleep +[1518-10-07 00:01] Guard #1877 begins shift +[1518-11-03 00:52] falls asleep +[1518-05-29 00:00] Guard #1069 begins shift +[1518-10-21 00:51] falls asleep +[1518-10-08 00:25] falls asleep +[1518-07-03 23:57] Guard #2953 begins shift +[1518-07-15 00:45] wakes up +[1518-08-11 00:52] wakes up +[1518-08-14 00:00] Guard #641 begins shift +[1518-10-11 00:23] falls asleep +[1518-10-12 00:50] wakes up +[1518-06-13 00:46] wakes up +[1518-07-16 23:58] Guard #1069 begins shift +[1518-03-17 00:40] falls asleep +[1518-07-15 00:23] falls asleep +[1518-05-09 23:48] Guard #971 begins shift +[1518-11-21 23:56] Guard #727 begins shift +[1518-07-29 00:00] Guard #1093 begins shift +[1518-06-27 00:48] wakes up +[1518-11-05 00:36] wakes up +[1518-04-25 00:02] Guard #1117 begins shift +[1518-10-24 00:04] falls asleep +[1518-03-10 00:54] wakes up +[1518-05-11 00:05] falls asleep +[1518-04-18 00:10] falls asleep +[1518-07-06 00:22] falls asleep +[1518-04-26 00:55] wakes up +[1518-03-24 23:56] Guard #683 begins shift +[1518-07-12 00:56] wakes up +[1518-08-04 00:11] falls asleep +[1518-08-23 23:59] Guard #727 begins shift +[1518-08-04 00:01] Guard #2339 begins shift +[1518-07-24 00:06] falls asleep +[1518-05-20 00:20] falls asleep +[1518-08-15 00:57] wakes up +[1518-03-29 00:23] wakes up +[1518-06-01 23:56] Guard #2339 begins shift +[1518-09-27 23:56] Guard #971 begins shift +[1518-04-08 00:01] Guard #653 begins shift +[1518-05-23 00:50] falls asleep +[1518-04-04 00:36] falls asleep +[1518-06-23 00:48] wakes up +[1518-05-12 00:41] wakes up +[1518-10-12 23:48] Guard #727 begins shift +[1518-04-12 00:08] falls asleep +[1518-07-11 00:49] wakes up +[1518-03-13 00:57] wakes up +[1518-03-06 00:23] falls asleep +[1518-03-31 00:00] Guard #1093 begins shift +[1518-09-13 00:33] wakes up +[1518-09-01 00:50] falls asleep +[1518-07-07 23:57] Guard #683 begins shift +[1518-11-14 00:04] Guard #971 begins shift +[1518-06-08 23:58] Guard #3301 begins shift +[1518-10-22 23:49] Guard #3461 begins shift +[1518-07-18 00:43] falls asleep +[1518-06-30 00:16] falls asleep +[1518-10-02 00:21] falls asleep +[1518-06-13 00:08] wakes up +[1518-05-03 00:36] falls asleep +[1518-09-23 23:58] Guard #1931 begins shift +[1518-10-26 23:46] Guard #683 begins shift +[1518-10-03 00:47] wakes up +[1518-03-23 00:48] wakes up +[1518-03-22 00:44] wakes up +[1518-09-08 00:45] falls asleep +[1518-05-17 00:02] Guard #1409 begins shift +[1518-09-16 23:59] Guard #641 begins shift +[1518-06-06 00:41] wakes up +[1518-08-29 00:00] falls asleep +[1518-10-04 00:59] wakes up +[1518-03-05 00:52] wakes up +[1518-08-16 23:59] Guard #1117 begins shift +[1518-11-03 00:55] wakes up +[1518-06-10 00:32] falls asleep +[1518-08-22 23:59] Guard #2543 begins shift +[1518-10-26 00:47] wakes up +[1518-03-11 00:29] wakes up +[1518-03-09 00:08] falls asleep +[1518-08-07 23:50] Guard #971 begins shift +[1518-05-30 23:59] Guard #3319 begins shift +[1518-03-29 00:12] falls asleep +[1518-06-06 00:00] falls asleep +[1518-09-24 00:58] wakes up +[1518-08-16 00:23] falls asleep +[1518-03-15 00:55] wakes up +[1518-09-22 00:00] falls asleep +[1518-03-07 00:33] wakes up +[1518-06-11 00:29] wakes up +[1518-03-11 00:22] falls asleep +[1518-09-05 00:01] Guard #2179 begins shift +[1518-07-22 00:50] falls asleep +[1518-05-15 00:01] Guard #3109 begins shift +[1518-11-18 00:00] Guard #1069 begins shift +[1518-10-07 00:54] wakes up +[1518-09-07 00:00] Guard #2953 begins shift +[1518-05-31 23:46] Guard #1931 begins shift +[1518-08-27 23:58] Guard #1931 begins shift +[1518-09-17 00:50] falls asleep +[1518-07-17 23:52] Guard #1877 begins shift +[1518-03-09 00:00] Guard #653 begins shift +[1518-08-21 00:19] wakes up +[1518-07-24 23:49] Guard #641 begins shift +[1518-08-05 00:08] falls asleep +[1518-03-02 00:51] falls asleep +[1518-09-07 00:13] falls asleep +[1518-06-21 23:57] Guard #919 begins shift +[1518-06-11 00:59] wakes up +[1518-09-25 00:49] wakes up +[1518-05-28 00:41] wakes up +[1518-06-14 00:03] Guard #3109 begins shift +[1518-05-29 00:41] falls asleep +[1518-09-14 00:56] falls asleep +[1518-03-16 23:46] Guard #1117 begins shift +[1518-04-23 23:59] Guard #641 begins shift +[1518-09-05 00:58] wakes up +[1518-10-09 00:38] wakes up +[1518-07-10 00:02] Guard #3109 begins shift +[1518-09-13 00:52] wakes up +[1518-10-07 00:17] falls asleep +[1518-07-19 00:57] falls asleep +[1518-09-06 00:41] falls asleep +[1518-06-26 00:45] wakes up +[1518-08-19 00:03] Guard #653 begins shift +[1518-07-11 00:01] Guard #971 begins shift +[1518-11-20 00:01] falls asleep +[1518-08-30 00:03] falls asleep +[1518-11-22 00:43] falls asleep +[1518-06-08 00:00] falls asleep +[1518-04-19 00:19] falls asleep +[1518-06-23 00:00] Guard #2543 begins shift +[1518-03-18 00:52] wakes up +[1518-06-05 00:50] wakes up +[1518-05-22 00:29] falls asleep +[1518-10-17 00:06] falls asleep +[1518-06-20 00:03] Guard #2543 begins shift +[1518-08-10 23:57] Guard #3079 begins shift +[1518-06-12 00:45] falls asleep +[1518-08-17 00:30] falls asleep +[1518-08-16 00:37] wakes up +[1518-11-14 00:42] wakes up +[1518-03-19 00:19] falls asleep +[1518-08-18 00:37] falls asleep +[1518-08-11 00:12] wakes up +[1518-04-14 00:57] wakes up +[1518-05-09 00:42] wakes up +[1518-07-31 00:51] wakes up +[1518-05-08 00:40] wakes up +[1518-05-14 00:37] falls asleep +[1518-04-16 00:54] falls asleep +[1518-04-04 00:19] falls asleep +[1518-07-20 23:58] Guard #3109 begins shift +[1518-05-21 00:40] wakes up +[1518-05-21 00:16] falls asleep +[1518-10-06 00:25] falls asleep +[1518-05-10 00:05] falls asleep +[1518-05-29 00:44] wakes up +[1518-08-18 00:55] wakes up +[1518-06-18 23:58] Guard #683 begins shift +[1518-05-18 00:02] Guard #919 begins shift +[1518-06-28 23:57] Guard #683 begins shift +[1518-05-02 00:04] Guard #1877 begins shift +[1518-07-28 00:48] wakes up +[1518-11-07 00:52] falls asleep +[1518-06-22 00:30] falls asleep +[1518-05-06 00:19] wakes up +[1518-07-07 00:00] Guard #1277 begins shift +[1518-10-07 23:57] Guard #641 begins shift +[1518-07-02 00:54] wakes up +[1518-07-02 00:00] Guard #3331 begins shift +[1518-11-20 00:55] wakes up +[1518-06-16 00:03] Guard #1877 begins shift +[1518-08-21 00:09] falls asleep +[1518-09-28 00:50] wakes up +[1518-09-01 00:59] wakes up +[1518-11-23 00:53] wakes up +[1518-03-22 00:02] Guard #971 begins shift +[1518-10-24 00:58] wakes up +[1518-03-21 00:14] falls asleep +[1518-05-21 00:29] falls asleep +[1518-03-14 00:07] wakes up +[1518-02-28 23:56] Guard #971 begins shift +[1518-09-15 00:40] falls asleep +[1518-06-12 00:37] wakes up +[1518-07-18 00:51] wakes up +[1518-08-15 00:15] wakes up +[1518-11-17 00:04] Guard #641 begins shift +[1518-03-21 00:00] Guard #1877 begins shift +[1518-07-11 00:54] wakes up +[1518-11-09 00:21] falls asleep +[1518-08-29 00:32] wakes up +[1518-11-07 00:30] falls asleep +[1518-05-26 00:52] falls asleep +[1518-08-22 00:15] falls asleep +[1518-09-12 00:46] falls asleep +[1518-04-28 00:45] wakes up +[1518-07-26 00:52] wakes up +[1518-11-09 00:14] falls asleep +[1518-10-11 00:03] Guard #653 begins shift +[1518-06-02 00:20] falls asleep +[1518-05-20 23:47] Guard #727 begins shift +[1518-06-14 00:36] falls asleep +[1518-10-28 00:45] wakes up +[1518-03-28 00:16] falls asleep +[1518-04-25 00:53] wakes up +[1518-08-13 00:38] falls asleep +[1518-03-02 00:08] falls asleep +[1518-05-22 00:02] falls asleep +[1518-06-25 00:14] falls asleep +[1518-08-05 00:00] Guard #2953 begins shift +[1518-07-24 00:46] wakes up +[1518-10-10 00:14] falls asleep +[1518-04-15 00:59] wakes up +[1518-05-29 23:59] Guard #2179 begins shift +[1518-10-17 00:04] Guard #3079 begins shift +[1518-11-13 00:36] falls asleep +[1518-05-15 00:56] wakes up +[1518-05-25 00:53] falls asleep +[1518-04-06 00:00] Guard #919 begins shift +[1518-03-22 00:39] wakes up +[1518-10-28 00:40] falls asleep +[1518-09-22 00:56] wakes up +[1518-07-19 00:10] falls asleep +[1518-10-25 00:16] falls asleep +[1518-11-05 00:22] falls asleep +[1518-07-22 00:59] wakes up +[1518-08-07 00:30] falls asleep +[1518-10-05 00:36] falls asleep +[1518-03-05 00:42] falls asleep +[1518-08-23 00:23] falls asleep +[1518-03-22 00:55] wakes up +[1518-09-01 00:42] falls asleep +[1518-06-04 00:04] Guard #2179 begins shift +[1518-11-08 00:39] wakes up +[1518-04-11 00:31] falls asleep +[1518-05-12 00:03] Guard #3331 begins shift +[1518-03-31 00:49] falls asleep +[1518-07-12 00:29] wakes up +[1518-11-08 00:02] Guard #653 begins shift +[1518-03-08 00:03] Guard #727 begins shift +[1518-04-13 00:13] falls asleep +[1518-03-05 23:59] Guard #1069 begins shift +[1518-07-24 00:55] falls asleep +[1518-07-14 00:42] wakes up +[1518-05-16 00:13] falls asleep +[1518-04-25 00:26] falls asleep +[1518-10-09 23:59] Guard #641 begins shift +[1518-03-24 00:28] falls asleep +[1518-11-07 00:04] Guard #727 begins shift +[1518-06-12 00:54] wakes up +[1518-08-21 00:32] falls asleep +[1518-05-27 00:46] wakes up +[1518-06-10 00:01] Guard #683 begins shift +[1518-10-25 00:51] wakes up +[1518-10-24 23:58] Guard #3331 begins shift +[1518-03-31 23:50] Guard #2543 begins shift +[1518-04-10 00:26] falls asleep +[1518-11-21 00:58] wakes up +[1518-03-10 00:53] falls asleep +[1518-10-04 00:37] falls asleep +[1518-03-10 00:02] falls asleep +[1518-08-20 00:00] Guard #919 begins shift +[1518-08-29 00:45] wakes up +[1518-08-15 00:02] Guard #3319 begins shift +[1518-10-16 00:10] falls asleep +[1518-08-22 00:01] Guard #971 begins shift +[1518-07-11 00:06] falls asleep +[1518-10-04 23:58] Guard #919 begins shift +[1518-03-17 00:31] wakes up +[1518-09-11 00:04] Guard #1093 begins shift +[1518-05-18 00:22] falls asleep +[1518-10-14 00:57] wakes up +[1518-05-16 00:54] wakes up +[1518-03-01 00:15] falls asleep +[1518-06-15 00:42] wakes up +[1518-10-25 00:45] wakes up +[1518-10-19 23:58] Guard #971 begins shift +[1518-06-04 00:47] wakes up +[1518-05-21 00:46] wakes up +[1518-07-29 00:53] wakes up +[1518-07-03 00:20] falls asleep +[1518-05-07 00:34] wakes up +[1518-08-01 00:00] Guard #1093 begins shift +[1518-09-02 00:56] wakes up +[1518-07-06 00:38] wakes up +[1518-04-23 00:18] falls asleep +[1518-04-30 00:11] falls asleep +[1518-03-29 23:59] Guard #3461 begins shift +[1518-07-16 00:47] wakes up +[1518-06-27 00:04] Guard #1931 begins shift +[1518-08-29 23:50] Guard #3319 begins shift +[1518-11-22 23:51] Guard #3331 begins shift +[1518-06-29 00:39] falls asleep +[1518-03-08 00:12] falls asleep +[1518-06-26 00:04] Guard #653 begins shift +[1518-09-30 00:54] wakes up +[1518-07-27 00:06] falls asleep +[1518-06-29 23:57] Guard #641 begins shift +[1518-06-08 00:33] falls asleep +[1518-08-12 00:32] falls asleep +[1518-06-03 00:56] wakes up +[1518-09-07 00:40] wakes up +[1518-05-11 00:44] wakes up +[1518-11-01 00:02] Guard #1093 begins shift +[1518-09-19 23:56] Guard #919 begins shift +[1518-03-25 00:30] falls asleep +[1518-07-20 00:16] wakes up +[1518-04-26 00:54] falls asleep +[1518-08-01 00:22] wakes up +[1518-05-21 00:00] falls asleep +[1518-04-02 00:46] wakes up +[1518-11-05 23:57] Guard #919 begins shift +[1518-10-14 00:04] Guard #3109 begins shift +[1518-05-07 00:03] falls asleep +[1518-08-17 00:47] wakes up +[1518-09-19 00:08] falls asleep +[1518-03-11 00:00] falls asleep +[1518-09-22 23:52] Guard #2179 begins shift +[1518-10-13 00:36] wakes up +[1518-08-08 00:45] wakes up +[1518-03-08 00:36] falls asleep +[1518-05-06 00:03] falls asleep +[1518-07-24 00:00] Guard #3461 begins shift +[1518-05-14 00:24] falls asleep +[1518-04-04 00:42] wakes up +[1518-09-02 00:00] Guard #653 begins shift +[1518-03-16 00:46] falls asleep +[1518-08-18 00:03] Guard #727 begins shift +[1518-03-12 00:42] wakes up +[1518-04-29 00:03] Guard #1069 begins shift +[1518-05-19 00:50] wakes up +[1518-09-27 00:13] falls asleep +[1518-11-08 00:26] falls asleep +[1518-04-09 00:02] Guard #1877 begins shift +[1518-10-23 00:01] falls asleep +[1518-08-30 00:49] wakes up +[1518-09-13 00:00] Guard #1093 begins shift +[1518-04-26 23:56] Guard #1277 begins shift +[1518-11-19 00:04] Guard #3461 begins shift +[1518-07-30 00:01] Guard #919 begins shift +[1518-04-12 00:38] falls asleep +[1518-07-19 00:34] wakes up +[1518-05-23 00:03] Guard #1877 begins shift +[1518-10-06 00:36] wakes up +[1518-09-27 00:37] wakes up +[1518-03-22 00:43] falls asleep +[1518-11-06 00:45] wakes up +[1518-06-08 00:53] wakes up +[1518-05-21 00:25] wakes up +[1518-11-23 00:00] falls asleep +[1518-09-09 00:01] Guard #1093 begins shift +[1518-07-30 00:48] wakes up +[1518-09-05 23:59] Guard #3461 begins shift +[1518-07-10 00:32] wakes up +[1518-04-05 00:36] falls asleep +[1518-10-30 00:49] falls asleep +[1518-09-21 00:18] falls asleep +[1518-04-29 00:10] falls asleep +[1518-09-08 00:57] wakes up +[1518-03-30 00:59] wakes up +[1518-06-28 00:48] falls asleep +[1518-10-31 00:48] falls asleep +[1518-03-12 00:00] Guard #3079 begins shift +[1518-04-01 23:58] Guard #971 begins shift +[1518-05-26 00:55] wakes up +[1518-09-16 00:02] Guard #919 begins shift +[1518-09-10 00:29] wakes up +[1518-07-31 00:47] falls asleep +[1518-06-12 23:58] Guard #1877 begins shift +[1518-03-24 00:07] falls asleep +[1518-07-04 00:08] falls asleep +[1518-06-18 00:57] wakes up +[1518-06-21 00:02] Guard #919 begins shift +[1518-08-21 00:00] Guard #3461 begins shift +[1518-04-04 00:32] wakes up +[1518-09-11 00:13] falls asleep +[1518-10-20 00:47] wakes up +[1518-08-12 23:58] Guard #653 begins shift +[1518-09-06 00:56] wakes up \ No newline at end of file diff --git a/advent_of_code_2018/day4/main1.cc b/advent_of_code_2018/day4/main1.cc new file mode 100644 index 0000000..fe7d383 --- /dev/null +++ b/advent_of_code_2018/day4/main1.cc @@ -0,0 +1,159 @@ +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +struct Event +{ + tm time; + string event; +}; + +istream &operator>>(istream &in, Event &event) +{ + char toss; + + in >> toss; // toss '[' + in >> event.time.tm_year; + event.time.tm_year -= 1900; + in >> toss; // toss '-' + in >> event.time.tm_mon; + in >> toss; // toss '-' + in >> event.time.tm_mday; + + in >> event.time.tm_hour; + in >> toss; // toss ':' + in >> event.time.tm_min; + in >> toss; // toss ']' + + getline(cin, event.event); + return in; +} + +ostream &operator<<(ostream &out, Event const &event) +{ + out << "Event: \n"; + out << " " << put_time(&event.time, "%c") << "\n"; + out << " - " << event.event << "\n"; + return out; +} + +int main() +{ + vector events; + map guards; + + cout << setfill(' '); + + while(!cin.eof()) + { + Event event{}; + cin >> event; + events.push_back(event); + } + + std::sort(events.begin(), events.end(), + [](Event &lhs, Event &rhs) + { + time_t l_time = mktime(&lhs.time); + time_t r_time = mktime(&rhs.time); + + return l_time < r_time; + }); + + int current_id; + for (Event const &event : events) + { + size_t numstart = event.event.find("#"); + if (numstart != string::npos) + { + size_t end = event.event.find(" ", numstart); + current_id = stoi(event.event.substr(numstart + 1, end - numstart - 1)); + } + + else if (event.event.find("asleep") != string::npos) + { + for (size_t idx = event.time.tm_min; idx != 60; ++idx) + ++guards[current_id][idx]; + } + + else if (event.event.find("wakes") != string::npos) + { + for (size_t idx = event.time.tm_min; idx != 60; ++idx) + --guards[current_id][idx]; + } + } + + size_t max_id = 0; + size_t sleeper = 0; + + // cout << " Guard ID Minute\n"; + // cout << " 1 2 3 4 5\n"; + // cout << " 012345678901234567890123456789012345678901234567890123456789\n"; + cout << " "; + for (size_t idx = 0; idx != 60; ++idx) + cout << setw(3) << idx; + cout << " | total\n"; + + for (auto const &[id, sleep] : guards) + { + cout << "Guard " << setw(5) << id << ": "; + size_t total = 0; + + for (int num : sleep) + { + cout << setw(3) << num; + total += num; + } + cout << " | " << total << "\n"; + + + if (total > sleeper) + { + max_id = id; + sleeper = total; + } + } + + cout << "Max sleeper: " << max_id << "\n"; + + size_t min_id = 0; + sleeper = 0; + for (size_t idx = 0; idx != 60; ++idx) + { + if (guards[max_id][idx] > sleeper) + { + sleeper = guards[max_id][idx]; + min_id = idx; + } + } + + cout << "Slept most in minute " << min_id << ", for " << sleeper << " minutes.\n"; + + sleeper = 0; + min_id = 0; + size_t minute = 0; + + for (auto const &[id, sleep] : guards) + { + for (size_t idx = 0; idx != 60; ++idx) + { + if (sleep[idx] >= sleeper) + { + sleeper = sleep[idx]; + min_id = id; + minute = idx; + } + } + } + + cout << "Guard " << min_id << " is most frequently asleep on minute "; + cout << minute << "\n"; + cout << sleeper * minute << "\n"; + +} \ No newline at end of file diff --git a/advent_of_code_2018/day4/test.in b/advent_of_code_2018/day4/test.in new file mode 100644 index 0000000..62c3a7a --- /dev/null +++ b/advent_of_code_2018/day4/test.in @@ -0,0 +1,17 @@ +[1518-11-01 00:00] Guard #10 begins shift +[1518-11-01 00:05] falls asleep +[1518-11-01 00:25] wakes up +[1518-11-01 00:30] falls asleep +[1518-11-01 00:55] wakes up +[1518-11-01 23:58] Guard #99 begins shift +[1518-11-02 00:40] falls asleep +[1518-11-02 00:50] wakes up +[1518-11-03 00:05] Guard #10 begins shift +[1518-11-03 00:24] falls asleep +[1518-11-03 00:29] wakes up +[1518-11-04 00:02] Guard #99 begins shift +[1518-11-04 00:36] falls asleep +[1518-11-04 00:46] wakes up +[1518-11-05 00:03] Guard #99 begins shift +[1518-11-05 00:45] falls asleep +[1518-11-05 00:55] wakes up \ No newline at end of file diff --git a/advent_of_code_2018/day5/input.in b/advent_of_code_2018/day5/input.in new file mode 100644 index 0000000..855e4f2 --- /dev/null +++ b/advent_of_code_2018/day5/input.in @@ -0,0 +1 @@ +eEecClfFpgqQGPXxLEhHxXTbBeEcYYynNvVyCHhTtqQtrdDTAatyYynNYkiIKUwWuWhHiIzZKkwHhRkjJKSsJjNnowSsWCcOzZbeEBSspAamMPJLlTGgCcCZzcnCcNKkbBXxTtFZzflnNIPsmMSGgpiIiLyYbBbFwWfMmnNeEDdzZpNnUuPlLzZBTmMtGgqGgQYYyydDEUuQqJjeKkKaAHhkbRBbrVpPFvVfqdDQvxXRrBRrIPpiGaAgUuPAapMFHhfmnNbnNVvodDZzOdDzZBVvwCcFfFfJjqQYyGSoHhfFOsgWSRrcYemMEYyyPplLCsvVsSOSsRroFfwWBtTbOonNGgTkKtNbrRoicOOLlooCItTOBmMZzyYrRDdFfNwGgWnjJxXLlLiIHhluUAaFMmPkKpkKEeDdfsSQqqQiITtDnEeqQNxXqQEJjHhJjehHVvWuUwZzMmdbBDgGIsSYyZzUvAUuaSshnjJNHkKSROZzoYyRrxXrsZzVVvKNnkuQRrPpEeqJRrjbBJZzjpSsrbBRjJuUvVTtvgGZzVpPGgBbBbDdjJyDdMIimMOtAaToqaAQCcmVvYLlzHdPpaAbBDzZTtPpxDiZzICkhHjJKcdZPpzwWCcUuiWwXxXxSsoOlLKkSsVvIiIiIXXdiIDrRfFUuCCccxWwXocTtfEespPSmMPpLlFGgrRCbEeBSDdAaRrkyYWwKxXRrYSLlsZzZzDxXdHqQEDdfFyYxXEeeUuOTtRrKkoFyfFYexXEmMfuUhmMgGaQqwMmWmWfFwlmMLGuUgpPcHhHhCLeLlMKkmECcflLCcFmMlVvqbBQfvVdCcDFNeEzZzZmMrLxXleERYyBbiIIiPpsXxSnNAmMaiIaAfFmGgZzIiWwMnTPpVvheYyuaAUMmEHdDfFtvWwtTVaPRQqvVVHhvMmrjHhJHhreEVvRDQqdYyhHTtFfxXpeEpfFiIgPpGklLQwWqHFfHhqHNnhQhKivVIrRmMPpAlLGSsXxgcCeEwWDdaDnNdEeqQpRrPAWpPwlLXxqQIaAiyYakKMmpPkKBbmMWwoOketTEnNvVRNPcCcCpHhUuQFfqnCpFfrRxaAaAwSCcsvVWEeyQqYFfaAAOoeOiIoQqEeEfBPpbAaFbufFUPpBHzYykKZcCmMbiIFfBhduUAaHAaRryYvVhDKkplLCVvLlcjJPOoRgeEhHGGgQqglLdOovVqQDSQqsSsvVWwJsSTKQqktuFfEeEeKkUvXxLlVhHoODdKgwKlLkWEeGJjcCkrRvVjVcCGgEoOTtBbesMmSBmVpPvhHMxXmmMmMaAFrRVbBvNXxnAaCZvQqVWWwwzCWDdIikKwcpPfFctNnTLRrlRDdKVDdvXxkhHIMEeYuSHhsUymiqXshifFHhiIOomzZMIwWRriEpPWiIhHwWwuUAaYyYyzZtMmTnNUueICIiSsSmMsiDdIcmbDSsdBAalUvVGgstTSRrjJSsiIuFbtTBjJfHGgkKhYyMOomLXxmPTtfFTtqMmMzHhZmQpiInQqfFdDHhmNCcnltToOMmLlkrQUuqnNgiIGRqQTtKyviIVYouUOPpbBkKbzZlLdDtsSjJWwGgdGgWbBwDTssBYybjJSaiIxXJsSjuCcxjJXQtQqdnNDTdDgJjKkhNapPAnHveEsrRIkKifnNFEjJeOoSOoUdDxXumejmMJEvVUuMMmNtTNmMnnrRxSZzbFkKmMCCccfqQVvBpPDdeEWwvVTtOoHhwaABacFbBfCiIAqVvQNnbZzsTtBAFfrRcVvCEEeVvelLabeErRkKxXPpSmMQUwWTkKtPwWpEXxeCuUKksSGMNnmgcCcBbhDLldDdrRdDDaAdHgZzGunNOYyvVIHhitMmTMHhmJxXjJjJjQVvZYyzqiIoeEdDfbhHxXBkKEaAuUfFehHSXxTtsFMmPpXxdDGKkgCEecyGKkFfjBbwWJQqRrQqgMpDZzdPOeEomgpPzZugGkKpPUGGgiIBbmRrPpbBBTlYykKYytTLOjHhiIcCJgGoipPIkKoOGgbBrRgtTlQqLyKkYJIijGtbPPppLlBnXGgxpPWwrpPRNxAMmAoOaaoOLlxXPpicCuUICvVHlLhcUAauXZeEySsYfvVFyYYySsXxZkKhHzFfTtVvnNLlwWPgGpzwWRFCcqQfuiIUAlLHCcBbhHhXNnxahOovVNaQqAPpnoOPpzaAZvLlVVvJjHFmMfNcCRQqqAaQriIPrGVdDUuJNnjvqQwWzZehHbsuUSBEtTZzhHYJjHhyKkHIDdihaArsSRCcCtVvTkNnJjiIKcOlLEeoIuUicXnNXxxCbjJETzZteJjARrasSdDuUGgrbBRmiICcMBMmPpCcdDwaAxXsIizyDmuNncCwjxXJWjCIicJhHczsSGgBbZBbfEeFCxXHhzSsZSsnNUunNTtxXIiSmMxskKSXwWwPIipikVxXxXUuSsodDMtZzVvUuTmDHrRhbBdOUuztEJjeTWtTwZBbzvVcmMqQyPpnNYwWAaCDdbBZWwiIJjvLEedDBblmrRMuzLlLZzlbBWwZLlUoOYrRyCcRgGrsSmMXxKmpPZxXzMsSwlLWWwETtegwWEewWyYGaAzrRvVPpGsSdDrVvRBuUKkbgkiIPSsSeElLsyYpKboOtTteETtTAzXjJxysSSsHsSZzhbBGgsiISTfFjuURQpPqrJjtsSfFWwTLlzoztTbBZOgGXxgGnNkKZKpPXxTtkKsSbBjhHJiIUuLlUuLlAuUSsEeEeXxazZsSaUurRbSsBGUugSgNnRrzBgGpPHWwfFhbZGFJjumMYyUvVfVkZEezKNBbZznjJfFfFiIvwQqWwWBbKktjJTrHhgGKkYyWwRjJsWwcCcbBTtUYyXxuGgoJjrROCxXAgbwWBGbBrRyOoYhwWjJHyGgYEhHecCaRaArfFHAaejJElLGGMmVvCgGcKkgOMmoCcAaKkrRgPpkKYyDddDgGhRrnNHKvVkBbURrpPZzRrWwoOuviITwJjLloOEIieyYDdUuxXzZfkVvZtTVzZvFfznNsSFGgfZNnxXzDdCcWwYhHmgGMvVPpmnNnZzyYNWwhLlcCHKoOuUJjEWwiIeoOZaKkAxGgbQqBHhPrRpXzlLDGgNtTnzZdlLrRNnfVqpjJeKkEgTOXxoriIsScCRXoOxtPGgxfFXKkpTrRtapPSsNnqQhHAHOoTtBqQbhMkhyYbGgBfjlLFIOhHoifJbnNBeEUqoOQPbSNnsBeEsSkKdbLlBBbDNnbTtZmMDdCZzDdAaxXmMcwkKTtSUuXwWrRxiIZzAkKauUtYyTzNniIhHEeZSsxXAasPnNVkmMXxAaHhkSsKGxXPTtpghHKiIcCEeQqPpmMyUuPpYvVqQdAaDiIhiRrRrZzIHPpyCcsSSbBFfsiIYrUmdDnTtvhHUuYdtTDrRbByVwWomAlLaMOAaBNnleELUVpPkKvIfFQizWwNnuVvsSvpPoOtTVzIbGgBIUBbuixwCcWKDdkXDdbBbNJPpbjJnbXxOosSBKkNQqJjNnaMmNnAKRrkrRmMXxvBRrbjJgnqQYyNSsUOkKhHoAanNkjJKYySLlDdNAanPrRpQqfFrRvVeEIiUOovVugGGgsSpPfFxjJVvlWcIiCiIMrReyYEmmMRrZzTrUuGgRjJqQwSuUsWpzZPOoHtnNQqTRrNnEeyYcChJjdDuFUuwWbDFfdBdDnSsRrsSyYDdCcIxXzPpZiqXxWwBbQXxAabBocCOvzZAEeGgaCcdDaaAiYoOSsyIiIisSQnNqcDdBKzZkPpDdBsSFLwWlBbfDdOoqpPfFCcFfQKuUkLlWoxzZaAXApPauULlGgLlOFfftgtTGVvTpPfMmAaFfXxjJFKkDZzdFAaZwWztXxTwFrtTEeRxpPZzFfXBwFfRrGBbjJgrRZzWfFbwXsXxDdzZSMmvVbBinNZzXUuxdmMYynNpPDVvqYygKkZzOoGGfFgHUuhXIiouUOgGpPmYCcyhHjTtqQJVvGgRrPpsiISUuNnNnyzFNniIfpPaATtrzZRUutTpPoGeETtgkKOoOeECgGchRPpAnFcCfAaMmjJUusIiSsSWRrwhLlHDBKkbBXPpPpxbdEaQKkbBpzyYZiIhHPOomMtkTtlLfFKVLjgGOuUmIlLtTVvdDbCjJQqFfRryYcBiDZVmMvMmzRUuriIKbBkdRrRrXxkKMYYyQjJqdDyGLlyYjiInNLlHEehIHuUhrRxXMmaAEetUuTTtipPmMIiIqQHhsSZzfFLlzZMmsUtmIiqQPpsUuUhHuMmRjJjJpHhvVdhHDbcCdDqrRgGsjJKkwpFfPYfFFfyHSsCcKkbcCJjsQhHRrqdDqQdDmMiYaAkaAhoJjgGSHhLlsVmeEvpPsSVhHzZOonNYNvVnNnEexKVvkkJjeEZzjJiSsUuODdoIoOPpjJbBIiApPamMOoCcKBUukKbiZzIaGgATEcCekKOuUoSstDdXZaMmWrRwYyXxBbBPpFfGgbLlzVfQevXxgGhHJwWjTgAaiIeEmfFMjJAfFJjcCDkKdUNnpXxPEHdDhdDjXxLlJVvOoTtNniApPaIKJcCRuUaAYqFKklxXbBBbRvVNgFfNVKkvnGXxjJVvopjJPOAaSYyMXxuUHhmHQaMmqQAqDjTtJVvcydDYRhHWGgwKcCkBbsUuoJjwbBngvVGkVvVvYBbYyyzZKUuUGgoOPQhHqRbBKkdDrpMmVZzvgwWyBbeYyEYcCGYyFfnEhrRFflwWLHiyQqYTtEebBdiNndDISsaAoOaKpOISsFfSqruUgGlxSsEeNnoyYOwWLUuzPpZBtTqAaQQqPptTnkKLlLOSsWQqYrRNnyngUeEKkLvVlXxbJfoOHfFUSsfFubBsRreEtTEipPoONnbBZdDmMzIsSdVDdvFfDCcJRKkrjAtTbgGwWMmVvuULleEfFXbKkBrqBbVoOaSsXxwoOWRrGgdDJiWwIcUuXxSsHhSnHeEAKkhlMmJjmbBXxirRIoFfTiIteEHyYhOoNngGPpACcaoIiIhCcHibBtCcINiIeEHhPpniYssSvVXCSsCcujcCbBJCPpsXxyYkKShqTUjJnJjLlgGJnNyufFUVvYjNqQJKkvuUVmcIiCPpBbxJOoqQjKkXTPcCpfFQZzqtKkMrVoOuUvRsoOOoAaylsLlSLbxXjJIbBiFfdBuUbDDdVmMEsoOWwhHSHhRqQXYyVveZzlLExFfXCuEnNeqQeEIihoBbGgOHVlLoCcJOXNnxojukKNnUOqQyYzgGvVZQqFfqQhHfFEBbRzZrYhHynZzEAajyYJSUuseEuKkMmEAoOaXxGgrRaAjqQwWIiriIjUuJyYWwHhRQsSYyxynimgGrRMcNfFBbNnnCobmMBjTtJKtNznLWwcCYylNhHfNnEejqLlQbBJjeFIszZSifFfaAaDdvVUuwyOoKjJAakYIiXFZzwAPpaWPpMmqQQqQDrRkKIivVuPvgGtTfkKFVrhHRNndDYHhlLyBbVNUJjunLjzsSHhaGLlgAgAaGLySsZzYLlrRPpXxfFYyWIiwjAAfteEOoDdbJjBSsjJRJWwbBjrcCLfFlRgGQRrnNLlbBKkgqQdHWXxwfFhDkWwKGqrRgrRFfkaAKngizxXZwWUVvJjuFPpfIeokKGSsgGgOZrRRroOvVLlzQqIqRrQiISIiyIXCeEcxgGkvnsSETcBbfaAFZzXJjoOYyyYcGWsSrRwNnKkmfFMeqavVTtbbBpPeGgEnNsSnzZNgGzZDdrKkIiRvLyYAaHhaBzZbWABbawLFfBWoOwblzZFfsSiIdDnNxXoOOoAORpProeiIZtPpTzEfFlBTkHqlLQvvyYVVhKgWxhHfFUsSuWwzZXCqQcwWbBcCkKCReErZsAaQRrqSIioOSTtyYszcYhBbxcCgGsmMSBbRUtTwBMmbzvVOoaZzcCSsZzKqQAqQyYaJVAaHhddWworpvTtVvXxjHmMhfKcFfuUuYcCbqQEWbBwFfeBbUYyuzZWYyHicinmovVFfOIVdDDKKlxXeELFfGgQqkJjkhHgGKkpvVRJjGgrPgGdrRdDeEeEpPcxXvVFJjfZUuzvuUFgrRCcdDCcQqRrGuLlUfBbRrFVorDdRJTgGCctQkKqjOoJWwsStiGgIlLYUuoOvyYVOwpPGVvgaEecCAmMzZMhsdHhyxXTtcSzZaCcAZwnNXxvVeUuEUQqvRsSrSxtoOHTthZzTXzxkKkKXoqQrJxXzZXxIzZxXVvVviImMiuHhUdDJjOvVKFYyfKWwklLDOovDdVDwWcCzuBbCXxcrRWeeEEQqQqGCcJKkzZBbjTyKkWwYAUDduZFfzSswWKEjSscCrREetTJepPkVvoTsSGgoODdtYyXxLldIizfFZDKkTSXDdeQqEAfFBbaPZRbBrKvVkuUNSsAuUanNhHnzbsSNniItqQQpPqfFmNnMKkTJMmjAasSbBXYykKzZdDeGgWwTtpPUuwWWAawnNkSUuvrHfTtFhJjCQXxtGgwWTYiIwsSWyqTeJjuUbBeIfFXxAopPhHOHhsSSsUEicRlLrYiIbAaBYyMZzQqmygibBRrhHjJIGCRrRreERrxXIcuAaUrRrRiJjYAaCcoSEzZTXxAatMmGgdyYwWDJzZHEhHeuUgYygfFGGKIVvikKlFfLLAalEDdecCPqQxXoOpOYyodEeDNnrRaAkbBPCcplLQqWQNnLleEGgvAtGgrhhHHIEZzcCeiQEeqVvRruYyMmEeUkTKCcknNtKRThouUtTgGOHvlLKkJQgWwAgGaGqGrRgTDdtjqQCcfFCkWTtTtwKwxXfctTCyBmzsSZPprESfFWFfwiIMmsuUmMopXVygGcCnUuVIHhirRoOBnNbmMNnbBAaDgdZzDGXYdTTOhjlLJHoXJjxFBbpPCcJPIRriIzAAzZyYakxjyYJrIgGiRVTtvdDokHhJjdAaDgJTtjFYPpyUxXuHuUKtTYcZzCIxXYygGxqxXjUuJwzNsSnZXxWqyYUWqsSQMDddDiLlroAaLlcCORUsbBjKksSPJjpNpPndxxsMmgVpPvGxELTtleJjHYfFZzAHyqQYPphcCqGQqnVdsSDBbvOcCojrRwRraAHhRrnNsGgVwkKDdsShHySsYWAaAaMmqemnNMdKkDLVvmMGWwglTtENCcGgpyYPkKnkKoOGgEeaTtsSsLSslzZkKmMSLXXdtTDHlLQqxXmMtfFTyYhHgXxWbuUctvVEQqekBbKhHTMmNnoCcNeEnOMasWvVwSSwWeEsATMmEevVtNnnXxKkRuUTtrRfFrAaWwjJQqLmLlHnNCcEMmehQveEVzwWXbBgGqQOczZXjJrbvVCFfpzOcColLZbBMmXFfzZxvwWVSstTiYyUkKUuuGgHcioHcChDLKkAyEeyYsSvPpVHVewWEvhYEeInNpdDdvrRVoODUgGugxDXxaAdXPLlpuSyYoOpPTtQhHqPqQbBKkphHaAgGWwLlXeEAeEaXxzhHZtJAaLlLlRroOjJxXqnIiYurRBbUwWtTmbBbBOAaLWwtTEelTtiIZzaUsokKsSxtTXBGgbOmMuSsaAlQqLzaEgGeaADdiIHhBbVbBVqQvHhTwWyCcDdYixXIsSJjVvyMpPmkwXxoDdZFCGgcfFrvVRDlLdvPxXvOUqMmeEQujLlJtTTtjaAJMWRrwtmHhkuUffsbBSFFfXLlxfjHhMmJwWDLllCJjPfFGgphHCfWoOxqQXYHzJjZmPpBbhHdyKkYCcfFMmPNfFSUHwWhuzZgGjHhUuVijJcPJjpSsnMmmbeWwEbAqbBAapPWhKfFKjZAcCIfFTtiafFznMqEeQaaAAawWwZzvVZzqQWArMmfFfPpulLUFeIHhxrRXOoTeERrRromMZzUujJSaAXLlxrnNRMdDmsYypPbhOlLoWupidDIBAabnDPpMmZjEaAewWoPpXtTxeEEeOxxXSsDvVdyosSOnNQqsScCYlLyMwWmvAOoaGnNgDhHdVYEeaAGCcgazZaksSKAAXxvVGqfZzEUuIinBEemFfMUubrmMOmMoCiIiUucCIcbBblLOorWGgwRoeBbiIQqESlKSFfsHhrCcWRpxAassSSsrRroqQQqyYnNqQORCclQfFAIiFHBbdeEFvrjJgGjmMHhPOwtTWiIDfFdvNnRPpYypMmbBPVKkrSspeEPMkKmbNnxXEuUaAVgGLlrNnRveKfFiIAsspPSzQaFfABbjJmOlLoMJEelLQqWwUVvuAlCcLqaAQWnNmQSeEaAqrRMmQbBwWHOoxOVAalfFLvDIioOcINncCDHhdeEPpnkKDdNnNqQvSsVHerRxXzZEEXLlxekpPKrReAaXlLxAaxUizwXHMmEbygGYPUuoRrOeEJjyYpMwKkkKbvDdYyoTWnNFfkKQqLONnLlFzTtZfUuxXzbSsZzEeVunEeLjhHJIilFeuUETiIzBEebDdUtsSTuYaAiIYyyKqQkvEeNnFKkfFvVdDfQEIQvVkxXKKkQlpPLqxXDKkHxXhdgHrPpgGbGbBWwFfYVOMmUwWuoyWnNPpKMEemjUYmKuUkixmMXIFfijJIxeEJnNCciIFPpiIUuCcfCtEvVaEeAdVvDDdDdIiaAUMmdjJYEeySTHZzEAaGgekKFzdqQSVwWGgSNpPnseEdFfCmShwWVrRZpPERrLRLghNJcCjkcCszfWwPphWhHwHUudBnNQdDqbgiIGXxMFNusSUMmqpUufFUyAOoUuWwKQJjXiINnxqgGVxvVVnEcNnWPMVlAaUNzZsSnzWWfrryYFdDBbzBbFfKrRNBCcYaApPpJSsjnrtTgGBPpDdxeWwEXgGRcCreYyRrEYFJSbgXGgBQqYyOobnNfAjJaCcIicCWdWwDiTTtDdyVvIiYHsyYWOoeEMmeyYEsSOoWwdDwWwxXdxXZJGgeUuzZEPpiEeGgvVImHEbBKkLlOoAldWwDLbDdrFOrRotAaoKiOoIzxXMmnNzYRrUnNuUpZzIiPLlwWqQgcCcEpPeDdPpUCQqGPpjjnsNOonSNnLgGlXqsDlLzZdQhFWXxwFkUuKaANrRJjnfANngCcdBeEZuUXoOmMhgGtVSsvuUYJSGgVvTtscEhaAHGpPQGcwWaACnjJNgGgqldBbbWloiIOJIdcoOvSsVZqQPpzXxayRFfoQqOKeEeRrEEeDdzZbxsLplJjAxXaaiIrEoaeEAiIwOSsoLlbTmXkUuKqQPKkPpwWMHhmSspuUTxqFfjJQvyjkKJltTCBoOZOozaAFfaAZzTTttZzbJFQlTKOoktMCcHhMoOtKUrRukYAaysSYdDNjgGkJjKEDsmJjuThKfAnNaBoObXCcxFsZzSAakHbyOoYWsiIUuVvSbKwWRrZMmpSLeEiAaFhYydbBPpDFNNnGSshHcCbBgwWScaACsnKTsGgStTuUiIWwOxXmMCcnPmEHKGoOPwWeEpFiInNIFfiqGgQnNaAlLfjJgGzjTtJxXZgZgzZMmGejnNEGgiISsZzRrbvdDwRrPpDdlLjJuUWsOTLltdTtpPyYPNMuWwjJeCaCsSoWwdDbhHUuZzwWqtTeEWwAaFMmfQBmMOoNxqndCQqcmMjJUabVaASeAaGnNgQqEKPprpPRkisStkGAEBqQJWcCcCcChHwfiICcrSsjJjqjEuhHSrdDYrQqolxuUprRYyhrRblMmLqBbQzZpxvVxQEDdeqqflLFKncCNIiQCcCXxGgHsRVbBXxvrOcCowSsmMlLeEWoODrRiWwPpIiIRdDyBkKbWeEqBbtTQdubUsScHNniIixXXWwxITsSHhlLeEtlLnQyYWCqEeQcwGECoyYdDUuPpgGgBEebEVveAaqQvJjLLlviIVqNnQlMmaAXxmeEMnwWNZzwzxXZucCdDUuyYUOxEUUuJQcMMmhWwHCXxTPprzMmTxoXrBbDCcdHLJjlRuUTJJjWwxvvVVYyKSskyjJYyuUYXAanOowHXxcChfaAiIIhHibBFWOHgHhVvgGriIFfbQdGKKkVylLiIqQhnNRrIigiIBbzzZDMagGNnAmWwFftTdwWlLOQBbKkMpYOoVvKkbqEenNQqgGYyXxQqcCVpiIChHqQVvlMZuUoOTInpPNKkiXxtzYBKlLQBQWOoroYyCyDVoOvrmMPOophXqkKOojNnJzZyFCcfMeEIHhiedDxCcHhxBbJjIDdivqwvVghHcTipnoFvVAajDVvaWrRLrRfhbBmTtMAdzZVULfRpPrXzoONnNYBbyGgZzIypPVjJVvDXHhzZzMmZZTctDaAdhLlHplLexXENKvVeEGgwWECcpmMPejJJjCcjJwiIWqLlQqiIkKhLQyYqlzLlNFfNvVhHnhHjAoIdJRrhaAHbpHdCPiaANnbBItMmNPCcSsdDZzHhEeVZUPKbBkeEnNnSJpiIPjSyYqQLzZUulqQJRrkKjWsSATtEwWeMBRJjrLlLlSsZzElLJjXNIQqPptTTMmIwNbDggzZGHhGSsoAaWsSwONnetTEmMYtgGXWwzZHkXxKWwNmZZvVqUcHjpPQFfFtTfvVhHGeEgBbNHUCcPpvZeEFhHfzfJwKEiIecCaAWwJjaAPVmMGrRgMrKkfFPrRGlSsLLBdDEeFkKLJJjjLllhHfeEbaWPHhQqbZmMWwdGguUDCcDDGgdWwsngGApxXLlZOoSjJRZzrdlLHhtFfTeUfEegLlcOwWiIoPpEPOouCjJUCdDsuUSnNcHhhbBEeHFdOcCOooIyjJYiWzyYZbWwBkKOkcYOpPvuAakSsKzZOoVugXxNnUuGURqOoeJMmjNnQqUuEywWYssRrMmStTdDNHofTtDaAxXRrqQjJpcWwCCxNnXuqFfivVblpPLxTioOItYySfFdDQqNnsXkcXPbBQeSsZzVHhDfGgseLvVYDdyXnhHNxlXailxOrHhWvVEewWyYLlKkRQqaPftTFFfGhHgnQWLxXDdlfFlLNnTJcCewEeWvTFYeEfulLkKSsYiIXVvjRHFVvzYyPGgyHZzWuCVvGgcGgqSzZskVvKxQqAuFfvVfgGCcismMSIrQIwaAWHLIilrRuTtURBQSmKkHhgtTGBqQnNbHiVvLAaOofeQqsdTtqQfHDQqpPBbDddLLlFfvbVvZzLWiIJjNIinWABbRrawkcMISbBkKreERIiXgGxIhHxUusSBbdtTVkKvoOpPcYxXRrGgdDsCcxXzvVhnzZNwhHoOXxhvYqDdQqQDdCDCcYwWyEeSsDdrRrgGqkAaZzyYeeEBiISJjsxosSOdQqWeCOoSsAcqQCauUuYyBafzZbBxUZxXilBbVtTgGUWZzrPXxGgLlbBrSsRWwpRjUVKkSsjGgBCsScmMEPpnNPOopLEwWcChHotAzZnKjpPJkzyYZCcYnHhyYNElYyyYLIiegbxOzZFfofFXfFKkrKkRHpPkKxXmMEviwWVvIiynkKNjJGgUdDwWFvTjJkKRahHLyIiYlUtTKYykutFPpIcaAmMyuPDduVAaSswWMUfFfcCFoOSsrRglpPLClLGTtgytThHvVkkKKCcDrqkUVfBrRIiQRQqSudDUhsSHyOsIiFfeESBbdrGmbBMnuUNfvrzZRiXCcGRtiIvZzWwzmMEeZVcCTtRfeIitTEyIPVHhdDvmgMmVlXxLvUukKFwWBgWxgGXGEDdVMtHhUupPTmXxsSGfRdBlLjJMMfySitTIsFfzWNnwWkVvKwbBjJUuERFxXpPQqffFrXxyelLEHhlVKkURfFrpqEnzgHhGZQPDFutTtFfLlryanudNndTtDUZCmMeVvEDdkKrRMXxGnNgMLlXRHxXMmoLlmMefFQHhGfFIEISAarRBbIigFANnAukKkKXDdxHhntTlLyGDdgSIimMWwzLlhHZQoQEASsaeQjFfpPJdDbBRrVnvYIinNyBbLIgGirRaEsqLlcIiCTCLlcXZjdDJfFSfFsjVbBsSTtfFjJgGvVCiIcNFfHyalLUkfcBXxQqpPbFLvEeVxsSywcCGgmQrdDzZzOrGgtTRKkoMQxGgSZboOyfFrLSslgmMGjtTCsScJAuUZzmQcCJIjKkJGtnGQqDONPpQqnFUuhHRrOhDSsKkJqYyKmLlhHLLlzrRZEzZSDhDQqNngGubBKkbPXxpZzBDlLdDdVSgzAaZMkcZztTCBMmjJrYyxXxXRDdwxXSswGrUuRCcpMmPWwgIiAaSTtlLQJjiISsiaAoBnNNnXxbXpPlNgkKdvVDHhXZzhHCSGgSsyFfJDdCcjbUkKusboTtOOoJgTtVvaLpjJuUZzTJjsFfEeSiINiIIEeBFfbpPiqICuUcNniFfiZgwYlLcCeEtTVfDBbdhGgLPPSspplPQqmFrRasvbZzxzGgzZGNYynFMVvmfaHhvVWwAiDdIzzZCvVclcEeVJjvClXOJjocfFveEjXxKxXkJkKVgGwktTRrPYyoOGDdsDdBDicCDdIuKvHhcCsdDlDyLlHxXhSvoyTfFgGiIAgyYyKkYYyJsdDSSCCccpPsjgPKkpGCTtkLlpPKRrxXVpPvqBblLnNnNeEtrlFfLRnNTtxWHaAHSFNiRATtaLlOkKocCfFFSJrRelHhnPgcCfFGpHqYgmhFfHxCeABzUfSeSsEAasVuJPpjLlKknNUnNUuXxVsSSRrwMMmflzJjzZsxTDdwWsOgGTtulLvVUuUiIitAaTKmPpMkiFfkGgKoOSndzZDgJjHGghDpOoAairRGOogQCMqPpQHTtfRwkYyKMvxXxRzjDMmdmqQWwXxoOhOoTtHQqJKkOJwZzvsFfvVSZnGCcgNhHYyzueEUhetxCcXTqQyYEdxXPTAvympPtfdTDdtXiVyhHkNVTtvbIicCsSVOoAjJavCMmcBArRZrzPpKBNdDxXxsJzZrtTBbHVvhZzEeIidygsCHaXoOobcDdCCcNnBaAgGDoONWCcRrbQqNanaCcJQqQhHWwqjfFIQibBVHhmMpPjJIhZmtasFNhfHsnoONGgeHBPcCwWVNRuEcCoOgIoAxXmPjJZzwWIajJZstTSqmrLlDdjDoGCgZZzuJYOozexXSyYsrRZjJRrnGwWRrFnNnNEewRNYCKksScsYaAhHFoBbJzZrBXxmMbsSedDEfMnvxXVNRrROoKJjHhLlHAarFfrRcBbvLsSeElQmrRdiIJjDXxpPMNHFnNftGgTwWccCepTtPzZpPRubBUrEMmsSlLYPpCoExXLleLhHqQVvQqmMqCbBVvcxTwWtBbKKrVvMeEWdrRllLLSsDwYIcCqQiyuxYyvRrtTLoGnNWwgVabSTtYyhHmwWusuTtHKkhIZHjJeIiEJgGjFeYkDdgWaAwWrRwSsGbBKZiIzpoxXVrRTtHhuzJjjJZiqQFrRfSswBsiISbPpWwpOojvfFtTlLVpPCyYcLDdltIibBfrxzGjJZmMFfaAzgMtTrjJvkKTtVFDsEeLLllPpKVpPvkWwdWkKRroOwlLfTICciNsSnutTFfJjUEeIdDjJiGgsSjJpGgGoOgoztQOGjOvVYVcCwKkWXxLmMlvqQMmoOMzZqvmpbBfFjkeEqFfDiIikwWBbCEehqQHbBcpPRrMlKLxUujJjJAHefiIFnZzxXNtQqWQvVfFkKtUumgPnNlLafFAiLlrRLlkFGgfKHDdhqPHhCIXPmaAMpxxjJcMEemqQjJbbByYBMmsSEgGEANaAnXVvJjlLxHhJGgItYBbCczZtLlTynSdhIixkKaOuUdtLLmIbByyVvYPpdAdDfxXwkHvlJjLDdxXKAMvDWoOnfmwWMZzEkKJDDhmRrEUbBbyYUOQqrRaZzmCcMgGASwWKGwcCinNpKkPnNDvVLleETdDmloFfyqQqBbbBQppbyYlwWVvrTFuZuNnfBbTtXjJxIIiRVxDIjJulLUiTUeNAaYynpPmMtTXxFVUuyUuYgqzZKuUtOUuVvDrorRPpYIpsQUCcugGzZqCDqQFXxzYyVvNbQgIiGJjTjJIiJLeEfFuUlLtTBbOolmTtWbBwsSHhfFDxkcCSsLltTYCGQqhHFfgbgFgBbGypPJrRcCCPAjGgJaPuDCcdmDdmhhqQSoOdcCDEFVLXOojhHjJFXxrRfJmsXxSBbdqQunNIwWvVLOolxsSXHqQhCBwYybBxrcCyYRaAjZzlLSmtXxXXrXzZltDdTLBaAQqgtQkhHPSoOGrRQRnaAshZwKkRLCsvVZjcuUzZCuUgGSdDldWfFZzrRwtTrlLDPTxXtTYTtygGBbCoQqoOOrRcjkKFIdTFfLluUbmTLhGAagRoaiEeIRtTlhHKqQkLQbvWwxXBkIgRrGUuiLoFcCfpqViIXxVvvUSsksSFkVvXxlLjKkWwGuWXxwXxRNXxEeXxnrDdLlUvVesSuyYsSChHwCcUudhbkaobsSuhHURbyYdVvdDxXytlLrRHhktTsLLWHhjJqQtlAafFeMLltZzAwiasdIiVvDOtToDCYycFnNdDfRPpqenVROowJhnEkoOMXxPpvVJimpPZzjjyYLlFfOoqYeeEOUDEShHpPkKIzoOxMsgzZDPpDpMwbXGKZzGLjTtmhEeHFfBqQtvOXZzmARrrtJnQqJaPpAjNkmMyYKeIbjHyMiImzaAZzxtvVTFfvVsSTtPpqBnNbwKkcCoOWtJQIRrRqyYEeHhQcuwQqxHhPBbncZzyYqQuzZWEeIixTEvfZzFsSmwpPGIRJjkwAXkgGKXxRxCwoTfXIiIihGHhEeuUSWwcRrGsAaIFUuwxNnEHhgGAaxCsQLdDloOKRynrRNYYjsOodXyUuXrRZZzzGRrEeKkxXsSdDslLcOjJAdxXvVlZGgzYZCczeEYgGylNFfLzPpIivVuoOWwUUuwsEVvQQqqURzkKmNYpwgGeEMmGgxjDAVSsQqvwBkLiXxLUuwcNnCSlkQiIqwzuBVtTTIJDdMGYAvtTVkLXxloRSbBspPsXNgGjTfRPwjBjJvVVaAvbwbBWrXqiHhPgDhHHjJhkKDdSEesoOTxPWwpxEetOoUBbFfQNyHWAawWwhYRaAhHPpUuBbENaAcdeJoguZXxHuJjTJqQjuUqALBoLlOxQqlZBbznNXYyLlxLyYsUSsuvZzVtUuyYQqdAaiCNuUTKkaNocCWkKwaAvjUyYuJIiQIDdEeodDOFAZVvoXxsZOtfFTozyDqvVQdFfvccCUumKIqQEWBBdDbbwtUKzZHJSLlxqhnNFfyYRrrzZBbDSsPpNRSdYuPuUJjwWnNjotLMmZFFVvEZjXBKkboOnWWwwocCOwWNNnxJWHmKTCCcSoOswowWOmaAOoMOnNJZHhMHXxvVtcCnOoacCyUaAuOfCbzZTiILrdDRVvaZqQOrRQceACsSKhGgkKHuUSMmBbsfFhbBmaCcAIiMUSspteHExBbDVvpPDHhdUuWaAzoOVoOGgtEelLVHhBbjJvoOLlUWwuoOJjSYMMmuUmysMkbZyZzYynNSTacIiyIiGmIDdiKkZzAAHhTlLCISsfVvdgzzDdZZwWnNXIFfSsIAanxxXnryvVYaAMieROlLosShAGuRrtTpBCOzZkUiIueAaXxKsSkEVlXCKkgxZqZzlSsHAXwWxapFpUuqQenTLlhofFOgGQOoqLEebdGtTgavVAUzZcsGgPphHkKYymQqBgGMmeETthHibFExXaQOoBJyYGgjzYBPpRrPpiftoFEDdeiqDPsuUSbBuPpRrfuVvplhDdiPpIHbBujJYyUDdhHkKOSsoOzZCcolVvLLrxXfDdfnNzomMSHzZBbhOXLHSZzMmAfFqQyYTtHBpPNmVvHhMmydYWwXxkpPtPyYkIAeIiuUEEemqQTtMFBmPRxvkOobBKbsFiXEexAGdDcEgGsSzOiAhwwWDvUVvubKkYqQjJpCyYsDdfFSdHIihTtDPCgwWziiXxlJrRfZzQqEeFBbrxbRpGgPcqQIRELlhLZIiOWmMwSLLlXqstTSOZzoMmiVvXbBMEraYyAxXQaoAaHwWhgAagOoGpzZPGHbgMdDMmGgCnlLWwnNAmabBcLlCBaAJgnNGEIiedTVvVCVvyYklsSLlfFoNDGVGgAayYsSXxkKvyYyuUYUsSUwWOouuXxCiIrRZzcBdvEsSkgGKsSfFsVAXxaPIvPwcAaOjeEJotTZzdMNnmHhUSstTjJjmVamRrdmqiIKPpUvMSXxHjjAIDckGZzjJgKENJjjHEeEyhxXBVXyYKkOVvfFmPpvVYDkktkKTKKDdGDXhjJHFuUCcGdtTQlRLwWZSsIkGgFfOOVaAtTdCqIMmBbXxpNbnzZXkKyYPcCpIJCugYypwWKCcpPLrRchHCoUIGfiIrRFeErRyIiFDdCcfwJjNTtsSnWZzRHByiLlvFfgGgmzfxxiYyIaImMtTXPpxkKfFdpPanTePpyYpjJyfqViUvNDqQdnVZzuasSvoJrZHhdDzEBbpEWdPpLCGgZzCcGgLRrlnNMlbYyOImMTtiXsyYrJjDBTaKVwVvDMmdfFWThHNEendDEYWaAwJHWDZEHhXxlLQhlfTtbSyNsSTKrRTtvUBbTtgqGykmYyYODBbnYysSfFDCaDdAOerVvxXpKkXhWwHxXWRrQixMmrRaaAAkzZAaeEYyYyDJjCcMpMmyYakpKfFkPbBbBpxpwWgGPqQjVBbhHtUuoOlLXsvLJUkBbJjzRrvVXxYyDdSsYplstTdYYnqwWQGLFfpghJjEKkZzedDhHEQqBbQNnqhHxOoxafoSsMmlesSshHSEYyVsSbBCcQCuUmofFASVvsagZQoOqOuttwMmWeEPZzkKqrlTCUucGQqDTngGNcXxbQuUBbBFxXoqAaTEKumMSfACiIRriZAOJBeYyLlIiEgPpGVGgTFftdIcbBvfXxZtXxkKIQJZlLzznZzRppmzZJjgkKJcJZzoOFSwWQlLTvVzuRqcCfoOFZzxXoxTtEPpPAHlLuRraAUnZGjJWwnAaUEeCFfgGcRJTjJIFYyfDCcCciUuIFiIfgGQPpqGgBuUSiJRAQqqQbxXAtMmFCcajJxUJjBbsuJtmRUuSETtmMdDeTpVFnNWwMNbBcCtlCcLTtFSsFffqQXNUJQoOquqnwWTuuUoIhHKRHfFWSsKKMESsbdpPDrRNNnNnYSZPpzmbBMsiZzCcGgQqbBQqAAIpPThHtiCcgGCcDdPpXPAnNahuUOgGusptQfFDdYyqogZzsSGgpWiIwPTxuUXtWGgwFfxXfFQszyYAaAcMmvdYrgGRRrbIiwEcaudDgGtTjJRyULSBCnEoukKCOowhGfFgHssSLDdlUcQfJcIpYjnNcDGsSgWsrRVxjGBbUOoPTtyOonNYsSXBWjJiArIBbiJWSqbBQFdBbDROGDfJjFdggGkAaIifFFfFkKGgoOkfUuFKGgfFPpSEYoxXLliIOYRrUPtlEkdDBDdPpvcYygxXGmHqCjvVJzxXZeEcCAxgGecSsAPtSpPsCIicThnKYKUsvfFLkKlkbcCDdBfoPpFZSybBEeSsIiBbWwhHVvraAkUXyYXxJjLQMNYOxXtTLfFHZhGgMmHorpPRjiIaAJGguJFEeBbTtuuUuJjWWyQQqKjBbckztTEeFJjYyYCuUcAazZjIgGhlLWlLzZwRrfHZzhvlHhvVBbLVFBwWrNnvcCVvSqQlUuZzeojLlxnNGJtdoOlybBdApPIicJjoVvNnNUupSwPpzZVFHhKUIiqUuMmdOGCcgJWwjdDdAPpwWaGdFfDeHgkaAFfXxGgUlLLlEeRVMmvJzZXkiLlIMOoxXxdiiUfpPpPFkKhHuqQwiIuSXxRrZyYPpAaHhgGxjTtkKzZMmxXcAMGCQHrXDWmMPGDmMlLKfFHEehCgHjDdZzWwOVvODdoRmKkEkKKTLlaAVdoLWvVsmXxOoEAayzsSUiWwaAGQqgIcrRpwWoTbBZQwWyUFMmfuZzIpPeQhHLgaAdDxBSsCccdezlLZErXiIxfFRxXQaAqkTrRttTjWwJscCTrRcDdZzBDDQqHUuhRjhyXxRSsrMmHBmUQqCcTYxqQXeiBWbbWwrauUARtusSUBwGgVxdDXybmMfLRzFfZrXPpPpxRZzAuUKXJjxNnkDLlZzmMPTRraALlhHpYyPvVQqWsSZvVsSVYsTmEeMlLoaAKLAaBFTHTtAaqQhnxtNWwHhdMmDYspCLlCccvrIRrizqvRdDrDZTtxUNkvVKnNSGfzpmMdMmElNuPioRjJBOoTtLzZLllWwyypPOwmMWjyYWpyYPXvVbFrcDdURruVPpOovxzqQIihSsvVZWwibDRraRhAZtcCTttXxLlhMBIXxiRKkpPrBYdBVDdPqqrQBdiIruUwYygfJqiorApPuqvPpxrRrFfPiKcCkIpRtEMmuErxUUlAZZDdzzQNzKkEecCiIpZmuEpkHhhyerdDsSkKsSiEfTbKBbPnaEJSgcCOotTLSszZBbllOOzocCOJUujtTXEzZFwhLHtBSaAsDdsSprPpRqQqAJjaDaPrLlSshHDdhqYjnNgkmGgMiImMAdLoTQAZzaYuUcNnVDdvWfXziVvkiiICbPjaAaVQqMTtmMRrhHWGgwRrTaoaAvVOOoaAzfFhthHeiIEdAwccCCuUwOYzZrRjZnSdDLKbqQoOBbBMmvLKklWqQtJjWwnQQqxEeQqXUOhHtYyIMTtNpVvDlLHwWQRUuZzVvdDeSsEroOCGXxGgCBVjDuUruUREegGRAmXnNwWMEbMOEecqQpPCaALtTugGUnQsSqKYkKaXZLlzQbBlCcLJoOIVvSqbnNEvVNaXxivXaYyCcNnCmJLNIiXbBpFZTJjAaJCcFfQVfEeEeTVAiIHifEFJjfNmTUuiGksxXnNJHhffCipPUqgGWBesZKkZznNEVSQJkKaxMmUVNnyfFYsSFnOoOvVoOosSsSNXxfCezuUgGZXxuFNcCkEexXAaEaTtzcgrZsfzrpcCzFoqRpNgGOfFBbWwFfwWMKlFdFxJURnNHhjySsYWwHhHAahJrMBiEuVvtTxORrBbEJjecuURrcCgctzQqVauULRrKklmMAyXHsrknqXByKrRNiEkMmdxXIkKbfxwWaoOiIyYfrRFWxxiIiRVlLtMJjmxYyIiZzXNBbLlpPnsGUtHhUumMXuIkKiBbsNqQaxXaAAgGwaIXsSHhQqvVAIidoOQTtrRqDNTtndfzuotHDtTlxXwpPWgMmGxCccDddDwWdUMmuZVavwWuJOoYYyMkKuoOOgGuUrRwvVWwWnNUCRsuxXyHhYyYkmMXvVFpfFuUhxXHPfVvsDdSsAfFRpPrZkPpfhHIpGlmYXesAhHaFLZZzlHTzTsDdqFFiCcIfrbmsSUTKktujZHsJFkWlEwOoWaATteyYZuUKwAxPpPbuGkKoOQqgUtkKTBoOywtoOiITzZvHhILidDIlWwzqiMZzynNYiBkKaAiJQyewRrZztTnxXvbBVNfBODrWdeEDbrRrRHTtvapPslLSsSNnDWwthFgogaAGiDaAdkKIvwWtxHRZSPHhULlBELhHlTJjeEdDSsrxXerTjXxGVvyiIRlLhDdZzJjszZxCcdYyJjLlwWyYDIOUuoEuknNKeQWCpxXTkoSqQhHqrfdDsWwhzHgGaOuggTeRkWzJjwpPHhIGPpeEBbBfOoFaAGFDdfJtnNpUHxXQqhPBfFlLHhPaWwYoONdDjkKJFfiyCInwsSLlGcCQBvVbqRPQSvVHccvrRhRyYoOIiQXxVvOaIixXLTtHHhOgLqGaAHhgVvSpooOOFqABHhYyTtbvuUedDiNnZgGzHRpBbDdDWwWuUtATHhBABbEnOaBVqQvYPjKmMkrmQZzRrTtqMRJxveYyQjJqEzZirRlqVIfFQtbPpBFhHAvAXxGvVYGTtFIBvtTwpPZSsEZqQTtllkKTtcTtdDReEAakKzvVDdgXxdfGbBgGqerTtDUupPRrfzZcqQrycKWwzLSslOvBcgmRSsNKLhvaAVqYHiGBbAaCeEqQNfIVcXLlsyBbwIirzQblLQqWzHDMmdhuCXcxKoKMjJjoyzbBbaoOeECcFeENnMEeGgcLlwNnmQJjYRftTRyXEdNnDvwWVedPenmXxYNnrumkiIKUpGgJUTtNZzPjroCNhqLmszZGgPpcVmITtiMfceEUYIiMmWCcTtRheAwWaLlYixnNngGOoiIGgNCWKCilLIwLlKkLdCcbRrdxLOnQqfFQqZdDExiyoObUOMHPpzUuCTJjvyBaACCXxcLkKtVvgfnsSNuPpOWwgTWwJsuvVcCQzSKJnwenubhHqNFISsiGaQfDdPzZfKkwHhJjnxbBNnFtrRuXxLDtzgBMpTeEEecQhZcCOQqwKkWQdDFuQyYBNnbqEVvCcOoaAaOWpbXjaApPcCWzwWGorFChmeeAIaAchfzaNVvnmlcCKkKNuzUEeScAdDlLUGguNAmzZalDMssSkjQqffFhlnrRCtzaAhzTtgQqEeWLlwGqnKwQGfFgiIFiFifAUydDkHhViMaKyYyYlxZUPpUuuZzvzDdZVZCcpkCBbbzZyQlLeGcAIiaZIiyrsKkbKyYMRbBbsYSsyJjIELcnNcxCcXCYpKktThfDrnNqQvVkfFcBbsZqqvXyVRhXZaVZZuMmBbdLLKkwaAPUuGxXgImMiyoOFHJTeETPpfFXxtcCegXREGCcVxXvaAHwIRrncuRuUwWvMKSsycDyRdDKrRBbGglQqLuUYyBxXbMpSyFfIiUScJkcCEZRPOoAPRVvcYiINVoFTtwWCaRrAfwqfRrCIKkPMZgmSJtTfFjJjaAbKYyjJkjVoTtgfmMdDfCcPJjuVWwWwvEeRrfdvXxawTHDFfPVpGWwgPNeeDvcCkzDmjEeJbOtggVvTlCPpysSyAaAKuUyqoqrKVrgbqoKkcCOPKFDJuWwOoTOwWyXYyxylLYyiIQyWrxiIKjCOJfgUuGTRHVVOFOdhlsSAMmHEBGcmMrvVWwMZqrkBKkxdtPbRlLktZzcCAaSQqkPpPUHtFfAaPHhFOHhHsIiTtcCYwWkKeoOVDgTZpVvgGFQuUxwxjJXAaWnPVhqzsqrWqQLlCRrgBdUuDvVMPFfIaAiWdHnaXmMvJmbMjTeiZzIdDEsEeiIgxXaAjJZwztpPTZeFfEGmLDlvIjPIRrnnNNnDGqQrZLTtpPKkmTnqBrrRVvJjadqtTtsPpfKAVBbjuqlLQUVvEuAaWwXxTtLuUmElJjUXLeEqbRrqvtwWvVTFOQoxXuOoxBbXDdUOfFIrcChCLhHZFfMUHoZWwzTtuUuBKATtUsSovVOzyYLWaGgElSGKieQHAaojJOhYjJrcnaFfwHLgGWPPgbKPFqQLlLxEHhguQooFfXmpeqAyYrxoQqOrfilZjlifDdHhFIZzxXxXWKkwaeUuYWwaAykrFvVLxjDEMWwbCKsSQXPphUOAayOoGANyYJpPLDdlPcCfFAanHwWhaAWvVwbEeKkpPBAMmXxzsSpVdDvsSsSJVkPgagmmTrRkKofFWOZqVtPZBWwByYXTtWYDnNeEPhhwhXsOXEJyYjicpgGEeBbzxSvuUVShHzZBmSoOtTTqtqiaAPpIXdxFfxNrQoMLllzCdnNBDGgszchuUfeMmsRYyrATudYJxIisAupYyNQfCbDNhHuUwcdDuUMSsmXxLlpPxzUWLQOwuwWUWnNjygGPpYJjJtnHRylLEzKnAtTaRjmPpPGCfFGXVvlLOrWmTtoOMMmNVpdDwzJaBObRRrrYQqJjHCqQhHsmOKhHYyBbZzIGwWhHRrOaARrmoPetgPFfNncbMZAakKEOJjxDFivqSIKPpNnkiRxMPgZzWwFyYfAaVvuYJnNNyWCsWTTthqQCwWCcSJpPjmMocRDCBfFiIgjsSljQYfMmFYZJNnjzydDNAdDkygPamJBClcFyYtUFfuuMmUTXKRQqKrqybMcaqLlQUBaEkKnzdDudDvVqfFvZHhbXYycCRQVvIGgrRmJazRacCAhZZArRXxjNnpfuUgLLlgNRrVCNdHhkKWOoBnAxXaNagtRssxUiALGDdKpPkFjWcCrkKRBbfFaVvXxAUuJJxXyqJdvVqQWwvlVWQqwjIiLlyCFsSqQPFDdRxxyhmkKLYbNnIiLVkYyrHgGyFaEjwXlZVvvgLvVvkBCsSFdDqQBlVvhHhHFMsSlLbQjGlWfVAawfUuvsGMmgSsWwWIAIqRAarQieEbBbxEenBndbBMQTtqahgbBGPdIxrOvWEezUuUlWwntTDxXiIdvVWwUuuBhBbNXeyYCcEgpATPjoOwVvhHZzEehHxNnXhxeiINUcYcCYsKEekHhIimMAPpbqQgiIzZREmjJmBbtYyIicVSTeWWKkPkKxLlXpHsShlLryJoLlmijJEBjoOuUJNZBDihHjJsNQSsRrRrIipbjuBbAaUIqucEpzZzwdDHBbhWaRPMpUmXbObBkKOoIiKkJjfdDZzeEUZjBxXwlkKqQzAaZxXLCOiIeELVYynirTBDdrKkYgxXaAGcgZzGIxoeVYyvozZJjOHlsSLmvNFfnkYKlLZZWiIzCJMnUuNmDxixvsvVlLTzcCoOmRrMlLIiXIipDdAfFsShIPpODnNGgdFMjzZIilLlzfFqBIXrNnckjJjJSCcaAopPnNVyFfveUuJaGgxgUuWwGXeEUSkvVKVhllLUjDakMeeElLmOoOdYyXxiILnNlLlKPjYdDVxoWTtwNCWwcbBnEcEEMMgGfHDdvwcaioOIADVvaZFsIeSGawaGQzZqclqquWwpuiIYHAzZQTtWYyVBuXReEAaUuwNnKkzFvVRgGofFEeNWwrCVvIieKkvVtecCEsSvJaFixLlucZGxGPziyckTFftKdJTtyWPekKJPeEhHvVDfFdDNsSnCgfUuFFhCcfFaKopjJqAaNSSoOCBbliILcCAPWZRbRrULKgGkGMEzhIRXxlllLoOLxXaAImRzbBsOYsSoQIibBnJjjxCwuLlULoriKkIyYXxYAjBYNRSnXxNgKMNyRrBXKkxbtpozxNLFXxCSklLWCEBJjbxSsnNkKiIzZQQqmMgaAtfpKkDdqdYedDEzRrcpdrRDPbBmMtlEeLhqHcHxxzpsSjLYyGPFGPmxfPJjJzhUmubmNUsSjoCJLGhxGlTAMfVvFqYyhXxhAIZziaEJBntcyYjtoOePJzuoYObxsqaDdSRGmMOEmMRzoXmyoQZTJmMJPKkqQBOzgGvVmMEeoNnOtTXtTWtZrdIUuzZFVyoOqeEQYGtZQjFxnNXhblLgGBhyQxeNnEXeRsSgGJOnFbqQBfhHItNNyYKUdDWMmrYNrsSmMzbkwdVnDdzYzefUYlLyuteDtucngGmMKiIPecVvQkrNRyYddDTtdDfDkKZsSVLHYrpPldPwDkytTVeEAfhyYOhHBdDgGiDFTyYMsSVnNvOUzGNnwWazZLZzLzRbQqHSlgmaAnYsSEJMHHpPtXGJjCVQqNLaMmyolissdHhDmWwKkMynNQJknNfLVvvUuoOFqoOEeVcLlmIiAHNzAfddTkKkfwDfLjmnrtWwxJIyXfcaAmmcCMsybBYKMmrPDEKzZkrRecYyFRRkBbbTuUtzjJOYkHuPgSshTVdDFfArDdHhvVscHPdaXmMxPGgdFlZzUGeKkiIiCEehaVKnNNnJZqEwYrRyMHnGgkeEAUtcDdmMsjebGLlgVYoOunhvZfFzMmiGflqQLCsSvVMwQqpPLlKPMeoZKkzWwEeYvUwCKkiaHhYbByDPpOyOJRCUaYgGJxeLfNIMMorfFRfSftTFsMmujzUAcfseixoBhKkHCcqWYOoZzyEeZoJrSjPYbTRfFdVvmDnIBUpPpnuUNrKknNZzZzRyHCTVXoOxnlxYRSiIsIicCWXKPoMaYFqQEqkhBbHAzZTtuzFaquFnbhjJHmWwSwWQOeXNUAMfwgblLfTtFIDllmXbmQqMyYBciIYETmkoOalLUpudNLtAyYyVbPsnUarvVUuImtZiINIwHBPJjiqQIDdaAqQqGLlVKMMPpIBPEwWwWyYRWthSsPpvVQWpaBIikxwWXNeRrVUWWLTCCcTtuzIiXkMAGDQqwTtIbQSBFhPREeUwzZgCpPnAaNOoKHnxXTqJjGvzZVyYtFfbAFFnCKklLHDQeEVWDDdnNuYMMVEepPLYyQNQqnhZzeECcHYxzcAIbqQWnNVQYyDkWuEecxyOovVELbBBbBbtDhHcuZPpjRrpOFpsuDbKkEbBJNoXxOdwAvVXoOuULljWdDDdyQXtArRLtlOdLlktfaqRrIYyfvcCAaVFDyogGevVlxXLwmTlLeSsTthmMUbBlPZzihHIplVvLJbmMZUfYazBXzvlRBXGBqmMfDuYyUdcmMyYYRsuWDdZBZzlLwEsHShJhgeEGHUdDFQqfoIjldaAVsMUqDnNnsSIAaIpvLnNlVRGRrnVSzZVvYuUyFNeOfVeJoWprRZaAzPJjMmPpiDdIzJQOoqLppBJjbyHQSTdHmmMgGNvWlJeErRRrierathpLlpOwWgfFEdHhweFhHfGggGoOoBDvVBbhyNJwtTmMNUxnkjIiteBiIbVvhCDJHDCHNnrNOcghUODdQYkKSsXSzZaJEnNYuUDcvyHhbKdQqDVgVfFYdkeiIBbTQQEecTiAmGgKYSboKxaMmDdAXGdYlYwbsVPlnNlvVVOMmitMmYyTVRrvpPxgGoNTVcyYyvtcCTgXpLXNGAaMSGUuefDzZzgpPGKGnujOYlXxiIbBykKxlRDTYyidAqlgaAMJjcaANcafxKkmbrbhRfdxXzOoBFsSaAWbBwyMmYocKHVvhiImoWXbBAqkKlLdeUmJogiXRDAbcCRNmfFIkyYYudYgiILgmfcjJvtkyhHigdoGopjJlJjizbqLllwyRRktpPTsEHpQvVqBKkRNHNzdGxdDXKkskKScJnxeOoyPppFXADUueiIheKnfCcxyrnqZkBWwXxRbBDjaAValAyuUyCsCgwWGclLScYxGgvVXYKkaLAUuvRrJdcVvCbBrzZbKzfFQNRYXFNkcdDCEHEdaxzXiIxZfJMmUfFujPYEXLlcCyYNmvVMjClcuUCLgTyYtLlDZnhnrbPPYylLGgpheWwSuUKrrfFYWHGghLQBZILPOkKXxgOkKDPpGIhtTHYKTVjJhHCFaAkKMGlaAFfLlGyDUyKiMnrBadrxIGOjhHMuEJjjJDyYTtQaxwgGOMtsSTdCcDkCOdDCcWeEwMmCctTHhnNfbTtQqAaZDFrHCcBRBMcCXFACnCmGLQaDItXxdIirLXYFfIiLpPyoJUNgkZdFEDdUugsmAagnZzEexlPxhiIHGVUuYCvtnvVWwOhHXIovLLpvSBWyLmMyDgkOBsqQykMnNaItCqqzZtaARrSssSEKDKkyDdvHoOhGvvVkBiIYVCdqQVvyeTtYyjAGnNFfgslLxyqGgSsSsKkobDdOoBuHGCRronRhcSsdhjaAbBLldcHEgGTJKgfFTtGNXunEeWjnYHAadbOSslLEUueQqFfEWDepPWwGoPPHYyTAREHhVvIxXJjrRjLwVUunGgMhDtsqhMmYPLdDlPMmljZaAwOSsIijEVHhvvXxFoEnfYaAysvNbBgrPiiNRrPpbCcBdQumFfSvaADLzZJiOujeEHshSHheWbzwUScCryCFQbgxbrMmLIrHhRiVZxbZAyFuzBMmCWwcUJjcCNnuMXxmAajHhLaAuHQqEtHhMWEOYdoOsSvViQziIZArRFTKDcCgGoyYqQLTlaTRrxqYwJTtxaWDnjexXBdUSPAafoPYyJOoHhzUCdTqDAadQleYvVXCdDUMmwKUuXSsxZzdqvwBiaCnNZXyhHqlvmmyUdwvqdhcNVvffHhaBTgFflhHLQkKtNhkQqcGRSsrWurzZpHfbsqBiPpWQDdqDMmddgadDvwWVmPpvVKxZUcCctiIlqQwGgwuvHhEnKIiENnebvLlVAzoBbOZPwqHTwqQrdDcCNnfMmIiFehHpfCcFbimmkwWvgQpbhWinzTMiRPpAuNjJSpBiIvhfFHYwqQWyYaTlsSdDneEDUPuUuvVAKMvVtnNezZysSCxAIiUuaMLLXxdifFnNBGpPRrWeEFmaunxEoqnNsMBNfUQTtAfZyYUaUuKQeHhtTfykKAmOpkxWwwbBryXLNveEzZtetTEchFBblLfYrJjGeEyYgUfFuRPubiNdMDrtBypJjJsRjOwWzwQbdDOXIESEeFCaxXuZJUFOuUiImminFlEXjyAucmMrjoYozqQZqQdAIiIlLiIcWiIuVyIiIiOEmpkWlLmcFOouUgIqQVHNUyvlLcCAaBEzZJSfFCTuaRrKNhEemWeQRrzjmMkvAQqHlLcIEilLIeIicCbBEKkgsSuuULvoOlLxKkXVfDqPpVJjvQpADpTthCSRavcBbCtHqQCKkcGpUhFfKyoCcZDdUKkuBQqKrrfCqQdKkpsSeHhERkSMCFQqxnNKkYipPjXToOMmRNMkKJlGYygFddDWFGgKlLQqTyYtQuTtUiIiDdIqtDPpNnUuDRrFaZnhaMCvQfHhVVvlFKyYjGgqYSSILORrYAlhHnvcgxTdDhhmjeyNMGLshXTtxBvVrYyZlBbRrlLlAdDgZuoyYmtfHhiIdIbPpoHFaiIvYKdXxDyYdpPWpDLzZRywWhlvzdFDrncCRKqCEpkNCUEeTdETUkKuFEZyZNvGMmgDWjJKBZRnxXyRuUGgwTteEukUunnTihqQHNojrExXqxwWXYHHfJEeqzTgwWvfVvAaGgmMiDRzTwxttTTcCiIMmUuZhHQqJjobpjjtzlLqOYMxOkKZrrReOoojJgrxXspPAQEeSXBoyOUgGZjpEGgTJCTNbHhjKkefzZFLlHHQmatLgXHgaAlAajcOJuSsngsKkkKSGMBUQqMuQqHZjNnKktTpRrFXMtTpgfXxHhYyTtpgKkUuNVvxeEXpPEenlJPZXXUuhChQHTZZzzhVvzZHDdoOCZyDQZzPkGgKFTGqpJjzZPSsSsfFnNPQqpXJjeCccgGwKscflnXkKZEeOPTYnmGnNgkGsoOYpPlKkJjLBUubyrnybJauUyROljJWcQOoqXEeHhJuUNqQxXqONnyoSbXxBZrvVMiAaLPpjJriHZiIemjJgKqpPQVYyvkNnlwWuFfdrRDBrvVzwpacssMWwmBbnQPqygGYQqQOkAHffFYyGcqQdDiIdpNAanjEpwYjDJjBbrRlLCyYjcCEFfeVBbvJVvYIxXyYZpnNgXsStYyTGKkggbSVvsBzrRCUXVvIfPCAaGjJgcpAjVfMmFeQqETEpPcRnOrfVVvvZdMmDWBXxblEeLeErxCcgGUbiIvwdDqahyUPvVUQQLCWgGwegGEgYyGQfFhTtHnNqgAWAgsEHhiScCfvVzAEedCWAaVhcCFIuUivVdMmDQqmmeegGCeOXvyJpkRrzZDoMEmjJKAdJuLxXHvsuAjEVAaYvOsKCRgHhpPGxIUuiibQZEeLjhHNnqQeSsEJzzZZJyMmYzZmRoOrfoPpJjiHaPyjJYxZtSVZzXIXfFdjcZHhZzwzzkyKVMhELlAaOqQXiCSUuCcNnsYyKkybBDdRhHbtRINvlocWbJJjziIudDoOFzOWwYyoZeEiITOotYyRrHhuUoBxMuPmpVvuUrARrZPeCUQTtiIiRpPrJwWBXxqQzDdZHhPfFLlqnSIipPfFIdbznbhXxHekKIMOjYRwWwwEtRrRrFfsvCTMMelLrTttTGeEpPPpBPpFfJxXQqjaSOvVoyMmHdDhysJZzeEDdjuUSEeCMmuniIEIiXgaAGHvVWVvJptIiaPIiGeExnHbUKktTNLuZkkUuKJjKUuKkwVoIiRXiDpHAsSmMmqQmMDNbNiyYUuIXBIiiIDdaiwSylLYOoHhuUVFWvFwLgJqBwWmfIiVvLbfcvNnyWwYaAaAVgGPpQqkKbKVlGVzLxWJeRrAfYJjhuUXxdDRjJKvlBycClMgGxXHslLSfFYXXrAICciGgafsaADdSpQqfcYJvLVJjDjQXxYCcjjwJfNVmhHMvngQqlaIuXGgoOSXcOoCxSrTGjJMmAbwsCcHlLFfIihSKkDncvnGuUlnNGRXxrFPJaFfUuzzHwWrZYyAuUjMTtiEefFlLNnquUrxBaAzVpPJjtTQUZNeAbuAEeLKklCmBYQRkrkxLlhOxXFfvVoHtWwTfAaCLcbjMApGYKQqaAanaEeAdDYFfyyqJLgAaGzZAaJGbcdrCOMmfFYyIispPcUuHZzaAtwBbScwYnAajyUGzZgGBbpmXrGgsiIQVIfdxXXoetTkKzmBCpGTEpOMPpoSwWswWZzgiKMmkkoMScheEEeKkygGBiLqQlIobAWwjZWPyXxYmMuUvnwRoxgcgpMJKAakOouUvViIghHGrNwQqWkcCZeYrhLlNVvTfFoMCcvVmqlwmEeMuZXsSmMCWjJndBcFqMmnPUaSXOojJjyDURrtaSMmEFHCZSdbDcZLMmmOqRQsSRTrRKktrPpqnXXDWwxFcCxXfQpvVPTOoQtmMWwFdDfdDsMZzxXIibsXxuUsXZuUBbIiPCOoIpdDPPpexoSxaAHoOWHHpdywxbbzlLpNnTvfFQvWwVzoJjwOteEdDtTMMGAGbBpKyYvjPUuQqZaLVvlpPUuDdNJjpzbBZKkjmMnuYpPoOyUagYouHxRGgrqFhHfkltxXlLTLcBmPpYyedJXlvVfRKXxoOEkKAwgfFGWLJzMmLIFRUuXRaQEPJEejUuupPMGgmUMxOOSsqUGeXlfpuUkBhHGppwlhWAKkzJujnNZNCRjJyHhhHqQCdDPpcqEIkgshHLeGgAwlZuakUubUOhumzfFPplcPZzpHuURibBqjJofVQBQlxuUuAaZZzCczLeMlrRhHUdDxXeTtOoJvakzZFvVSGLlLlqQgToOQDkKARbQNSstMpPHhluUzRgdcCNkKPpipdDJiVLwWDddeElMRrgMmWHhzGStJmBqQzZMSscCDdSsjVlLVvxANfFhDwgGpPpmKkCcJxXKkAajaACcoObeBRrGgbEGcqQwHLlIiDdRrCcBaAbhxLlXRQSZQHvIUNnuiplLWwNXoOWwNnqfPztGdvEyXxSlLhofpThVvOoZzupKsTKrBpTDXbiIKRoOQzmAaRCgBbbeIisShaLYyHDojJVvfovBbvhoTtOrtFjoyYcJmMkXRwYYyqYYomMtUjdfkpQBjJZzdDPpGRvzZkRQOQYkMmOodDlLaYyYFIifYyYGgcLtGGToBMcCdZKVdEEnHhNnvpdhtWMmEeAVDtTKkFQqFKkGgfgGUpwEenNWYyFFGOFfvJTtBsCcMmMCcTtGwaKkAWzpPpPmpicFQWFcCciIfPpOiRrIgGvnyCraApacCpBbNnEerzeKEejCsuYsPmvVjJkrRrYdCYpPAaaAkzWwZmaAVrJjlLXxUCNwWiIiWwWvDdVhCcgerlLxEeGmJjMEKktjhfYoOqQKkGgpWlleEDPpMQqmUzCczvLlAkKzxHBMmFfbrvNnMmgGZzqQYCcdDWwxAaVQQzSrRdCcAuUayYDkKSsCINncCidGgDKRdFHNnPyCleicCPpUuWwStTQqBrmRrvVPKkpklTtLHhBSRYzFBbjJfCgQqgGEqYBcKPzzXLkAmKkIvKYIiuaFIfIfqoOIgGrRiWkNQqQZUuHZnNyYhHeETAacNLHFQGgqJNnElLeKSsSmdLAManbBWwXxaCsvVuZUnkuzZZzULMAwWgGZFVvHCiaEEMHcfQqROgnNZwJjJxBPwoAkKMmaAwWeUfqouIihPpHUzHhHqCtPmCcbGlLXxZTmMdlnNUTfFfkKvcCcCVXNWFnNpFqAgfnQRYyrBUNwWEWNjRrzZkxXsLiIxXCclZqUSjtzfFZGoLlUQqFGjJTleEiIcbYBbIiVBbcgbBGdDCtcMmZCcheEaAmouxXBYIXGgezeAaEAaNozZlXDqQBDKkNnltTWiBbIckwcVvXiIIyqQEeIiEHIiJjrwMmUuyuCFvCSmMMlQSsHncORJpnufFAQqWwajPubBMkkKjJgGthHTuUKUkKRyMNEpDLaAlxYxVVviItTvrRXrAaFrMmYyPiIpMqQmyqMWcCOeEoMPpOtTaAomCEeuUKkmfAMmBiIQqZYOJpPCpPcmlOoLkOkXIiCxcgGUHhZwJjBqeEZRWYSsSxCviFqQneEcgPDdpIhBbyYyQsZzYySHlknrMfFGCkxXKOowWbVoPpZkhHCYRCFdhhHHGgiIRVOIiovEBbQxXgFDGZdhWwHDrwWXxCLLDIidhIiUuHKkFfzeZlLzHhVvzcCWVbTtifgygaVVTtvafJjTqivQLhHIHGgPphSsVFfXpymMrRbAoNeabdwWDHdhHDEehtauUTLlwdFfPrhIEVlLBbaQfPWwjeEJsWwgGBbdDQlGohlFfAoqTtrHVCChsbBqLKklprgdDWNUuicYInykKApRrxXGgbyYpupPIiPTjgbrRPpqQgiXrRxHhdbBNnDrzZRWZwKrEQqtrcCRGGdDUocCAbBgkKMmGaAhZHSPpFRbBQsDdOKtPcwqEUeZIivVsSziXSpYyPuUHrhHYbBgXxGgJtREVvRsStZzebupsXxvVzrhXdDTViQqIOQqGCLlmMcfHnNKNnvVkTdpPnNAzZrRywVVvjfFJvVvWYlhmMHbBLKkUqQqQusSnNVwtTWhMmBgGMmwrRRliILfpPFvVZzdoXxbFOobBAanhHNWEjJYqQqjRrxXjJzZIsSbrRImIQZiVWHEeUuhYIipXiIahHWkzLwKfjddDDShXxzsSJMBRfQStKkiIZtNnhTtLzlfSarRmMZzMNnmAbBEbBxyMLgPIiigGrRFKzRraSUuTtxKzxXZyYxXaAUScCrceEuRrYyohHUwWkKmOoyjUVAvznNbBDAWwaCXuULfFdhTOUZFjJbBDavVxGgiAWrRKknrRwEeNnWhHSUxUuTugSbBlvVgGLrRTvrIXXwNngqnCcNCcIiQzZGcCvMmvVVAXFBiYKkyaADRrDdXxeBbDdeEEKoOeInkOPpLloLlYbxQNQqKRShHhnsSNxYvZTMTtmkKCGkKJWUjJuDdIiMmwjCoXhHUeIbmujAaXfDwWfLkmPOopmMonlLYyxXPLleErQOfZPRZFSzGgRGCqQZAOoekKKnfUEpPcfHhFvtTuXAjrRqsvYyeoONuUnaAWwZXXxKkxzhHzKkSHhEcCbzZwQuNnSsIzZcFIitTzZFjSKWwgXyIiYxnNcCIDdKktUurdDRaAMneVDdKuUkvFIhnNavtFvqdDjtzfPYyxnljMcbCcBAxHhVIAneBQsiNngOoGvVjoUuOqxAykNKABbaklnsSXxNfFUuRrOoomyYBcCemJjxMardTtJvbcgcqhdgGgHhGPnIimiTouqNSsTsSYywmMVklsKYykPpNzJyiIiIonNxXBbWWaXxDTHZeEnNOoeEbBfFsSAtjYybBJbBmvAJyPpYpBYyczZIOoKIZxyYFwCyqtTtOlDaTtmMKGJvVyQHLlRpAdQqQPbhHThlHWnNfBbeWwwWxKkmMZooLOoGPpCcsjeoVvXxOVvANpkBFfthHFeIIiREoUuulLUOkjJTqQtKYiIHKPGgeUMzPiDdEeIZRrfPfFpFyYnDdqaLuJjuXReUeTXVQULlaROIiIhHFfQjFGbBWRcCIicgGCRrDbqRQeEQqQpvERrebDybbBQqUuPpbmHTTzkkKKaKkHpPJjrAqQhvhHVaAHdBLlImMvHhVntTpPNYySszHRnNpAaPrqQIgGmMVviZuUqQPpXLlCRfBxwJMmEeoYYbdDBbrxXOIzZpUnLcCsSvVNnSseLlLlDPjJzZZUuFgsTtnMmorRbBOlQqLHhoOuXKkzdDdVbBQZIiRVeQqECOocPTtlLJdDnNUujmoOLlMmMSynpPHhSsToXxOXLloONRrtfblSszZkOalLDdpPAtSyvzwHCchJAajOPfFpEeotpdaOCcorDdlFzAaZPpBYzZCkKcvWbdDkKTBBwbIETtytuMbhfFYWwPpFfHJrddbDddDpPCYyoOtSoVbWwBBbvOeEDdjXxJTtKUaAqQuDFfCUubYyXUuGlqMzZmdDEiYqzoOtObSsBPCuZYeEeMSwGglODZzKkvtlPpLdDkeMsSrLNnlouEeUpZzPksSLlKJhXxyYGSgGscHhklLrrRrdDRRGgkKdkKgpwdWwxRhqyakKlLoOBQbBumMUJjqbSsgsjJSGAYcsSgmMmQqxXaCJXPpzmMeEsUaAKkWjJIxXIDoOXmQtTqKxoOgGjUumMrKWwVAavuUWwaAuUkJjuKGOohEgDnXeExMmNSsoYyDQkKBbukjHhJfqQvWJjsPOonOaACpPawWDlLAaMmYsSYyLDcfFsSCcCTjoOBbkKsSEIieUgGugXJcCviVvCCccIVOEUuLsVDdRbVvHsSyYaAdDOocCiJyfGgwWZsSKCYyJkqjJYtTwwUUYSsyPpfZzjUaAGgsQqzZZzAaSdDOzhloynAamqRTtWwkKiIZzZzhHrlxQquKRYszPpfOFKnNVSukykNHlLiISrRsLQqllLpaUuXxOjJoUEeuCEKkBbUOouIiXvVacQhMIiCKkVCcCwWEecbKeLsSTpujJyHhydZKkXxzIiHhDesfiIKorfAaDdWwsOolLwjRrGMmgoODdRBgGEeGgNnbWwhHTfFtaVvIwhHbxpuvVgJXWwFfeEvSwdCJyPqQgaAGiCjFqCuSWcjnNJzZUOUuecuUJPKkpdDrRjCNAaiCcyYIcbsluYrAaUACeWBJJjKnNkzZpPjDdbBkKqQyDVXxCaBiIKkbZHhSqlLGsSOTAaPSczZCUoHpxywWYaaIyIiPpnOoFfdDBemXxkkwhrkiOUuUtNmMQnxTewWdpgGPDxXfbBFzaAZbBaAAahgGiwWIDdEeRrYyZfFzpPBbHBuUbEwWtTnyMmYNnfFeErWwRqXxvVVvQmWwfvVvPtQqsrMTjUSFyYfWwLlNnuXAhHfTiIaBarjIsbuxXmMqQUIiditYyjdYyDreEuNgznNRrNuBbkKUwNnWhapeXOQrUCcZteEXsSdDxjJqkEfWwFeryaAYRaAKYysPpkpPDdKfjZyYzCjGmMoOMPPrNZPZztTLlVcCvpjqihDdHTUuaAzFVCiSsDvbyuUYjoiIDdaCczIcasSYyFsUkxXsSRretpVvPSsQOqQfbmMjOoJFfhEHheHBZzbqBFfCtdgtLRTtiIQQsSqpBbTMmbBTwWUyYjJyvVIiYMmozGOMcqxXvLOFAXTtXeHpPhHoOGPlgNPpyrRyDSbBonNOLaAcClLJjPRrJQqjyMzZmLlsSZKJjujlVFfSxcCTwWDdvJXwRrWPRrCcKAPKkmdAaKWvVwOoXIqHhwWwxlLPREobBXxcdNdgWwGoyoOjdDfLlFmMEeJnbkKBNMKYgDdQGuFfHhVkthHnYsBFoOLHoOqHKkvVhZpPrRzeoZzvVLlKFfqQqQtWwTkcCYyOlLzdwhjyeVyYvpiMhHmIPiaAIXxtvkAtLlXxbdGgciGgIiIuyYUCRpPSxWAsnNSOoNnawohHuUXxKkBUHhuYyPSXxspLgGmlxXLclGgDOowePeRjOnNVVvAInNvQFYPEoOXxjJtNAjJIiDiAXPpKkXFZMnNcCGwWtTiIlLAaVIYyYNkwWHhUuKnqTtQbdsSZzkKpPJGgjvVuUDyYVvvVhrYiIIivVOogiuODGgTtdRrgAakKGlLltTprDdjJRPkmMlLTTttLlPGUlLMmSscaAvVjiJjyYgGgGBbkKiIxNndDNBnoAaOGZzUuZIiziZAazIgTtPcCUuiQcDvoYyoKiqQzlrLqFRrfsSwWDIiPpLlgfvVLlxAadxqQXgYydyMmMoxvbHYehOoJnrRegvVGCnNdihHaJMmJDcCrRdhnNhHbBsmmMJjwWhSUusHVukOowWQMDMAFfvUuMzZwdhHDSjJsuUWJNnuUlLvVJjhHkKYyuHmMcChDCMbBmZzWpVsSixXpvSeVDbGgRrVvdDgVbBvdnOLKAawWcUuvtDjQqbAMaPGgXQqxXhHxpYyNcNJRrjguUGnmGBhAaAaOAOoqRemxIQxlhHsozRrlHeZzIiriujJUNnRroONnvVFfCrgGBXRjJHhjHhLIbBqQQqIZGFfxXWwcpsWLlwSJjcPyGkKgFfBVdWHOoOoaIoKkZeCVpPDdvGgOogavVIfSBxXJjPMmpVXrpQDdqMbBbfarREegNnUusSGzZcgGCFuUfPpgBbGicCKpTKyDYMidDvVcCIqQmfFFIiXxUiIufRcCrMndrRDbhFfaZuUzPpsWwhloOxomMqQsSsOZFVvFRlrbBEeROoLPUFNnUoOZzQqqQpcfFRrDdCdQuUAaIsSfTtOfFTcCFIblOqQoLLWwlyZbvVMmqQqAefaAaABhHIbMSCuepPEkEeKzZQqyYDBleDdASsaEvVHsIiStAFaAfaqQJjcCUuNEPAMmDsSdCIicbBahHLlfRrpPPCcRrRrhLeEQzXvVrRUuGcxLCcvSsKFfKkocmMbPUgaHrEImRLPplNfFXNtTKNnkFpPfNniixGhHsUkKuSDFCciZzZPpzAvVcCahHcuUtaaiHhEeIPpxXMjJgYCAtmMdDscCWwjJNnYzBKmVvTBbvZwWHtTDmMUudhwSsTtDBbddXvoqQtTSsOVHheujsSCcJUhyYETPWwumJjdDMUuHkcCcaECqozAWwYyoOltqQBFfclLqGgQFJjEeoDdYAzZNThQqCcmznNaHZpPzhAMmJjGgCcYkKmMaAyjMmoWctTtkyYMFfhwIieEzeffxXzQqcClTOxqQXJJjpBbTtOoUZwWwWzfFyDGgBbyYsNnrndRHoQqXxTtOUVvZzuDdQXsjhkLsSluTeuUqHhQFfigGbBkcMmCMkKCVTtzZPprRLlYAgGHhPpjJaSOzHtThafFpPfivVqvVVOLlnBfFbAtndDcIDYyTSlIUuiZzDdVvLXnNblaQtUhZzXXxhHxzcFfWwCUSsGOjEDAaRfFrNnIiQqBkKLlbnNXxnNmMCneZzBbllLLtTrnRrquTXlLLlXtdGpIQkkKKxRJWCcpGqQgoOrdDQmMqFtJnxSMmrOWnNwDdQqKVvcCRrsTtSmEeMaygAamjitvbUZWzZKLsGgWtTlIlKbSsQqWVvlLVvadVvwWJyYXWvVPxXYyynMFfhHZreKfFcCRrkwWiIZzVFfvEuZzeNnSWXxZiIlQqnLyCcLDXxaiIoGgSsCSGggsSxqQYDhHdaQqvVJjqvVYXxyQAGdDgxDSXxJyrfFkqScXIlHzfFyYZhLYyieXdDfFWRrDdfFfiMmSFbBCcfgpPuUCsgbBHehHExFtDBbdOWwWuhHUcXZzrxlLwWaZzWNnKrigYyqQNnfFdDnNfXxlLFPpSsWMVetXwUCNQqcCBbpOZzoXJjWUCKPpkrPGaIiAgpiVRrBbvqjDdTQgeEGXZYhJRTtrBidDEnNjTJjWwRaMxoVTbRrDdvVMYyJaAlfFgkgxBjJWmAaGDdgyYPgGddGSmXZHhisedqYyQuoEyQIWwiOoJiIJMIjmKXxyYIieNxqoCbBccCOWwQXHjWrZzSsvNEqQQrdSAIGgpPWaTKkKkmwyYWELeETDdwllSfFKxXqQTYwWDlLGgNcCnBNnrFfBOAKBYybBkKnNHDoOWcTpPtCcUEgpAaPEeJDdTtVvPpmMKfVvKVviIKkuDdQGJEejgIiYyPpPOlKbhHDdVBqDdrtTimMPrRpIvVAtTOjJrHltMqQBwWtDifJtOHhopdSsRDLsUuJzrRSIilOoLIickpPKJqQjliXxIEerNnWkKzgyYGHSNHhIiriDdIZdDzqDdgspoOyaAYJfFjKqSsTGgGBbbVZzuqDdDdQUmMvxnNXxRwHhWdDBbiIxxKkTMsbBJXaAVvWbczZFfxpPXBPpbeEiUVvDMxlvfMmJPpjesldDLWwvVZzHHMsSMwcCWUQqVvppcqQflpPLFjYoOfGBcyKXCJjzZcdXxaAwWOoUuDdMjTtuUoOtqQqBnZfdyYBbcSPJjiyORVvdCcIiYAaymMoTkQEeGvsvVuUSkKfNsbBSnEgGyWwYiIuRrtTtKkeEdDdXvriFUzrRUftXxRnNLBPPYOLMttHhTdIWbEeyyYHsSIihwWlLxXJjTcCtQWwqYBgkswWYyVvlLoSsuBuiIeTtFVvfMRrHduUdjeFNwdViImakjJPpXxVDdhBbKWFmMXxuULDdlIIiiaJjvVXxTtDYJnNDdjiMllTDWwdgGDSsotTgGmMAAaOoiIXHDsJjNRbBrOotTmMTihwWHjZzHOiIlLohaAaQqtTfFeWwlLKpEefQqFPkeCzwWZXivVcYDdyUujJpdDlLQIpGMTeEqKkzZwvVuUgGTqQEnNhaEGgeXrRlkLLlmucCAaUKIdqQQmMKHsShbBUuwWJPMVMKkzZHhmaHhAXxQxBbXUDgGdqQumyUUuuoJgoawWAYyqTZOSsPtFDuUwFfWhHmMhHWwRrtTSCcvVdZzZzaFfAfRmZkKBbXRFTiIHhrRJPWkKpPyYDdIXxzZZrRzcCkBfFbRqQrJjFQmyYMzZqMmfeEKUvOPMmkbBYQqkKCcTtQqWwUuyKyEfhziDlIitTrRLdQqHhEeUSUoOMssSBiIAtTvwFpPfWOlzeEZVXUKmMZzkmEeeERrRkTtZzkXQlObByYcyZLoSsOtTlzAaCvVmMVKDdkvsShnMIieEmvVlLqmMVCRhzZDTtdWwkrmaAQqhHFaAvtTnNBboOxXVRRVvrjEeIiOkKfCPpcyHhrRqQSKkynAarWRvVvVeHdDpPvvVpfFPVWwhKkELlRAarrEefgNzOovVEnBbNZyjUZzzXxGTdDtcgJjOtIiTFfdngGNluDdULBbJRMQzYyAipHhMZzaOrRiEeGoOIiejwWXxJrRUZzoOrzZnvpbaAhnNaAjPpJgGESpPhBoObFCcHnfSATLlPpLluURrPpMzHKFfBbkivIIiqiXxANAnPpBRrwduUuUDGgRrgGnYNnywWJjgGdtTOxIiAhcSKkHhGmMGgfFpPSqjAaJQsNnYgGDQhHqyYRFfjSUoOuXnMmbkZRziqQITQqrzHhZEeUuRtGgMmanRruUTtKYvIcyYCJjxDGgFTMmMZzYxXVmMmViIvWwMatcCjJuUmVvdDMmMpVvDHVWxXjxXojMJpPZiIvVrXVZzmeEWrFxXlLhBbqQDMmdVvbqQBiIiIeEmcRrqIPFfdGNsIZvVzIoSiItTthHXSZcCQsSqLzZlIiGgiILdUuDFVvTwWeEAmMoOYyFfatoOmWUulLsRrvvMmUzfFZuWwYyYyFVvfnNBCcbFuQqjJbIiBZkKhOoHKkzVvZXxbaLkKlETtnNcXRRnNrrMZzvVGyrRxXQnNGBbghLlNnNayYDdnNATtLEPpiIeEhHjsaAAavVfeEvVATtarIlLUkKAaunfdDshhwuUcCuUXTQcvVKpPBzZbkGMmatYOVmMyYyYskKYFfdwWqTtQLSzZpPVkUJjdJjbSgoOpPxXpKWCqQcCxkKzZiIwWLeEDSFfsdgGrsSRLfFZlLeEpPgZXAaBVSPpAWwfMxXpHIiFDTtrRdbbBBbBCTpPtcviXxIlLxXVnNvhHvVyWgGGzIQjJntLhHlurnVKkvNHeEhRUPlAjJzZGTtuUeoOExXAauUhHjBbBSDdBZzmMvVYschHxTtGnLBbxOIqsFffFZzWuUWryYxCzZcIiXRUuZzDJjsSdbCsHhSfFgeEGuQqUYCcyJjcyaTtAYKmpPtTCcGnNsvUdDdGtTWwgHUudselMOoAaOaAogdOomMpPDZzGkRrQWwTtjkKzZdHozZaAfwWodgNnNTgjJijnNqoOOoGgMaymMYRYrRzZYyoOBzKksXCcqmDtCzdDZcEeTcCdoOgGjJZRqiIMpPAayYNnDRrdWYXlgGffPpUuFuUnNCFKFfNnhHBbuAdDYhqQmqQtTAaMnyYvJBbyYrRzxtNnQSeyYIhHiHjJhJlQdDqnNNhTtHnLjTtAFflUuhjPpJHmMVvVGgaANvjJnNUSsSsSsuqSsTtVEZzevqOEeLllLqQqtTLlsYNUaCkKnNcdDapPfGsijJVvrPpOoRSsebBWwCDdcigNpPoOnqblLBGgnqQNEOpPFdDfhpPrpPZzXxrRxmmczluNnULuhnNHRrDkWwKhHnNUASsaNxXhHAYIpOpvVIiPOoohHAaWIVviwPiIioORTxkKXiIjCcJUfdpzxonNOXZrRSsqNeQPusxXSVvvLYeWwZldDLZzYFmFfmbBbDoqQOQqknNKrFgJFrRfdDFyUuYfFfjvegslLeExXSwGgqQbBGbfYyIdDiuUGMvVpirJjwWRYshHxVvXDdkzIiZHhKnNSwWFrvwWVuUTrCcgOoLlxKkiIISsqHJjlAaaALhVvQVFFfJoOjgRDoYsrqPzlLZtTpbebBEFvuOvVoZzyYCcKQRZzqQEebBdrfFRQiIHhqYcWwGSIisusSuUsSTtCcmyYvmrRMUpZrRzUYCSsifqQTASsrhHPpyYtNnoOVfXkKDdlLxbKkBuYIVehBCcKpPkYyGXxuUvpPNnbrROoBVynNNaScCsTbHhFcCfYyWwBydDYOwWeWwcClFfUuPpmoZdAOoBbaDhHzVvOMefFmMbJGgEAaCcqQHhoOgGevlLuJwuvGggGkKLIzZzuXOoFhHAbIBbQqsPpJYycCNVvnbWwBjUuSiOocMmCmMIiUcEbBwbBzZDXTjJtSsbSsEyYEKkcdDCsSeveEVeEmMzZsSKOooOQdDaAnNRCFfcFfoOoOoOpHhPYiIydEehHcyRrVHWHZIwWHhqQiSoZzOYycCykcCKCCcduUHhrRDmMDOobuMmULdDlBYihHIDdBbyhHXIiiGgRfFrsimCKwlBVlHhlLmMhFDSBbEFQiIqlIhMSssPpqbqpzZPQrEeIirRhAaiqaAfFtDdTRFKkUiIaXQHhJjQdDqUwxLnNlXJjgdQqDvVGheeExMmbBLXxlXEDdxXYpvQqVJsSjZWwOoVlbwWBLvJhHjnNAafhBbLlTtrZzUuJxypPUFyWwftVEcCUujhxXHqQtwqKkNLlGgpHhMmeEAQciICtTqVvrHhwROooOoAagGFfXLfnNdDFIAxEnNSNnKoORrkxXFqVGlLgXxRDLldXxrvVvQdtpPTvVvEqMmeEgDdGpQqxCKBIQVvkKlYyLpwWPmMSDuUdsUcwWPdcCDdFMmFqQiIfOaATthnsSjUuJSQrPpeBIibEvUVoyCKpPCcoTtwdDDKkfuSsEecUNndDOopeoOCGwWjZzqQJFujJEDeExXKkYTtfWwZzFcCyszPQCcqnNOouUVvyYabBNSdAaoONvVJjnkKzBUuSsEvVepfFwAbBVvCcIilLlgpzZRrRrRmlLvtTeEoOOYyouUpkWjDdFoiyYinNIVvIOoWwhHOVgGurkKRhQqlLnlLqyGrRgDdYmMJhYyCuQEezzMnQAaJjqXVvQqxEeQoOqlLhxkKTrRyeEdBeZzIiEjCcJvVcCvVnvVWJlLjitaaAAineElLEejJiImMxeZzNnbmawHhmIQqiMCcsswJjWNyYpPpuzvprRnTyYsPpSpcDhPBjgGnNDiOYNnyaJSsYynhgGHZHQknaADdKkPTCwWtoOuJjfFSsUzxdvYinZxXxkKAaFluUDduJjvDAajJaHFasSRrhKkHAlwAdfRrYfFeEyFtTbBJFGCcgYyfHhqQfxXOFfdDNfFuUPIqQsSOlqQLotTtCGWQpPVnNpPXXEmrRYlLQdWwDxkcCaDdAKHJmMjBbZzcCZzRdBbYcOGgfFrRRhJjHwHhsSnNXaAhzZHpPITDdTtfwWFtiJjnNxqPpbqjKkoOJkJjjJrmMdDAacCGgMJjRrmRbymfFLzFfZcPvrRGgQBcCkKyPmgGNIingGBMmbqRPpHhroZGHYgWwGiUuILlvGgiIIiHhkWwJNkAaHhKFfnjIigDqepPEWwMmBRgGGaARrhoOTtMmoNhHRAaLljJPkKpSsyVvPpYrjrFtWTtwTWwfRttTMmkKQqrhRxSsOXkKlLtZRVeEQqvEetSwuUWlFfLOQqpKkPKkosBGgbcmCqGPpxkKuUXewWJjEgjueXocVmMvCJCczZKmMUukjhbBHWvVnNAgGaVIlrRLXxdXxDigeEGFfGOtTglLGSscBbegNPpnoOsSqNhCkKulZzLYRrDdyBUDdDwpPYxXkKDdrYydnqQLlNvVhHQqShbBcLlzZCcqkUgNnGuQKtJjTkOoXXPRFftTCcrxddDDmhHMXDkKhHSsdLRHhrlsPpSQKkhlCcLbBHIiqHPXLORXkKxGgyYyZzIiRsUsMmShHeKkJQEeFfQNnqHhJMmWWNnVvmDdOoMXxwxNfFnBbXwcCRIJjiFWXxQqwjbITtiRreacCNngDddfFDfFKnNvVTVNnvIdDseENnSsvBCJjIiiIcLlHhAAaiIUueEuDNQsYnNXxySJjdDXwWeGgEnmMzZPpOqsSQcyYAqQcEUmeEnpDovVXxDdFfPpSfFVHhBpPMmNoOfFneJIxXioOEzEeTtHIihkRroOAahrResSMFfpiIwWBbNqBRriIbQxXdSsDUuAatTUAauotklLHhTtfHyYfrRWnNwIlsPQmMYQpPqyluULqGWwgvVbBhYyHmMzkBMmwBtUKYymMkMSvVdTrRteJnyTpQqPmmLqAafjXxiIHhcbBXbBxkKLYVXtiILltTjlzZOoLqQNnJxMtYyvVWwbBkKBaAWOfFsSwWjJeRAjJYyYyLfkKFPlZzkKXxSsSGgXrAaRkKBkrSsgGLRrlBbYkKAveEnNDdVPUZzupsSCyYPpDSsKkKVvkMmQHhqpPhHrJjRSiIsKLlkLtTlxXBbXBbxijLwNkKnJQoOqjcNBoObnCOoRrvVsSihHIxfFgGuUEegGpfFaAQWzZoOwaAKLJjlqQkLzZrRlqRrQqQqPXMmQqHhyYAaVvfFzxXZBDLmTFdDftMokKOHBbhgYyBMmbfFeCjPpyYykKOEeFfDdopPUuNnJjToOZzWJjGgkKAuUaTtwWbZzBhyYHwHxySGgsYoOOoBSsbNnzsSqQbVvDGaFRroOiIfFfLlfTcCfFmMtHkKqDdSQdDqQxNnrRpPbBvVNWwpPaAJaAmMcCJJjuynNSsGtTAagGgjCcJWwZZkBbOjJWwDdAjRkKrJTtaTfZzuURBqQVvuAahhHHUaexwWXPATtapuUhDdeEMcfFChcCHxXjzDShCctVvOpMmAaPJjnQqNoJjIbBwFxGBYyDdsSsINniGsSsSBbspPSrRHNnhXAaDdxguUjfVNnvyjJbRQqdDGgKkGROorPpgYygVOovwWGNuUsSxXBOobPyrRrRbIinqQksSnNZYyfsSRRFwTtwWwdDhHZVvkKyYuunNUTtLvKtTkmlLOobBpejJEoOJqQjzZwCSCcseaAUugbBGNnNvXvQqkaYvtTVuPkKNnQlLfFnfxXsSmVvOohHDFhgGjJHZSZFfWwzTtKZzwWncCHGlRrrXxtTvDdVlMmgGVveXxzzZveEfFsSHCccHhCYylJjtTLUKkuYyxdDhHXjJZrRzsMcDdDvMmsDpPZoFfOffFeEhgeYyWwEGoKdDkgIiJaAzZeEjGiImMBbOPtTpLlduVvSsUDRzZrHhfVvFIAaiQqHMmaAhtQqsqQDuLBbxXTtlaAQqAaeTFftTcRrYyeEqQjXIiWRrwSFLlflLyYHhsNnkKoOMNnyuTtJkwYsSoOMmvygyYnNDnNpPdPpUunNBUuRhGkKqieqVZtfxXaANUFfmwWMvvVBZfFzNnZpPosSyYYyGgtTlwtpPOVZzBzZWqMmxXQwtTfFtTqQWVvTtmPpYQqyBehHzZhxMSsmWhHkLlRrKZNnIuoOXEGgpPUunbBfFlLCQqciWwIFfNhjJPpHhiZzuUKkSsJWOowjlLXxYnNyYIiyCoOqMmQdIiCcyYwWoCcofFOXhHsXvVxShHqnNcCQNyYnhsqMtxVvXTkAaKwHhTtHhUurRajaAhHdsSDEeXxOojTtJFfqZSaqQHfQRrqiIFZziIhfFjJlxXNwWKaAknDdHYydDhPpLVvDdEJjxyYXlqQBbLjJTtyYeMmUzZukdDzZAaLlZzBqCcQNnRBbXxvIOoicCaLlAIisSRrrVqQopNnJRuUZzuUhHVfvLlVDyYhfaqLlLjJSxSsTtXngGNJFfZzkKoOjdZzDXmcCMPrwRuUkBbLjJsOAzZaRQqrBcMmCJjRoONpPeWwrNnxXRrREeGgFOoQlLgEeLmnNzZMlmhHuUVeDdTtEveEMXJzdNPIiUwcCHrRsSiIyYGgjJtTBnzZTtNjJOthHRrIiVvZkKzbBrRiEnNRpPnNmpPYdwWDaAyTtfIiIiypPYMmFnNNCcJAfJjFvVaYyAXxtTamMfWwaAFkpIiwWPkIiHwQSspPaBUnkOodXxxXDKIwEelLWiqQNuBMLMmlNQkKoOuUqCaAIvJuUsnpmMDIiMhWwiHhIVvMmrBbRysSrNnHhRhHIiQBbrRyYqWwfFCbcCXxBJuUjGeEgcEesSwXaAGgNnxAahYKDdkyaAHFcHhcLtTdEFfeeECciIHhFBbFKMAajJpPTmcqQCoVGwWTtgpvVNnKkiIXxEehsSkKSsOXxoNnhHeEHVJrRjDdaAbBffFaAzDNndOWXxeEdDKteEiIKkMmTeErbBRTtQIiqrRSXxsoIiOoOYtsSMmLshHSGglZztfFqQTsGdDgSvAZaALlfFwWTttTAaiIUxXSOLlozZPpuAoUuonNOIwAaWiMqRrQcXxCPpPtToUuOKkpyNQSMmseEjssSSbBXHhZzxOtToHhCcmMTxMmfFTtrRlLsUGPZzfFiOMmiIoLlEzZeSscRrCuUAalLfFZzNnjJxXapPlEevVhHmMdSsOIsILxXlLHhlxXiSChIiIPsSGgcqQBFhHfZsSzdDRyYxCVrRKkoORFfrvDdoxXxTtZXxlUJjEeuLqFfMBbljpPMnNPpoOyGgbBxXAaTtYeEmJNzZyYzZmCuUbnNBIiBrRYywOoGrAOCcoLCclaeEGgRrzGgZRhxxGkKgldDAQvSWgGuUhLgGlTtHspGgPShHuUFnKkNfpCcPJNglLdpPDQiIRrlOoLaWwBbUkKuoyYOmMHhUuygkKOcCoyYZzIiCcGhXSbZzdlLDNDdbBnBAbtTBnNaXLlCcXyYPpDJSuaAriwWyYIfFRuUtTJNnyYjpPciICImrRwuQQlLoOXiWwTtTtykRrhEezZvVdDwWOoOoisZFfzPpMeEmXxSTtIeElLNnfGiIvVKOFfXKaZdDMmipgGNnxXiTtDdApDdYyPaIVzZxXKQqDdkNnWwvjOooOyYfFhlLHoZuUEezOfPLljJpttVkKMkKXTtxNblLaTtAWwBrRUuoOmMnmvDyZzmxXMeEyYxQqdzZvWwkKHhNYcChzZTtHvGAlLaiwWlKkLKkzZjJkVgGkKvKAZzaIgkKxPOBbefQqFRMbYAaFLleECcWKkcyYeEwWoOAbBzZeEbLlRBxXbTtrWwBaVvVaVqNxXqQnmvVMuWFTtBbfwKkUwhjesYyOyqQgGICeuatTXvVxigGYyEEtiMmIIiZWBbplLPuCcUwcCzhyEeYHgGZzRhHrCLtTFfzZlccKkRVqQKksKIimxIiXMEOoSfFzZcCsXCcxSsxeEBpgGWwpHMmhftTsSrRpPFPPwWpxEesLltHhOooOSWwmMPAaNnpPgGphHsdDhiIQXxqvqQNnVcDdCHEPpvsqzeEkKZFfQjJSVesyYSnNOMmvEeGQqsWwrRSUgGDdugwWoOVeEyYNnaHhtgwiIjTNntiXxIJUjJCcAGgaIiZddUXxukoZbBzjRDdXqQzZxdDsSrRvVOZsVuFoOwWiHhuUIyTtYfaAWQqzfqQxXFrNnRuUsCmUzZuUUcCuuIWwiMbBGgYDCcSHsSmWkKJjxXLloMmmMyuURhHKkreETjOkKSBbHhsvfVKZQkKIiqzOokvvVVQqxXClLkKeEuUvQqzZiMoOBbNICQqIBPpbMmGOoghmMTtwByWwUCkGpPoOctAaTCgFmqQYkhHpUuBbPNnKyYUuyMJjJcSsZzCyhqQHRWnRqQrNprRPwrfFwWYgGkKVPRcCKkBbOCcDDbDdBnNXxvjkAZlLrRtTfFNCcnWclLSCcsmMyYFQqfnIiNeyYEkwWKtTpPlqDdQDdDdtTLCoOuGgrIiiIpPXLlYyHXlLxzDdUuHhEeZydUuDwEeqQZOozZQqkKCcDRrdzGeEUuYPsSpyaAtuUYybVvVpEePBSsAoOzZQELlgMsSmCxYyCtcCeNVoOmnNMKiqQRaAriIYsiYyEzZGNTXxtGDTtdrTtdDNtTnTFadDdDyOoYyYaIiLNCAaCccEnNenlcCWvVwJluUZWwJlLlvaORromMJjApUdGgJjqDdEeSseEaACTtcqjJQKkzZfxbBoOMmsSJjWmYyjwWJhdDUuugGUEpJjPeSsHJjyPRrLlpcCYMXxIFfRrgGizZyYxXrRJjPzZpWmMEeiICcuUnNwATtxXEJHhRrTbBtjJjJtTFZzTtZTteEnTTtFfYnNMmRryBJjkOIoOvVNYgGcCXqFfhHJKkevViIbGgBvOlLoGgVNxXntTwWXxwWUeEemMFfNfkKFeiIoODdHJjhvNpPnZzuuUUIiUcvVxeEgGvrRBbVimMKVvksLlfFcCaACBbcSsVvmMPpSMdbBNnJjDFfEecKkPpCmIdLkOoNnKaAXxlLlqQDOIioreAacCDdvnqQNibBQqIiIBYSVBbvjdDCcsoOSPputQlLFfcCeXaJjAxZzTBOobtEFfyYZjJzBWwDdbHHhexXvCcgGVEcUcZzxQFfqpLlPIiuUSNgGnAblLBaIiyCcTOOMMmLdKkDHDdahNVvsVvCgGWwgGqQeeECBbcIuhHUifFERrIijADUFfudrRCcypPuUQOZoOzomMqNpPnYvExXfFeHhQRxDdBWgSseEGgiInNsSvcCVGwmMaLlKkVveoOdDSSsBUaAubJjmMhHVYKkyvQqAahoOFWGgvVLlJjwjVvIgGiiIGglHhyYLBhHuPpGNwfFxXolBbEeKkiINbOofFllJMmjdxXDgxXGLXaAAaLRGgQsizZoCRrQhHqmaAMcPcCRrhHjtTJDtQqQqTGgTtVvGWwTtgnNbBFfMnNmdJzZjRrsOoSHhOokADaARrpcUuCPNnIEJwWoUuOjeIiejJDNndQqNMGgmkUVxXIivyzZYNWwnelLFfGMmghHvVEuKLlmpPMlLBbHCoSsOchpPcEaAefsSFLlCaAghEzZeHSsGDduNKkWfFjJWwOSGgrCIflLFqQAaidvVhgvVGscmMCMmnJjLuUVvgGlVcCvwWrLmMfvVQvVbByYFfyuUSsarRArJjjpoOmMPfJjUuYyVvFkTzZtKkyYdDFfIiSsJjWwhHNnCcekKekKEuRrHhFfeXVvxemMEjJEBbIiaGlzZLTttKkVEqUuhHsnNSFvZiIrNnyYEeYyzZRCcOoAOPpovVAadDDdJjtgGOlLoVQqsSvZzOoTAiIaBcfFYyCbtPpToOIipPzIZRrzivVAaYySTtgGsVvxkpPtnNTGgKsSdGgPnNpDdLlDZzXJjLBblQqyYYlFfWwLgGytTMmyMpPnNvtTgGEeVzZvuHhpPghHGHyYzZhmMUtTOOoHKDdGgyoOwWIFfKeEKkPpkSBiIhaUuoOEwWeHhAwWxXQKRrGgPplLJzKkNJjnyYZNMmnNJjlLnvVjvVkIrBbNnBbrRByYbeoODdIiMmLlCcAanNyYyIiUuYEeEqQUuRrRCLlcvVMmXxiqWSQBHhGxXiWwIvVMmgPrSMuUDdTAgGafWwFBbtGgpPcCjkKPpJfFCVzZrNnRQyYNXxnqNnvcTBvVbKkKTtoOpPkVQTtqvPpZzBbpXxaAPoOuSGZzgiFffFJgovVeEJOolvTmMoOqsImMiSWwAAxXaeRCcyYvVrjJNPpvVaOSsYyoiGgndDNnNEeHhIiIrHZYMxveESUusVnNvMmtTsSVqVvQQWbBwlSsqQLWwGHhgIimMIrhHRYyxUPvVOxXZzEeHJjUuOlLYyoDSUusnNaAdyYhotTpPpxXnqNnFfQyYNuWZeEzfEekbBotTOWiInNdPpDXxwKFfuoOUbbYyCGgBbcCIZzAPpeLlEVupPhHvVSjJsmMxXwWUiIeEMmWVvwNjJfsqQHCcMmhSUtwlLKkVyYvvVLXsHhHhTtsLlrRSuyYGVtTmMQwWqMmMsSCBbccCmBYrRyjQqnriGgIRPpBxBbcIiEejJCXcCGgZzfFwWstTHhhHSiaJWwjAxXGgFeEsSfCJjcYyZiIioOtTyYIUqwWQZuTHhtUEnLlNwWQKknoONPpqFfAgfFGaexAxXCcOoFpPfyDrRnNDdDddYOoaXINnuUsSLlquofFhHxXOUTtiubNrRMwWJjrRTtuQqKkKkuURYyAabSsBUuhVvuUnNHvqQpdGzZgDuXxJjSsLMMmmlgGUWOoyYacCEcCemQqAaMTtDdjJiICcsSvrRNnVBbuUAaxwWXANncCzTtBZzoOqyYQnNnNAWwasaAeEhHSEensSaASvVsNpRrujUgGuOokDdKzZBbAaSsNnHhRrFFfKkHKlLmmMkGgKBbRriIGdDzZPWPxXpMAaMaAZzmmwQqYyKKkEetTkOoLlBbrReEBbEevEeVQvFsnNaAVmMPRYCJAajcEYyeytTrpCcvVvwXxVvWruULlRbBaASUukOoMytTuUAxXuUazZJnNjeElHhLlLKlLFFfGjJgZdDcCHGgAaEPpMmehzzZEecCWOynNgGYoJncCNhHNnJjjtmQqMWwVEehXxNvXxVnGgqQxXqQZiWaAwIzAYpPDdyZzlLklLDdAgGXxQqMmjJrmMNnRakKRfFrjJRrWTtEewJtHhzZTtqQXyYxdUAaaAdDcCuyYDXxsSCcYRYmMyzZIiraAPpvVhHZeEUuYIiqQnNsPpSZzyxRrXeEWwaHhWfFGgwVwRRrrpPWWOoBHhbIikKEQqeOqDdQopPwWHhzEeLlZRrwLlkKtRrTzZvBSUuJjEeZzyYeEsOFfofYbBjJyPpFCcNneEGghHVvZAaILlRUuBXxjWEewCcZzTtgGmMwiIWJpvVxXdxXKkDEeJjPbWTthTtHwsSlLEeZzHhyWOoIgGiGgnNzZeEfFwSsYuUysmMSYSEesbBWMmLNYyvVnxXdDlwDpPglLGVfXdDxFOpPohHvhHoOqQuPpPpUdrWUimMIuMmCcjdYyDeEzZXxKkFfxeEEzTtZeyQqQqQqYmMtTUubBjEVveJkKHhXJcCikKIRrhHxXJPXxpMmjFzZfnNNXxAanbBSsyYUEeXxGguCcFftVvTmsSMmMuUNcCnshHrNbBHiIgGhnyYRzHiDdmMnNWKXxxXkPpwIXcCxhlLUgGuKRrzZyYaAFlLfYylLaAkXHhxTtZLlsSxXUbBiIJjMdYvVZSxXcCuUEbBeyWwYWHLlfFkFfKhRoOmMQVuUvzZqwWryYoDdfFUuhYycCHjeEmMJMmqhHQuUaAOZzzZoAaOgREjsSJsSsSetTpmMpDdEegGEpcdDCPePfbBuUtTFoOZPpiIziAanJeEjbBXxHheEXCcCcRrtTZzsSBbxmMLlPpYuUyNISsCcntTrOoqQcOoCCcgGbWPpRVJjvrcCwnAaNbWsSwBIGtTgPiImMBbFDAaSxXsdfphsSHuUCcQqBbbBoONOoNVvndDAmManqLlrRQTwWQqKkCctivVRhHdDrRYyrLlrRMYQqqWlBjJcCAabLsFeEfyYeEVcCbAaBvvVOjJDdoRruiIMmWwnNUupgGPuUUXVGIihHoOjJPXUuxsaASHhoOpNPpnqUMmOoVvUuNIiQqJMmEeGgjEekpPKOAAayRrmMYXxaogGnCcooOOEebBmMKkTtAUuSbaABEefFBLZzMfRrEeBbsSSsRHhQqnZhHzNrbBUPpuvVFJjJHgGhjNnjZbBzJNgWwMmGZzPpOoOkKoiIZAazLfFSsxMpPmXlpPMxXmMxXYywWmMmMDdDdlLdRrDMuZpPzWwmiIkKMQqkKUHkKatTAvVtTSxUuQCZzwWcZzmmMNZznhHLuUlDeEHhKkdDbPpBdiJjIMCcBbCcdRbBrDDdBbnNeAazNnZxSsXiOyYEeoNdDnrJjmMRIgGitTIFfAaALlanSLlvlLVskKNskKhHeESpPqQsSGgwhHkKWzZEWwwWrxXqQnNfVvtRaArTAcCaiaAIAaKYykMDdNnTtzZRPYypYKJUujkEOlLoesScrRCHhyWwARrarbKknNfiIFxXiKmMkIwZvVzdDWsfQqbBIiFBbSvZKtTkzDEeoOBvVfFBbfFUsxXSuIiLRricCICAacQqlAabPHhAfFazLlMmZuFfUAaHrRdDhXxssSSLzZkKEelwQqmMWwmNnMwWWIAairRxXphavaAVqCcQxrRXEkKeKkAHJjEqQbBeYyPxXiIRiIHhALlvVarkZzGiIgKhHpMmDdNnxXSKkUpPMmuFfgGSswWsnNYyXdDxdLlpPYIikKyRrCcGrRmrOoRcCHhIiMralLXTtxXDNndurRUuUmMtTkKpQqdDdDPtTOoPZzbpQzZqGMmaNnpPAgPmLlIiDdsSbaAQACcBbaWwqUsSuMNlLvVnLlmmzZMIiBDWwSsdMBSsRrcCDdMwxXWmYvVXLcClxYyjJfFOoymbgGBjJrRoUuOMAaANnCcRraedDLvkKVlrRVPpsSuUYvVCcyvkKqZddDDpPzQzkKUNnbBuZmMiIEAYyaGwWUuHhguZqQzUHhNnGYhHydcCyYhHDgAaLYylJjVvLPjJpNnluUnNmMoOLUuiIlSeEswWqEeHhxXaApPQaAgbBoOGTtOoDdcTwWFftYwWyfFTOhHotTCctvVMmBbFFffkBKOoTtkbDqQdoDdOKDdZzQqNnBbcyYdDuOoXxUCGtTgrRQuUFfqrrRBqQpPbRrAaKPbBDdmMRRrrcCyhHwWDdYTIitKYJjIAaiyIiTzZBwWbtkoOAZzdDnNNnWwiIhcCHYwWyXxrqQvVRdbBBuUbDvVksSsSLlPpPpUujzqQZGgJMmBbKIXxidDNnwWoOIGgNnihHqRrQkKXTtxsSMAnwQqWjlLJSzZIiuUjJEUDduUueoOanNiIAVUuCCYyYycDdAJjahHqQhHcgGxXnStTsNZzJjvsNnxLlQqkKwWXzZzHAahyYZMqEenLlqQNQXxJjUuNmSsMyXxYnmUUuoOuNTKktrRxDNDdndXJjrRiIaAuFfJjUIiGpPgyaWIiwAFfcCfaAFnNtTDdeEHhJjAnNLEefFeElDdSkKssSRrKkmMkKLraAmMhHlsSjJLRYylIiVqcCQSsvWuUwrRaAasIiOgGUuVvEeFfxwWsRrZzZzEiIXSKkPpVOovsSsxraAReStTVIivhqYjJyQXkBbiIKxNnNGDdgnZxXOONnoEeAaWwMmGgUqQvKkiIVuoZdDIiUBtTfFbkKexXEuPCchHptjJxdrRDOoGgXGgTzJYycCjNnDNnhHNndPTtQDdqidRrnRWnKkNwrcCkAaKmvVMPpHvVvVhuwWUcCNnTSsRrHbBCcTtdcSsSskKCftTFmMMmDUutTyuDdZzUYcChbeEBtmjJPpPpSsMkPpzZkKRnvVehHENYytyFfzZYffFFTQqYzAaqQZUuyzZrKPpiwWIvkIiKMmVYeERrJjyUuMSsEejkKJmKfFcCktMSMmOoqQQqssSmzZrWwRwyYHUZzjJhHucCVvRrQqBRrbhcGjJrRgBHhbCVvkKsSzkKXxZEeWjJzZOoj \ No newline at end of file diff --git a/advent_of_code_2018/day5/main.cc b/advent_of_code_2018/day5/main.cc new file mode 100644 index 0000000..f530207 --- /dev/null +++ b/advent_of_code_2018/day5/main.cc @@ -0,0 +1,56 @@ +#include +#include +#include +#include + +using namespace std; + +size_t collapse_polymer(vector polymer) +{ + int react_diff = abs('a' - 'A'); + size_t oldsize = 0; + while(oldsize != polymer.size()) + { + oldsize = polymer.size(); + + for (size_t idx = 0; idx < polymer.size() - 1; ++idx) + { + if (abs(polymer[idx] - polymer[idx + 1]) == react_diff) + { + polymer.erase(polymer.begin() + idx, polymer.begin() + idx + 2); + --idx; + } + } + } + + return polymer.size(); +} + +int main() +{ + + vector polymer { + istreambuf_iterator(cin), + istreambuf_iterator() + }; + cout << "Read polymer of size: " << polymer.size() << "\n"; + + size_t minsize = polymer.size(); + for (size_t idx = 0; idx < 26; ++idx) + { + char current = 'a' + idx; + vector filtered{polymer}; + + auto it = remove_if(filtered.begin(), filtered.end(), [=](char c) + { + if (c == current || c == toupper(current)) + return true; + return false; + }); + filtered.erase(it, filtered.end()); + + minsize = min(collapse_polymer(filtered), minsize); + } + + cout << "Smallest collapsed polymer size: " << minsize << "\n"; +} \ No newline at end of file diff --git a/advent_of_code_2018/day6/input.in b/advent_of_code_2018/day6/input.in new file mode 100644 index 0000000..250be86 --- /dev/null +++ b/advent_of_code_2018/day6/input.in @@ -0,0 +1,50 @@ +118, 274 +102, 101 +216, 203 +208, 251 +309, 68 +330, 93 +91, 179 +298, 278 +201, 99 +280, 272 +141, 312 +324, 290 +41, 65 +305, 311 +198, 68 +231, 237 +164, 224 +103, 189 +216, 207 +164, 290 +151, 91 +166, 250 +129, 149 +47, 231 +249, 100 +262, 175 +299, 237 +62, 288 +228, 219 +224, 76 +310, 173 +80, 46 +312, 65 +183, 158 +272, 249 +57, 141 +331, 191 +163, 359 +271, 210 +142, 137 +349, 123 +55, 268 +160, 82 +180, 70 +231, 243 +133, 353 +246, 315 +164, 206 +229, 97 +268, 94 \ No newline at end of file diff --git a/advent_of_code_2018/day6/main1.cc b/advent_of_code_2018/day6/main1.cc new file mode 100644 index 0000000..a503088 --- /dev/null +++ b/advent_of_code_2018/day6/main1.cc @@ -0,0 +1,125 @@ +#include +#include +#include + +using namespace std; + +struct Point +{ + size_t x; + size_t y; + + Point() + : x(0), y(0) + { } + + Point(size_t x, size_t y) + : x(x), y(y) + { } +}; + +istream &operator>>(istream& in, Point &point) +{ + cin >> point.x; + cin.ignore(); // ignore ',' + cin >> point.y; + + return in; +} + +inline size_t manhattan_distance(Point const &p1, Point const &p2) +{ + return (p1.x > p2.x ? p1.x - p2.x : p2.x - p1.x) + + (p1.y > p2.y ? p1.y - p2.y : p2.y - p1.y); +} + +int closest(Point location, vector const &points) +{ + int index = -1; + size_t mindist = std::numeric_limits::max(); + + for (size_t idx = 0; idx != points.size(); ++idx) + { + size_t distance = manhattan_distance(location, points[idx]); + + if (distance == mindist) + index = -1; + else if (distance < mindist) + { + mindist = distance; + index = idx; + } + } + + return index; +} + +int main() +{ + size_t width = 0; + size_t height = 0; + vector points; + + while(!cin.eof()) + { + Point point; + cin >> point; + + points.push_back(point); + width = max(width, point.x + 1); + height = max(height, point.y + 1); + } + + cout << "grid size: " << width << " x " << height << "\n"; + vector counts(points.size(), 0); + + for (size_t idx = 0; idx != width; ++idx) + { + for (size_t idy = 0; idy != height; ++idy) + { + int index = closest(Point{idx, idy}, points); + if (index == -1) continue; + ++counts[index]; + } + } + + // if a class hits the edge its infinite. + // we check highest and lowers rows first. + for (size_t idx = 0; idx != width; ++idx) + { + int index = closest(Point{idx, 0}, points); + int index2 = closest(Point{idx, height - 1}, points); + + if (index != -1) + counts[index] = -1; + + if (index2 != -1) + counts[index2] = -1; + } + + //side rows + for (size_t idx = 0; idx != height; ++idx) + { + int index = closest(Point{0, idx}, points); + int index2 = closest(Point{width - 1, idx}, points); + + if (index != -1) + counts[index] = -1; + + if (index2 != -1) + counts[index2] = -1; + } + + size_t maxclass = 0; + int space = counts[0]; + for (size_t idx = 1; idx != counts.size(); ++idx) + { + if (counts[idx] > space) + { + space = counts[idx]; + maxclass = idx; + } + } + + cout << "biggest class is " << maxclass << " with a size of " << space << "\n"; +} \ No newline at end of file diff --git a/advent_of_code_2018/day6/main2.cc b/advent_of_code_2018/day6/main2.cc new file mode 100644 index 0000000..952cc6d --- /dev/null +++ b/advent_of_code_2018/day6/main2.cc @@ -0,0 +1,73 @@ +#include +#include +#include +#include + +using namespace std; + + +struct Point +{ + size_t x; + size_t y; + + Point() + : x(0), y(0) + { } + + Point(size_t x, size_t y) + : x(x), y(y) + { } +}; + +istream &operator>>(istream& in, Point &point) +{ + cin >> point.x; + cin.ignore(); // ignore ',' + cin >> point.y; + + return in; +} + +inline size_t manhattan_distance(Point const &p1, Point const &p2) +{ + return (p1.x > p2.x ? p1.x - p2.x : p2.x - p1.x) + + (p1.y > p2.y ? p1.y - p2.y : p2.y - p1.y); +} + +int main() +{ + size_t width = 0; + size_t height = 0; + vector points; + + while(!cin.eof()) + { + Point point; + cin >> point; + + points.push_back(point); + width = max(width, point.x + 1); + height = max(height, point.y + 1); + } + + size_t region_size = 0; + size_t distance_limit = 10000; + for (size_t idx = 0; idx != width; ++idx) + { + for (size_t idy = 0; idy != height; ++idy) + { + size_t sum = 0; + Point current {idx, idy}; + for_each(points.begin(), points.end(), [&](Point const &point) + { + sum += manhattan_distance(current, point); + }); + + if (sum < distance_limit) + region_size++; + } + } + + cout << "region size: " << region_size << "\n"; +} \ No newline at end of file diff --git a/advent_of_code_2018/day7/input.in b/advent_of_code_2018/day7/input.in new file mode 100644 index 0000000..46bbcd8 --- /dev/null +++ b/advent_of_code_2018/day7/input.in @@ -0,0 +1,101 @@ +Step J must be finished before step K can begin. +Step N must be finished before step X can begin. +Step S must be finished before step G can begin. +Step T must be finished before step R can begin. +Step H must be finished before step L can begin. +Step V must be finished before step W can begin. +Step G must be finished before step U can begin. +Step K must be finished before step A can begin. +Step D must be finished before step Z can begin. +Step C must be finished before step E can begin. +Step X must be finished before step P can begin. +Step Y must be finished before step U can begin. +Step R must be finished before step O can begin. +Step W must be finished before step U can begin. +Step O must be finished before step Q can begin. +Step A must be finished before step P can begin. +Step B must be finished before step E can begin. +Step F must be finished before step E can begin. +Step Q must be finished before step U can begin. +Step M must be finished before step E can begin. +Step P must be finished before step U can begin. +Step L must be finished before step Z can begin. +Step Z must be finished before step U can begin. +Step U must be finished before step E can begin. +Step I must be finished before step E can begin. +Step H must be finished before step G can begin. +Step X must be finished before step I can begin. +Step K must be finished before step X can begin. +Step Z must be finished before step I can begin. +Step S must be finished before step M can begin. +Step L must be finished before step U can begin. +Step A must be finished before step M can begin. +Step W must be finished before step A can begin. +Step N must be finished before step A can begin. +Step S must be finished before step E can begin. +Step W must be finished before step Q can begin. +Step J must be finished before step L can begin. +Step Q must be finished before step L can begin. +Step M must be finished before step U can begin. +Step H must be finished before step E can begin. +Step D must be finished before step E can begin. +Step V must be finished before step P can begin. +Step Q must be finished before step M can begin. +Step X must be finished before step W can begin. +Step K must be finished before step I can begin. +Step T must be finished before step H can begin. +Step Y must be finished before step L can begin. +Step G must be finished before step O can begin. +Step M must be finished before step Z can begin. +Step F must be finished before step Z can begin. +Step Q must be finished before step E can begin. +Step H must be finished before step C can begin. +Step Q must be finished before step P can begin. +Step D must be finished before step U can begin. +Step Z must be finished before step E can begin. +Step O must be finished before step M can begin. +Step L must be finished before step I can begin. +Step J must be finished before step A can begin. +Step Q must be finished before step Z can begin. +Step P must be finished before step I can begin. +Step K must be finished before step O can begin. +Step R must be finished before step E can begin. +Step W must be finished before step F can begin. +Step D must be finished before step Q can begin. +Step R must be finished before step U can begin. +Step W must be finished before step P can begin. +Step S must be finished before step Z can begin. +Step T must be finished before step P can begin. +Step B must be finished before step Q can begin. +Step S must be finished before step T can begin. +Step R must be finished before step A can begin. +Step K must be finished before step R can begin. +Step N must be finished before step G can begin. +Step C must be finished before step W can begin. +Step T must be finished before step A can begin. +Step B must be finished before step Z can begin. +Step C must be finished before step P can begin. +Step D must be finished before step P can begin. +Step B must be finished before step P can begin. +Step F must be finished before step U can begin. +Step V must be finished before step X can begin. +Step K must be finished before step W can begin. +Step Y must be finished before step I can begin. +Step C must be finished before step B can begin. +Step X must be finished before step L can begin. +Step X must be finished before step M can begin. +Step H must be finished before step P can begin. +Step S must be finished before step F can begin. +Step J must be finished before step Y can begin. +Step Y must be finished before step Z can begin. +Step B must be finished before step I can begin. +Step S must be finished before step C can begin. +Step K must be finished before step E can begin. +Step N must be finished before step Q can begin. +Step A must be finished before step Z can begin. +Step J must be finished before step I can begin. +Step Y must be finished before step O can begin. +Step Y must be finished before step F can begin. +Step S must be finished before step U can begin. +Step D must be finished before step W can begin. +Step V must be finished before step D can begin. \ No newline at end of file diff --git a/advent_of_code_2018/day7/main1.cc b/advent_of_code_2018/day7/main1.cc new file mode 100644 index 0000000..0cca6d9 --- /dev/null +++ b/advent_of_code_2018/day7/main1.cc @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#include + +using namespace std; + +struct Constraint +{ + bool placed = false; + vector requires; + vector required_by; +}; + +bool satisfied(Constraint const &constraint, string const &plan) +{ + for (char c : constraint.requires) + { + if (plan.find(c) == string::npos) + return false; + } + return true; +} + +int main() +{ + array constraints {}; + + while (!cin.eof()) + { + char step; + char requires; + + cin.ignore(5); // 'Step ' + cin >> requires; + cin.ignore(30); // ' must be finished before step ' + cin >> step; + cin.ignore(12); //' can begin.\n' + + cout << step << " requires " << requires << "\n"; + constraints[step - 'A'].requires.push_back(requires); + constraints[requires - 'A'].required_by.push_back(step); + } + + string plan; + while(plan.size() != 26) + { + for (size_t idx = 0; idx < 26; ++idx) + { + if (!constraints[idx].placed && satisfied(constraints[idx], plan)) + { + plan += static_cast('A' + idx); + constraints[idx].placed = true; + break; + } + } + + cout << plan.size() << " / '" << plan << "'\n"; + } + + cout << plan.size() << " / '" << plan << "'\n"; +} \ No newline at end of file diff --git a/advent_of_code_2018/day7/main2.cc b/advent_of_code_2018/day7/main2.cc new file mode 100644 index 0000000..7556cce --- /dev/null +++ b/advent_of_code_2018/day7/main2.cc @@ -0,0 +1,142 @@ +#include +#include +#include +#include +#include + +#include +#include +#include + +using namespace std; + +struct Constraint +{ + bool placed = false; + vector requires; + vector required_by; +}; + +struct Task +{ + char step = '\0'; + size_t time_left = 0; +}; + +bool satisfied(Constraint const &constraint, string const &plan) +{ + for (char c : constraint.requires) + { + if (plan.find(c) == string::npos) + { + cout << "Constraint not met in plan '" << plan << "', missing " << c << "\n"; + return false; + } + } + return true; +} + +char find_satisfied(array const &constraints, string const&plan, string const&goal) +{ + cout << "Finding next step from plan '" << plan << "', already done: '" << goal << "'\n"; + + for (char c : plan) + { + if (satisfied(constraints[c - 'A'], goal)) + return c; + } + + return 0; +} + +int main() +{ + array constraints {}; + size_t plansize = 26; + size_t baseline = 60; + + while (!cin.eof()) + { + char step; + char requires; + + cin.ignore(5); // 'Step ' + cin >> requires; + cin.ignore(30); // ' must be finished before step ' + cin >> step; + cin.ignore(12); //' can begin.\n' + + cout << step << " requires " << requires << "\n"; + constraints[step - 'A'].requires.push_back(requires); + constraints[requires - 'A'].required_by.push_back(step); + } + + string plan; + while(plan.size() != plansize) + { + for (size_t idx = 0; idx < 26; ++idx) + { + if (!constraints[idx].placed && satisfied(constraints[idx], plan)) + { + plan += static_cast('A' + idx); + constraints[idx].placed = true; + break; + } + } + + cout << plan.size() << " / '" << plan << "'\n"; + } + + cout << plan.size() << " / '" << plan << "'\n"; + + /************************************/ + /************************************/ + /************************************/ + string done; + Task workers[5]; + size_t duration = 0; + + while (done.size() != plansize) + { + ++duration; + for(Task &task : workers) + if (task.time_left != 0) --task.time_left; + + for (Task &task : workers) + { + if (task.time_left == 0 && task.step != '\0') + { + done += task.step; + task.step = '\0'; + } + } + + for (Task &task : workers) + { + char next = find_satisfied(constraints, plan, done); + if (next == 0) break; + + if (task.time_left == 0) + { + if (plan.size() > 0 && satisfied(constraints[next - 'A'], done)) + { + task.time_left = baseline + (next - 'A') + 1; + task.step = next; + plan.erase(plan.find(next), 1); + } + } + } + + cout << "Plan / Done: '" << plan << "' / '" << done << "'\n"; + cout << "Workers on: \n"; + for (Task &task : workers) + { + cout << " Step: " << (task.step == '\0' ? '-' : task.step) << "\n"; + cout << " Time: " << task.time_left << "\n"; + } + cout << "\n"; + // this_thread::sleep_for(std::chrono::milliseconds(1000)); + } + + cout << "Total time: " << duration << "s \n"; +} \ No newline at end of file diff --git a/advent_of_code_2018/day7/test.in b/advent_of_code_2018/day7/test.in new file mode 100644 index 0000000..1dfd2ea --- /dev/null +++ b/advent_of_code_2018/day7/test.in @@ -0,0 +1,7 @@ +Step C must be finished before step A can begin. +Step C must be finished before step F can begin. +Step A must be finished before step B can begin. +Step A must be finished before step D can begin. +Step B must be finished before step E can begin. +Step D must be finished before step E can begin. +Step F must be finished before step E can begin. \ No newline at end of file diff --git a/advent_of_code_2018/day8/input.in b/advent_of_code_2018/day8/input.in new file mode 100644 index 0000000..3ddd4c7 --- /dev/null +++ b/advent_of_code_2018/day8/input.in @@ -0,0 +1 @@ +9 11 7 3 5 4 3 5 1 7 0 11 7 1 2 1 9 4 6 9 5 8 1 2 1 1 1 2 1 3 1 5 0 6 6 2 4 1 3 9 2 1 3 3 1 1 8 0 6 1 6 1 1 8 8 2 1 1 1 3 3 2 2 2 1 1 3 1 3 4 1 5 0 8 8 6 7 2 1 3 6 8 1 1 2 2 1 1 9 0 11 7 4 3 3 1 7 1 7 9 5 9 1 3 1 1 1 2 1 2 1 1 9 0 10 6 2 8 7 7 1 9 2 3 2 1 3 2 3 3 2 2 2 2 3 3 4 4 3 4 1 5 0 10 5 5 8 7 2 8 1 2 2 5 1 2 3 1 1 1 5 0 8 7 4 9 3 4 1 7 1 2 1 3 2 1 1 9 0 10 1 2 6 4 6 5 7 7 1 9 1 1 2 3 1 1 1 3 1 2 3 1 2 3 7 1 7 0 9 6 1 3 4 7 2 8 7 5 2 2 2 1 1 1 1 1 7 0 7 1 4 6 7 2 3 3 2 1 1 3 1 1 2 1 8 0 7 1 7 4 5 5 5 3 3 1 2 2 2 2 1 3 5 3 3 1 3 4 5 3 6 1 5 0 8 4 4 4 1 4 9 2 4 1 1 1 3 1 1 5 0 9 6 9 7 3 2 9 5 7 1 3 2 2 1 1 1 8 0 9 7 5 6 3 7 8 6 6 1 1 2 2 3 2 2 1 3 5 5 1 2 5 5 3 6 1 1 4 5 3 6 1 5 0 8 6 2 2 1 4 1 7 5 1 1 3 1 2 1 7 0 9 2 3 4 1 1 5 3 8 2 1 1 2 3 3 3 2 1 8 0 10 6 1 6 9 2 5 2 5 3 1 2 1 3 1 2 1 2 3 4 5 5 2 3 3 3 5 1 5 0 10 5 7 3 6 2 6 1 1 9 9 2 2 1 2 1 1 5 0 10 8 4 5 1 1 1 2 4 5 9 1 3 3 3 1 1 5 0 7 6 6 3 2 3 5 1 3 1 1 1 3 5 1 5 1 1 3 7 1 8 0 9 7 7 1 4 7 1 9 1 3 2 1 1 2 1 1 2 2 1 6 0 7 7 6 1 1 2 6 7 3 3 3 1 1 2 1 7 0 7 3 4 3 1 1 6 2 1 3 1 3 3 1 2 1 2 2 1 4 5 2 3 7 1 7 0 7 1 8 6 6 3 2 8 1 2 3 1 2 3 1 1 9 0 9 6 3 4 6 1 6 3 4 4 2 1 1 2 3 1 1 2 1 1 5 0 9 7 1 2 2 6 6 6 6 8 2 3 2 1 2 2 5 4 1 4 1 3 6 6 1 4 2 5 5 3 6 1 9 0 6 2 2 1 8 2 9 1 1 3 1 1 1 3 1 3 1 8 0 8 8 3 5 9 9 6 1 5 3 3 1 1 3 1 3 1 1 9 0 8 1 2 4 8 4 4 4 1 3 1 2 1 1 2 2 3 2 4 1 2 3 3 2 3 5 1 6 0 9 8 7 9 2 1 4 1 8 8 1 1 3 2 1 1 1 6 0 6 2 1 4 6 2 2 1 3 1 2 1 2 1 6 0 10 7 6 1 8 7 8 4 7 8 6 3 1 3 1 2 1 3 1 2 5 5 3 5 1 8 0 8 2 7 7 2 5 5 1 6 2 3 3 2 1 1 1 3 1 6 0 8 1 9 9 4 8 4 9 4 1 3 1 1 1 2 1 9 0 11 4 4 6 4 8 9 6 1 3 9 9 1 1 1 3 3 2 1 2 3 3 1 2 4 3 3 4 1 5 0 7 5 9 2 9 6 1 1 1 1 1 3 1 1 9 0 11 8 5 5 8 2 1 7 1 8 2 3 1 3 1 2 2 1 3 1 1 1 6 0 10 8 7 4 1 3 4 3 8 2 1 1 1 2 1 2 1 3 3 5 1 3 7 1 9 0 9 6 7 7 9 4 2 1 8 3 3 3 3 3 1 2 3 1 2 1 8 0 7 7 4 6 1 6 6 1 2 3 1 1 2 1 1 2 1 9 0 9 8 1 5 5 5 4 5 3 9 2 1 3 2 1 3 2 1 3 1 3 4 4 4 1 4 7 3 5 7 2 4 5 3 5 1 5 0 10 3 9 4 1 8 1 9 5 4 6 1 3 2 2 3 1 6 0 10 1 8 7 5 6 8 9 9 3 8 2 1 2 2 2 3 1 5 0 6 1 7 6 1 8 8 1 3 2 1 3 3 5 5 2 4 3 6 1 5 0 10 4 1 1 5 4 8 7 4 4 8 1 1 1 1 2 1 5 0 8 7 4 1 6 6 8 2 1 3 1 1 1 3 1 7 0 9 1 8 1 7 7 5 1 7 7 3 2 3 1 1 3 1 4 2 5 4 1 2 3 4 1 9 0 11 2 5 3 5 2 6 5 6 9 1 8 3 3 2 2 1 1 2 2 1 1 5 0 10 2 9 7 1 5 1 5 4 5 2 1 3 1 3 3 1 7 0 8 3 8 7 9 8 1 1 1 2 3 3 1 2 1 1 5 2 4 5 3 7 1 5 0 8 4 7 7 4 8 1 6 6 1 2 2 1 2 1 6 0 6 1 9 9 6 2 4 2 2 1 2 3 3 1 7 0 11 1 2 3 5 7 4 9 2 9 8 1 2 1 1 1 1 3 3 3 5 4 2 4 4 4 4 2 4 1 3 5 3 3 6 1 9 0 7 8 2 5 4 1 8 7 3 1 2 1 2 1 2 3 1 1 8 0 6 1 2 6 9 5 1 2 2 1 2 3 2 1 2 1 7 0 9 3 6 5 2 2 1 3 6 3 2 3 2 1 3 2 1 5 4 2 2 5 5 3 6 1 8 0 7 1 5 6 4 1 1 6 3 1 3 2 3 1 2 2 1 7 0 6 4 1 5 6 4 1 2 3 1 3 1 1 1 1 8 0 7 7 6 1 8 4 2 1 1 1 3 2 2 1 2 2 4 3 3 2 2 5 3 5 1 9 0 7 3 8 1 4 5 1 5 3 1 3 3 3 3 1 2 2 1 5 0 11 2 6 8 8 9 8 4 1 3 5 1 1 3 3 1 3 1 7 0 10 1 3 2 8 7 6 7 5 8 4 2 2 1 1 2 2 1 2 1 4 2 1 3 6 1 7 0 6 1 5 3 7 3 1 2 1 1 2 3 1 3 1 8 0 9 6 6 8 8 7 8 5 2 1 1 1 3 2 2 3 3 2 1 9 0 9 1 3 6 5 5 7 8 6 6 1 1 2 3 1 2 1 1 2 4 3 4 2 1 1 3 4 1 7 0 11 9 6 4 6 4 5 2 1 3 8 2 1 1 1 3 3 1 1 1 6 0 7 8 5 1 1 4 7 5 1 1 2 3 2 2 1 5 0 7 2 1 1 1 5 2 7 3 2 1 3 2 1 5 4 5 1 4 1 5 5 3 7 1 8 0 9 4 4 2 1 3 6 3 3 9 1 3 3 2 3 1 1 1 1 7 0 6 4 6 1 8 9 3 2 1 2 3 1 2 1 1 8 0 7 6 2 6 1 3 1 2 1 1 3 1 1 2 3 1 3 5 4 3 2 1 4 3 5 1 5 0 8 4 2 4 7 5 2 3 1 1 2 1 2 1 1 6 0 10 8 8 1 3 1 9 6 7 4 7 2 3 2 2 1 2 1 7 0 9 9 2 7 7 1 2 9 9 1 1 3 1 2 1 2 1 5 1 3 2 2 3 6 1 6 0 7 3 9 2 2 1 1 3 2 2 3 1 1 3 1 9 0 6 5 3 3 1 8 9 3 2 3 3 1 2 1 3 1 1 5 0 10 1 6 2 4 7 2 1 1 6 9 2 2 1 2 1 3 4 5 4 1 5 3 7 1 6 0 6 1 9 9 2 1 9 2 1 3 1 1 3 1 8 0 7 6 4 3 3 1 1 3 2 3 3 1 1 1 1 2 1 6 0 8 5 9 2 2 1 8 9 9 1 2 3 1 1 2 4 4 2 2 5 1 2 3 7 1 9 0 6 1 6 8 1 9 7 1 3 1 2 1 1 1 1 1 1 9 0 8 1 5 1 2 6 9 6 9 1 2 1 1 2 1 2 2 2 1 8 0 6 6 4 1 7 3 6 3 2 1 3 3 3 1 2 1 4 1 2 4 2 2 5 5 3 7 4 5 3 3 7 1 7 0 10 5 2 7 1 1 6 2 8 9 3 2 1 2 1 1 2 2 1 9 0 7 6 3 1 8 8 5 5 3 3 1 2 3 1 1 3 3 1 6 0 7 3 1 3 4 6 2 7 3 1 2 1 2 2 3 3 4 4 4 1 3 3 6 1 9 0 7 7 8 2 1 1 2 6 2 3 2 2 1 3 3 3 1 1 5 0 11 4 2 2 5 7 4 2 4 4 1 3 1 2 1 3 1 1 5 0 7 4 1 3 7 1 5 1 3 1 1 2 3 1 3 2 1 1 4 3 5 1 9 0 9 9 1 9 9 1 1 6 7 9 2 3 1 3 2 2 1 1 2 1 9 0 7 3 2 1 1 8 6 6 2 2 1 3 1 1 3 3 3 1 9 0 8 4 3 3 8 9 5 5 1 3 1 1 1 2 1 1 2 3 2 4 5 4 1 3 6 1 5 0 7 1 7 1 7 3 8 2 1 1 2 1 1 1 7 0 6 7 1 7 7 3 9 1 3 3 2 3 2 3 1 8 0 9 1 4 6 8 2 5 5 9 2 1 1 2 1 1 3 2 2 2 1 1 3 2 2 3 6 1 9 0 9 9 6 6 8 6 8 1 1 3 2 2 3 2 3 2 3 1 2 1 6 0 10 8 9 1 1 7 9 7 3 2 1 2 1 2 3 3 1 1 6 0 10 9 1 1 7 4 9 3 5 7 5 1 1 2 3 1 2 2 5 5 2 4 1 3 2 4 4 9 3 7 3 4 3 3 7 1 5 0 9 8 1 7 5 4 4 7 2 4 2 1 1 1 3 1 8 0 7 3 6 7 4 5 1 1 1 2 3 2 2 3 2 2 1 7 0 11 3 8 9 6 7 2 7 9 9 4 1 2 1 1 3 2 2 3 4 1 3 2 2 3 2 3 6 1 6 0 9 8 5 6 7 1 9 1 1 5 3 1 1 1 2 3 1 7 0 11 4 1 1 3 8 2 1 6 9 1 1 2 2 2 2 3 1 3 1 7 0 11 9 2 1 5 4 1 1 1 5 9 5 3 2 1 2 1 3 1 3 3 5 2 3 4 3 4 1 7 0 11 3 7 1 8 2 4 8 3 5 1 2 2 3 1 2 3 2 1 1 7 0 9 4 8 9 1 3 9 9 9 4 3 1 2 1 1 3 1 1 9 0 6 7 1 2 5 6 3 2 3 2 1 2 2 2 2 2 1 1 1 2 3 4 1 7 0 7 4 1 2 5 5 7 1 2 3 3 1 3 1 1 1 6 0 7 1 3 7 2 7 1 5 1 1 3 1 1 2 1 6 0 7 9 7 1 3 7 8 8 1 3 3 2 2 1 4 5 5 3 1 6 1 5 3 3 4 1 9 0 6 2 1 7 9 2 1 1 3 1 3 3 3 3 2 1 1 5 0 11 7 7 2 5 1 8 1 3 2 9 3 1 2 1 2 1 1 8 0 10 3 1 6 6 4 4 1 5 9 2 3 2 1 1 2 1 1 2 3 5 3 2 3 6 1 7 0 9 9 9 9 3 1 3 1 1 5 3 3 1 1 1 2 2 1 9 0 9 7 4 8 1 1 7 2 1 1 2 1 3 1 3 1 1 1 3 1 7 0 10 4 5 6 4 2 8 1 5 1 6 2 1 2 1 2 3 3 1 3 2 5 5 5 3 4 1 6 0 11 8 5 3 1 7 7 8 4 5 6 9 1 1 1 1 3 3 1 8 0 10 6 5 7 5 5 6 3 9 6 1 1 2 1 2 2 3 1 1 1 6 0 6 1 1 5 7 1 1 3 1 3 3 3 1 4 3 4 2 3 5 1 7 0 10 7 1 5 4 5 1 3 9 1 3 2 1 2 1 3 1 1 1 7 0 9 7 2 2 6 2 4 1 1 3 1 1 1 2 3 3 1 1 6 0 6 1 7 7 7 9 2 3 1 2 1 3 3 1 1 1 3 5 3 4 1 5 0 8 1 9 3 3 1 8 8 6 1 1 3 2 1 1 8 0 11 9 1 8 6 3 5 2 4 8 8 9 1 2 2 2 3 2 2 1 1 9 0 10 1 7 6 7 4 1 6 4 7 5 1 3 3 2 3 2 2 2 1 1 4 2 5 7 2 4 4 4 3 6 1 6 0 8 1 1 9 7 9 6 3 9 3 2 2 2 2 1 1 9 0 7 6 9 1 7 1 5 3 2 2 1 1 1 1 2 2 1 1 5 0 7 5 6 4 1 6 7 8 2 2 1 2 1 1 1 1 1 4 1 3 4 1 7 0 6 1 1 4 7 8 5 2 1 1 2 3 2 1 1 6 0 10 4 6 9 8 8 1 1 1 1 8 3 1 3 3 3 1 1 7 0 9 8 8 7 7 4 5 3 1 2 3 3 1 1 3 3 1 1 3 2 3 3 5 1 9 0 7 9 6 9 3 1 3 9 1 1 2 1 2 3 2 2 3 1 5 0 10 3 9 8 6 5 4 3 1 5 3 1 3 1 1 1 1 5 0 10 1 5 9 5 6 8 5 8 4 8 3 1 1 3 1 2 1 4 1 4 3 5 1 9 0 6 1 6 5 4 1 5 1 1 1 1 3 1 2 1 1 1 5 0 10 9 5 1 1 7 1 4 4 2 7 1 1 1 1 2 1 7 0 10 3 2 1 9 7 2 2 4 5 1 1 1 1 1 1 1 2 2 3 1 4 3 5 2 1 6 5 3 3 7 1 9 0 11 8 2 4 4 9 1 5 2 7 6 1 1 3 3 1 2 3 3 3 3 1 6 0 9 2 4 2 7 5 1 6 8 2 2 1 2 3 2 3 1 8 0 9 3 2 7 1 8 2 6 3 8 1 2 3 1 1 2 3 2 1 4 3 3 5 4 3 3 5 1 5 0 9 1 3 7 5 1 6 3 6 1 1 1 2 1 1 1 5 0 11 2 2 7 1 4 1 5 6 2 3 1 1 1 1 1 2 1 7 0 7 3 5 1 4 5 3 6 2 2 1 1 1 3 2 3 3 3 3 5 3 5 1 7 0 10 1 7 1 4 9 1 3 3 9 4 2 2 2 3 3 1 1 1 7 0 7 2 6 2 1 2 9 7 3 2 1 1 2 3 1 1 8 0 9 1 3 7 2 1 4 4 8 7 1 3 1 1 2 3 1 3 2 5 3 4 4 3 6 1 7 0 8 2 1 1 4 4 3 4 6 1 1 2 1 1 1 2 1 8 0 11 1 7 5 9 8 8 7 9 1 8 8 1 2 3 3 1 2 2 3 1 7 0 7 5 1 1 1 7 1 4 2 1 1 3 1 2 1 4 1 2 4 5 1 3 6 1 8 0 6 1 2 7 9 1 2 2 3 3 1 1 2 3 2 1 9 0 7 2 1 5 5 9 7 9 1 1 1 1 3 1 2 3 1 1 9 0 11 1 1 9 4 7 9 9 8 3 3 8 1 1 1 1 3 3 1 3 2 5 3 1 2 1 4 3 6 5 4 4 3 6 1 8 0 11 6 1 2 3 6 9 2 7 5 9 1 3 3 3 2 2 1 3 1 1 6 0 6 1 8 6 1 2 9 2 3 2 1 1 3 1 8 0 6 1 9 9 7 6 5 3 3 1 1 2 3 1 1 1 4 2 2 2 3 3 5 1 7 0 8 3 1 5 2 8 1 5 9 3 1 2 1 1 2 3 1 6 0 11 5 2 2 8 1 3 4 1 1 9 6 2 1 1 1 1 2 1 5 0 6 3 3 1 3 9 5 2 1 3 2 3 2 3 4 3 3 3 6 1 6 0 7 7 1 1 3 1 7 8 3 3 3 1 1 2 1 6 0 6 9 1 2 7 2 1 2 3 2 1 1 1 1 8 0 8 9 3 1 7 8 1 3 3 2 3 1 2 1 2 1 1 2 1 4 1 4 5 3 7 1 9 0 6 1 2 6 5 9 8 1 3 1 1 3 1 2 2 1 1 7 0 6 7 1 3 1 2 9 2 2 1 1 1 3 2 1 9 0 9 1 8 1 9 5 7 7 1 5 3 2 3 1 2 1 1 1 3 2 4 1 5 2 1 5 3 1 1 5 4 3 3 5 1 6 0 8 1 2 1 6 7 1 6 1 3 1 2 1 1 3 1 5 0 8 8 1 8 5 9 2 5 5 2 1 3 1 3 1 9 0 10 1 4 1 3 7 3 5 8 7 2 3 2 1 1 1 1 1 3 3 5 1 2 3 2 3 6 1 9 0 7 2 1 1 2 2 1 7 2 2 1 3 1 1 1 3 3 1 9 0 8 9 7 2 6 1 3 4 8 3 1 1 3 1 3 1 3 1 1 6 0 9 4 6 7 7 1 2 5 4 2 1 1 2 1 1 2 3 2 1 1 3 2 3 5 1 7 0 7 7 1 8 7 1 6 3 3 1 3 2 2 3 1 1 6 0 7 7 8 3 4 3 8 1 2 1 2 1 1 2 1 5 0 6 3 9 1 5 2 9 1 1 2 2 3 1 3 1 4 4 3 4 1 5 0 9 6 7 1 6 6 3 3 3 1 2 3 1 1 1 1 7 0 7 7 8 1 2 2 7 7 1 3 1 3 3 3 1 1 9 0 8 9 9 8 7 8 1 3 9 2 1 3 3 3 1 1 1 3 3 1 4 4 3 2 1 4 4 3 7 1 9 0 10 9 9 9 7 1 5 2 5 6 1 1 1 1 3 3 2 2 2 2 1 8 0 10 6 4 4 5 4 1 5 7 7 4 3 3 1 3 2 1 3 3 1 9 0 7 5 9 7 6 4 8 1 2 1 3 2 1 2 1 2 1 2 3 3 3 2 1 5 3 5 1 8 0 11 9 4 1 1 9 4 1 8 1 9 7 3 1 1 1 2 1 3 3 1 9 0 9 5 7 4 1 1 1 9 1 2 3 3 1 3 1 2 3 3 3 1 5 0 9 1 1 1 6 3 2 1 1 8 2 3 2 1 1 4 5 2 3 1 3 5 1 7 0 6 1 8 1 7 7 1 1 2 2 3 3 1 2 1 5 0 7 2 1 3 1 2 6 1 1 1 2 2 2 1 6 0 11 7 7 4 7 5 3 8 1 8 9 1 3 1 2 3 2 1 5 3 5 2 3 3 6 1 8 0 10 2 7 2 4 2 1 4 1 5 1 3 1 1 1 3 2 1 1 1 9 0 9 6 1 9 4 7 1 5 1 3 2 1 1 2 3 1 1 1 1 1 8 0 11 6 1 2 2 1 9 1 1 2 3 7 3 2 3 1 1 1 2 3 3 2 3 5 4 4 2 1 5 2 5 2 7 7 3 5 4 3 7 1 8 0 7 3 1 9 7 8 1 8 3 3 2 3 1 2 2 2 1 5 0 6 3 4 1 3 1 3 1 1 1 1 1 1 5 0 11 1 9 1 2 6 7 2 9 7 3 8 1 1 1 1 1 2 3 2 5 5 1 4 3 5 1 8 0 11 7 7 3 9 5 9 7 5 9 1 3 1 2 1 3 2 3 1 1 1 5 0 7 1 6 1 7 9 7 3 1 2 2 1 1 1 8 0 8 8 1 7 9 7 1 1 1 2 3 1 2 2 1 2 1 4 2 1 3 1 3 7 1 8 0 7 4 6 4 4 8 1 4 3 2 1 1 3 2 2 1 1 6 0 11 1 6 5 9 5 5 7 4 9 3 1 1 3 1 2 2 2 1 7 0 10 1 6 9 7 3 7 9 6 1 4 2 1 3 2 1 3 1 5 3 2 5 1 4 1 3 4 1 6 0 8 7 6 3 6 8 3 1 9 3 2 1 2 1 3 1 8 0 10 7 2 6 1 3 3 9 8 8 9 3 2 3 1 3 1 1 1 1 6 0 9 1 3 2 6 6 4 3 5 5 3 3 3 2 1 2 4 1 2 2 3 7 1 5 0 7 9 2 7 2 1 9 3 3 3 3 1 2 1 8 0 9 5 9 3 8 9 1 2 5 8 2 3 1 3 2 1 1 1 1 6 0 11 3 7 6 1 4 1 8 2 2 2 8 1 3 1 2 3 1 3 4 3 2 3 1 1 3 4 6 7 5 3 3 6 1 7 0 10 7 7 1 2 5 4 7 5 2 7 2 2 2 1 2 1 3 1 9 0 9 7 4 2 1 9 1 2 1 7 2 3 2 3 2 3 3 2 1 1 5 0 7 5 2 9 4 6 1 6 1 2 1 2 1 1 4 4 3 5 1 3 6 1 7 0 9 5 7 1 7 7 1 3 2 7 2 2 2 1 3 2 3 1 6 0 10 5 2 2 9 7 1 2 3 3 7 3 1 1 3 3 3 1 9 0 7 9 2 3 6 3 1 6 2 1 3 1 2 3 2 1 3 1 5 2 2 5 1 3 6 1 5 0 11 3 7 1 6 7 8 1 1 9 5 2 3 3 1 3 2 1 8 0 9 9 1 1 1 5 1 8 8 5 1 2 1 1 2 1 1 3 1 8 0 8 2 9 1 1 3 2 7 7 1 3 2 1 2 2 1 2 4 2 3 2 3 3 3 4 1 9 0 6 3 2 1 2 2 4 1 3 1 1 1 2 1 1 3 1 7 0 9 1 4 5 3 4 9 2 6 7 3 2 2 2 2 1 1 1 5 0 11 3 5 4 4 5 9 8 4 1 1 4 3 1 2 2 2 1 1 2 1 3 6 1 9 0 8 4 1 7 4 6 9 3 9 2 3 2 3 1 2 3 1 1 1 9 0 6 9 4 8 3 1 3 3 2 1 1 1 1 2 3 3 1 5 0 11 1 3 4 7 1 7 7 9 9 2 1 3 1 3 1 2 5 2 5 3 1 2 2 5 3 4 4 3 6 1 5 0 6 9 9 1 3 2 9 2 2 1 1 1 1 5 0 10 1 5 9 4 6 4 4 8 1 2 2 1 3 1 1 1 5 0 11 9 3 1 4 4 1 7 9 3 2 6 1 1 3 2 1 4 2 3 3 5 3 3 5 1 8 0 9 7 1 9 8 8 3 7 1 7 1 1 2 3 2 2 1 2 1 8 0 7 1 1 4 8 7 2 8 1 1 3 3 3 2 2 3 1 6 0 11 1 7 4 2 3 6 1 5 3 3 1 3 1 1 3 3 3 3 1 5 4 2 3 4 1 8 0 9 4 7 1 5 3 2 1 7 9 1 1 1 1 2 1 3 3 1 7 0 9 8 6 5 8 1 1 4 6 1 1 1 1 3 2 2 1 1 9 0 11 3 7 1 7 1 8 3 2 3 2 7 1 3 1 3 2 1 3 1 3 4 1 1 5 3 5 1 7 0 8 1 1 9 3 9 1 7 2 3 3 1 2 1 2 2 1 8 0 6 8 9 6 8 2 1 1 3 2 2 1 2 1 1 1 5 0 6 6 9 5 1 6 8 1 3 2 2 1 1 3 1 4 1 4 3 2 4 4 5 3 5 1 8 0 6 2 9 1 3 1 9 2 1 2 2 1 3 3 3 1 7 0 8 1 1 1 9 3 1 4 1 3 1 1 2 2 2 1 1 8 0 10 8 4 8 5 6 1 6 7 4 7 1 3 3 3 1 2 2 1 2 5 3 1 2 3 4 1 8 0 10 1 9 2 2 1 5 8 6 2 3 2 1 1 3 3 1 3 3 1 5 0 7 7 1 3 3 1 3 9 2 2 1 3 3 1 9 0 8 1 8 8 6 2 9 2 6 2 1 2 1 1 2 1 3 2 1 3 5 2 3 5 1 5 0 11 6 2 1 3 7 2 1 1 8 2 9 2 1 1 2 1 1 7 0 10 6 6 1 8 1 5 4 9 8 5 1 1 1 3 3 1 1 1 5 0 9 7 2 7 1 4 8 8 1 1 1 3 1 3 2 2 5 4 3 2 3 5 1 6 0 7 8 3 6 5 6 9 1 3 3 2 3 1 3 1 6 0 7 1 4 5 5 9 6 1 3 1 2 2 1 3 1 5 0 11 1 6 6 8 1 6 4 1 4 9 1 2 2 3 2 1 5 1 1 1 5 6 6 1 3 3 4 3 3 6 1 9 0 8 4 2 1 8 2 3 9 1 3 2 1 1 2 3 1 1 2 1 8 0 9 8 8 8 8 1 7 8 5 1 2 1 3 1 3 1 3 3 1 7 0 7 6 3 4 1 1 2 5 3 1 1 2 3 3 2 3 2 5 2 2 2 3 5 1 7 0 8 3 9 8 8 7 1 8 3 1 2 1 3 2 2 3 1 8 0 11 3 2 7 7 4 5 1 2 6 2 1 2 2 2 3 3 2 1 2 1 5 0 6 9 1 7 1 6 5 1 1 2 1 3 1 2 1 3 5 3 7 1 6 0 9 5 1 1 1 3 2 5 2 9 1 1 1 3 1 1 1 9 0 10 4 7 8 1 7 1 4 3 7 6 1 2 1 3 3 1 1 3 3 1 5 0 11 8 3 4 4 4 9 5 6 1 7 5 1 1 3 1 2 4 4 2 1 3 3 1 3 4 1 8 0 7 4 8 1 6 2 4 1 2 1 1 2 3 2 1 1 1 7 0 10 5 7 1 1 3 6 4 6 4 7 2 1 3 1 2 2 2 1 7 0 8 7 2 6 7 1 3 5 8 3 3 2 1 2 2 2 1 3 1 3 4 3 3 5 5 3 4 1 8 0 8 6 1 3 1 5 3 7 8 1 3 1 1 3 1 1 2 1 6 0 11 1 1 7 2 9 3 2 6 3 3 6 3 2 1 2 3 1 1 5 0 11 4 7 3 1 2 4 6 8 3 7 7 1 3 2 1 1 2 5 5 4 3 4 1 6 0 6 6 7 5 7 1 8 1 1 1 2 1 2 1 8 0 7 8 9 7 7 3 6 1 2 1 1 2 2 1 1 1 1 9 0 11 4 5 5 6 2 9 5 4 9 2 1 1 2 1 3 1 1 2 1 2 3 1 4 1 3 4 1 7 0 7 1 9 4 1 9 9 7 2 3 3 1 1 3 1 1 7 0 10 5 1 8 1 1 4 8 7 2 3 2 2 1 1 2 1 1 1 8 0 8 8 1 7 3 7 5 8 5 3 1 2 3 2 1 2 2 5 3 5 1 3 7 1 5 0 11 2 2 2 1 2 9 2 9 4 1 7 1 1 1 1 2 1 7 0 7 6 1 6 3 7 5 9 1 1 3 1 1 1 1 1 5 0 11 7 1 8 1 3 7 3 6 7 2 5 1 3 2 1 2 2 4 1 2 1 5 4 3 5 1 7 0 11 6 3 7 3 4 2 8 4 1 9 8 1 3 1 3 3 1 3 1 6 0 7 6 6 6 8 1 1 1 1 3 3 3 3 1 1 6 0 9 4 1 7 1 9 6 3 9 6 2 1 3 2 3 1 2 5 2 3 1 3 5 6 7 3 5 3 3 6 1 8 0 9 9 7 4 1 1 4 5 7 9 3 1 1 2 1 1 3 2 1 5 0 7 3 7 5 1 5 1 1 1 2 2 1 1 1 8 0 7 7 1 7 8 4 2 8 3 1 1 3 1 3 1 3 2 5 2 1 1 1 3 6 1 6 0 8 1 6 2 7 2 3 7 3 1 3 2 3 3 1 1 7 0 11 4 8 4 8 5 4 2 1 3 4 4 3 2 2 1 3 1 3 1 9 0 9 8 7 6 8 5 1 6 1 8 3 3 3 3 1 1 1 3 1 2 4 5 5 2 2 3 7 1 9 0 7 9 6 1 7 6 1 7 1 3 2 3 1 3 3 1 3 1 5 0 6 1 1 6 1 8 6 3 2 2 3 1 1 7 0 10 1 1 1 5 3 6 4 9 4 9 3 2 1 3 2 1 3 1 1 2 5 1 2 5 3 5 1 8 0 6 8 3 6 1 2 1 3 1 2 2 2 1 1 1 1 7 0 6 1 9 9 9 3 8 1 1 2 2 1 3 3 1 9 0 9 4 9 6 1 4 4 4 2 4 2 2 1 1 1 3 2 3 3 2 2 2 4 3 3 6 1 6 0 8 9 1 2 2 3 1 7 7 1 3 3 3 3 2 1 9 0 7 1 6 1 2 1 2 8 2 1 3 1 2 3 1 2 3 1 7 0 8 1 2 5 5 1 1 9 6 2 2 3 1 2 3 3 2 5 2 4 3 3 1 2 2 1 3 2 7 3 5 4 3 4 1 9 0 7 8 1 1 1 2 9 7 2 3 1 3 1 3 3 3 3 1 8 0 11 6 1 3 8 6 8 4 1 7 1 1 2 3 1 1 2 2 3 2 1 6 0 8 1 3 7 4 7 7 9 5 1 3 3 3 2 3 1 5 5 4 3 7 1 9 0 11 1 4 2 6 7 2 7 6 6 5 8 1 2 3 2 1 1 1 3 1 1 8 0 11 6 1 4 1 5 8 1 7 5 9 3 1 3 1 2 1 1 1 1 1 8 0 10 6 4 5 5 3 1 5 8 6 6 2 3 1 2 1 3 3 3 5 1 4 2 3 2 4 3 7 1 9 0 9 9 4 6 2 1 9 6 3 3 1 2 2 3 3 2 3 1 1 1 6 0 9 9 6 5 1 4 2 1 9 9 3 1 1 2 2 1 1 7 0 10 1 1 7 1 1 9 6 1 7 6 2 2 1 1 2 1 2 3 1 5 5 5 4 1 3 5 1 8 0 7 8 5 3 2 3 1 2 3 2 2 1 2 1 2 1 1 6 0 11 8 5 2 1 6 5 5 5 7 6 9 3 2 1 1 1 1 1 8 0 9 1 9 1 5 4 8 4 6 4 2 1 1 1 1 2 1 1 5 3 2 5 1 3 4 1 7 0 7 1 1 7 2 6 9 6 1 3 3 2 1 2 1 1 5 0 9 7 1 1 7 4 2 6 2 3 2 1 1 3 2 1 6 0 8 3 6 4 2 7 1 6 9 2 2 3 3 2 1 1 5 1 2 7 6 5 2 5 5 3 6 1 8 0 9 8 2 2 1 4 8 6 9 3 1 3 2 2 3 3 1 1 1 7 0 6 5 4 1 2 1 1 1 3 1 2 1 1 3 1 7 0 11 4 5 6 2 1 4 3 9 3 3 1 1 3 3 2 3 3 3 5 1 5 2 4 1 3 6 1 8 0 7 4 1 6 5 7 1 7 3 1 1 3 3 2 1 3 1 7 0 11 7 1 9 3 6 3 8 1 2 6 5 3 1 3 2 1 2 1 1 5 0 7 1 2 6 1 3 9 6 1 1 3 1 2 5 5 3 2 4 1 3 4 1 8 0 7 7 1 4 5 3 1 4 2 1 3 2 2 3 1 1 1 5 0 6 4 7 1 5 3 6 1 3 3 1 1 1 7 0 10 3 6 1 8 1 1 6 2 5 4 2 3 1 1 1 1 3 3 5 2 1 3 4 1 9 0 10 1 9 4 3 8 3 4 4 5 7 1 2 1 1 1 2 1 2 2 1 8 0 9 1 9 9 4 5 6 6 9 2 1 1 2 1 1 3 1 1 1 8 0 6 6 8 8 1 7 2 2 3 3 1 1 3 3 2 3 5 2 4 3 5 1 9 0 8 3 1 7 7 3 3 8 2 2 2 3 1 2 3 2 2 1 1 8 0 6 6 1 7 5 1 3 3 1 3 1 1 2 2 3 1 9 0 10 1 1 5 5 7 4 4 4 3 5 2 1 1 1 3 2 2 2 2 2 4 3 1 2 4 2 6 3 4 5 5 3 6 1 9 0 11 3 8 3 1 6 1 9 9 1 1 6 2 1 3 2 3 1 3 2 2 1 9 0 7 9 4 1 9 1 1 3 3 1 2 1 1 2 1 3 3 1 7 0 8 8 8 4 3 8 1 2 2 2 3 1 3 3 2 3 4 2 4 1 2 1 3 5 1 7 0 10 1 6 3 1 3 2 3 4 6 1 1 1 3 1 3 3 1 1 7 0 11 8 9 2 1 7 4 3 1 7 9 5 1 1 1 3 2 1 1 1 7 0 6 6 1 1 9 4 9 2 1 3 3 3 3 1 1 5 4 3 1 3 6 1 9 0 11 8 2 6 1 6 5 1 6 2 9 6 1 2 1 3 2 3 2 2 1 1 5 0 6 5 4 1 1 6 2 3 3 1 1 1 1 7 0 11 3 2 1 7 8 8 5 9 6 9 1 2 1 3 2 3 1 3 5 5 2 1 2 1 3 4 1 5 0 11 1 4 3 7 6 1 4 2 6 4 2 3 1 1 2 1 1 7 0 10 1 6 1 1 5 5 1 2 2 9 1 1 1 3 1 2 1 1 5 0 8 1 8 6 2 1 1 1 4 1 1 2 1 1 1 3 1 1 3 6 1 9 0 11 6 4 1 9 8 8 7 9 1 1 2 1 1 2 3 1 1 3 2 1 1 5 0 9 1 6 7 3 6 2 6 1 7 3 2 2 1 2 1 6 0 8 1 2 1 9 1 4 7 1 2 2 3 3 1 1 1 4 3 2 2 2 4 3 4 5 2 5 5 3 6 1 6 0 9 5 1 1 9 8 6 6 3 2 1 1 1 1 1 2 1 9 0 8 1 3 5 7 5 1 4 3 1 2 3 1 3 2 2 1 3 1 6 0 6 8 5 6 9 1 2 3 2 1 1 2 1 1 5 2 1 4 4 3 4 1 6 0 9 2 1 8 2 8 4 6 4 7 3 3 1 2 2 1 1 5 0 7 4 2 4 1 4 1 7 2 3 1 3 1 1 9 0 6 6 1 3 2 9 1 1 1 3 1 2 1 3 1 3 2 4 4 3 3 4 1 8 0 7 7 4 8 6 1 9 6 3 2 2 2 1 3 2 1 1 8 0 10 9 6 7 3 8 2 5 2 9 1 3 2 2 2 3 2 3 1 1 8 0 9 5 6 7 1 1 8 2 2 9 1 1 1 2 1 1 1 1 3 2 1 4 3 6 1 5 0 10 5 1 2 6 8 6 3 6 3 1 1 1 3 1 1 1 6 0 6 7 1 3 1 8 2 3 2 3 3 1 2 1 8 0 6 1 7 9 8 1 2 2 1 1 3 2 3 2 1 2 1 1 4 4 3 3 6 1 5 0 10 6 9 4 1 5 3 6 1 1 5 1 3 3 1 1 1 6 0 10 5 9 3 1 4 2 3 9 1 5 3 2 1 2 2 3 1 7 0 9 6 7 3 1 1 9 8 4 1 2 1 1 1 2 2 1 5 1 1 5 1 2 6 1 6 4 1 5 5 3 6 1 9 0 9 1 8 9 1 9 2 3 7 9 1 1 1 3 3 1 1 1 2 1 8 0 9 2 8 3 1 1 2 1 6 1 1 2 3 3 3 1 2 3 1 9 0 10 1 6 4 6 4 3 4 5 3 8 3 1 3 3 1 3 1 1 1 4 1 4 3 5 3 3 4 1 8 0 8 6 2 3 6 2 1 7 9 3 1 1 1 3 2 1 1 1 5 0 7 8 6 8 1 1 4 4 2 1 1 1 2 1 9 0 11 4 6 1 9 3 1 9 6 2 5 9 1 3 3 2 1 1 3 3 1 2 2 3 3 3 5 1 9 0 7 6 4 2 1 7 1 7 1 2 2 3 2 2 1 3 2 1 5 0 7 2 4 9 1 1 3 1 3 3 3 3 1 1 9 0 8 6 1 7 5 6 6 9 7 1 3 2 1 1 3 3 1 1 5 5 5 2 1 3 7 1 6 0 7 6 1 6 1 4 1 4 1 1 3 1 2 1 1 9 0 10 6 9 5 8 1 9 5 1 8 3 3 3 2 1 3 1 3 1 1 1 8 0 7 7 9 1 9 8 3 9 1 3 3 1 1 2 3 3 3 5 2 1 2 5 2 3 7 1 6 0 10 1 6 1 9 9 9 5 3 7 9 2 2 1 3 3 1 1 6 0 9 1 1 3 9 5 2 6 3 8 2 1 1 2 3 3 1 8 0 9 7 9 1 7 7 7 1 8 4 2 2 3 2 2 1 3 2 3 4 2 2 2 3 2 2 3 1 3 3 5 4 3 7 1 6 0 6 1 4 1 5 3 4 3 1 2 1 3 2 1 8 0 9 4 1 7 9 8 3 8 6 1 3 1 3 3 3 1 1 1 1 7 0 8 2 2 8 6 1 9 5 8 2 1 1 1 1 3 3 3 2 1 2 2 1 3 3 5 1 6 0 7 6 2 1 8 5 6 7 1 2 2 1 2 2 1 7 0 9 2 9 8 9 4 1 9 1 1 2 2 1 1 2 1 2 1 8 0 10 2 4 8 6 6 7 6 1 1 2 2 1 1 2 2 1 2 1 2 3 3 2 5 3 4 1 9 0 10 6 4 2 5 2 9 3 3 1 3 3 1 1 2 3 1 3 3 1 1 8 0 10 2 5 1 9 7 8 8 3 1 4 2 1 3 1 3 2 3 2 1 5 0 8 8 6 6 1 7 5 4 9 1 3 1 3 3 5 4 2 3 3 7 1 7 0 11 3 3 2 3 1 4 3 8 3 4 6 3 1 2 1 1 2 1 1 6 0 6 1 1 7 4 1 2 1 2 3 2 3 1 1 8 0 11 9 2 1 3 1 6 7 5 1 9 1 3 3 2 1 1 2 3 3 1 2 1 4 5 1 3 3 4 1 8 0 6 5 3 5 2 4 1 2 1 1 1 3 1 3 2 1 5 0 8 4 9 4 1 7 3 2 9 3 1 3 2 1 1 9 0 6 8 9 8 1 8 1 2 3 3 3 1 3 3 2 3 4 3 4 2 1 4 7 1 5 4 3 7 1 5 0 8 6 1 8 5 1 6 7 9 1 1 2 2 1 1 5 0 7 8 1 1 4 5 5 1 2 3 2 1 2 1 8 0 6 5 4 8 2 1 9 2 1 1 3 2 1 1 2 5 4 3 3 4 3 1 3 5 1 6 0 9 4 6 1 7 7 1 7 8 7 3 2 1 3 1 3 1 7 0 9 5 8 1 5 1 4 4 5 3 3 1 3 3 3 1 2 1 5 0 11 9 6 3 3 1 4 8 6 4 9 8 3 2 1 2 3 3 5 1 5 1 3 5 1 8 0 10 4 3 7 7 2 5 7 1 5 7 1 3 1 3 3 3 3 1 1 7 0 7 7 1 6 1 3 1 6 3 1 1 1 2 2 3 1 8 0 8 1 2 4 4 1 5 2 4 2 1 1 3 1 1 2 2 2 4 3 2 1 3 5 1 7 0 6 8 8 1 9 5 6 3 1 1 3 3 3 1 1 7 0 7 1 6 8 6 7 3 5 3 3 3 1 1 3 1 1 9 0 11 5 1 4 6 1 2 4 2 7 3 4 2 1 2 3 1 1 2 2 1 3 2 2 3 4 3 6 1 9 0 10 4 8 8 5 2 1 6 1 3 3 2 3 3 2 3 1 3 1 1 1 8 0 10 8 3 1 4 1 4 1 9 6 1 2 3 1 1 1 3 2 1 1 7 0 7 1 6 3 4 4 1 1 3 2 1 3 1 1 1 2 5 2 4 3 4 1 1 3 5 4 5 9 6 3 5 3 3 4 1 5 0 9 1 4 4 3 9 5 3 4 5 1 3 2 1 3 1 6 0 6 1 9 1 5 4 7 1 1 1 2 3 2 1 9 0 8 7 7 9 8 9 3 7 1 2 1 1 1 3 1 3 3 2 4 3 5 5 3 4 1 5 0 9 3 3 1 8 2 1 6 2 2 1 3 1 3 3 1 7 0 8 5 5 6 8 6 3 1 5 1 3 1 2 2 3 1 1 9 0 9 5 5 2 8 2 4 1 9 2 3 1 2 2 2 2 3 1 2 2 3 3 3 3 6 1 5 0 11 6 2 8 6 2 6 7 1 6 1 4 2 1 3 2 1 1 8 0 6 9 1 6 3 7 3 1 3 1 3 2 2 3 2 1 6 0 11 1 1 9 5 8 4 7 1 1 2 3 1 1 2 3 3 3 5 4 2 3 1 1 3 5 1 9 0 6 8 2 1 3 4 3 3 3 3 2 1 2 2 2 2 1 9 0 6 5 1 2 7 2 4 2 1 1 3 2 2 3 2 3 1 9 0 10 2 2 6 1 9 9 5 4 6 1 3 3 1 3 2 2 2 2 3 2 2 2 1 2 3 7 1 6 0 9 1 2 3 4 2 9 3 1 6 1 3 3 1 2 1 1 5 0 7 1 6 3 1 9 5 9 2 1 3 1 2 1 6 0 10 6 4 8 1 8 4 8 2 6 3 3 2 2 2 1 1 3 4 1 4 3 5 3 3 3 4 5 5 3 4 1 7 0 11 4 2 5 9 1 6 1 9 9 1 3 1 1 2 2 3 2 3 1 7 0 9 7 4 6 2 8 5 1 1 9 3 1 3 2 1 2 1 1 9 0 11 9 6 6 4 2 4 7 9 9 2 1 2 1 1 1 3 1 1 2 1 3 2 5 2 3 4 1 5 0 6 1 5 5 2 1 5 2 3 1 3 1 1 9 0 7 8 1 5 6 1 9 9 1 2 3 3 2 3 2 1 1 1 5 0 9 1 1 9 8 5 7 4 8 5 3 2 2 1 2 4 2 2 1 3 7 1 9 0 10 4 9 7 1 3 9 5 3 5 2 1 3 1 2 1 2 1 2 3 1 6 0 9 1 2 6 3 7 1 4 2 6 1 3 3 2 1 1 1 6 0 6 1 1 7 8 1 1 1 3 3 2 3 1 2 4 5 3 5 4 2 3 5 1 5 0 11 6 4 7 1 8 8 8 9 8 6 6 2 1 2 1 3 1 5 0 11 7 7 1 4 2 1 2 9 7 1 4 2 2 1 2 1 1 8 0 10 1 7 1 7 7 1 6 7 3 5 1 1 3 2 3 3 2 2 3 5 1 3 3 3 4 1 8 0 11 3 6 7 1 9 1 4 3 3 8 7 1 2 1 3 3 2 1 1 1 5 0 6 1 4 1 1 7 3 1 3 1 1 2 1 9 0 10 9 2 2 2 4 4 4 1 2 6 1 2 2 1 3 3 2 2 3 3 2 1 1 4 5 7 7 5 5 3 3 5 1 7 0 9 5 4 9 1 3 2 3 8 1 3 1 1 3 1 2 2 1 5 0 9 1 7 9 3 3 6 5 9 9 1 2 1 3 1 1 9 0 10 4 7 1 1 4 8 5 9 5 1 1 1 1 3 1 3 1 2 1 4 1 5 1 3 3 6 1 9 0 9 3 9 8 3 8 3 1 9 9 3 3 1 1 1 3 3 3 3 1 8 0 11 1 5 1 9 4 1 5 3 1 9 8 1 1 2 2 3 1 2 1 1 7 0 8 5 2 6 1 5 8 8 9 1 1 1 1 3 1 3 2 1 1 2 4 4 3 7 1 8 0 11 4 8 2 6 8 3 1 8 8 4 7 3 3 1 1 3 2 2 2 1 7 0 9 4 1 8 8 6 5 2 5 5 3 3 1 1 1 1 1 1 8 0 6 2 5 1 5 8 3 2 1 3 2 1 2 2 1 5 2 2 3 2 2 5 3 6 1 7 0 10 2 3 9 4 8 1 4 4 7 5 1 2 2 2 2 2 3 1 6 0 8 1 4 9 2 1 1 8 4 3 1 1 1 2 3 1 6 0 8 5 1 8 9 8 9 2 5 2 1 1 1 2 3 5 2 4 2 5 1 3 7 1 8 0 10 2 2 5 5 7 1 1 8 8 8 1 3 1 3 1 1 2 1 1 8 0 6 1 4 9 3 7 2 1 1 2 2 2 2 3 3 1 8 0 10 4 1 7 6 2 8 4 2 7 8 3 2 3 2 3 1 3 3 3 5 2 2 3 3 2 2 6 1 5 5 3 4 1 7 0 11 3 1 3 6 5 1 1 6 2 8 9 1 1 1 2 3 3 1 1 5 0 10 9 8 3 3 2 6 8 5 1 5 1 3 2 1 3 1 5 0 9 8 1 1 2 8 7 8 7 2 2 1 1 3 3 4 2 5 3 3 4 1 9 0 9 2 9 1 7 4 3 3 3 5 3 2 3 1 2 1 2 2 2 1 9 0 7 7 3 2 8 1 2 7 2 3 3 3 3 1 3 1 3 1 6 0 8 5 1 2 2 4 4 6 4 2 3 2 2 3 1 1 1 5 2 3 5 1 5 0 9 4 4 6 9 8 4 9 1 4 2 2 3 1 1 1 5 0 11 1 2 9 5 6 3 5 9 2 5 6 1 3 1 1 1 1 8 0 7 1 9 7 1 9 3 1 1 1 1 3 3 3 1 3 5 1 4 5 2 3 7 1 8 0 6 1 8 2 9 1 1 1 2 3 2 1 2 1 2 1 6 0 9 9 1 5 5 8 1 8 9 3 3 1 1 3 2 1 1 6 0 10 2 7 7 1 6 2 1 1 5 9 2 2 3 1 1 1 2 3 1 3 2 4 3 3 4 1 7 0 7 4 9 1 2 6 9 4 2 1 1 2 1 2 3 1 9 0 7 2 6 4 9 5 1 9 3 2 3 3 1 3 1 2 2 1 6 0 10 1 1 1 9 6 3 1 6 7 9 2 1 3 1 1 3 3 4 2 4 3 6 2 7 3 4 5 3 7 1 9 0 6 9 7 2 8 1 8 2 2 3 2 1 1 1 2 2 1 9 0 10 1 7 5 8 9 7 9 8 7 5 2 1 3 2 1 3 1 3 1 1 5 0 11 3 1 2 3 1 4 2 6 5 6 6 1 1 3 2 2 5 5 2 5 3 2 2 3 6 1 9 0 11 4 2 6 9 2 3 1 8 5 2 8 1 2 2 1 1 1 1 2 2 1 6 0 8 2 6 7 4 4 5 1 3 2 1 1 1 1 3 1 6 0 7 9 5 9 7 1 3 5 2 2 1 2 3 1 1 4 4 2 1 1 3 5 1 7 0 6 5 5 5 1 8 8 1 2 1 1 2 2 1 1 9 0 6 1 2 5 8 3 1 1 3 3 2 2 1 2 3 3 1 9 0 8 3 8 6 1 5 2 7 3 1 1 3 1 3 1 2 2 1 1 1 3 1 5 3 6 1 6 0 10 1 3 4 3 5 9 1 3 1 1 1 1 3 3 3 2 1 9 0 6 1 7 5 7 8 7 1 3 3 1 3 2 2 1 2 1 7 0 11 1 2 6 1 3 1 6 2 8 1 9 1 1 3 2 3 3 3 4 3 5 1 2 3 1 2 3 3 5 4 4 3 6 1 6 0 11 7 3 9 3 9 1 7 6 1 6 4 1 1 1 2 2 3 1 8 0 10 5 9 4 5 3 7 7 1 8 4 1 3 3 1 1 3 1 1 1 5 0 11 1 1 1 4 1 1 6 1 1 6 3 1 3 3 2 1 4 4 3 2 5 3 3 5 1 9 0 11 5 1 5 2 1 7 2 3 2 1 7 1 1 2 3 3 1 1 1 1 1 7 0 7 1 9 7 1 7 5 5 2 2 2 3 3 1 2 1 9 0 10 2 8 5 7 1 8 3 5 5 2 3 2 2 3 1 2 3 1 1 4 3 2 5 3 3 7 1 8 0 8 5 7 9 6 1 7 1 9 1 1 1 3 1 3 1 3 1 9 0 11 2 3 5 1 7 3 1 4 1 1 6 3 1 1 2 1 3 1 1 2 1 8 0 8 3 5 6 1 9 1 7 2 1 1 3 2 3 2 1 1 1 5 5 3 4 5 3 3 5 1 7 0 11 3 5 9 9 2 3 5 3 3 7 1 2 3 1 1 3 1 1 1 5 0 8 7 9 2 1 8 8 1 3 3 2 1 3 1 1 8 0 10 7 8 2 2 1 6 3 8 2 7 1 2 1 1 3 1 3 2 4 3 1 2 2 1 4 6 4 5 3 7 7 2 5 4 3 5 1 7 0 9 6 1 2 2 2 8 9 1 2 1 1 1 2 2 2 3 1 6 0 7 4 4 8 9 9 8 1 1 2 1 2 3 1 1 6 0 6 1 1 2 3 6 7 1 1 2 2 2 3 3 3 4 5 3 3 4 1 8 0 8 8 1 7 4 6 1 6 2 3 3 1 2 3 3 1 2 1 5 0 6 7 2 6 7 2 1 1 3 1 3 2 1 6 0 10 2 7 9 1 9 9 1 5 2 1 2 1 2 1 1 1 1 5 5 1 3 4 1 6 0 7 7 9 9 1 6 4 6 2 1 1 2 1 3 1 9 0 8 4 7 7 3 3 1 4 9 3 2 3 1 3 3 2 1 1 1 8 0 7 4 6 2 9 8 7 1 1 1 1 1 3 3 1 1 5 1 2 1 3 6 1 6 0 8 9 6 9 6 3 1 8 1 2 3 3 2 3 1 1 9 0 9 1 1 8 5 1 5 6 1 1 1 3 1 3 1 3 2 1 2 1 5 0 8 7 9 7 1 7 6 7 8 1 3 3 1 3 5 1 5 2 5 2 3 4 1 8 0 10 7 8 3 1 6 9 1 4 1 4 2 3 1 2 1 1 1 1 1 6 0 10 9 4 3 1 1 8 3 1 9 7 3 1 3 1 2 1 1 7 0 9 6 3 1 4 6 7 8 2 4 2 2 1 1 1 3 2 5 2 2 1 5 5 1 5 5 4 3 7 1 7 0 10 4 5 7 1 1 9 7 7 8 8 1 2 3 3 3 3 1 1 9 0 7 1 2 4 9 1 4 6 3 1 3 3 1 2 1 2 2 1 9 0 9 2 6 9 2 4 8 1 3 1 2 1 1 2 1 3 3 3 1 3 3 3 2 4 4 3 3 6 1 7 0 10 9 4 3 1 1 5 4 4 6 1 3 3 1 1 1 2 2 1 5 0 9 3 3 6 7 4 7 2 1 2 3 3 1 3 1 1 5 0 11 4 1 6 2 3 4 1 8 4 8 2 1 1 3 3 3 1 5 4 1 1 3 3 4 1 9 0 6 5 8 5 1 1 3 2 2 1 3 3 1 1 3 2 1 5 0 10 2 2 1 7 3 1 7 1 1 3 2 2 2 3 1 1 5 0 11 6 6 9 1 4 7 3 5 1 6 2 2 1 3 2 1 1 3 1 1 3 6 1 8 0 7 1 8 1 9 3 8 3 1 1 1 3 1 2 2 3 1 9 0 6 8 9 2 9 7 1 2 1 3 3 2 1 1 1 2 1 5 0 7 1 9 4 2 9 4 3 2 1 2 2 1 4 1 1 5 5 1 3 7 1 5 0 8 3 6 2 3 6 1 7 5 1 1 2 2 1 1 8 0 6 5 9 6 4 1 9 1 1 2 3 3 1 1 3 1 8 0 9 4 8 2 8 2 9 7 1 7 2 1 2 2 3 1 2 1 5 5 2 5 1 3 2 6 4 6 5 5 3 3 7 1 9 0 8 1 3 9 9 1 5 2 3 3 1 1 1 1 2 1 3 1 1 6 0 11 1 8 2 1 7 3 6 2 1 3 9 1 3 2 1 2 2 1 7 0 10 1 2 4 1 9 1 6 5 1 2 3 1 2 3 3 2 1 3 5 2 3 1 3 4 3 5 1 7 0 7 2 1 4 8 6 7 3 1 1 1 1 2 1 3 1 8 0 10 8 8 4 3 9 5 9 1 3 5 1 3 3 3 3 1 2 1 1 7 0 10 9 6 1 9 1 3 4 7 3 5 2 3 1 3 3 1 1 3 3 1 4 1 3 7 1 8 0 10 4 6 7 2 6 4 2 1 5 1 2 3 2 2 1 3 2 2 1 9 0 6 9 6 9 4 1 8 1 3 1 3 2 3 3 1 1 1 8 0 8 3 5 3 1 7 6 5 1 2 1 3 2 1 1 1 2 4 1 3 1 3 4 2 3 6 1 5 0 11 7 5 8 2 1 2 2 2 1 1 1 1 1 3 1 1 1 7 0 9 1 2 9 5 1 4 7 1 4 2 3 1 1 1 1 1 1 7 0 10 8 5 1 7 2 2 2 3 8 7 1 3 3 1 2 1 1 3 1 2 1 1 5 3 7 1 9 0 8 9 9 9 6 1 1 1 5 3 2 3 3 1 2 3 2 1 1 8 0 11 1 6 7 4 4 6 6 3 4 1 9 2 2 2 3 1 3 3 1 1 5 0 9 1 3 3 4 6 3 3 8 2 3 3 2 1 2 2 3 4 4 1 2 4 3 2 5 4 3 3 5 1 8 0 10 3 7 4 1 8 1 3 4 1 1 1 1 3 3 1 1 3 1 1 9 0 10 3 8 1 3 2 9 6 9 7 8 1 2 3 3 1 1 3 3 1 1 6 0 7 5 2 2 7 6 5 1 3 1 2 3 1 3 2 2 3 2 1 3 7 1 6 0 9 2 1 1 3 8 2 1 2 4 3 1 2 1 2 2 1 9 0 7 9 5 5 4 1 3 2 1 1 3 3 3 3 3 2 2 1 8 0 9 4 2 1 7 1 4 9 2 4 3 3 2 3 2 3 2 1 5 5 1 5 1 1 3 3 4 1 9 0 10 2 2 1 2 3 3 2 1 2 1 2 2 1 1 1 1 1 1 2 1 9 0 11 8 6 9 6 9 5 8 1 2 5 9 1 1 2 1 3 3 1 1 3 1 5 0 10 4 1 6 5 7 8 2 5 1 6 1 2 3 3 1 2 3 4 5 3 6 1 7 0 11 7 6 6 2 1 1 3 8 5 8 2 1 2 1 2 3 1 3 1 8 0 9 6 9 7 4 6 1 5 9 7 2 2 3 2 1 1 2 3 1 8 0 10 2 7 1 7 9 6 4 6 3 1 3 3 3 1 2 1 1 3 5 4 2 4 4 2 4 6 4 4 4 3 5 1 7 0 10 4 3 1 1 6 2 9 4 4 4 1 1 2 2 2 3 1 1 5 0 9 1 5 1 9 4 1 3 9 5 2 3 1 1 1 1 5 0 10 3 8 8 6 9 7 1 4 7 9 1 3 2 3 3 3 3 5 1 5 3 6 1 9 0 6 4 1 5 1 3 5 3 2 3 1 1 1 3 3 3 1 5 0 10 6 3 5 4 1 3 1 9 3 5 2 2 1 1 1 1 7 0 7 5 3 9 3 1 9 5 2 1 1 1 2 1 1 2 1 3 3 5 1 3 5 1 6 0 7 1 6 9 9 1 2 5 2 1 1 1 2 1 1 5 0 8 1 3 5 9 9 4 4 8 3 3 1 3 3 1 8 0 6 1 7 5 7 9 4 1 1 1 2 1 1 1 3 1 2 5 4 3 3 6 1 5 0 8 5 1 3 8 3 6 7 6 1 1 1 2 3 1 6 0 10 3 9 1 7 1 4 5 1 9 2 2 2 3 1 1 3 1 7 0 11 4 8 8 5 7 1 7 9 6 3 6 3 1 3 2 1 1 1 3 5 3 5 5 1 6 3 4 2 5 4 3 6 1 9 0 11 7 2 1 3 3 4 9 6 9 3 6 3 3 2 3 2 2 1 3 1 1 8 0 10 9 3 9 1 4 1 9 2 4 1 2 2 1 1 1 2 2 3 1 8 0 11 4 1 1 3 6 2 2 1 1 5 8 1 2 3 3 1 3 3 1 2 2 4 2 3 5 3 7 1 5 0 11 1 3 5 2 7 1 1 8 3 3 9 1 1 1 1 2 1 9 0 9 6 1 1 9 9 8 7 1 5 1 3 3 1 1 3 1 2 2 1 6 0 11 1 9 4 9 3 9 7 6 1 9 4 1 3 1 2 2 2 2 4 1 3 1 1 2 3 6 1 6 0 11 6 9 6 8 1 4 2 9 3 7 9 2 2 1 3 1 3 1 8 0 6 1 6 1 5 8 1 3 1 1 1 2 2 1 3 1 9 0 6 3 1 8 1 6 2 3 2 2 3 1 2 3 3 2 1 1 3 4 5 3 3 6 1 6 0 9 9 9 5 2 9 7 7 8 1 1 1 1 3 3 2 1 9 0 6 1 6 9 1 8 5 3 3 2 1 2 2 3 3 2 1 7 0 6 3 1 6 3 2 5 2 1 1 1 3 1 2 2 5 1 4 1 2 3 6 1 5 0 6 4 8 7 1 1 7 2 3 1 3 1 1 8 0 11 1 3 4 1 1 4 4 5 1 1 4 1 1 1 1 3 3 1 1 1 9 0 9 6 1 6 3 4 9 3 1 8 3 2 1 2 3 1 1 3 1 4 2 5 2 1 1 5 4 6 2 5 4 3 4 1 5 0 9 7 9 3 2 7 8 1 2 2 3 2 3 1 1 1 6 0 6 1 7 4 5 1 3 1 3 2 1 1 3 1 9 0 9 1 6 9 7 1 7 5 6 1 1 1 1 3 3 3 1 3 1 1 2 3 3 3 7 1 9 0 11 7 8 6 2 8 1 3 3 5 2 1 3 3 2 2 3 2 2 1 2 1 5 0 6 1 1 7 7 4 6 3 2 2 1 1 1 7 0 7 1 2 8 8 9 4 1 1 1 1 3 3 1 1 3 1 2 1 5 4 1 3 5 1 6 0 11 1 7 1 2 1 3 4 5 7 6 3 2 1 1 1 2 2 1 6 0 10 3 8 3 8 9 7 8 2 1 1 2 3 3 3 1 3 1 5 0 11 7 1 7 2 6 4 1 7 5 7 2 1 1 1 1 3 5 3 1 5 3 3 6 1 7 0 11 7 7 1 1 7 5 3 6 9 8 1 3 3 2 2 3 1 3 1 7 0 6 7 3 8 2 1 4 3 1 1 1 1 1 2 1 5 0 11 9 8 5 7 1 8 1 8 1 2 8 1 2 1 1 1 5 1 4 1 1 3 3 5 1 9 0 8 5 1 9 8 2 1 2 4 2 1 2 2 1 1 2 2 1 1 8 0 9 2 1 8 7 7 3 8 7 4 1 2 1 2 3 2 1 3 1 6 0 8 1 7 6 7 9 6 8 4 2 1 1 1 3 3 4 3 5 1 5 6 6 2 4 7 4 6 2 5 5 3 4 1 9 0 10 2 9 6 9 4 7 1 4 7 9 2 3 3 2 1 1 1 2 2 1 5 0 9 4 7 1 5 7 8 4 7 6 2 2 2 1 3 1 9 0 7 4 1 5 9 8 3 1 2 2 1 1 2 1 2 3 1 3 2 5 2 3 6 1 8 0 9 1 6 5 6 1 7 4 1 1 1 3 1 3 1 2 2 3 1 9 0 9 2 9 6 9 2 7 9 1 5 3 1 3 3 2 1 2 1 1 1 7 0 9 1 2 8 5 2 5 8 5 6 1 1 2 2 1 3 2 4 1 2 3 2 5 3 5 1 8 0 9 5 9 9 8 6 6 1 5 2 3 2 2 3 2 1 2 2 1 6 0 8 5 3 1 1 4 9 3 7 1 1 3 1 3 3 1 8 0 10 9 1 8 7 7 1 1 7 1 2 2 3 1 2 2 3 2 1 5 2 5 3 3 3 4 1 9 0 11 1 3 8 7 2 6 3 7 3 6 2 2 1 3 3 3 2 2 2 3 1 8 0 6 4 2 5 7 1 4 1 1 3 3 1 1 3 1 1 5 0 9 6 4 5 1 4 1 4 2 8 1 1 1 1 2 2 1 3 5 3 6 1 9 0 7 1 2 6 1 4 1 3 1 1 2 1 2 1 3 1 3 1 5 0 10 1 1 1 9 5 6 8 4 4 8 1 3 2 3 2 1 7 0 8 5 1 1 7 9 4 9 1 1 3 1 1 1 2 3 2 2 2 1 5 1 2 1 3 2 7 4 5 3 6 1 6 0 10 4 4 6 7 8 6 1 2 6 6 1 3 2 3 2 1 1 8 0 6 4 9 8 1 5 5 3 3 1 1 1 2 2 1 1 6 0 9 5 9 2 1 9 4 3 2 4 2 1 1 1 3 1 3 3 5 2 5 3 3 7 1 7 0 7 3 4 2 5 5 3 1 1 2 2 3 3 3 2 1 5 0 7 8 4 9 4 8 4 1 3 1 3 3 1 1 6 0 6 1 9 1 8 1 6 1 3 3 1 2 1 1 1 5 4 1 1 2 3 5 1 5 0 9 5 1 4 1 9 2 9 4 6 3 1 1 1 3 1 7 0 7 1 3 6 1 7 5 4 3 1 2 1 2 3 3 1 7 0 7 7 1 2 1 1 9 3 2 1 1 1 3 3 1 1 5 3 2 4 3 5 1 9 0 10 7 2 5 3 1 8 1 5 5 1 3 2 2 2 1 2 3 3 1 1 8 0 9 5 5 7 6 2 3 1 5 1 1 3 3 1 3 3 1 1 1 8 0 10 5 3 1 6 3 2 2 1 7 9 1 1 1 1 1 1 2 2 3 4 5 2 1 3 4 1 6 4 4 4 3 4 1 9 0 6 1 3 6 5 5 3 1 3 1 3 1 3 1 2 1 1 5 0 7 9 9 5 1 3 1 3 2 3 2 1 1 1 6 0 8 1 1 3 4 7 3 7 7 1 1 3 2 1 2 1 3 1 5 3 6 1 9 0 8 5 4 1 3 9 9 3 2 3 3 1 3 1 3 1 3 2 1 5 0 10 2 8 2 2 1 1 1 2 5 1 3 1 1 2 1 1 5 0 11 4 7 7 3 6 8 6 7 8 8 1 1 1 1 1 3 1 3 1 2 4 1 3 6 1 8 0 10 6 6 1 4 1 5 1 6 1 2 3 3 1 2 1 1 2 3 1 5 0 8 1 3 1 3 4 8 1 3 2 2 2 3 1 1 7 0 7 9 4 2 5 1 1 8 3 1 2 2 1 2 3 3 4 4 1 4 5 3 7 1 5 0 9 1 9 4 1 1 1 5 5 2 3 3 1 1 1 1 9 0 6 5 1 8 6 8 5 2 1 3 2 2 1 3 3 1 1 7 0 8 8 4 3 8 4 2 6 1 2 2 3 3 1 1 3 1 2 3 2 1 4 3 4 4 2 1 5 4 3 7 1 8 0 11 8 1 1 3 5 8 4 1 5 8 1 1 1 2 1 3 1 2 1 1 5 0 8 2 2 1 1 5 2 5 5 1 2 1 1 1 1 6 0 11 1 8 3 8 8 5 1 7 6 9 4 2 1 1 1 1 1 1 2 1 5 1 1 3 3 7 1 8 0 6 1 9 8 8 1 7 1 1 3 1 3 2 1 3 1 7 0 7 9 2 3 2 4 1 6 3 1 1 1 1 1 3 1 7 0 8 8 7 1 5 1 1 6 1 3 2 1 1 2 3 1 2 4 2 3 4 4 2 3 7 1 5 0 9 4 5 7 7 7 1 4 7 5 1 3 3 1 3 1 7 0 9 5 2 5 7 3 3 1 4 8 1 2 2 2 1 3 3 1 6 0 9 5 3 1 1 9 7 8 2 1 3 2 3 3 1 1 2 1 4 2 2 3 1 3 6 1 8 0 9 1 6 2 8 7 5 4 6 9 3 1 1 2 3 2 1 2 1 9 0 6 1 6 7 1 3 2 1 1 1 3 2 1 3 2 1 1 6 0 10 3 5 9 2 3 8 3 7 1 4 3 1 2 1 2 1 3 5 1 1 2 1 3 7 1 6 0 9 6 7 1 2 5 2 4 1 2 1 1 3 2 3 3 1 6 0 10 7 6 7 7 1 4 5 1 1 1 2 1 1 3 1 1 1 7 0 10 1 7 9 1 1 2 2 2 2 6 3 1 3 2 3 1 1 2 3 3 3 3 2 2 1 4 5 2 5 3 3 6 1 5 0 6 3 1 1 8 1 9 1 1 3 1 2 1 8 0 9 2 5 6 9 9 1 8 9 2 3 3 1 1 2 2 3 3 1 8 0 9 8 5 8 5 7 7 1 6 1 3 3 1 3 2 2 2 2 3 5 5 3 3 3 3 6 1 9 0 11 3 7 9 3 1 3 2 4 9 9 3 2 3 1 1 3 1 3 2 1 1 9 0 6 1 8 9 1 8 2 1 2 2 3 2 2 3 1 2 1 5 0 8 6 7 9 1 3 6 3 5 1 1 3 1 1 5 4 2 1 5 3 3 7 1 9 0 10 7 1 5 5 5 1 8 4 2 2 2 2 3 1 2 1 3 2 2 1 7 0 11 1 7 3 3 6 8 1 3 5 5 1 1 1 2 3 1 3 3 1 9 0 11 6 6 1 7 8 3 4 4 9 1 3 3 2 3 1 3 1 1 1 3 2 3 2 1 5 1 1 3 6 1 9 0 11 3 8 3 5 1 4 4 8 2 7 4 1 1 1 3 1 3 2 3 2 1 6 0 8 1 3 1 3 4 2 7 7 1 1 2 1 1 3 1 5 0 6 9 5 1 3 2 6 3 1 1 1 2 2 2 1 4 5 2 3 7 1 9 0 9 9 5 8 1 4 8 1 6 2 1 2 3 2 1 2 3 2 2 1 5 0 9 1 1 5 2 1 4 1 8 1 1 2 2 2 2 1 9 0 7 4 7 1 1 6 6 8 2 1 2 3 1 1 1 1 1 1 5 1 3 2 5 2 7 3 4 5 5 3 5 1 6 0 6 2 3 4 3 1 8 1 2 1 3 1 1 1 8 0 11 8 1 3 5 8 6 9 7 3 6 1 1 3 1 1 2 2 1 3 1 9 0 8 8 9 3 8 6 7 8 1 3 2 3 1 3 3 1 1 1 2 3 1 1 4 3 4 1 9 0 10 5 2 3 7 4 9 8 1 1 5 2 1 1 1 3 3 1 3 3 1 9 0 6 9 7 2 5 3 1 1 2 3 2 2 1 3 1 2 1 7 0 11 9 3 9 9 5 5 1 1 9 5 2 2 3 1 3 1 2 1 3 2 2 4 3 7 1 5 0 6 9 9 1 9 7 1 2 2 1 1 3 1 5 0 10 8 1 9 8 1 2 4 4 4 2 3 1 1 2 1 1 9 0 9 7 6 6 4 6 1 1 2 2 2 1 1 3 3 1 2 2 3 4 1 3 5 2 1 4 3 5 1 8 0 9 8 1 7 7 1 1 4 9 4 2 2 3 3 1 2 1 1 1 5 0 6 8 1 1 4 2 1 3 1 3 1 2 1 6 0 7 7 5 3 1 1 9 5 3 2 2 3 1 2 4 5 4 5 1 3 7 1 8 0 10 1 9 2 1 9 1 9 9 2 7 2 1 3 1 3 1 2 3 1 8 0 8 8 7 3 8 7 6 8 1 1 3 2 1 2 3 1 3 1 7 0 9 2 4 7 4 1 8 4 2 8 2 3 2 1 1 3 2 5 3 1 3 2 3 3 6 3 7 4 3 6 3 6 3 4 3 3 6 1 7 0 7 3 8 7 8 4 1 9 1 2 2 3 1 2 2 1 6 0 7 2 1 7 4 5 5 6 2 3 1 2 3 2 1 8 0 11 1 9 3 9 6 3 1 7 8 2 5 1 1 3 2 3 1 1 2 1 5 1 5 4 3 3 5 1 6 0 7 1 9 3 2 3 6 2 3 1 1 1 3 2 1 7 0 11 1 4 6 2 6 3 3 8 1 8 8 3 3 1 3 1 3 2 1 8 0 10 2 8 6 4 3 4 4 1 3 4 1 3 1 1 3 1 1 2 4 5 3 1 5 3 7 1 8 0 7 7 1 9 1 1 8 8 2 3 3 1 2 2 2 1 1 6 0 8 8 4 3 3 5 1 7 2 2 1 2 2 1 2 1 5 0 10 4 7 1 5 8 4 4 2 7 5 2 1 2 1 2 1 1 4 1 3 2 2 3 7 1 8 0 8 6 1 6 5 7 8 5 1 1 1 2 2 2 1 1 1 1 8 0 11 9 7 6 1 1 9 5 1 4 8 5 3 3 1 3 2 3 2 1 1 5 0 7 1 8 6 8 2 6 1 3 1 1 1 2 1 3 4 1 3 5 1 4 4 1 4 4 3 7 1 5 0 11 9 8 1 5 4 9 7 7 7 8 5 1 3 1 3 2 1 8 0 10 1 3 3 3 1 1 3 6 5 7 1 2 1 3 2 2 2 3 1 7 0 11 8 3 4 4 1 7 7 3 3 7 9 3 1 1 3 3 3 3 3 1 5 5 1 4 4 3 4 1 5 0 6 6 6 1 6 5 1 1 3 2 1 3 1 6 0 11 7 2 2 5 2 2 9 2 1 3 6 2 2 1 1 3 1 1 7 0 6 4 1 8 1 6 6 2 1 1 1 2 2 1 3 4 2 5 3 7 1 9 0 8 2 1 1 5 3 4 6 4 1 1 1 2 2 2 3 3 3 1 9 0 11 8 4 8 8 3 1 2 7 4 5 5 2 3 2 1 3 2 1 2 2 1 9 0 10 1 7 3 3 2 3 6 8 8 4 3 3 2 1 3 2 1 3 2 3 4 1 5 4 2 2 3 7 1 7 0 7 9 1 3 8 3 3 4 1 3 3 3 3 1 3 1 7 0 6 1 9 5 4 6 4 3 2 1 3 1 1 1 1 8 0 9 8 1 1 9 4 6 6 5 5 1 2 3 1 3 2 1 1 1 2 2 3 3 2 4 2 1 2 4 5 5 3 5 1 5 0 7 6 1 4 3 4 3 2 1 2 3 2 1 1 7 0 9 2 5 8 2 7 9 5 3 1 2 1 3 2 2 1 1 1 9 0 7 6 5 8 5 5 3 1 3 3 1 3 3 2 3 3 1 3 4 4 4 2 3 7 1 6 0 9 1 6 5 7 9 9 4 7 1 3 1 3 1 3 3 1 8 0 9 7 8 4 1 3 5 3 1 4 2 1 3 2 1 1 1 2 1 6 0 11 9 1 2 8 7 5 4 4 8 8 1 3 1 2 2 2 1 4 4 4 4 1 4 3 3 4 1 9 0 10 1 7 2 8 9 8 5 8 6 4 2 2 1 1 3 1 1 1 3 1 9 0 9 5 1 9 5 5 4 9 1 1 2 1 2 2 1 1 3 3 3 1 8 0 6 8 3 4 4 9 1 3 3 2 2 3 1 2 1 2 3 3 1 3 5 1 5 0 11 2 6 4 7 1 9 4 4 3 1 8 2 1 1 1 3 1 8 0 10 8 7 4 7 3 1 4 5 1 4 1 1 2 3 2 3 2 1 1 6 0 7 6 1 2 2 2 5 7 1 3 1 3 3 1 3 3 3 1 5 3 5 1 9 0 7 3 1 8 5 8 6 1 1 1 1 3 3 3 2 3 3 1 7 0 11 4 4 1 3 8 2 3 9 1 3 8 1 1 1 1 2 2 1 1 6 0 9 1 1 4 2 1 9 7 5 3 2 1 3 3 3 1 2 4 5 2 5 5 1 5 1 2 4 3 3 5 1 9 0 10 1 3 5 2 6 6 1 7 7 1 3 1 3 2 1 1 2 1 3 1 5 0 11 8 8 6 3 1 2 9 1 6 5 5 1 1 3 2 3 1 9 0 7 1 3 1 1 7 4 9 2 1 1 3 3 3 1 1 2 2 1 2 5 5 3 4 1 6 0 6 3 2 1 4 1 3 1 2 1 1 3 3 1 8 0 10 2 6 5 8 7 4 3 1 2 4 3 3 2 1 3 2 3 1 1 9 0 6 5 1 2 1 2 3 1 2 2 1 1 2 2 2 1 4 4 2 2 3 6 1 6 0 6 9 1 4 4 2 9 1 3 2 2 1 3 1 5 0 11 2 1 9 6 9 2 4 7 6 7 8 2 1 1 3 3 1 8 0 10 9 3 8 5 5 1 4 4 4 1 3 3 1 1 2 1 2 3 1 4 3 5 5 5 3 6 1 8 0 7 4 6 6 1 6 9 9 1 1 1 2 2 3 3 2 1 6 0 7 1 8 7 8 6 6 7 3 1 1 1 1 2 1 9 0 9 5 1 6 9 9 6 3 2 2 1 2 1 2 1 1 2 2 1 1 4 2 1 1 2 2 3 6 5 4 3 6 1 8 0 9 2 6 2 1 5 9 7 4 1 1 3 1 2 1 3 1 3 1 9 0 7 5 2 6 1 7 7 5 2 1 3 3 1 2 1 1 1 1 9 0 10 9 5 1 3 2 2 1 2 5 3 3 1 3 3 2 1 1 3 3 2 3 3 3 2 1 3 4 1 7 0 7 8 5 8 2 2 1 1 3 1 1 3 2 3 3 1 9 0 6 5 5 1 1 1 8 3 2 1 2 2 3 1 1 1 1 5 0 8 1 7 4 5 2 9 9 1 1 3 1 2 3 3 4 2 1 3 5 1 5 0 7 4 8 6 1 6 9 1 2 3 1 3 3 1 8 0 6 1 9 6 7 8 9 3 3 1 1 2 3 1 3 1 8 0 10 7 6 3 6 5 1 5 4 3 2 2 3 3 1 3 2 3 2 3 4 1 3 5 3 6 1 7 0 7 8 5 4 7 7 1 7 3 3 3 1 3 3 3 1 8 0 7 2 3 3 4 8 1 5 3 1 3 2 1 2 2 1 1 9 0 8 4 1 8 9 1 4 7 8 3 2 2 1 2 1 3 1 1 3 5 4 3 5 3 3 5 1 8 0 10 8 2 7 7 1 8 5 9 8 1 1 1 1 2 1 1 3 3 1 6 0 11 9 9 1 2 4 1 4 9 1 9 1 1 1 2 3 2 1 1 7 0 7 6 8 5 1 4 6 8 3 2 3 1 1 3 2 3 1 1 3 5 3 5 4 4 4 3 3 4 1 9 0 11 1 2 8 2 8 8 9 1 4 9 4 1 2 3 2 1 1 1 1 1 1 8 0 8 3 4 9 5 1 1 8 2 3 1 1 3 1 1 1 1 1 6 0 6 2 8 1 2 7 8 2 1 3 3 3 2 2 3 3 1 3 7 1 8 0 8 9 6 2 5 8 5 2 1 1 2 2 1 3 1 3 2 1 8 0 7 9 6 1 4 2 7 4 3 1 1 2 3 3 2 2 1 5 0 9 1 3 7 5 7 4 9 1 5 3 1 1 1 2 1 2 4 1 2 1 2 3 7 1 8 0 7 1 6 5 1 5 9 6 2 3 1 1 2 3 1 3 1 7 0 9 5 4 5 2 1 6 6 3 8 3 3 1 1 1 2 2 1 9 0 9 9 2 2 8 4 1 1 1 9 1 1 3 3 1 3 3 1 3 3 5 1 3 1 3 3 3 6 1 6 0 10 1 5 2 5 6 4 8 6 9 1 2 1 2 2 1 3 1 8 0 11 8 3 7 6 3 5 6 8 1 2 1 3 1 3 3 3 1 1 3 1 6 0 7 1 1 2 8 5 5 3 1 3 2 2 1 3 4 2 1 4 2 2 3 3 4 7 1 6 6 2 5 3 3 6 1 8 0 9 5 3 1 5 7 1 2 7 6 1 1 2 2 2 3 1 1 1 7 0 7 4 9 6 3 4 3 1 1 2 3 3 1 3 1 1 5 0 11 5 1 3 1 9 7 5 8 6 1 9 1 3 3 1 1 3 2 1 5 4 2 3 5 1 7 0 6 4 2 7 3 7 1 3 2 1 3 1 1 1 1 8 0 9 8 4 1 2 6 2 1 8 2 1 2 1 1 3 1 3 2 1 6 0 11 1 4 8 2 1 9 5 8 8 3 7 1 1 3 2 3 2 2 3 1 5 3 3 6 1 5 0 9 3 7 5 1 5 4 8 8 9 2 1 2 2 1 1 9 0 7 4 1 1 9 9 1 5 1 2 1 3 3 1 1 2 3 1 5 0 9 9 5 7 2 5 2 3 1 1 1 1 3 3 1 2 1 2 4 5 4 3 4 1 7 0 9 3 1 1 3 7 3 7 8 8 1 3 3 1 3 1 3 1 8 0 9 1 3 4 7 6 5 2 4 4 2 1 1 3 2 1 3 2 1 9 0 8 5 8 2 4 9 3 1 6 3 1 1 2 3 3 3 2 3 4 5 1 1 3 4 1 8 0 6 8 4 1 7 9 1 2 1 1 1 1 3 3 3 1 5 0 10 2 2 2 3 8 2 8 1 5 4 3 2 2 1 1 1 9 0 7 1 3 3 1 1 8 1 1 1 3 2 1 1 1 3 1 1 2 4 4 5 3 5 5 4 3 4 1 9 0 10 6 1 6 7 5 9 6 3 6 7 3 1 3 2 3 1 3 2 3 1 8 0 9 1 3 7 2 3 9 2 2 4 1 2 2 1 1 3 2 1 1 9 0 9 1 5 4 3 1 4 5 5 2 1 1 2 3 1 2 1 1 2 3 1 1 5 3 6 1 7 0 8 2 8 6 2 6 6 1 1 2 3 1 3 3 2 1 1 6 0 7 2 7 8 1 6 4 2 3 1 1 3 1 2 1 7 0 9 5 9 8 1 4 6 7 6 1 1 2 2 3 1 1 2 2 2 3 5 2 1 3 4 1 6 0 7 4 8 5 9 1 1 1 3 1 2 1 2 1 1 8 0 6 1 5 3 8 4 8 1 1 1 2 1 2 1 2 1 6 0 10 2 7 2 4 6 4 9 1 2 2 1 1 1 1 3 1 4 3 4 3 3 6 1 6 0 9 8 6 6 6 3 8 9 1 5 3 3 1 3 3 1 1 8 0 9 2 6 1 2 1 3 9 3 8 3 1 2 2 3 3 1 2 1 7 0 9 1 8 6 2 4 1 5 4 5 1 1 2 2 2 2 1 4 2 2 2 4 2 3 4 1 8 0 10 9 2 8 1 2 3 2 6 3 6 2 2 3 2 2 1 1 2 1 5 0 7 1 9 8 4 6 6 2 3 3 1 1 1 1 9 0 8 4 3 2 4 4 8 7 1 1 1 1 2 1 2 2 1 1 3 5 3 1 7 5 1 5 5 4 3 7 1 5 0 10 3 2 8 1 7 2 7 8 4 9 1 1 1 3 3 1 5 0 7 6 6 4 2 1 5 1 2 1 1 3 2 1 7 0 7 1 4 7 2 1 5 1 3 2 3 1 2 1 2 5 3 3 2 3 1 2 3 4 1 8 0 9 9 3 1 8 1 4 1 1 1 1 2 2 1 1 3 1 1 1 9 0 11 3 7 8 4 4 6 7 1 6 3 1 1 3 2 2 3 3 2 1 3 1 6 0 9 3 8 7 3 6 1 2 8 1 1 1 2 3 3 2 1 1 5 5 3 4 1 8 0 10 6 8 1 5 1 1 2 3 5 8 1 1 3 3 1 2 2 1 1 8 0 8 1 7 3 4 5 3 9 7 1 2 1 3 2 3 2 1 1 9 0 8 4 9 3 5 1 8 5 2 3 1 3 1 1 3 3 1 2 3 3 1 4 3 5 1 7 0 11 6 4 2 1 4 6 9 6 1 4 1 3 3 1 3 2 1 3 1 5 0 8 1 8 2 5 7 1 2 2 2 2 2 1 2 1 5 0 10 7 1 5 9 9 7 1 8 6 7 1 1 1 2 1 2 1 4 3 3 3 5 1 6 0 9 5 7 1 6 5 6 9 2 8 2 2 2 1 3 2 1 6 0 11 3 9 2 3 2 4 3 9 7 5 1 1 1 3 3 1 2 1 5 0 6 7 1 5 9 3 1 1 1 1 1 3 4 5 2 2 3 2 3 7 5 5 4 3 4 1 6 0 10 2 1 1 5 9 7 1 9 4 8 1 2 1 1 1 2 1 5 0 8 5 4 1 9 6 4 7 4 2 3 2 1 1 1 7 0 9 1 1 6 5 1 4 3 8 3 2 2 3 1 3 1 3 5 3 1 1 3 7 1 8 0 6 6 1 6 8 3 7 3 3 2 1 3 1 3 3 1 6 0 10 5 6 3 7 3 1 8 9 1 6 3 2 1 3 3 1 1 9 0 9 3 8 6 8 8 3 9 1 6 1 2 3 1 2 3 2 3 2 2 1 1 4 3 2 5 3 6 1 6 0 10 1 8 1 2 3 4 7 5 9 2 1 3 3 1 3 2 1 9 0 11 9 2 3 8 7 4 2 4 1 2 2 3 1 2 3 3 3 3 2 1 1 9 0 11 7 7 7 6 4 5 1 8 2 4 7 1 2 2 1 1 1 3 2 1 1 2 2 1 5 1 3 5 1 6 0 11 8 2 5 5 1 1 6 7 8 3 3 1 1 1 3 1 3 1 9 0 10 3 7 7 3 1 8 5 2 1 6 1 1 2 1 3 3 1 2 2 1 9 0 6 4 1 7 2 1 2 1 3 3 3 2 3 2 2 1 2 2 4 3 1 3 6 1 8 0 8 5 1 8 4 5 6 1 6 1 1 2 1 3 1 3 2 1 6 0 9 5 1 9 1 7 9 7 7 1 3 2 3 1 1 1 1 8 0 8 5 5 5 1 8 6 2 3 1 3 1 2 1 1 1 3 4 3 3 2 3 3 3 5 3 3 4 5 3 4 1 5 0 7 1 9 7 1 7 1 1 1 1 3 3 2 1 6 0 7 1 7 3 8 7 1 1 3 1 2 1 3 1 1 9 0 9 2 5 4 9 6 4 1 1 8 3 3 3 1 3 1 2 3 3 3 2 4 3 3 7 1 9 0 9 1 3 5 9 4 5 7 4 8 2 1 2 1 3 2 1 2 2 1 5 0 8 6 6 3 1 1 1 6 5 1 2 2 1 2 1 6 0 10 1 8 2 8 8 1 7 2 1 4 3 3 3 3 1 2 4 1 4 3 1 4 3 3 6 1 6 0 9 2 1 6 7 5 4 1 2 3 2 1 3 1 2 1 1 6 0 7 7 6 8 6 5 1 1 1 1 1 1 1 1 1 9 0 10 3 8 6 5 1 1 9 1 1 2 1 1 1 2 3 3 1 3 1 2 3 3 3 5 4 3 4 1 7 0 9 4 7 3 8 1 6 1 3 1 2 1 3 3 1 2 3 1 6 0 11 6 1 7 1 6 4 4 2 1 4 9 3 3 3 1 2 1 1 8 0 8 5 2 1 7 5 8 4 4 3 2 1 2 1 2 1 1 2 1 5 2 5 3 6 3 5 4 3 3 5 1 8 0 6 5 1 6 3 7 8 1 3 1 2 1 3 3 1 1 7 0 6 4 7 1 2 4 6 1 2 1 2 2 1 1 1 7 0 6 1 5 2 5 3 8 1 1 3 3 2 3 1 2 2 5 1 3 3 6 1 9 0 8 1 3 6 7 7 2 5 3 1 1 2 3 2 1 2 2 2 1 8 0 9 3 3 2 2 9 7 6 1 3 2 3 2 1 3 1 1 2 1 8 0 11 7 1 7 9 7 3 7 1 5 3 1 2 3 1 3 3 2 2 1 4 2 3 3 3 5 3 6 1 6 0 9 2 1 7 9 8 8 2 6 7 1 3 2 1 2 2 1 7 0 8 9 9 3 4 1 2 1 4 2 2 2 1 2 2 2 1 8 0 10 9 7 1 8 2 7 3 6 2 2 1 1 2 1 3 1 3 1 1 3 3 1 2 2 3 6 1 9 0 7 4 7 6 4 3 1 6 3 2 2 3 3 1 2 3 3 1 9 0 11 4 6 5 8 4 7 1 3 9 2 8 1 2 2 1 1 1 3 1 3 1 8 0 7 7 6 7 6 3 1 9 1 1 2 1 3 2 2 1 2 4 1 2 2 4 5 1 1 1 3 1 6 10 10 3 6 11 3 8 2 5 \ No newline at end of file diff --git a/advent_of_code_2018/day8/main.cc b/advent_of_code_2018/day8/main.cc new file mode 100644 index 0000000..0ea5c2a --- /dev/null +++ b/advent_of_code_2018/day8/main.cc @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include + +using namespace std; + +struct Node +{ + size_t child_count; + size_t metadata_count; + vector children; + vector metadata; + + Node() + : child_count(0), metadata_count(0) + { } +}; + +size_t metadata_sum = 0; +Node parse_node(vector &data) +{ + Node rval; + rval.child_count = data.back(); + data.pop_back(); + + rval.metadata_count = data.back(); + data.pop_back(); + + for (size_t idx = 0; idx != rval.child_count; ++idx) + { + rval.children.push_back(parse_node(data)); + } + + for (size_t idx = 0; idx != rval.metadata_count; ++idx) + { + rval.metadata.push_back(data.back()); + data.pop_back(); + metadata_sum += rval.metadata.back(); + } + + return rval; +} + +size_t node_value(Node const &node) +{ + if (node.children.empty()) + { + return accumulate(node.metadata.begin(), node.metadata.end(), 0); + + } + + size_t sum = 0; + for (int idx : node.metadata) + { + int index = idx - 1; + if (index >= node.children.size()) + continue; + + sum += node_value(node.children[index]); + } + + return sum; +} + +int main() +{ + vector data; + + while(!cin.eof()) + { + int tmp; + cin >> tmp; + data.push_back(tmp); + } + + vector copy(data.rbegin(), data.rend()); //reverse data + Node root = parse_node(copy); + + cout << "metadata sum: " << metadata_sum << "\n"; // answer to 1 + cout << "node value: " << node_value(root) << "\n"; // answer to 2 +} \ No newline at end of file diff --git a/advent_of_code_2018/day8/test.in b/advent_of_code_2018/day8/test.in new file mode 100644 index 0000000..a316615 --- /dev/null +++ b/advent_of_code_2018/day8/test.in @@ -0,0 +1 @@ +2 3 0 3 10 11 12 1 1 0 1 99 2 1 1 2 \ No newline at end of file diff --git a/advent_of_code_2018/day9/input.in b/advent_of_code_2018/day9/input.in new file mode 100644 index 0000000..6153675 --- /dev/null +++ b/advent_of_code_2018/day9/input.in @@ -0,0 +1 @@ +468 players; last marble is worth 7184300 points \ No newline at end of file diff --git a/advent_of_code_2018/day9/main1.cc b/advent_of_code_2018/day9/main1.cc new file mode 100644 index 0000000..2c33ebb --- /dev/null +++ b/advent_of_code_2018/day9/main1.cc @@ -0,0 +1,120 @@ +#include +#include +#include +#include + +using namespace std; + +/* Slow-as-fuck solution: + + $ time ./a.out < input.in + Num players: 468 + Last marble: 7184300 + Best player had a score of 3156297594 + ./a.out < input.in 5143.54s user 1.02s system 99% cpu 1:25:53.91 total + +*/ + +struct Game +{ + size_t num_players; + size_t last_marble; +}; + +istream &operator>>(istream &in, Game &game) +{ + cin >> game.num_players; + cin.ignore(31); // ignore ' players; last marble is worth '. + cin >> game.last_marble; + cin.ignore(8); // ignore ' points\n' + + return in; +} + +size_t index(size_t main, size_t size) +{ + main += 2; + main = main % size; + return main; +} + +void print_gamestate(size_t round, vector const &game, size_t main) +{ + cout << setw(7) << ("["s + to_string(round) + "]: "s); + for (size_t idx = 0; idx != game.size(); ++idx) + { + if (idx == main) + cout << setw(5) << ("("s + to_string(game[idx]) + ")"s); + else + cout << setw(5) << game[idx]; + } + cout << "\n"; +} + +size_t insert_marble(vector *game, size_t main, size_t marble) +{ + size_t before = (main + 2) % game->size(); + + if (before == 0) + { + game->push_back(marble); + return game->size() - 1; + } + + game->insert(game->begin() + before, marble); + return before; +} + +size_t bonus_marble(size_t main, size_t size) +{ + if (main < 7) + return size - (7 - main); + + return main - 7; +} + +int main() +{ + Game game; + cin >> game; + + cout << "Num players: " << game.num_players << "\n"; + cout << "Last marble: " << game.last_marble << "\n"; + + size_t main_marble = 0; + + vector players; + players.resize(game.num_players, 0); + + vector marbles { 0 }; + // print_gamestate(0, marbles, main_marble); + + for (size_t idx = 1; idx != game.last_marble + 1; ++idx) + { + cout << "Progress: " << idx / static_cast(game.last_marble) * 100 << "\r"; + + if (idx % 23 == 0) //special case + { + size_t player = (idx - 1) % game.num_players; + players[player] += idx; + + main_marble = bonus_marble(main_marble, marbles.size()); + players[player] += marbles[main_marble]; + marbles.erase(marbles.begin() + main_marble); + } + else + { + main_marble = insert_marble(&marbles, main_marble, idx); + } + // print_gamestate(idx, marbles, main_marble); + } + + size_t best_player = 0; + for (size_t idx = 1; idx < players.size(); ++idx) + { + if (players[best_player] < players[idx]) + best_player = idx; + } + + cout << "Best player had a score of " << players[best_player] << "\n"; +} \ No newline at end of file diff --git a/advent_of_code_2018/day9/main2.cc b/advent_of_code_2018/day9/main2.cc new file mode 100644 index 0000000..07dd4f0 --- /dev/null +++ b/advent_of_code_2018/day9/main2.cc @@ -0,0 +1,146 @@ +#include +#include +#include +#include + +using namespace std; + +/* + $ time ./a.out < input.in + Num players: 468 + Last marble: 7184300 + Highest reached score: 3156297594 + ./a.out < input.in 0.16s user 0.05s system 99% cpu 0.203 total + +*/ + +struct Game +{ + size_t num_players; + size_t last_marble; +}; + +istream &operator>>(istream &in, Game &game) +{ + cin >> game.num_players; + cin.ignore(31); // ignore ' players; last marble is worth '. + cin >> game.last_marble; + cin.ignore(8); // ignore ' points\n' + + return in; +} + +struct List +{ + size_t marble; + List *next; + List *previous; + + List(size_t num) + : marble(num), next(this), previous(this) + { } + + List *rotate(int direction) + { + List *rval = this; + + if (direction > 0) + { + for (; direction--; ) + rval = rval->next; + } + else + { + direction *= -1; + for (; direction--; ) + rval = rval->previous; + } + + return rval; + } + + List* insert_after(List *entry) //assume single entry + { + entry->next = next; + entry->next->previous = entry; + entry->previous = this; + next = entry; + + return entry; + } + + //returns next in list. or nullptr when list size == 1 + List* remove_current() + { + if (next == this) + { + delete this; + return nullptr; + } + + next->previous = previous; + previous->next = next; + + List *rval = next; + delete this; + return rval; + } + + void print_list() + { + List *current = next; + cout << setw(5) << marble; + + while (current != this) + { + cout << setw(5) << current->marble; + current = current->next; + } + } +}; + +int main() +{ + + Game game; + cin >> game; + + cout << "Num players: " << game.num_players << "\n"; + cout << "Last marble: " << game.last_marble << "\n"; + + List *root = new List(0); + List *main = root; + + vector players; + players.resize(game.num_players, 0); + + for (size_t idx = 1; idx < game.last_marble + 1; ++idx) + { + if (idx % 23 == 0) + { + size_t player = (idx + 1) % game.num_players; + players[player] += idx; + + main = main->rotate(-7); //? + players[player] += main->marble; + main = main->remove_current(); + } + else + { + main = main->rotate(1)->insert_after(new List(idx)); + } + } + + size_t player = 0; + for (size_t idx = 0; idx < game.num_players; ++idx) + { + if (players[player] < players[idx]) + player = idx; + } + + cout << "Highest reached score: " << players[player] << "\n"; + + while(root) + root = root->remove_current(); + +} \ No newline at end of file diff --git a/advent_of_code_2018/day9/test.in b/advent_of_code_2018/day9/test.in new file mode 100644 index 0000000..f94a71a --- /dev/null +++ b/advent_of_code_2018/day9/test.in @@ -0,0 +1 @@ +10 players; last marble is worth 1618 points \ No newline at end of file diff --git a/advent_of_code_2019/day1/input.txt b/advent_of_code_2019/day1/input.txt new file mode 100644 index 0000000..708b203 --- /dev/null +++ b/advent_of_code_2019/day1/input.txt @@ -0,0 +1,100 @@ +84242 +87800 +131272 +84629 +105398 +91086 +99863 +146591 +58757 +51370 +108422 +95689 +91513 +113692 +79189 +113603 +52750 +123562 +147710 +145313 +98785 +86959 +89755 +97093 +62048 +98872 +145829 +76682 +65788 +119356 +124600 +69459 +80167 +56122 +117390 +72303 +141896 +140568 +82565 +75431 +54613 +124106 +104628 +78531 +63748 +139285 +111926 +101999 +53435 +57906 +58120 +146795 +147754 +79892 +65395 +121551 +50577 +122520 +66441 +86009 +121899 +71715 +112666 +112863 +140695 +54016 +78041 +91757 +130007 +89595 +142289 +149842 +136738 +70046 +89586 +142234 +142090 +147759 +85957 +136288 +86895 +131370 +71565 +128290 +95531 +110317 +115170 +56454 +71468 +113938 +64193 +115562 +73585 +81194 +92754 +105826 +104739 +137106 +104467 +120320 \ No newline at end of file diff --git a/advent_of_code_2019/day1/main1.cc b/advent_of_code_2019/day1/main1.cc new file mode 100644 index 0000000..651b42f --- /dev/null +++ b/advent_of_code_2019/day1/main1.cc @@ -0,0 +1,25 @@ +#include + +using namespace std; + +int required_fuel(int mass) +{ + return (mass / 3) - 2; +} + +int main(int argv, char **argc) +{ + int sum = 0; + + while (!cin.eof()) + { + int mass; + cin >> mass; + + cout << mass << " requires " << required_fuel(mass) << "\n"; + + sum += required_fuel(mass); + } + + cout << "Total required fuel: " << sum << "\n"; +} \ No newline at end of file diff --git a/advent_of_code_2019/day1/main2.cc b/advent_of_code_2019/day1/main2.cc new file mode 100644 index 0000000..b1c21d6 --- /dev/null +++ b/advent_of_code_2019/day1/main2.cc @@ -0,0 +1,29 @@ +#include + +using namespace std; + +int required_fuel(int mass) +{ + int fuel = (mass / 3) - 2; + + if (fuel <= 0) + return 0; + + return fuel + required_fuel(fuel); +} + +int main(int argv, char **argc) +{ + int sum = 0; + + while (!cin.eof()) + { + int mass; + cin >> mass; + sum += required_fuel(mass); + // cout << mass << " requires " << required_fuel(mass) << "\n"; + + } + + cout << "Total required fuel: " << sum << "\n"; +} \ No newline at end of file diff --git a/advent_of_code_2019/day2/input.txt b/advent_of_code_2019/day2/input.txt new file mode 100644 index 0000000..b2b8fe3 --- /dev/null +++ b/advent_of_code_2019/day2/input.txt @@ -0,0 +1 @@ +1,0,0,3,1,1,2,3,1,3,4,3,1,5,0,3,2,1,10,19,1,19,5,23,1,6,23,27,1,27,5,31,2,31,10,35,2,35,6,39,1,39,5,43,2,43,9,47,1,47,6,51,1,13,51,55,2,9,55,59,1,59,13,63,1,6,63,67,2,67,10,71,1,9,71,75,2,75,6,79,1,79,5,83,1,83,5,87,2,9,87,91,2,9,91,95,1,95,10,99,1,9,99,103,2,103,6,107,2,9,107,111,1,111,5,115,2,6,115,119,1,5,119,123,1,123,2,127,1,127,9,0,99,2,0,14,0 \ No newline at end of file diff --git a/advent_of_code_2019/day2/main1.cc b/advent_of_code_2019/day2/main1.cc new file mode 100644 index 0000000..f05982f --- /dev/null +++ b/advent_of_code_2019/day2/main1.cc @@ -0,0 +1,59 @@ +#include +#include + +using namespace std; + +vector read_input() +{ + vector rval; + int buffer; + char comma; + + while (cin) + { + cin >> buffer; + rval.push_back(buffer); + cin >> comma; + } + + return rval; +} + +int main(int argc, char *argv[]) +{ + vector program = read_input(); + size_t instruction = 0; + + // fix according to assignment + program[1] = 12; + program[2] = 2; + + while(true) + { + switch(program[instruction++]) + { + case 1: + { + size_t lhs = program[instruction++]; + size_t rhs = program[instruction++]; + size_t result = program[instruction++]; + program[result] = program[lhs] + program[rhs]; + } + break; + + case 2: + { + size_t lhs = program[instruction++]; + size_t rhs = program[instruction++]; + size_t result = program[instruction++]; + program[result] = program[lhs] * program[rhs]; + } + break; + + case 99: + cout << "Result: " << program[0] << "\n"; + return 0; + } + } + +} \ No newline at end of file diff --git a/advent_of_code_2019/day2/main2.cc b/advent_of_code_2019/day2/main2.cc new file mode 100644 index 0000000..9b4dd23 --- /dev/null +++ b/advent_of_code_2019/day2/main2.cc @@ -0,0 +1,79 @@ +#include +#include + +using namespace std; + +vector read_input() +{ + vector rval; + int buffer; + char comma; + + while (cin) + { + cin >> buffer; + rval.push_back(buffer); + cin >> comma; + } + + return rval; +} + +int run_program(vector program, int noun = 12, int verb = 2) +{ + cout << "running program!\n"; + size_t instruction = 0; + + program[1] = noun; + program[2] = verb; + + while(true) + { + switch(program[instruction++]) + { + case 1: + { + size_t lhs = program[instruction++]; + size_t rhs = program[instruction++]; + size_t result = program[instruction++]; + program[result] = program[lhs] + program[rhs]; + } + break; + + case 2: + { + size_t lhs = program[instruction++]; + size_t rhs = program[instruction++]; + size_t result = program[instruction++]; + program[result] = program[lhs] * program[rhs]; + } + break; + + case 99: + return program[0]; + } + } +} + +int main(int argc, char *argv[]) +{ + vector program = read_input(); + int target_output = 19690720; + + for (int noun = 0; noun < 100; ++noun) + { + cout << "\rIteration: " << noun << " / 100"; + for (int verb = 0; verb < 100; ++verb) + { + int result = run_program(program, noun, verb); + + if (result == target_output) + { + cout << "Noun: " << noun << "\n"; + cout << "Verb: " << verb << "\n"; + cout << "Answer: " << (100 * noun + verb) << "\n"; + return 0; + } + } + } +} \ No newline at end of file diff --git a/advent_of_code_2019/day2/test.txt b/advent_of_code_2019/day2/test.txt new file mode 100644 index 0000000..c5d0d74 --- /dev/null +++ b/advent_of_code_2019/day2/test.txt @@ -0,0 +1 @@ +2,3,0,3,99 \ No newline at end of file diff --git a/advent_of_code_2019/day3/input.txt b/advent_of_code_2019/day3/input.txt new file mode 100644 index 0000000..8adbfab --- /dev/null +++ b/advent_of_code_2019/day3/input.txt @@ -0,0 +1,2 @@ +R1009,U263,L517,U449,L805,D78,L798,D883,L777,D562,R652,D348,R999,D767,L959,U493,R59,D994,L225,D226,R634,D200,R953,U343,L388,U158,R943,U544,L809,D785,R618,U499,L476,U600,L452,D693,L696,U764,L927,D346,L863,D458,L789,U268,R586,U884,L658,D371,L910,U178,R524,U169,R973,D326,R483,U233,R26,U807,L246,D711,L641,D75,R756,U365,R203,D377,R624,U430,L422,U367,R547,U294,L916,D757,R509,D332,R106,D401,L181,U5,L443,U197,R406,D829,R878,U35,L958,U31,L28,D362,R188,D582,R358,U750,R939,D491,R929,D513,L541,U418,R861,D639,L917,U582,R211,U725,R711,D718,L673,U921,L157,U83,L199,U501,L66,D993,L599,D947,L26,U237,L981,U833,L121,U25,R641,D372,L757,D645,R287,U390,R274,U964,R288,D209,R109,D364,R983,U715,L315,U758,R36,D500,R626,U893,L840,U716,L606,U831,L969,D643,L300,D838,R31,D751,L632,D702,R468,D7,L169,U149,R893,D33,R816,D558,R152,U489,L237,U415,R434,D472,L198,D874,L351,U148,R761,U809,R21,D25,R586,D338,L568,U20,L157,U221,L26,U424,R261,D227,L551,D754,L90,U110,L791,U433,R840,U323,R240,U124,L723,D418,R938,D173,L160,U293,R773,U204,R192,U958,L472,D703,R556,D168,L263,U574,L845,D932,R165,D348,R811,D834,R960,U877,R935,D141,R696,U748,L316,U236,L796,D566,R524,U449,R378,U480,L79,U227,R867,D185,R474,D757,R366,U153,R882,U252,R861,U900,R28,U381,L845,U642,L849,U352,R134,D294,R788,D406,L693,D697,L433,D872,R78,D364,R240,U995,R48,D681,R727,D825,L583,U44,R743,D929,L616,D262,R997,D15,R575,U341,R595,U889,R254,U76,R962,D944,R724,D261,R608,U753,L389,D324,L569,U308,L488,D358,L695,D863,L712,D978,R149,D177,R92 +L1003,D960,L10,D57,R294,U538,R867,D426,L524,D441,R775,U308,R577,D785,R495,U847,R643,D895,R448,U685,L253,U312,L312,U753,L89,U276,R799,D923,L33,U595,R400,U111,L664,D542,R171,U709,L809,D713,L483,U918,L14,U854,L150,D69,L158,D500,L91,D800,R431,D851,L798,U515,L107,U413,L94,U390,L17,U221,L999,D546,L191,U472,L568,U114,L913,D743,L713,D215,L569,D674,L869,U549,L789,U259,L330,D76,R243,D592,L646,U880,L363,U542,L464,D955,L107,U473,R818,D786,R852,U968,R526,D78,L275,U891,R480,U991,L981,D391,R83,U691,R689,D230,L217,D458,R10,U736,L317,D145,R902,D428,R344,U334,R131,D739,R438,D376,L652,U304,L332,D452,R241,D783,R82,D317,R796,U323,R287,D487,L302,D110,R233,U631,R584,U973,L878,D834,L930,U472,R120,U78,R806,D21,L521,U988,R251,D817,R44,D789,R204,D669,R616,D96,R624,D891,L532,U154,R438,U469,R785,D431,R945,U649,R670,D11,R840,D521,L235,D69,L551,D266,L454,U807,L885,U590,L647,U763,R449,U194,R68,U809,L884,U962,L476,D648,L139,U96,L300,U351,L456,D202,R168,D698,R161,U834,L273,U47,L8,D157,L893,D200,L454,U723,R886,U92,R474,U262,L190,U110,L407,D723,R786,D786,L572,D915,L904,U744,L820,D663,R205,U878,R186,U247,L616,D386,R582,U688,L349,D399,R702,U132,L276,U866,R851,D633,R468,D263,R678,D96,L50,U946,R349,D482,R487,U525,R464,U977,L499,D187,R546,U708,L627,D470,R673,D886,L375,U616,L503,U38,L775,D8,L982,D556,R159,U680,L124,U777,L640,D607,R248,D671,L65,D290,R445,U778,L650,U679,L846,D1,L769,U659,R734,D962,R588,U178,R888,D753,R223,U318,L695,D586,R430,D61,R105,U801,R953,U721,L856,U769,R937,D335,R895 \ No newline at end of file diff --git a/advent_of_code_2019/day3/main.ih b/advent_of_code_2019/day3/main.ih new file mode 100644 index 0000000..f05c58e --- /dev/null +++ b/advent_of_code_2019/day3/main.ih @@ -0,0 +1,104 @@ +#include +#include +#include +#include + +using namespace std; + +struct Instr//uction +{ + char dir; + int steps; +}; + +struct Point +{ + int x; + int y; +}; + +void print_grid(vector const &grid, size_t width) +{ + for (size_t idx = 0; idx < grid.size(); idx += width) + { + for (size_t col = 0; col < width; ++col) + { + cout << grid[idx + col]; + } + cout << "\n"; + } +} + +size_t index(Point const &point, int width) +{ + return point.y * width + point.x; +} + +Point index_to_point(int index, int width) +{ + return {index % width, index / width}; +} + +Point update(Point point, Instr const &instr) +{ + switch(instr.dir) + { + case 'R': + point.x += instr.steps; + break; + case 'L': + point.x -= instr.steps; + break; + case 'U': + point.y -= instr.steps; + break; + case 'D': + point.y += instr.steps; + break; + default: + cout << "unknown direction '" << instr.dir << "'\n"; + } + return point; +} + +auto dimensions(vector const &instructions, Point start = {0, 0}) +{ + Point min{0, 0}; + Point max{0, 0}; + + for (Instr const &instr : instructions) + { + start = update(start, instr); + min.x = std::min(start.x, min.x); + max.x = std::max(start.x, max.x); + min.y = std::min(start.y, min.y); + max.y = std::max(start.y, max.y); + } + + return tuple(min, max); +} + +vector parse_instructions(std::string const &line) +{ + stringstream ss{line}; + vector rval; + char dir; + int steps; + + while (ss) + { + ss >> dir; + ss >> steps; + rval.push_back({dir, steps}); + ss >> dir; // parse comma + } + + return rval; +} + +vector parse_line() +{ + string buffer; + getline(cin, buffer); + return parse_instructions(buffer); +} \ No newline at end of file diff --git a/advent_of_code_2019/day3/main1.cc b/advent_of_code_2019/day3/main1.cc new file mode 100644 index 0000000..32eb54d --- /dev/null +++ b/advent_of_code_2019/day3/main1.cc @@ -0,0 +1,143 @@ +#include "main.ih" +#include + +int main(int argc, char *argv[]) +{ + vector wire_one = parse_line(); + vector wire_two = parse_line(); + + auto [min1, max1] = dimensions(wire_one); + auto [min2, max2] = dimensions(wire_two); + + Point min = {std::min(min1.x, min2.x), std::min(min1.y, min2.y)}; + Point max = {std::max(max1.x, max2.x), std::max(max1.y, max2.y)}; + + int width = max.x + abs(min.x) + 2; + int height = max.y + abs(min.y) + 2; + Point startp = {abs(min.x) + 1, abs(min.y) + 1}; + + vector overlaps; + + vector grid; + grid.resize(width * height, '.'); + size_t location = index(startp, width); + size_t stored_start = location; + grid[location] = 'O'; + + for (Instr const &instr : wire_one) + { + switch (instr.dir) + { + case 'R': + for (int idx = 0; idx < instr.steps; ++idx) + { + location += 1; + grid[location] = '1'; + } + break; + + case 'L': + for (int idx = 0; idx < instr.steps; ++idx) + { + location -= 1; + grid[location] = '1'; + } + break; + + case 'U': + for (int idx = 0; idx < instr.steps; ++idx) + { + location -= width; + grid[location] = '1'; + } + break; + + case 'D': + for (int idx = 0; idx < instr.steps; ++idx) + { + location += width; + grid[location] = '1'; + } + break; + } + } + + // some delish copy-paste + location = stored_start; + for (Instr const &instr : wire_two) + { + switch (instr.dir) + { + case 'R': + for (int idx = 0; idx < instr.steps; ++idx) + { + location += 1; + if (grid[location] == '1') + { + grid[location] = 'X'; + overlaps.push_back(index_to_point(location, width)); + } + else + grid[location] = '2'; + } + break; + + case 'L': + for (int idx = 0; idx < instr.steps; ++idx) + { + location -= 1; + if (grid[location] == '1') + { + grid[location] = 'X'; + overlaps.push_back(index_to_point(location, width)); + } + else + grid[location] = '2'; + } + break; + + case 'U': + for (int idx = 0; idx < instr.steps; ++idx) + { + location -= width; + if (grid[location] == '1') + { + grid[location] = 'X'; + overlaps.push_back(index_to_point(location, width)); + } + else + grid[location] = '2'; + } + break; + + case 'D': + for (int idx = 0; idx < instr.steps; ++idx) + { + location += width; + if (grid[location] == '1') + { + grid[location] = 'X'; + overlaps.push_back(index_to_point(location, width)); + } + else + grid[location] = '2'; + } + break; + } + } + + // print_grid(grid, width); + + auto manhattan = [](Point p1, Point p2) -> int + { + return abs(p1.x - p2.x) + abs(p1.y - p2.y); + }; + + int mindist = numeric_limits::max(); + for (Point overlap : overlaps) + { + mindist = std::min(mindist, manhattan(startp, overlap)); + } + + cout << "mindist: " << mindist << "\n"; +} \ No newline at end of file diff --git a/advent_of_code_2019/day3/main2.cc b/advent_of_code_2019/day3/main2.cc new file mode 100644 index 0000000..6015ffe --- /dev/null +++ b/advent_of_code_2019/day3/main2.cc @@ -0,0 +1,144 @@ +#include "main.ih" +#include + +struct Location +{ + int wire_one_dist = -1; + int wire_two_dist = -1; + + int time() + { + if (wire_one_dist == -1 || wire_two_dist == -1) + return numeric_limits::max(); + return wire_one_dist + wire_two_dist; + } +}; + +int main(int argc, char *argv[]) +{ + vector wire_one = parse_line(); + vector wire_two = parse_line(); + + auto [min1, max1] = dimensions(wire_one); + auto [min2, max2] = dimensions(wire_two); + + Point min = {std::min(min1.x, min2.x), std::min(min1.y, min2.y)}; + Point max = {std::max(max1.x, max2.x), std::max(max1.y, max2.y)}; + + int width = max.x + abs(min.x) + 2; + int height = max.y + abs(min.y) + 2; + Point startp = {abs(min.x) + 1, abs(min.y) + 1}; + + vector overlaps; + + vector grid; + grid.resize(width * height); + size_t location = index(startp, width); + size_t stored_start = location; + grid[location] = {0, 0}; + + int distance = 0; + for (Instr const &instr : wire_one) + { + switch (instr.dir) + { + case 'R': + for (int idx = 0; idx < instr.steps; ++idx) + { + ++distance; + location += 1; + grid[location].wire_one_dist = grid[location].wire_one_dist == -1 ? distance : grid[location].wire_one_dist; + } + break; + + case 'L': + for (int idx = 0; idx < instr.steps; ++idx) + { + ++distance; + location -= 1; + grid[location].wire_one_dist = grid[location].wire_one_dist == -1 ? distance : grid[location].wire_one_dist; + } + break; + + case 'U': + for (int idx = 0; idx < instr.steps; ++idx) + { + ++distance; + location -= width; + grid[location].wire_one_dist = grid[location].wire_one_dist == -1 ? distance : grid[location].wire_one_dist; + } + break; + + case 'D': + for (int idx = 0; idx < instr.steps; ++idx) + { + ++distance; + location += width; + grid[location].wire_one_dist = grid[location].wire_one_dist == -1 ? distance : grid[location].wire_one_dist; + } + break; + } + } + + // some delish copy-paste + location = stored_start; + distance = 0; + for (Instr const &instr : wire_two) + { + switch (instr.dir) + { + case 'R': + for (int idx = 0; idx < instr.steps; ++idx) + { + ++distance; + location += 1; + grid[location].wire_two_dist = grid[location].wire_two_dist == -1 ? distance : grid[location].wire_two_dist; + if (grid[location].wire_one_dist != -1) + overlaps.push_back(location); + } + break; + + case 'L': + for (int idx = 0; idx < instr.steps; ++idx) + { + ++distance; + location -= 1; + grid[location].wire_two_dist = grid[location].wire_two_dist == -1 ? distance : grid[location].wire_two_dist; + if (grid[location].wire_one_dist != -1) + overlaps.push_back(location); + } + break; + + case 'U': + for (int idx = 0; idx < instr.steps; ++idx) + { + ++distance; + location -= width; + grid[location].wire_two_dist = grid[location].wire_two_dist == -1 ? distance : grid[location].wire_two_dist; + if (grid[location].wire_one_dist != -1) + overlaps.push_back(location); + } + break; + + case 'D': + for (int idx = 0; idx < instr.steps; ++idx) + { + ++distance; + location += width; + grid[location].wire_two_dist = grid[location].wire_two_dist == -1 ? distance : grid[location].wire_two_dist; + if (grid[location].wire_one_dist != -1) + overlaps.push_back(location); + } + break; + } + } + + int mintime = numeric_limits::max(); + for (int overlap : overlaps) + { + cout << "time: " << grid[overlap].time() << "\n"; + mintime = std::min(grid[overlap].time(), mintime); + } + + cout << "mintime: " << mintime << "\n"; +} \ No newline at end of file diff --git a/advent_of_code_2019/day3/test.txt b/advent_of_code_2019/day3/test.txt new file mode 100644 index 0000000..3207492 --- /dev/null +++ b/advent_of_code_2019/day3/test.txt @@ -0,0 +1,2 @@ +R75,D30,R83,U83,L12,D49,R71,U7,L72 +U62,R66,U55,R34,D71,R55,D58,R83 \ No newline at end of file diff --git a/advent_of_code_2019/day4/main1.cc b/advent_of_code_2019/day4/main1.cc new file mode 100644 index 0000000..2f83385 --- /dev/null +++ b/advent_of_code_2019/day4/main1.cc @@ -0,0 +1,41 @@ +#include +#include + +using namespace std; + +bool meets_criteria(size_t passwd) +{ + string number = to_string(passwd); + + bool adjacent = false; + + char min = '0'; + char prev = '1'; + for (char ch : number) + { + adjacent = adjacent | (prev == ch); + + if (ch < min) + return false; + + min = ch; + prev = ch; + } + + return adjacent; +} + +int main() +{ + const size_t LOWER = 178416; + const size_t UPPER = 676461; + + size_t valid = 0; + for (size_t idx = LOWER; idx <= UPPER; ++idx) + { + if (meets_criteria(idx)) + ++valid; + } + + cout << "valid: " << valid << "\n"; +} \ No newline at end of file diff --git a/advent_of_code_2019/day4/main2.cc b/advent_of_code_2019/day4/main2.cc new file mode 100644 index 0000000..717a5d2 --- /dev/null +++ b/advent_of_code_2019/day4/main2.cc @@ -0,0 +1,62 @@ +#include +#include + +using namespace std; + +bool meets_criteria(size_t passwd) +{ + string number = to_string(passwd); + + bool adjacent = false; + int groupsize = 0; + + char min = '0'; + char prev = '1'; + for (char ch : number) + { + adjacent = adjacent | (prev == ch); + + if (prev == ch) + ++groupsize; + else + { + if (groupsize > 1 && groupsize % 2 != 0) + { + cout << "groupsize bounced: " << passwd << "\n"; + return false; //uneven group + } + + prev = ch; + groupsize = 1; + } + + if (ch < min) + return false; + + min = ch; + } + + if (groupsize == 1) + return adjacent; + else if (groupsize % 2 != 0) + { + cout << "groupsize bounced (end): " << passwd << "\n"; + return false; + } + return true; +} + +int main() +{ + const size_t LOWER = 178416; + const size_t UPPER = 676461; + + size_t valid = 0; + for (size_t idx = LOWER; idx <= UPPER; ++idx) + { + if (meets_criteria(idx)) + ++valid; + } + + cout << "valid: " << valid << "\n"; +} \ No newline at end of file diff --git a/advent_of_code_2020/day1/input.txt b/advent_of_code_2020/day1/input.txt new file mode 100644 index 0000000..c34d03b --- /dev/null +++ b/advent_of_code_2020/day1/input.txt @@ -0,0 +1,200 @@ +997 +1582 +1790 +1798 +1094 +1831 +1879 +1730 +1995 +1702 +1680 +1869 +1964 +1777 +1862 +1928 +1997 +1741 +1604 +1691 +1219 +1458 +1749 +1717 +1786 +1665 +1724 +1998 +1589 +1828 +1953 +1848 +1500 +1590 +1968 +1948 +1323 +1800 +1986 +679 +1907 +1916 +1820 +1661 +1479 +1808 +1824 +1825 +1952 +1666 +1541 +1791 +1906 +1638 +1557 +1999 +1710 +1549 +1912 +1974 +1628 +1748 +1411 +1978 +1865 +1932 +1839 +1892 +1981 +1807 +357 +912 +1443 +1972 +1816 +1890 +1029 +1175 +1522 +1750 +2001 +1655 +1955 +1949 +1660 +233 +1891 +1994 +1934 +1908 +1573 +1712 +1622 +1770 +1574 +1778 +1851 +2004 +1818 +1200 +1229 +1110 +1005 +1716 +1765 +1835 +1773 +15 +1914 +1833 +1689 +1843 +1718 +1872 +390 +1941 +1178 +1670 +1899 +1864 +1913 +2010 +1855 +1797 +1767 +1673 +1657 +1607 +1305 +1341 +1662 +1845 +1980 +1534 +1789 +1876 +1849 +1926 +1958 +977 +1709 +1647 +1832 +1785 +1854 +1667 +1679 +1970 +1186 +2000 +1681 +1684 +1614 +1988 +1561 +1594 +1636 +1327 +1696 +1915 +1045 +1829 +1079 +1295 +1213 +1714 +1992 +1984 +1951 +1687 +1842 +1792 +87 +1732 +428 +1799 +1850 +1962 +1629 +1965 +1142 +1040 +131 +1844 +1454 +1779 +1369 +1960 +1887 +1725 +1893 +1465 +1676 +1826 +1462 +1408 +1937 +1643 +1069 +1759 \ No newline at end of file diff --git a/advent_of_code_2020/day1/main1.cc b/advent_of_code_2020/day1/main1.cc new file mode 100644 index 0000000..5c7a059 --- /dev/null +++ b/advent_of_code_2020/day1/main1.cc @@ -0,0 +1,35 @@ +#include +#include +#include +#include + +using namespace std; + +int main() +{ + vector numbers; + ifstream in("input.txt"); + + while (true) + { + int tmp; + in >> tmp; + + if (!in) + break; + + numbers.push_back(tmp); + cout << "read " << tmp << "\n"; + } + + cout << "Read " << numbers.size() << " numbers.\n"; + + for (size_t outer = 0; outer < numbers.size(); ++outer) + { + for (size_t inner = outer + 1; inner < numbers.size(); ++inner) + { + if (numbers[outer] + numbers[inner]== 2020) + cout << "Answer: " << numbers[outer] * numbers[inner] << "\n"; + } + } +} \ No newline at end of file diff --git a/advent_of_code_2020/day1/main2.cc b/advent_of_code_2020/day1/main2.cc new file mode 100644 index 0000000..79f0c3f --- /dev/null +++ b/advent_of_code_2020/day1/main2.cc @@ -0,0 +1,42 @@ +#include +#include +#include +#include + +using namespace std; + +int main() +{ + vector numbers; + ifstream in("input.txt"); + + while (true) + { + int tmp; + in >> tmp; + + if (!in) + break; + + numbers.push_back(tmp); + cout << "read " << tmp << "\n"; + } + + cout << "Read " << numbers.size() << " numbers.\n"; + + for (size_t outer = 0; outer < numbers.size(); ++outer) + { + for (size_t inner = outer + 1; inner < numbers.size(); ++inner) + { + for (size_t innest = inner + 1; innest < numbers.size(); ++innest) + { + if (numbers[outer] + numbers[inner] + numbers[innest] == 2020) + cout << "Answer: " << numbers[outer] * numbers[inner] * numbers[innest] << "\n"; + + } + } + } + + + +} \ No newline at end of file diff --git a/advent_of_code_2022/day_1/input.txt b/advent_of_code_2022/day1/input.txt similarity index 100% rename from advent_of_code_2022/day_1/input.txt rename to advent_of_code_2022/day1/input.txt diff --git a/advent_of_code_2022/day_1/main.cc b/advent_of_code_2022/day1/main.cc similarity index 100% rename from advent_of_code_2022/day_1/main.cc rename to advent_of_code_2022/day1/main.cc