From 6a4482d03874f081f2caa7add8d2303ea72c33d5 Mon Sep 17 00:00:00 2001 From: Peter Hudec Date: Thu, 17 Dec 2015 01:55:50 +0100 Subject: [PATCH] first commit --- .gitignore | 1 + 01/input | 1 + 01/part1.py | 23 ++ 01/part2.py | 27 ++ 02/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++++ 02/input2 | 1 + 02/part1.py | 30 ++ 02/part2.py | 30 ++ 03/input | 1 + 03/part1.py | 47 +++ 03/part2.py | 61 +++ 04/part01.py | 23 ++ 04/part02.py | 23 ++ 05/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++++ 05/input2 | 5 + 05/input3 | 4 + 05/part1.py | 49 +++ 05/part2.py | 43 +++ 06/input | 300 +++++++++++++++ 06/part1.py | 88 +++++ 06/part2.py | 69 ++++ 07/input | 339 +++++++++++++++++ 07/part1.py | 95 +++++ 07/part2.py | 98 +++++ 08/input | 300 +++++++++++++++ 08/input1 | 4 + 08/part1.py | 48 +++ 08/part2.py | 48 +++ 09/input | 28 ++ 09/input1 | 3 + 09/part1.py | 61 +++ 09/part2.py | 61 +++ 10/part1.py | 26 ++ 10/part2.py | 26 ++ README | 2 + 35 files changed, 3965 insertions(+) create mode 100644 .gitignore create mode 100644 01/input create mode 100644 01/part1.py create mode 100644 01/part2.py create mode 100644 02/input create mode 100644 02/input2 create mode 100644 02/part1.py create mode 100644 02/part2.py create mode 100644 03/input create mode 100644 03/part1.py create mode 100644 03/part2.py create mode 100644 04/part01.py create mode 100644 04/part02.py create mode 100644 05/input create mode 100644 05/input2 create mode 100644 05/input3 create mode 100644 05/part1.py create mode 100644 05/part2.py create mode 100644 06/input create mode 100644 06/part1.py create mode 100644 06/part2.py create mode 100644 07/input create mode 100644 07/part1.py create mode 100644 07/part2.py create mode 100644 08/input create mode 100644 08/input1 create mode 100644 08/part1.py create mode 100644 08/part2.py create mode 100644 09/input create mode 100644 09/input1 create mode 100644 09/part1.py create mode 100644 09/part2.py create mode 100644 10/part1.py create mode 100644 10/part2.py create mode 100644 README diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..702ebda --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.ropeproject diff --git a/01/input b/01/input new file mode 100644 index 0000000..f1311c4 --- /dev/null +++ b/01/input @@ -0,0 +1 @@ +()()(()()()(()()((()((()))((()((((()()((((()))()((((())(((((((()(((((((((()(((())(()()(()((()()(()(())(()((((()((()()()((((())((((((()(()(((()())(()((((()))())(())(()(()()))))))))((((((((((((()())()())())(())))(((()()()((((()(((()(()(()()(()(()()(()(((((((())(())(())())))((()())()((((()()((()))(((()()()())))(())))((((())(((()())(())(()))(()((((()())))())((()(())(((()((((()((()(())())))((()))()()(()(()))))((((((((()())((((()()((((()(()())(((((()(()())()))())(((()))()(()(()(()((((()(())(()))(((((()()(()()()(()(((())())(((()()(()()))(((()()(((())())(()(())())()()(())()()()((()(((()(())((()()((())()))((()()))((()()())((((()(()()(()(((()))()(()))))((()(((()()()))(()(((())()(()((()())(()(()()(()())(())()(((()(()())()((((()((()))))())()))((()()()()(())()())()()()((((()))))(()(((()()(((((((())()))()((((()((())()(()())(())()))(()(()())(((((((())))(((()))())))))()))())((())(()()((())()())()))))()((()()())(())((())((((()())())()()()(((()))())))()()))())(()()()(()((((((()()))())()))()(((()(((())((((()()()(()))())()()))))())()))())((())()())(((((())())((())())))(((())(((())(((((()(((((())(()(()())())(()(())(()))(()((((()))())()))))())))((()(()))))())))(((((())()))())()))))()))))(((()))()))))((()))((()((()(()(())()())))(()()()(())()))()((((())))))))(())(()((()()))(()))(()))(()((()))))))()()((((()()))()())()))))))()()()))(()((())(()))((()()()())()(((()((((())())))()((((()(()))))))())))()()())()))(()))))(()())()))))))((())))))))())()))()((())())))(()((()))()))(())))))(()))()())()()))((()(()))()()()()))))())()()))())(())()()))()))((()))))()()(()())))))()()()))((((()))()))))(()(())))(()())))((())())(()))()))))()())))()())()())))))))))()()))))())))((())((()))))())))(((()())))))))(()))()()))(()))()))))()())))))())((((()())))))))())))()()))))))))()))()))))()))))))(())))))))))())))))))))))))))())())((())))))))))()))((())))()))))))))())()(()))))))())))))()()()())()(()()()(()())(()))()()()(()())))())())))()))))())))))))()()()()())(())())()())()))))(()()()()()))))()))())())))((()())()())))()))()))))(()())))()))))))))(((()))()()))))))))))))))))))))(()))(()((()))())))())(()))(()(()(())))))()(()))()))()()))))))))))))()((()())(())())()(())))))())()())((()()))))(()()))))())()(())()))))))))))))))))))))()))(()(()())))))))()()((()))()))))))((())))()))))))))((()))())()()))())()()))((()))())))))))))))(()())()))(())((()(()()))(()())(())))()())(()(())()()))))()))()(()))))))(()))))))))))(()))())))))))))())))))())))(())))))()))))(())())))))))))()(()))))()())))())(()))()())))))))))))))())()()))))()))))))())))))()))))(())(()()()()((())()))())(()))((())()))())())(())(()()))))()))(())()()((())(())))(())))()))())))))))))()(((((())())))(())()))))(())))((()))()(((((((()))))()()))(())))))()(()))))(()()))()))())))))))(()())()))))))))())))(()))())()))(())()((())())()())())(()(()))))()))))))((()())(())()()(()())))()()))(())(())(()))())))()))(()))()()))((((()))))()))((()()()))))()))()))())))(()))()))))(())))()))())()(()))()())))())))))))())))())))()()))))))(()))())())))()))()()())())))))))))))))())))()))(()()))))())))())()(())))())))))))))))))))))()()())())))))()()()((()(()))()()(())()())()))()))))()()()))))))((()))))))))()(()(()((((((()()((()())))))))))))()))())))))((())())(()))())))())))))())()()())(())))())))()())())(())))))))()()(())))()))())))())())())()))))))))()))(()()()())())())))(())())))))))()()())()))))())))())()(())())))))))()())()))(()()(())())))()(()((()()((()()(((((())(()())()))(())()))(())))(())))))))()))()))((()))()))()))))))))()))))))))((()()())(()))(((()))(())))()))((())(((())))()())))())))))((())))))(())())((((((())())()(()))()(()((()())))((())()(()(()))))(())(()()())(())))())((()(((())())))(((()())())))())()(())())((((()()))))())((()))()()()()(())(((((((()()()((()))())(()())))(())())((((()()(()))))()((())))((())()))()(((()))())))()))((()(()))(())(()((((())((((()()(()()))(((())(()))))((((()(()))(())))))((()))(()))((()(((()(()))(()(()((()(())(()(()(()(()()((()))())(((())(()(()))))(()))()()))(())))(())()(((())(()))()((((()()))))())(()))))((())()((((()(((()))())())(((()))()())((())(())())(())()(())()(()()((((((()()))))()()(((()()))))()())()(((()(()))(()(()())(()(()))))(((((()(((())())))))(((((()((()()((())())((((((()(())(()()((()()()()()()()(()()))()(((()))()))(((((((())(((()((()())()((((())(((()(())))()((()(()()()((())((()())()))()))())))())((((((()))(()(()()()))(()((()(()(()))()((()(((()()()((())(((((())()(()))())())((()(())))(()(()())(())((())())())(((()()()(())))))())(()))))))()))))))())((()()()))((()((((((()))(((()((((()()()(((()))())()(()()(((()((()()()()())()()))()()()(()(())((()))))(()))())))))))()(()()(((((())()(()(((((()((()(()()())(()((((((((()((((((())()((((()()()((()((()((((((()))((())))))))())()))((()(()))()(()()(()((())((()()((((((((((((()())(()()()))((((()((((((())(()))())(()()((()()))()(((((((()((()()((((((()(((())))((())))((((((((()()(((((((())(((((()())(((())((())()((((()(((((((()(()(((()((((((()(((()(((((((((((()()((()()(()))((()()(((()(((())))((((())()(()(((())()(()(((())(((((((((((()))())))((((((())((()()((((()())())((((()()))((())(((((()(()()(()()()((())(()((()()((((()(((((()((()(()((((()())((((((()(((((()()(()(()((((())))(())(())(())((((()(()()((((()((((()()((()((((((())))(((((()))))()))(()((((((((()(((())())(((())))(()(()((())(((()((()()(((((()((()()(((())()(()))(((((((())(()(((((()))((()((()((()))(())())((((()((((())()(()))(((()(((((((((((((((())(((((((((()))(((()(()()()()((((((()((())()((((((((()(())(((((((((((()(()((())()((()()(()(()()((((()()((())(()((()()(()()((((()(((((((())))((((())(())()(((()()((()()((((()((()(((()((())(((()()()((((()((((()()(()(()((((((((())(()(((((())(()())(((((((()())()(()((((()((())(()()())((((()()(((()((((())(())(()()(((((((((()()))()(((())(()(()((((((())(()()())(()))()()(((()(((()((())(()(((((((()(()(()((()(((((()(()((()(()((((((()((((()()((((()(((()((())(()(()((()()((((()()(())()(())(((())(()((((((((()())(((((((((()(())()((((())))()))()()(((((()()((((((())(()()(((()(()(((((((()(()(((((((())(())((((()((()(())))((((()()())(()))((()())((((()(((((()(()(())(()(()()())(((((()(((((()((((()()((((((((()()))(()((((((())((((())()(()(((()()()(((()(()(())(())(((((()(())())((((())(())(()(((()(((((())((((())())((()(((((((()(((())(()(()))(((((((((()((()((()()(()((((())(((()((())((((())(()(((()(((()(()((((()(((())(()(((()(()()(()(()((()()(()())(())())((()(()(((()(((()(((()()(((((((((()(((((((((()()(((()(((()())((((()(()(((()()()((())((((((((((())(()(((()((((()())((((()((()))(((()()()(((((()(((((((())((()())(()((((())((((((((())(()((()((((((((((()()((()((()()))(((()())()())()(((()())()()(()(()(((((((())()))(())()))())()()((())()((()((((()((()((())(((((()((((((()(())))(()))())(((()))((()()(()(((()))((((())()(((()))))()(()(())()(((((())(()(()(())(())()((()()()((((()(())((()())(()(()))(()(()(()()(())()()(()((())()((()))))()))((()(()()()()((()())(()))())()(()(((((((((())())((()((()((((((())()((((())(((())((()(()()()((())(()((())(((()((((()()((()(()(((((())()))()((((((()))((())(((()()))(((())(())()))(((((((())(())())()(())(((((()))()((()))()(()()((()()()()()())((((((( diff --git a/01/part1.py b/01/part1.py new file mode 100644 index 0000000..afff83f --- /dev/null +++ b/01/part1.py @@ -0,0 +1,23 @@ +#!/usr/bin/python + + +def read_file(filename, chunk=1024): + file = open(filename, 'r') + while True: + line = file.read(chunk) + if not line: + break + yield line + + +def main(): + floor = 0 + for line in read_file('input'): + up = line.count('(') + down = line.count(')') + floor = floor + up - down + + print floor + +if __name__ == "__main__": + main() diff --git a/01/part2.py b/01/part2.py new file mode 100644 index 0000000..4bc5e14 --- /dev/null +++ b/01/part2.py @@ -0,0 +1,27 @@ +#!/usr/bin/python + + +def read_file(filename, chunk=1024): + file = open(filename, 'r') + while True: + line = file.read(chunk) + if not line: + break + yield line + + +def main(): + floor = 0 + pos = 1 + for line in read_file('input', 1): + up = line.count('(') + down = line.count(')') + floor = floor + up - down + if floor == -1: + break + pos = pos + 1 + + print pos + +if __name__ == "__main__": + main() diff --git a/02/input b/02/input new file mode 100644 index 0000000..2f04474 --- /dev/null +++ b/02/input @@ -0,0 +1,1000 @@ +20x3x11 +15x27x5 +6x29x7 +30x15x9 +19x29x21 +10x4x15 +1x26x4 +1x5x18 +10x15x23 +10x14x20 +3x5x18 +29x23x30 +7x4x10 +22x24x29 +30x1x2 +19x2x5 +11x9x22 +23x15x10 +11x11x10 +30x28x5 +22x5x4 +6x26x20 +16x12x30 +10x20x5 +25x14x24 +16x17x22 +11x28x26 +1x11x10 +1x24x15 +13x17x21 +30x3x13 +20x25x17 +22x12x5 +22x20x24 +9x2x14 +6x18x8 +27x28x24 +11x17x1 +1x4x12 +5x20x13 +24x23x23 +22x1x25 +18x19x5 +5x23x13 +8x16x4 +20x21x9 +1x7x11 +8x30x17 +3x30x9 +6x16x18 +22x25x27 +9x20x26 +16x21x23 +5x24x17 +15x17x15 +26x15x10 +22x16x3 +20x24x24 +8x18x10 +23x19x16 +1x21x24 +23x23x9 +14x20x6 +25x5x5 +16x3x1 +29x29x20 +11x4x26 +10x23x24 +29x25x16 +27x27x22 +9x7x22 +6x21x18 +25x11x19 +14x13x3 +15x28x17 +14x3x12 +29x8x19 +30x14x20 +20x23x4 +8x16x5 +4x11x18 +20x8x24 +21x13x21 +14x26x29 +27x4x17 +27x4x25 +5x28x6 +23x24x11 +29x22x5 +30x20x6 +23x2x10 +11x4x7 +27x23x6 +10x20x19 +8x20x22 +5x29x22 +16x13x2 +2x11x14 +6x12x4 +3x13x6 +16x5x18 +25x3x28 +21x1x5 +20x16x19 +28x30x27 +26x7x18 +25x27x24 +11x19x7 +21x19x17 +2x12x27 +20x5x14 +8x5x8 +6x24x8 +7x28x20 +3x20x28 +5x20x30 +13x29x1 +26x29x5 +19x28x25 +5x19x11 +11x20x22 +4x23x1 +19x25x12 +3x10x6 +3x14x10 +28x16x12 +23x12x2 +23x12x19 +20x28x10 +9x10x25 +16x21x16 +1x18x20 +9x4x26 +3x25x8 +17x16x28 +9x28x16 +27x3x12 +17x24x12 +13x21x10 +7x17x13 +6x10x9 +7x29x25 +11x19x30 +1x24x5 +20x16x23 +24x28x21 +6x29x19 +25x2x19 +12x5x26 +25x29x12 +16x28x22 +26x26x15 +9x13x5 +10x29x7 +1x24x16 +22x2x2 +6x16x13 +3x12x28 +4x12x13 +14x27x21 +14x23x26 +7x5x18 +8x30x27 +15x9x18 +26x16x5 +3x29x17 +19x7x18 +16x18x1 +26x15x30 +24x30x21 +13x20x7 +4x12x10 +27x20x11 +28x29x21 +20x14x30 +28x12x3 +19x1x8 +4x8x6 +21x14x2 +27x19x21 +17x24x14 +15x18x11 +18x7x26 +25x28x29 +27x26x9 +18x12x17 +24x28x25 +13x24x14 +26x9x28 +9x3x30 +9x2x9 +8x1x29 +18x30x10 +18x14x5 +26x8x30 +12x1x1 +30x5x28 +26x17x21 +10x10x10 +20x7x27 +13x17x6 +21x13x17 +2x16x8 +7x9x9 +15x26x4 +11x28x25 +10x6x19 +21x6x29 +15x5x6 +28x9x16 +14x3x10 +12x29x5 +22x19x19 +25x15x22 +30x6x28 +11x23x13 +20x25x14 +26x1x13 +6x14x15 +16x25x17 +28x4x13 +10x24x25 +4x13x10 +9x15x16 +15x24x6 +22x9x19 +11x11x8 +4x19x12 +24x5x4 +27x12x13 +7x27x16 +2x6x9 +29x27x15 +18x26x23 +19x16x15 +14x5x25 +9x16x30 +4x6x4 +13x10x10 +1x8x29 +23x5x17 +19x20x20 +11x27x24 +27x15x5 +15x11x12 +21x11x3 +1x13x22 +17x8x8 +13x14x14 +17x22x7 +9x5x8 +2x6x3 +25x9x15 +11x8x13 +9x25x12 +3x16x12 +12x16x8 +16x24x17 +4x6x26 +22x29x11 +14x17x19 +28x2x27 +24x22x19 +22x20x30 +23x28x4 +16x12x14 +22x24x22 +29x1x28 +26x29x16 +3x25x30 +27x3x13 +22x24x26 +25x3x2 +7x24x2 +10x5x3 +28x8x29 +25x6x4 +12x17x14 +24x3x5 +23x27x7 +26x23x30 +11x10x19 +23x7x11 +26x14x15 +14x3x25 +12x24x14 +2x14x12 +9x12x16 +9x2x28 +3x8x2 +22x6x9 +2x30x2 +25x1x9 +20x11x2 +14x11x12 +7x14x12 +24x8x26 +13x21x23 +18x17x23 +13x6x17 +20x20x19 +13x17x29 +7x24x24 +23x8x6 +19x10x28 +3x8x21 +15x20x18 +11x27x1 +11x24x28 +13x20x11 +18x19x22 +27x22x12 +28x3x2 +13x4x29 +26x5x6 +14x29x25 +7x4x7 +5x17x7 +2x8x1 +22x30x24 +22x21x28 +1x28x13 +11x20x4 +25x29x19 +9x23x4 +30x6x11 +25x18x10 +28x10x24 +3x5x20 +19x28x10 +27x19x2 +26x20x4 +19x21x6 +2x12x30 +8x26x27 +11x27x10 +14x13x17 +4x3x21 +2x20x21 +22x30x3 +2x23x2 +3x16x12 +22x28x22 +3x23x29 +8x25x15 +9x30x4 +10x11x1 +24x8x20 +10x7x27 +7x22x4 +27x13x17 +5x28x5 +30x15x13 +10x8x17 +8x21x5 +8x17x26 +25x16x4 +9x7x25 +13x11x20 +6x30x9 +15x14x12 +30x1x23 +5x20x24 +22x7x6 +26x11x23 +29x7x5 +13x24x28 +22x20x10 +18x3x1 +15x19x23 +28x28x20 +7x26x2 +9x12x20 +15x4x6 +1x17x21 +3x22x17 +9x4x20 +25x19x5 +9x11x22 +14x1x17 +14x5x16 +30x5x18 +19x6x12 +28x16x22 +13x4x25 +29x23x18 +1x27x3 +12x14x4 +10x25x19 +15x19x30 +11x30x4 +11x22x26 +13x25x2 +17x13x27 +11x30x24 +15x1x14 +17x18x4 +26x11x3 +16x22x28 +13x20x9 +1x18x3 +25x11x12 +20x21x1 +22x27x4 +8x28x23 +7x13x27 +17x9x26 +27x27x20 +11x20x12 +26x21x11 +29x14x12 +27x25x1 +28x29x25 +21x23x28 +5x18x18 +19x5x4 +7x6x30 +27x8x11 +12x24x12 +16x25x22 +26x11x29 +25x22x17 +15x23x23 +17x9x6 +30x10x16 +21x3x5 +18x27x2 +28x21x14 +16x18x17 +4x18x2 +9x1x14 +9x1x9 +5x27x12 +8x16x30 +3x19x19 +16x26x24 +1x6x9 +15x14x3 +11x7x19 +8x19x3 +17x26x26 +6x18x11 +19x12x4 +29x20x16 +20x17x23 +6x6x5 +20x30x19 +18x25x18 +2x26x2 +3x1x1 +14x25x18 +3x1x6 +11x14x18 +17x23x27 +25x29x9 +6x25x20 +20x10x9 +17x5x18 +29x14x8 +14x25x26 +10x15x29 +23x19x11 +22x2x2 +4x5x5 +13x23x25 +19x13x19 +20x18x6 +30x7x28 +26x18x17 +29x18x10 +30x29x1 +12x26x24 +18x17x26 +29x28x15 +3x12x20 +24x10x8 +30x15x6 +28x23x15 +14x28x11 +10x27x19 +14x8x21 +24x1x23 +1x3x27 +6x15x6 +8x25x26 +13x10x25 +6x9x8 +10x29x29 +26x23x5 +14x24x1 +25x6x22 +17x11x18 +1x27x26 +18x25x23 +20x15x6 +2x21x28 +2x10x13 +12x25x14 +2x14x23 +30x5x23 +29x19x21 +29x10x25 +14x22x16 +17x11x26 +12x17x30 +8x17x7 +20x25x28 +20x11x30 +15x1x12 +13x3x24 +16x23x23 +27x3x3 +26x3x27 +18x5x12 +12x26x7 +19x27x12 +20x10x28 +30x12x25 +3x14x10 +21x26x1 +24x26x26 +7x21x30 +3x29x12 +29x28x5 +5x20x7 +27x11x2 +15x20x4 +16x15x15 +19x13x7 +7x17x15 +27x24x15 +9x17x28 +20x21x14 +14x29x29 +23x26x13 +27x23x21 +18x13x6 +26x16x21 +18x26x27 +9x3x12 +30x18x24 +12x11x29 +5x15x1 +1x16x3 +14x28x11 +2x18x1 +19x18x19 +18x28x21 +2x3x14 +22x16x5 +28x18x28 +24x16x18 +7x4x10 +19x26x19 +24x17x7 +25x9x6 +25x17x7 +20x22x20 +3x3x7 +23x19x15 +21x27x21 +1x23x11 +9x19x4 +22x4x18 +6x15x5 +15x25x2 +23x11x20 +27x16x6 +27x8x5 +10x10x19 +22x14x1 +7x1x29 +8x11x17 +27x9x27 +28x9x24 +17x7x3 +26x23x8 +7x6x30 +25x28x2 +1x30x25 +3x18x18 +28x27x15 +14x14x1 +10x25x29 +18x12x9 +20x28x16 +26x27x22 +8x26x1 +21x2x12 +25x16x14 +21x19x5 +12x9x22 +16x5x4 +5x4x16 +25x29x3 +4x29x13 +15x16x29 +8x11x24 +30x11x20 +17x21x14 +12x24x10 +10x12x6 +3x26x30 +15x14x25 +20x12x21 +13x11x16 +15x13x3 +5x17x29 +6x3x23 +9x26x11 +30x1x8 +14x10x30 +18x30x10 +13x19x19 +16x19x17 +28x7x10 +28x29x4 +3x21x10 +4x28x24 +7x28x9 +2x4x9 +25x27x13 +6x12x15 +4x18x20 +20x1x16 +5x13x24 +11x11x10 +12x9x23 +1x9x30 +17x28x24 +9x5x27 +21x15x16 +17x4x14 +8x14x4 +13x10x7 +17x12x14 +9x19x19 +2x7x21 +8x24x23 +19x5x12 +11x23x21 +13x3x1 +5x27x15 +12x25x25 +13x21x16 +9x17x11 +1x15x21 +4x26x17 +11x5x15 +23x10x15 +12x17x21 +27x15x1 +4x29x14 +5x24x25 +10x10x12 +18x12x9 +11x24x23 +24x23x3 +28x12x15 +29x9x14 +11x25x8 +5x12x2 +26x26x29 +9x21x2 +8x8x25 +1x16x30 +17x29x20 +9x22x13 +7x18x16 +3x3x23 +26x25x30 +15x23x24 +20x23x5 +20x16x10 +23x7x8 +20x18x26 +8x27x6 +30x23x23 +7x7x24 +21x11x15 +1x30x25 +26x27x22 +30x28x13 +20x13x13 +3x1x15 +16x7x1 +7x25x15 +12x7x18 +16x9x23 +16x12x18 +29x5x2 +17x7x7 +21x17x5 +9x9x17 +26x16x10 +29x29x23 +17x26x10 +5x19x17 +1x10x1 +14x21x20 +13x6x4 +13x13x3 +23x4x18 +4x16x3 +16x30x11 +2x11x2 +15x30x15 +20x30x22 +18x12x16 +23x5x16 +6x14x15 +9x4x11 +30x23x21 +20x7x12 +7x18x6 +15x6x5 +18x22x19 +16x10x22 +26x20x25 +9x25x25 +29x21x10 +9x21x24 +7x18x21 +14x3x15 +18x19x19 +4x29x17 +14x10x9 +2x26x14 +13x3x24 +4x4x17 +6x27x24 +2x18x3 +14x25x2 +30x14x17 +11x6x14 +4x10x18 +15x4x2 +27x7x10 +13x24x1 +7x12x6 +25x22x26 +19x2x18 +23x29x2 +2x15x4 +12x6x9 +16x14x29 +9x17x3 +21x9x12 +23x18x22 +10x8x4 +29x2x7 +19x27x15 +4x24x27 +25x20x14 +8x23x19 +1x24x19 +6x20x10 +15x8x5 +18x28x5 +17x23x22 +9x16x13 +30x24x4 +26x3x13 +12x22x18 +29x17x29 +26x4x16 +15x7x20 +9x15x30 +12x7x18 +28x19x18 +11x23x23 +24x20x1 +20x3x24 +1x26x1 +14x10x6 +5x27x24 +13x21x12 +20x20x5 +6x28x9 +11x26x11 +26x29x12 +21x4x11 +20x11x17 +22x27x20 +19x11x21 +2x11x11 +13x5x7 +12x10x25 +21x28x1 +15x30x17 +28x19x1 +4x19x12 +11x4x12 +4x10x30 +11x18x5 +22x20x12 +3x7x27 +20x26x4 +13x27x26 +23x14x13 +4x19x7 +26x27x16 +20x5x20 +18x5x8 +19x21x1 +22x8x1 +29x4x1 +24x10x15 +24x9x20 +10x3x8 +29x30x3 +2x8x24 +16x7x18 +2x11x23 +23x15x16 +21x12x6 +24x28x9 +6x1x13 +14x29x20 +27x24x13 +16x26x8 +5x6x17 +21x8x1 +28x19x21 +1x14x16 +18x2x9 +29x28x10 +22x26x27 +18x26x23 +22x24x2 +28x26x1 +27x29x12 +30x13x11 +1x25x5 +13x30x18 +3x13x22 +22x10x11 +2x7x7 +18x17x8 +9x22x26 +30x18x16 +10x2x3 +7x27x13 +3x20x16 +9x21x16 +1x18x15 +21x30x30 +4x25x23 +3x11x7 +5x6x12 +27x1x20 +13x15x24 +23x29x2 +13x5x24 +22x16x15 +28x14x3 +29x24x9 +2x20x4 +30x10x4 +23x7x20 +22x12x21 +3x19x11 +4x28x28 +5x4x7 +28x12x25 +2x16x26 +23x20x7 +5x21x29 +9x21x16 +9x6x10 +9x6x4 +24x14x29 +28x11x6 +10x22x1 +21x30x20 +13x17x8 +2x25x24 +19x21x3 +28x8x14 +6x29x28 +27x10x28 +30x11x12 +17x2x10 +14x19x17 +2x11x4 +26x1x2 +13x4x4 +23x20x18 +2x17x21 +28x7x15 +3x3x27 +24x17x30 +28x28x20 +21x5x29 +13x12x19 +24x29x29 +19x10x6 +19x12x14 +21x4x17 +27x16x1 +4x17x30 +23x23x18 +23x15x27 +26x2x11 +12x8x8 +15x23x26 +30x17x15 +17x17x15 +24x4x30 +9x9x10 +14x25x20 +25x11x19 +20x7x1 +9x21x3 +7x19x9 +10x6x19 +26x12x30 +21x9x20 +15x11x6 +30x21x9 +10x18x17 +22x9x8 +8x30x26 +28x12x27 +17x17x7 +11x13x8 +5x3x21 +24x1x29 +1x28x2 +18x28x10 +8x29x14 +26x26x27 +17x10x25 +22x30x3 +27x9x13 +21x21x4 +30x29x16 +22x7x20 +24x10x2 +16x29x17 +28x15x17 +19x19x22 +9x8x6 +26x23x24 +25x4x27 +16x12x2 +11x6x18 +19x14x8 +9x29x13 +23x30x19 +10x16x1 +4x21x28 +23x25x25 +19x9x16 +30x11x12 +24x3x9 +28x19x4 +18x12x9 +7x1x25 +28x7x1 +24x3x12 +30x24x22 +27x24x26 +9x30x30 +29x10x8 +4x6x18 +10x1x15 +10x4x26 +23x20x16 +6x3x14 +30x8x16 +25x14x20 +11x9x3 +15x23x25 +8x30x22 +22x19x18 +25x1x12 +27x25x7 +25x23x3 +13x20x8 +5x30x7 +18x19x27 +20x23x3 +1x17x21 +21x21x27 +13x1x24 +7x30x20 +21x9x18 +23x26x6 +22x9x29 +17x6x21 +28x28x29 +19x25x26 +9x27x21 +5x26x8 +11x19x1 +10x1x18 +29x4x8 +21x2x22 +14x12x8 diff --git a/02/input2 b/02/input2 new file mode 100644 index 0000000..5256b38 --- /dev/null +++ b/02/input2 @@ -0,0 +1 @@ +2x3x4 diff --git a/02/part1.py b/02/part1.py new file mode 100644 index 0000000..3e5bcf3 --- /dev/null +++ b/02/part1.py @@ -0,0 +1,30 @@ +#!/usr/bin/python + +import re + + +def read_file(filename): + file = open(filename, 'r') + while True: + line = file.readline() + if not line: + break + yield line + + +def main(): + + size = 0 + for line in read_file('input'): + match = re.match(r'(\d+)x(\d+)x(\d+)', line) + s1 = int(match.group(1))*int(match.group(2)) + s2 = int(match.group(1))*int(match.group(3)) + s3 = int(match.group(2))*int(match.group(3)) + + size = size + 2*s1 + 2*s2 + 2*s3 + min(s1, s2, s3) + + print size + + +if __name__ == "__main__": + main() diff --git a/02/part2.py b/02/part2.py new file mode 100644 index 0000000..66053b5 --- /dev/null +++ b/02/part2.py @@ -0,0 +1,30 @@ +#!/usr/bin/python + +import re + + +def read_file(filename): + file = open(filename, 'r') + while True: + line = file.readline() + if not line: + break + yield line + + +def main(): + + length = 0 + for line in read_file('input'): + match = re.match(r'(\d+)x(\d+)x(\d+)', line) + l1 = int(match.group(1)) + l2 = int(match.group(2)) + l3 = int(match.group(3)) + + length= length + 2*min(l1+l2, l1+l3, l2+l3) + l1*l2*l3 + + print length + + +if __name__ == "__main__": + main() diff --git a/03/input b/03/input new file mode 100644 index 0000000..1757219 --- /dev/null +++ b/03/input @@ -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< diff --git a/03/part1.py b/03/part1.py new file mode 100644 index 0000000..3838d2f --- /dev/null +++ b/03/part1.py @@ -0,0 +1,47 @@ +#!/usr/bin/python + + +def read_file(filename, chunk=1024): + file = open(filename, 'r') + while True: + line = file.read(chunk) + if not line: + break + yield line + + +def getFloorPlanKey(posX, posY): + return "%dx%d" % (posX, posY) + + +def moveSanta(posX, posY, direction): + if direction == '>': + posX = posX + 1 + if direction == '<': + posX = posX - 1 + if direction == '^': + posY = posY + 1 + if direction == 'v': + posY = posY - 1 + return (posX, posY) + + +def main(): + posX = 0 + posY = 0 + houses = 1 + floorPlan = dict() + floorPlan[getFloorPlanKey(0, 0)] = 1 + + for line in read_file('input', 1): + (posX, posY) = moveSanta(posX, posY, line[0]) + key = getFloorPlanKey(posX, posY) + + if key not in floorPlan: + houses = houses + 1 + floorPlan[key] = 0 + floorPlan[key] = floorPlan[key] + 1 + print houses + +if __name__ == "__main__": + main() diff --git a/03/part2.py b/03/part2.py new file mode 100644 index 0000000..1eff4be --- /dev/null +++ b/03/part2.py @@ -0,0 +1,61 @@ +#!/usr/bin/python + + +def read_file(filename, chunk=1024): + file = open(filename, 'r') + while True: + line = file.read(chunk) + if not line: + break + yield line + + +def getFloorPlanKey(posX, posY): + return "%dx%d" % (posX, posY) + + +def moveSanta(posX, posY, direction): + if direction == '>': + posX = posX + 1 + if direction == '<': + posX = posX - 1 + if direction == '^': + posY = posY + 1 + if direction == 'v': + posY = posY - 1 + return (posX, posY) + + +def main(): + posX1 = 0 + posY1 = 0 + posX2 = 0 + posY2 = 0 + houses = 1 + floorPlan = dict() + floorPlan[getFloorPlanKey(0, 0)] = 1 + + for line in read_file('input', 2): + + (posX1, posY1) = moveSanta(posX1, posY1, line[0]) + key1 = getFloorPlanKey(posX1, posY1) + if key1 not in floorPlan: + houses = houses + 1 + floorPlan[key1] = 0 + floorPlan[key1] = floorPlan[key1] + 1 + + if len(line) < 2: + break + + (posX2, posY2) = moveSanta(posX2, posY2, line[1]) + key2 = getFloorPlanKey(posX2, posY2) + + if key2 not in floorPlan: + houses = houses + 1 + floorPlan[key2] = 0 + floorPlan[key2] = floorPlan[key2] + 1 + + print houses + +if __name__ == "__main__": + main() diff --git a/04/part01.py b/04/part01.py new file mode 100644 index 0000000..6737f0c --- /dev/null +++ b/04/part01.py @@ -0,0 +1,23 @@ +#!/usr/bin/python + +import hashlib +import re + + +def main(): + number = 0 + input = "yzbqklnj" + + while True: + s = "%s%d" % (input, number) + m = hashlib.md5() + m.update(s) + h = m.hexdigest() + if re.match(r'^(0){5}', h): + print number + print h + break + number = number + 1 + +if __name__ == "__main__": + main() diff --git a/04/part02.py b/04/part02.py new file mode 100644 index 0000000..f9d76ae --- /dev/null +++ b/04/part02.py @@ -0,0 +1,23 @@ +#!/usr/bin/python + +import hashlib +import re + + +def main(): + number = 0 + input = "yzbqklnj" + + while True: + s = "%s%d" % (input, number) + m = hashlib.md5() + m.update(s) + h = m.hexdigest() + if re.match(r'^(0){6}', h): + print number + print h + break + number = number + 1 + +if __name__ == "__main__": + main() diff --git a/05/input b/05/input new file mode 100644 index 0000000..7bc179c --- /dev/null +++ b/05/input @@ -0,0 +1,1000 @@ +uxcplgxnkwbdwhrp +suerykeptdsutidb +dmrtgdkaimrrwmej +ztxhjwllrckhakut +gdnzurjbbwmgayrg +gjdzbtrcxwprtery +fbuqqaatackrvemm +pcjhsshoveaodyko +lrpprussbesniilv +mmsebhtqqjiqrusd +vumllmrrdjgktmnb +ptsqjcfbmgwdywgi +mmppavyjgcfebgpl +zexyxksqrqyonhui +npulalteaztqqnrl +mscqpccetkktaknl +ydssjjlfejdxrztr +jdygsbqimbxljuue +ortsthjkmlonvgci +jfjhsbxeorhgmstc +vdrqdpojfuubjbbg +xxxddetvrlpzsfpq +zpjxvrmaorjpwegy +laxrlkntrukjcswz +pbqoungonelthcke +niexeyzvrtrlgfzw +zuetendekblknqng +lyazavyoweyuvfye +tegbldtkagfwlerf +xckozymymezzarpy +ehydpjavmncegzfn +jlnespnckgwmkkry +bfyetscttekoodio +bnokwopzvsozsbmj +qpqjhzdbuhrxsipy +vveroinquypehnnk +ykjtxscefztrmnen +vxlbxagsmsuuchod +punnnfyyufkpqilx +zibnnszmrmtissww +cxoaaphylmlyljjz +zpcmkcftuuesvsqw +wcqeqynmbbarahtz +kspontxsclmbkequ +jeomqzucrjxtypwl +ixynwoxupzybroij +ionndmdwpofvjnnq +tycxecjvaxyovrvu +uxdapggxzmbwrity +csskdqivjcdsnhpe +otflgdbzevmzkxzx +verykrivwbrmocta +ccbdeemfnmtputjw +suyuuthfhlysdmhr +aigzoaozaginuxcm +ycxfnrjnrcubbmzs +fgbqhrypnrpiizyy +taoxrnwdhsehywze +echfzdbnphlwjlew +jhmomnrbfaawicda +fywndkvhbzxxaihx +aftuyacfkdzzzpem +yytzxsvwztlcljvb +iblbjiotoabgnvld +kvpwzvwrsmvtdxcx +ardgckwkftcefunk +oqtivsqhcgrcmbbd +wkaieqxdoajyvaso +rkemicdsrtxsydvl +sobljmgiahyqbirc +pbhvtrxajxisuivj +ggqywcbfckburdrr +gmegczjawxtsywwq +kgjhlwyonwhojyvq +bpqlmxtarjthtjpn +pxfnnuyacdxyfclr +isdbibbtrqdfuopn +vucsgcviofwtdjcg +ywehopujowckggkg +mzogxlhldvxytsgl +mllyabngqmzfcubp +uwvmejelibobdbug +brebtoppnwawcmxa +fcftkhghbnznafie +sqiizvgijmddvxxz +qzvvjaonnxszeuar +abekxzbqttczywvy +bkldqqioyhrgzgjs +lilslxsibyunueff +ktxxltqgfrnscxnx +iwdqtlipxoubonrg +twncehkxkhouoctj +bdwlmbahtqtkduxz +smbzkuoikcyiulxq +bjmsdkqcmnidxjsr +icbrswapzdlzdanh +eyszxnhbjziiplgn +pdxhrkcbhzqditwb +nfulnpvtzimbzsze +glayzfymwffmlwhk +bejxesxdnwdlpeup +ukssntwuqvhmsgwj +hoccqxlxuuoomwyc +rapztrdfxrosxcig +cxowzhgmzerttdfq +yzhcurqhdxhmolak +kqgulndpxbwxesxi +yjkgcvtytkitvxiu +xnhfqhnnaceaqyue +qkuqreghngfndifr +xesxgeaucmhswnex +occbvembjeuthryi +dmefxmxqjncirdwj +ystmvxklmcdlsvin +pplykqlxmkdrmydq +cbbjkpbdvjhkxnuc +embhffzsciklnxrz +asrsxtvsdnuhcnco +xcbcrtcnzqedktpi +mglwujflcnixbkvn +mnurwhkzynhahbjp +cekjbablkjehixtj +kbkcmjhhipcjcwru +usifwcsfknoviasj +rsfgocseyeflqhku +prgcyqrickecxlhm +asbawplieizkavmq +sylnsirtrxgrcono +nzspjfovbtfkloya +qfxmsprfytvaxgtr +yckpentqodgzngnv +ycsfscegcexcnbwq +kbmltycafudieyuh +tpahmvkftilypxuf +qivqozjrmguypuxu +gdhbfradjuidunbk +vxqevjncsqqnhmkl +rpricegggcfeihst +xucvzpprwtdpzifq +egyjcyyrrdnyhxoo +kfbrzmbtrrwyeofp +qpjdsocrtwzpjdkd +reboldkprsgmmbit +vwkrzqvvhqkensuy +ydvmssepskzzvfdp +vqbigplejygdijuu +mzpgnahrhxgjriqm +uiejixjadpfsxqcv +tosatnvnfjkqiaha +yipuojpxfqnltclx +pcxwvgcghfpptjlf +shrudjvvapohziaj +jdckfjdtjsszdzhj +hgisfhcbdgvxuilk +gytnfjmrfujnmnpp +ohflkgffnxmpwrrs +jzxajbkwwjknasjh +xrcxfollmejrislv +djjlwykouhyfukob +rittommltkbtsequ +lpbvkxdcnlikwcxm +vkcrjmcifhwgfpdj +dkhjqwtggdrmcslq +swnohthfvjvoasvt +yrzoksmcnsagatii +duommjnueqmdxftp +inlvzlppdlgfmvmx +xibilzssabuqihtq +inkmwnvrkootrged +ldfianvyugqtemax +gbvwtiexcuvtngti +temjkvgnwxrhdidc +askbbywyyykerghp +onezejkuwmrqdkfr +kybekxtgartuurbq +ubzjotlasrewbbkl +stueymlsovqgmwkh +lhduseycrewwponi +yohdmucunrgemqcu +onnfbxcuhbuifbyc +odrjkigbrsojlqbt +imqkqqlkgmttpxtx +sxmlkspqoluidnxw +akaauujpxhnccleb +xvgpghhdtpgvefnk +jdxeqxzsbqtvgvcq +mdusenpygmerxnni +agihtqvgkmgcbtaw +dovxcywlyvspixad +uulgazeyvgtxqkfz +ndhmvrwuflhktzyo +hcaqkmrbvozaanvm +tvfozbqavqxdqwqv +rlkpycdzopitfbsv +dmyjtmjbtnvnedhs +fmwmqeigbzrxjvdu +twgookcelrjmczqi +grxosmxvzgymjdtz +zsstljhzugqybueo +jpeapxlytnycekbd +iasykpefrwxrlvxl +azohkkqybcnsddus +aoaekngakjsgsonx +awsqaoswqejanotc +sgdxmketnjmjxxcp +ylnyuloaukdrhwuy +ewoqjmakifbefdib +ytjfubnexoxuevbp +ewlreawvddptezdd +vmkonztwnfgssdog +ahbpuqygcwmudyxn +kmahpxfjximorkrh +otjbexwssgpnpccn +aewskyipyztvskkl +urqmlaiqyfqpizje +nrfrbedthzymfgfa +vndwwrjrwzoltfgi +iiewevdzbortcwwe +qiblninjkrkhzxgi +xmvaxqruyzesifuu +yewuzizdaucycsko +hmasezegrhycbucy +dwpjrmkhsmnecill +hnffpbodtxprlhss +avmrgrwahpsvzuhm +nksvvaswujiukzxk +zzzapwhtffilxphu +vwegwyjkbzsrtnol +qurpszehmkfqwaok +iknoqtovqowthpno +brlmpjviuiagymek +efxebhputzeulthq +mzkquarxlhlvvost +xsigcagzqbhwwgps +qufztljyzjxgahdp +dlfkavnhobssfxvx +hgdpcgqxjegnhjlr +fboomzcvvqudjfbi +wnjuuiivaxynqhrd +nhcgzmpujgwisguw +wjeiacxuymuhykgk +qmeebvxijcgdlzpf +nmmnxsehhgsgoich +ejluaraxythbqfkl +mdbsbwnaypvlatcj +nnfshfibmvfqrbka +dvckdmihzamgqpxr +foztgqrjbwyxvewk +okpryqcbvorcxhoh +fpiwsndulvtthctx +zrbiovlmzdmibsiq +setwafbnnzcftutg +nyvqghxhgkxfobdm +enpvqadzarauhajl +twblhpvkazpdmhmr +lbhlllsgswvhdesh +tdfwkgxnqjxcvsuo +lnvyjjbwycjbvrrb +jsxqdvmzaydbwekg +xirbcbvwlcptuvoa +hwnukxenilatlfsk +khwopjqkxprgopmd +sljzdoviweameskw +stkrdmxmpaijximn +fdilorryzhmeqwkc +mfchaaialgvoozra +gjxhoxeqgkbknmze +beowovcoqnginrno +mkgmsgwkwhizunxo +phnhfusyoylvjdou +csehdlcmwepcpzmq +pgojomirzntgzohj +fkffgyfsvwqhmboz +mrvduasiytbzfwdn +epzrmsifpmfaewng +ooqxnoyqrlozbbyf +ahcxfmgtedywrbnx +ibqktvqmgnirqjot +xarssauvofdiaefn +xradvurskwbfzrnw +nxklmulddqcmewad +twichytatzoggchg +qmgvroqwrjgcycyv +yvezgulgrtgvyjjm +jgmcklzjdmznmuqk +bytajdwwconasjzt +apjttucpycyghqhu +flfejjzihodwtyup +gmrtrwyewucyqotv +nlohdrlymbkoenyl +wxcmqwbrwgtmkyfe +njtzlceyevmisxfn +htbbidsfbbshmzlt +gxhjeypjwghnrbsf +cifcwnbtazronikv +ezvjijcjcyszwdjy +srffeyrvyetbecmc +xpjefrtatrlkbkzl +yhncvfqjcyhsxhbb +pqhcufzlcezhihpr +qtdsfvxfqmsnzisp +dfonzdicxxhzxkrx +mqqqzhxkyfpofzty +dodjadoqyxsuazxt +jjwkrlquazzjbvlm +ttosfloajukoytfb +llateudmzxrzbqph +criqihrysgesmpsx +npszvlittbcxxknj +qmzojrvraitrktil +cfyoozzpwxwkwoto +daxohtcgvtktggfw +vthkpkoxmiuotjaj +pkfkyobvzjeecnui +ojcjiqrfltbhcdze +scbivhpvjkjbauun +ysowvwtzmqpjfwyp +laeplxlunwkfeaou +jufhcikovykwjhsa +xrucychehzksoitr +pyaulaltjkktlfkq +oypfrblfdhwvqxcv +zybrgxixvhchgzcf +puoagefcmlxelvlp +xjnhfdrsbhszfsso +ocgvzryoydaoracw +bxpnqllmptkpeena +pziyeihxlxbbgdio +bvtrhtlbfzmglsfc +ggpuvtseebylsrfk +pukenexjqecnivfj +jswabfbzpnhhdbpn +enojrtwqpfziyqsv +rjtmxudgcudefuiz +iqmjxynvtvdacffc +uheywxlsusklitvl +kwhxduejafdpmqdc +rspgblenbqlmcltn +rczhurnrqqgjutox +dqhytibjzxkdblzl +hpbieadydiycvfys +pucztfoqvenxiuym +nqpfzgpblwijiprf +ltgseeblgajbvltk +mwxukbsnapewhfrc +dvxluiflicdtnxix +pexfbpgnqiqymxcq +dakudfjjwtpxuzxy +letlceyzlgmnrewu +ojktahbsdifdfhmd +anezoybbghjudbih +sawxtlvzysaqkbbf +ttnkctcevpjiwqua +edrwrdvbaoqraejd +wnbfilvuienjxlcr +wqhzwvyybyxhhtsm +jxbgvyaqczwdlxfo +wbypqfmbwrsvfmdv +izdxjyfpidehbets +vbxbggqseurknjor +egpmpoxickhvwdlz +ivfrzklvpwoemxsy +xkziseheibmrpdww +xnrmtoihaudozksa +efemdmbxdsaymlrw +yjdjeckmsrckaagx +vlftqxxcburxnohv +fwyquwgajaxebduj +dwpmqvcxqwwnfkkr +isduxxjfsluuvwga +avdtdppodpntojgf +vrcoekdnutbnlgqk +kbhboxjmgomizxkl +cgsfpjrmewexgzfy +usdtnhjxbvtnafvp +bjoddgxbuxzhnsqd +hoyqdzofddedevsb +rwiwbvqfjajotaoj +iabomphsuyfptoos +bubeonwbukprpvhy +xurgunofmluhisxm +puyojzdvhktawkua +dbvqhztzdsncrxkb +oaeclqzyshuuryvm +nmgwfssnflxvcupr +vjkiwbpunkahtsrw +romyflhrarxchmyo +yecssfmetezchwjc +qwtocacqdslhozkd +mesexvfbtypblmam +mtjucgtjesjppdtt +pvodhqqoeecjsvwi +vvlcwignechiqvxj +wiqmzmmjgjajwgov +kwneobiiaixhclev +lkdeglzrrxuomsyt +oqovuwcpwbghurva +lfsdcxsasmuarwwg +awkbafhswnfbhvck +sztxlnmyvqsiwljg +hozxgyxbcxjzedvs +oifkqgfqmflxvyzn +mfvnehsajlofepib +delgbyfhsyhmyrfa +uenimmwriihxoydv +vjqutpilsztquutn +kfebsaixycrodhvl +coifyqfwzlovrpaj +xiyvdxtkqhcqfsqr +hoidcbzsauirpkyt +fiumhfaazfkbaglq +fzwdormfbtkdjgfm +faxqrortjdeihjfv +ljhaszjklhkjvrfi +pzrxsffkuockoqyl +immbtokjmwyrktzn +lzgjhyiywwnuxpfx +vhkocmwzkfwjuzog +ghntjkszahmdzfbl +gbcthxesvqbmzggy +oyttamhpquflojkh +nbscpfjwzylkfbtv +wnumxzqbltvxtbzs +jfhobjxionolnouc +nrtxxmvqjhasigvm +hweodfomsnlgaxnj +lfgehftptlfyvvaj +ccoueqkocrdgwlvy +euhgvirhsaotuhgf +pdlsanvgitjvedhd +seokvlbhrfhswanv +pntdqaturewqczti +jkktayepxcifyurj +dhzzbiaisozqhown +wehtwakcmqwczpbu +zwvozvspqmuckkcd +efucjlrwxuhmjubr +lzodaxuyntrnxwvp +qdezfvpyowfpmtwd +mizijorwrkanesva +txmitbiqoiryxhpz +xhsqgobpouwnlvps +muixgprsknlqaele +disgutskxwplodra +bmztllsugzsqefrm +ymwznyowpaaefkhm +ebfifzloswvoagqh +pkldomvvklefcicw +ziqzbbfunmcgrbtq +iuekfpbkraiwqkic +jflgjidirjapcuqo +achsfbroyrnqnecg +udbhouhlgjjzapzr +arerrohyhhkmwhyo +txyjzkqexgvzdtow +ogzrjwibvzoucrpg +rfdftaesxdnghwhd +axdhwmpuxelmpabo +gtktemowbsvognac +wkfuclilhqjzxztk +qbwjouutzegaxhrz +opfziwqqbwhzzqhj +pvcvcsupfwsmeacs +xsbohvbguzsgpawn +sczoefukwywxriwj +oqkhcqfdeaifbqoc +vtsrholxbjkhwoln +yuvapljnwbssfbhi +dxdfwccqvyzeszyl +gdbmjtonbiugitmb +qunirtqbubxalmxr +zzxsirhdaippnopr +fibtndkqjfechbmq +gqgqyjvqmfiwiyio +ihwsfkwhtzuydlzw +eygyuffeyrbbhlit +zdlsaweqomzrhdyy +ptbgfzuvxiuuxyds +llxlfdquvovzuqva +wfrltggyztqtyljv +kwipfevnbralidbm +gbhqfbrvuseellbx +obkbuualrzrakknv +hlradjrwyjgfqugu +vtqlxbyiaiorzdsp +tedcbqoxsmbfjeyy +cxdppfvklbdayghy +gjnofexywmdtgeft +ldzeimbbjmgpgeax +egrwsmshbvbawvja +vadfrjvcrdlonrkg +mojorplakzfmzvtp +jyurlsoxhubferpo +ijwqogivvzpbegkm +cnmetoionfxlutzg +lawigelyhegqtyil +mqosapvnduocctcd +eqncubmywvxgpfld +vigfretuzppxkrfy +ncwynsziydoflllq +cbllqinsipfknabg +ndtbvdivzlnafziq +iqrrzgzntjquzlrs +damkuheynobqvusp +jxctymifsqilyoxa +ylritbpusymysmrf +paoqcuihyooaghfu +obhpkdaibwixeepl +igrmhawvctyfjfhd +ybekishyztlahopt +vkbniafnlfqhhsrq +kltdigxmbhazrywf +ufhcoyvvxqzeixpr +klcxdcoglwmeynjt +funpjuvfbzcgdhgs +akgyvyfzcpmepiuc +zhlkgvhmjhwrfmua +ibsowtbnrsnxexuz +vpufbqilksypwlrn +ngrintxhusvdkfib +ziuwswlbrxcxqslw +sucledgxruugrnic +zwnsfsyotmlpinew +oaekskxfcwwuzkor +qjmqwaktpzhwfldu +tmgfgqgpxaryktxo +qfaizepgauqxvffk +addkqofusrstpamf +shdnwnnderkemcts +gwfygbsugzptvena +fpziernelahopdsj +bkkrqbsjvyjtqfax +gxrljlqwxghbgjox +ipfwnqaskupkmevm +nnyoyhnqyfydqpno +lgzltbrrzeqqtydq +fgzxqurhtdfucheb +jvpthtudlsoivdwj +bmlhymalgvehvxys +fhklibetnvghlgnp +hfcyhptxzvblvlst +donanindroexgrha +oqawfmslbgjqimzx +jzgehjfjukizosep +bhlgamcjqijpvipb +jrcrdjrvsyxzidsk +ouwfwwjqezkofqck +wrvsbnkhyzayialf +knhivfqjxrxnafdl +hbxbgqsqwzijlngf +qlffukpfmnxpfiyq +evhxlouocemdkwgk +baxhdrmhaukpmatw +nwlyytsvreqaminp +ljsjjzmlsilvxgal +onunatwxfzwlmgpk +njgolfwndqnwdqde +ngdgcjzxupkzzbqi +ieawycvvmvftbikq +ccyvnexuvczvtrit +enndfwjpwjyasjvv +tcihprzwzftaioqu +bkztdkbrxfvfeddu +qkvhtltdrmryzdco +rurtxgibkeaibofs +mjxypgscrqiglzbp +unpkojewduprmymd +csqtkhjxpbzbnqog +mednhjgbwzlhmufi +sfrwfazygygzirwd +ijqeupbrhhpqxota +cmhpncanwudyysyh +wwcxbwzrplfzrwxd +jriomldifuobjpmq +radonyagpulnnyee +ryqjwxsspbbhnptd +yeoqpnsdhludlmzf +qsqlkeetyalenueh +qnnedenwsjdrcrzt +lejkuhsllxbhfcrx +anddbvllrrqefvke +wdtljquijaksvdsv +adslgvfuqqdkzvbc +whbccefjpcnjwhaq +kqrfuankaibohqsg +fyxisfwihvylgnfd +rwqdrddghyqudcif +syhzowthaaiiouaf +zjmrtgrnohxmtidu +deecwkfvjffxrzge +dztmvolqxkhdscxe +cdghcrgavygojhqn +pepqmdbjhnbugqeu +pnumdjpnddbxhieg +jzfhxeyahiagizfw +hdkwugrhcniueyor +gmgudeqlbmqynflu +toidiotdmfkxbzvm +pyymuoevoezlfkjb +etrbwuafvteqynlr +usvytbytsecnmqtd +dfmlizboawrhmvim +vrbtuxvzzefedlvs +vslcwudvasvxbnje +xdxyvoxaubtwjoif +mduhzhascirittdf +cqoqdhdxgvvvxamk +dshnfwhqjbhuznqr +zimthfxbdmkulkjg +luylgfmmwbptyzpj +iujpcgogshhotqrc +caqcyzqcumfljvsp +sprtitjlbfpygxya +fnconnrtnigkpykt +irmqaqzjexdtnaph +bbqrtoblmltvwome +ozjkzjfgnkhafbye +hwljjxpxziqbojlw +zahvyqyoqnqjlieb +dptshrgpbgusyqsc +uzlbnrwetkbkjnlm +yccaifzmvbvwxlcc +wilnbebdshcrrnuu +evxnoebteifbffuq +khbajekbyldddzfo +kjivdcafcyvnkojr +wtskbixasmakxxnv +uzmivodqzqupqkwx +rxexcbwhiywwwwnu +rowcapqaxjzcxwqi +fkeytjyipaxwcbqn +pyfbntonlrunkgvq +qiijveatlnplaifi +ltnhlialynlafknw +urrhfpxmpjwotvdn +xklumhfyehnqssys +civrvydypynjdoap +fvbmxnfogscbbnyd +oznavyflpzzucuvg +iyshrpypfbirahqo +qmzbfgelvpxvqecy +xkkxaufomsjbofmk +irlouftdmpitwvlq +csjoptbdorqxhnjg +bkryeshfsaqpdztm +guxbdqzfafsjoadl +tgrltexgrzatzwxf +cwsgsijqdanubxad +xafnexgturwrzyrg +apcrsqdbsbaxocxr +pspgxnzcevmvvejk +szephmeegvegugdt +ndjsoloeacasxjap +bdnfksliscnirjfu +ehglacmzpcgglpux +jwweijomqfcupvzw +yesblmmkqhbazmdu +sjsmalypmuslzgac +fkiqatyttlnuhdho +tlhnyuzdocvfdihq +ngehtjmycevnybga +obxodzcdgtrycgry +stkyrvdfbwovawmk +bdkhqcfrqaxhxloo +gpvumnuoiozipnrk +jbhanddinpqhxeol +hwkzkmbmsrvunzit +rfuomegkxbyamjpw +yzbljuksletipzwm +eafedkagwitzqigl +prenqvsbotqckgwy +spedpbwzphdrfxfz +cmsuqwemhwixkxet +xgdyeqbqfldvaccq +eooxgsrfsbdaolja +kyhqylxooewrhkho +mswieugqpoefmspt +uszoqundysdyeqlc +hkmjdggxefdyykbq +dtuhjnlaliodtlvh +oalbueqbhpxoxvvx +oowxtxsoqdwhzbya +lclajfsrpmtwvzkm +fxmjufpqtpyazeqo +ozlmreegxhfwwwmf +mqzrajxtxbaemrho +nfglecsyqduhakjr +nkxqtmasjjkpkqbp +jjfonbqimybvzeus +vjqkhkhjlmvpwkud +wxxhnvfhetsamzjr +pladhajujzttgmsw +dbycgxeymodsdlhm +qxszeuaahuoxjvwu +adultomodzrljxve +dmhgrbhvvpxyzwdn +slohrlwxerpahtyp +mngbocwyqrsrrxdb +facyrtflgowfvfui +hyvazpjucgghmmxh +twtrvjtncmewcxit +uejkrpvilgccfpfr +psqvolfagjfvqkum +nvzolslmiyavugpp +lpjfutvtwbddtqiu +fkjnfcdorlugmcha +eaplrvdckbcqqvhq +xrcydhkockycburw +iswmarpwcazimqxn +kicnnkjdppitjwrl +vwywaekzxtmeqrsu +dxlgesstmqaxtjta +pmeljgpkykcbujbb +vhpknqzhgnkyeosz +jprqitpjbxkqqzmz +fiprxgsqdfymyzdl +dzvfwvhfjqqsifga +aeakhfalplltmgui +frqrchzvenhozzsu +hsvikeyewfhsdbmy +puedjjhvxayiwgvg +zmsonnclfovjoewb +bnirelcaetdyaumi +szvudroxhcitatvf +sccfweuyadvrjpys +yiouqrnjzsdwyhwa +xyjhkqbnfmjjdefz +fjwgemkfvettucvg +aapqpwapzyjnusnr +dytxpkvgmapdamtc +hgocpfoxlheqpumw +twzuiewwxwadkegg +qdbosnhyqmyollqy +fclbrlkowkzzitod +sgxnrrpwhtkjdjth +xckvsnkvnvupmirv +nioicfeudrjzgoas +lcemtyohztpurwtf +oyjxhhbswvzekiqn +idkblbyjrohxybob +rthvloudwmktwlwh +oyzhmirzrnoytaty +ysdfhuyenpktwtks +wxfisawdtbpsmwli +vgmypwlezbmzeduk +rpepcfpelvhzzxzj +zxbovsmixfvmamnj +cpkabmaahbnlrhiz +jvomcbqeoqrmynjj +iqdeisnegnkrkdws +ilhemlrtxdsdnirr +fjimtscrwbfuwmpo +lmfiylebtzwtztmx +ddouhysvomrkcpgu +xtjwvzdhgnwwauwi +cntzuwcumbsebwyy +hieqvdlvnxkygeda +hushfszxskjdrjxi +xvdfzqblccfoxvyq +nldnrtieteunyxnb +vszpidfocenlhzqb +ofcuvtwhortxesoq +bwniqemqwxlejcfq +wkqiwdjnytjnomps +rbadoommlmrictte +nsmxhpothlulxivt +bvzbfcvenskqxejr +sdqeczmzpqqtqabq +bjveyzniaaliatkw +zxsqlntyjajjxytk +jkoxlerbtidsuepg +ewtlibdkeqwgxnqt +lmrshemwxrdwzrgc +nekcdyxmftlymfir +edaqvmulzkskzsfy +znmvqaupykjmyebx +ximtebuxwhqpzubd +rrlstppkknqyxlho +uyibwcitxixjfwcr +chrvoierkimesqmm +dltxmwhheldvxwqe +xfuthxjuuizanfjy +vtiwavmxwonpkpug +phchnujfnxewglht +owvmetdjcynohxtw +cbtujdrumixxatry +iirzildsfxipfipe +sqxcscqyofohotcy +sbubnekndkvovuqg +jzhsqqxqdrtibtcd +mscwasyvxkhlvwbn +bpafxtagbuxivbwz +uhvueesygaxrqffw +trrxlibhtmzuwkkl +yktkmkokmfslgkml +gfzzzdptaktytnqg +pgqmaiwzhplnbyhg +qjiptlkwfshunsfb +lewvlpescsyunxck +tywsfatykshogjas +qtrnwjjgxdektjgi +arypcritpwijczkn +jwxvngigbhfpiubf +upsjdctitlbqlnhf +lvpjlrpnmdjiscrq +jvzchdrsnkgpgsti +wuoesbwunpseyqzu +xuqspvoshgxmrnrb +icdawnmfnpnmyzof +hwcwtibgpvctznuo +bzdjrniddyamfloq +hffkxtzuazageruv +deixfxjvzbitalnc +zihsohukiqrgsnvw +nwoondfnlgowavkg +qnuulsywgnoillgn +koozejhfjyzuhviy +oetcoipohymhpump +cizwpfczfoodwuly +jghlinczhtaxifau +svjejifbidnvvdvy +rxmbsnaqhzcnbfcl +vveubmiecvdtrket +sbihpvrcnzjtgfep +iqbuljuxkwrlebvw +ptrhvxrpezqvmmvv +duwzugnhktpiybjw +lijafjnujfeflkva +coylvegferuuyfop +fowsjrgammrqkkof +pgmcruaioccmbrbz +osejwflxagwqtjoi +otqflckqgxzvtper +slwyntdcrncktoka +hzcdzsppcfkrblqg +jksdmmvtzkqaompg +galwwwgugetdohkg +zbghtjvuikmfjuef +dmqwcamjtlcofqib +zbczldlfdzemxeys +mdlqoklybhppdkwe +tuyajhkexrrrvnlb +ylfolaubymxmkowo +nnsyrfnoyrxswzxn +zkhunhhhigbsslfk +spbokzdfkbmflanz +zmzxvrwdhiegfely +imywhfczvmgahxwl +fnvabvxeiqvsarqq +yschramprctnputs +ubyjrgdzsvxzvouj +qnvdhpptympctfer +smipxcntyhjpowug +ouhjibgcmotegljy +zpflubaijjqqsptz +fgysnxrnfnxprdmf +pbpznrexzxomzfvj +thhzjresjpmnwtdv +sbmokolkhvbfqmua +sxxpdohxlezmqhhx +pevvsyqgoirixtqh +wdxrornmhqsbfznb +zjqziqbctxkshqcn +nbqcwpzfwfaahylk +bxbvkonpcxprxqjf +xplbpqcnwzwqxheb +prsakggmnjibrpoy +xoguxbpnrvyqarjl +ilrgryrmgwjvpzjy +efwrmokaoigjtrij +yhcncebopycjzuli +gwcmzbzaissohjgn +lggmemwbbjuijtcf +fkqedbfrluvkrwwl +jcbppekecevkwpuk +onvolrckkxeyzfjt +zzousprgrmllxboy +cajthmamvxuesujl +rmiozfsikufkntpg +lvekypkwjbpddkcv +dwaqzfnzcnabersa +pcdsskjopcqwhyis +uabepbrrnxfbpyvx +yxlgdomczciiunrk +ccerskfzctqxvrkz +edvmkntljlncwhax +xtcbwecdwygrvowo +axqgqjqkqwrgcqot +tyjrynolpzqwnjgj +thrtmlegdjsuofga +mpgoeqkzzqqugait +emuslxgoefdjyivl +klehpcehdznpssfb +xfgvugyrdxolixkc +acenyrbdwxywmwst +yqgperajsfsamgan +dbjxlnumrmhipquw +hsnhirmswcenewxm +qehqkbhmgucjjpwo +gprjdglsbtsfzqcw +wvqkyrkoratfmvfi +myhzlerupqbduqsl +couyazesiuhwwhht +scxzehubxhkfejrr +gqlitwfriqkmzqdd +pxtbmqelssoagxko +dzhklewjqzmrfzsw +yxgeypduywntnbji +kwzbgzhkzbgedlfh +vukmuyfstgmscuab +vcmaybfvdgwnasgt +qmybkqqdhjigzmum +cbnuicuncvczyalu +qdgpsdpdlgjasjqr +kdzxqqheurupejjo +mcatrxfchbqnxelm +badunwkeggdkcgco +ntaeanvcylpoqmxi +ghnyfytpzgvuokjn +ozepydixmjijdmts +qefcfwzdhwmcyfvp +ycyktmpaqgaxqsxt +edpizkxnsxeeebfl +uwciveajsxxwoqyr +rbvjkljpxtglqjsh +nbplrskduutrptfk +vewrbadvkseuloec +upaotnjxquomoflx +qfwxkinrousqywdd +mqzxvvskslbxvyjt +oxicszyiqifoyugx +bkitxwzjpabvhraj +ydrbyjecggynjpir +hezyteaublxxpamq +hxkuektnoovsehnd +cwtbbavnhlpiknza +qrwvkhbyasgfxwol +qryjbohkprfazczc +wjksnogpxracrbud +znmsxbhliqxhvesr +gkippedrjzmnnwkp +pklylwsnsyyxwcwg +osdpwbxoegwaiemr +kpslrrrljgtjiqka +vuqkloqucpyzfxgk +bvtdsisgvkuzghyl +qlcayluuyvlhdfyy +kbimqwnzanlygaya +nvoeanlcfhczijed +kqvcijcuobtdwvou +pmhdpcmxnprixitl +yueilssewzabzmij +zqxhafrvjyeyznyg +mhdounmxkvnnsekx +hnacyglnzicxjakg +iaxfdqibnrcjdlyl +iypoelspioegrwix +uiqouxzmlnjxnbqt +kslgjfmofraorvjo +bgvotsdqcdlpkynk +huwcgxhvrrbvmmth +vpqyfnkqqjacpffw +hpjgdfovgmrzvrcl +vbntbhbvdeszihzj +nrbyyuviwyildzuw +wckeoadqzsdnsbox +xgsobwuseofxsxox +anvhsxdshndembsd +iygmhbegrwqbqerg +ylrsnwtmdsrgsvlh +zvvejnrarsavahvc +yncxhmmdtxxeafby +kekgiglblctktnes +uoqgymsrlrwdruzc +saaoymtmnykusicw +bqvcworpqimwglcp +zbpgtheydoyzipjv +pkykzslwsjbhcvcj +jhwxxneyuuidrzvl +pafeyajcrlehmant +klszcvtmcdeyfsmj +ledsltggvrbvlefn +hubpbvxknepammep +gthxhaapfpgtilal +jtfhbozlometwztj +jrhshycyenurbpwb +fyaxbawrsievljqv +lgfcgbenlqxqcxsd +dhedabbwbdbpfmxp +mxzgwhaqobyvckcm +qboxojoykxvwexav +jcpzfjnmvguwjnum +ohpsxnspfwxkkuqe +nyekrqjlizztwjqp +thuynotacpxjzroj +wymbolrlwosnbxqx +iyaqihnqvewxdtjm +hdvdbtvfpdrejenu +gtjscincktlwwkkf +wtebigbaythklkbd diff --git a/05/input2 b/05/input2 new file mode 100644 index 0000000..6402f21 --- /dev/null +++ b/05/input2 @@ -0,0 +1,5 @@ +ugknbfddgicrmopn +aaa +jchzalrnumimnmhp +haegwjzuvuyypxyu +dvszwmarrgswjxmb diff --git a/05/input3 b/05/input3 new file mode 100644 index 0000000..2de64a3 --- /dev/null +++ b/05/input3 @@ -0,0 +1,4 @@ +qjhvhtzxzqqjkmpb +xxyxx +uurcxstgmygtbstg +ieodomkazucvgmuy diff --git a/05/part1.py b/05/part1.py new file mode 100644 index 0000000..36bdcb4 --- /dev/null +++ b/05/part1.py @@ -0,0 +1,49 @@ +#!/usr/bin/python + +import re + + +def read_file(filename): + file = open(filename, 'r') + while True: + line = file.readline() + if not line: + break + yield line + + +def count_vovels(line): + count = 0 + for vovel in ['a', 'e', 'i', 'o', 'u']: + count = count + line.count(vovel) + return count + + +def count_bad(line): + count = 0 + for vovel in ['ab', 'cd', 'pq', 'xy']: + count = count + line.count(vovel) + return count + +def count_double(line): + regexp = re.compile(r"(.)\1") + match = re.search(regexp, line) + if match: + return 1 + return 0 + +def main(): + nice = 0 + for line in read_file('input'): + if count_vovels(line) < 3: + continue + if count_double(line) < 1: + continue + if count_bad(line) > 0: + continue + nice = nice + 1 + + print nice + +if __name__ == "__main__": + main() diff --git a/05/part2.py b/05/part2.py new file mode 100644 index 0000000..a09e39a --- /dev/null +++ b/05/part2.py @@ -0,0 +1,43 @@ +#!/usr/bin/python + +import re + + +def read_file(filename): + file = open(filename, 'r') + while True: + line = file.readline() + if not line: + break + yield line + + +def count_twice(line): + regexp = re.compile(r"(..).*\1") + match = re.search(regexp, line) + if match: + return True + return False + + +def count_repeat(line): + regexp = re.compile(r"(.).\1") + match = re.search(regexp, line) + if match: + return True + return False + + +def main(): + nice = 0 + for line in read_file('input'): + if not count_twice(line): + continue + if not count_repeat(line): + continue + nice = nice + 1 + + print nice + +if __name__ == "__main__": + main() diff --git a/06/input b/06/input new file mode 100644 index 0000000..c4357c6 --- /dev/null +++ b/06/input @@ -0,0 +1,300 @@ +turn on 887,9 through 959,629 +turn on 454,398 through 844,448 +turn off 539,243 through 559,965 +turn off 370,819 through 676,868 +turn off 145,40 through 370,997 +turn off 301,3 through 808,453 +turn on 351,678 through 951,908 +toggle 720,196 through 897,994 +toggle 831,394 through 904,860 +toggle 753,664 through 970,926 +turn off 150,300 through 213,740 +turn on 141,242 through 932,871 +toggle 294,259 through 474,326 +toggle 678,333 through 752,957 +toggle 393,804 through 510,976 +turn off 6,964 through 411,976 +turn off 33,572 through 978,590 +turn on 579,693 through 650,978 +turn on 150,20 through 652,719 +turn off 782,143 through 808,802 +turn off 240,377 through 761,468 +turn off 899,828 through 958,967 +turn on 613,565 through 952,659 +turn on 295,36 through 964,978 +toggle 846,296 through 969,528 +turn off 211,254 through 529,491 +turn off 231,594 through 406,794 +turn off 169,791 through 758,942 +turn on 955,440 through 980,477 +toggle 944,498 through 995,928 +turn on 519,391 through 605,718 +toggle 521,303 through 617,366 +turn off 524,349 through 694,791 +toggle 391,87 through 499,792 +toggle 562,527 through 668,935 +turn off 68,358 through 857,453 +toggle 815,811 through 889,828 +turn off 666,61 through 768,87 +turn on 27,501 through 921,952 +turn on 953,102 through 983,471 +turn on 277,552 through 451,723 +turn off 64,253 through 655,960 +turn on 47,485 through 734,977 +turn off 59,119 through 699,734 +toggle 407,898 through 493,955 +toggle 912,966 through 949,991 +turn on 479,990 through 895,990 +toggle 390,589 through 869,766 +toggle 593,903 through 926,943 +toggle 358,439 through 870,528 +turn off 649,410 through 652,875 +turn on 629,834 through 712,895 +toggle 254,555 through 770,901 +toggle 641,832 through 947,850 +turn on 268,448 through 743,777 +turn off 512,123 through 625,874 +turn off 498,262 through 930,811 +turn off 835,158 through 886,242 +toggle 546,310 through 607,773 +turn on 501,505 through 896,909 +turn off 666,796 through 817,924 +toggle 987,789 through 993,809 +toggle 745,8 through 860,693 +toggle 181,983 through 731,988 +turn on 826,174 through 924,883 +turn on 239,228 through 843,993 +turn on 205,613 through 891,667 +toggle 867,873 through 984,896 +turn on 628,251 through 677,681 +toggle 276,956 through 631,964 +turn on 78,358 through 974,713 +turn on 521,360 through 773,597 +turn off 963,52 through 979,502 +turn on 117,151 through 934,622 +toggle 237,91 through 528,164 +turn on 944,269 through 975,453 +toggle 979,460 through 988,964 +turn off 440,254 through 681,507 +toggle 347,100 through 896,785 +turn off 329,592 through 369,985 +turn on 931,960 through 979,985 +toggle 703,3 through 776,36 +toggle 798,120 through 908,550 +turn off 186,605 through 914,709 +turn off 921,725 through 979,956 +toggle 167,34 through 735,249 +turn on 726,781 through 987,936 +toggle 720,336 through 847,756 +turn on 171,630 through 656,769 +turn off 417,276 through 751,500 +toggle 559,485 through 584,534 +turn on 568,629 through 690,873 +toggle 248,712 through 277,988 +toggle 345,594 through 812,723 +turn off 800,108 through 834,618 +turn off 967,439 through 986,869 +turn on 842,209 through 955,529 +turn on 132,653 through 357,696 +turn on 817,38 through 973,662 +turn off 569,816 through 721,861 +turn on 568,429 through 945,724 +turn on 77,458 through 844,685 +turn off 138,78 through 498,851 +turn on 136,21 through 252,986 +turn off 2,460 through 863,472 +turn on 172,81 through 839,332 +turn on 123,216 through 703,384 +turn off 879,644 through 944,887 +toggle 227,491 through 504,793 +toggle 580,418 through 741,479 +toggle 65,276 through 414,299 +toggle 482,486 through 838,931 +turn off 557,768 through 950,927 +turn off 615,617 through 955,864 +turn on 859,886 through 923,919 +turn on 391,330 through 499,971 +toggle 521,835 through 613,847 +turn on 822,787 through 989,847 +turn on 192,142 through 357,846 +turn off 564,945 through 985,945 +turn off 479,361 through 703,799 +toggle 56,481 through 489,978 +turn off 632,991 through 774,998 +toggle 723,526 through 945,792 +turn on 344,149 through 441,640 +toggle 568,927 through 624,952 +turn on 621,784 through 970,788 +toggle 665,783 through 795,981 +toggle 386,610 through 817,730 +toggle 440,399 through 734,417 +toggle 939,201 through 978,803 +turn off 395,883 through 554,929 +turn on 340,309 through 637,561 +turn off 875,147 through 946,481 +turn off 945,837 through 957,922 +turn off 429,982 through 691,991 +toggle 227,137 through 439,822 +toggle 4,848 through 7,932 +turn off 545,146 through 756,943 +turn on 763,863 through 937,994 +turn on 232,94 through 404,502 +turn off 742,254 through 930,512 +turn on 91,931 through 101,942 +toggle 585,106 through 651,425 +turn on 506,700 through 567,960 +turn off 548,44 through 718,352 +turn off 194,827 through 673,859 +turn off 6,645 through 509,764 +turn off 13,230 through 821,361 +turn on 734,629 through 919,631 +toggle 788,552 through 957,972 +toggle 244,747 through 849,773 +turn off 162,553 through 276,887 +turn off 569,577 through 587,604 +turn off 799,482 through 854,956 +turn on 744,535 through 909,802 +toggle 330,641 through 396,986 +turn off 927,458 through 966,564 +toggle 984,486 through 986,913 +toggle 519,682 through 632,708 +turn on 984,977 through 989,986 +toggle 766,423 through 934,495 +turn on 17,509 through 947,718 +turn on 413,783 through 631,903 +turn on 482,370 through 493,688 +turn on 433,859 through 628,938 +turn off 769,549 through 945,810 +turn on 178,853 through 539,941 +turn off 203,251 through 692,433 +turn off 525,638 through 955,794 +turn on 169,70 through 764,939 +toggle 59,352 through 896,404 +toggle 143,245 through 707,320 +turn off 103,35 through 160,949 +toggle 496,24 through 669,507 +turn off 581,847 through 847,903 +turn on 689,153 through 733,562 +turn on 821,487 through 839,699 +turn on 837,627 through 978,723 +toggle 96,748 through 973,753 +toggle 99,818 through 609,995 +turn on 731,193 through 756,509 +turn off 622,55 through 813,365 +turn on 456,490 through 576,548 +turn on 48,421 through 163,674 +turn off 853,861 through 924,964 +turn off 59,963 through 556,987 +turn on 458,710 through 688,847 +toggle 12,484 through 878,562 +turn off 241,964 through 799,983 +turn off 434,299 through 845,772 +toggle 896,725 through 956,847 +turn on 740,289 through 784,345 +turn off 395,840 through 822,845 +turn on 955,224 through 996,953 +turn off 710,186 through 957,722 +turn off 485,949 through 869,985 +turn on 848,209 through 975,376 +toggle 221,241 through 906,384 +turn on 588,49 through 927,496 +turn on 273,332 through 735,725 +turn on 505,962 through 895,962 +toggle 820,112 through 923,143 +turn on 919,792 through 978,982 +toggle 489,461 through 910,737 +turn off 202,642 through 638,940 +turn off 708,953 through 970,960 +toggle 437,291 through 546,381 +turn on 409,358 through 837,479 +turn off 756,279 through 870,943 +turn off 154,657 through 375,703 +turn off 524,622 through 995,779 +toggle 514,221 through 651,850 +toggle 808,464 through 886,646 +toggle 483,537 through 739,840 +toggle 654,769 through 831,825 +turn off 326,37 through 631,69 +turn off 590,570 through 926,656 +turn off 881,913 through 911,998 +turn on 996,102 through 998,616 +turn off 677,503 through 828,563 +turn on 860,251 through 877,441 +turn off 964,100 through 982,377 +toggle 888,403 through 961,597 +turn off 632,240 through 938,968 +toggle 731,176 through 932,413 +turn on 5,498 through 203,835 +turn on 819,352 through 929,855 +toggle 393,813 through 832,816 +toggle 725,689 through 967,888 +turn on 968,950 through 969,983 +turn off 152,628 through 582,896 +turn off 165,844 through 459,935 +turn off 882,741 through 974,786 +turn off 283,179 through 731,899 +toggle 197,366 through 682,445 +turn on 106,309 through 120,813 +toggle 950,387 through 967,782 +turn off 274,603 through 383,759 +turn off 155,665 through 284,787 +toggle 551,871 through 860,962 +turn off 30,826 through 598,892 +toggle 76,552 through 977,888 +turn on 938,180 through 994,997 +toggle 62,381 through 993,656 +toggle 625,861 through 921,941 +turn on 685,311 through 872,521 +turn on 124,934 through 530,962 +turn on 606,379 through 961,867 +turn off 792,735 through 946,783 +turn on 417,480 through 860,598 +toggle 178,91 through 481,887 +turn off 23,935 through 833,962 +toggle 317,14 through 793,425 +turn on 986,89 through 999,613 +turn off 359,201 through 560,554 +turn off 729,494 through 942,626 +turn on 204,143 through 876,610 +toggle 474,97 through 636,542 +turn off 902,924 through 976,973 +turn off 389,442 through 824,638 +turn off 622,863 through 798,863 +turn on 840,622 through 978,920 +toggle 567,374 through 925,439 +turn off 643,319 through 935,662 +toggle 185,42 through 294,810 +turn on 47,124 through 598,880 +toggle 828,303 through 979,770 +turn off 174,272 through 280,311 +turn off 540,50 through 880,212 +turn on 141,994 through 221,998 +turn on 476,695 through 483,901 +turn on 960,216 through 972,502 +toggle 752,335 through 957,733 +turn off 419,713 through 537,998 +toggle 772,846 through 994,888 +turn on 881,159 through 902,312 +turn off 537,651 through 641,816 +toggle 561,947 through 638,965 +turn on 368,458 through 437,612 +turn on 290,149 through 705,919 +turn on 711,918 through 974,945 +toggle 916,242 through 926,786 +toggle 522,272 through 773,314 +turn on 432,897 through 440,954 +turn off 132,169 through 775,380 +toggle 52,205 through 693,747 +toggle 926,309 through 976,669 +turn off 838,342 through 938,444 +turn on 144,431 through 260,951 +toggle 780,318 through 975,495 +turn off 185,412 through 796,541 +turn on 879,548 through 892,860 +turn on 294,132 through 460,338 +turn on 823,500 through 899,529 +turn off 225,603 through 483,920 +toggle 717,493 through 930,875 +toggle 534,948 through 599,968 +turn on 522,730 through 968,950 +turn off 102,229 through 674,529 diff --git a/06/part1.py b/06/part1.py new file mode 100644 index 0000000..a61e688 --- /dev/null +++ b/06/part1.py @@ -0,0 +1,88 @@ +#!/usr/bin/python + +import re + + +def read_file(filename): + file = open(filename, 'r') + while True: + line = file.readline() + if not line: + break + yield line + + +def getPosKey(posX, posY): + return "%03d%03d" % (posX, posY) + + +def action_turn_on(data, posX1, posY1, posX2, posY2): + changed = 0 + for posX in range(posX1, posX2+1): + for posY in range(posY1, posY2+1): + key = getPosKey(posX, posY) + if key not in data: + data[key] = False + if not data[key]: + data[key] = True + changed = changed + 1 + return (data, changed, 0) + + +def action_turn_off(data, posX1, posY1, posX2, posY2): + changed = 0 + for posX in range(posX1, posX2+1): + for posY in range(posY1, posY2+1): + key = getPosKey(posX, posY) + if key not in data: + data[key] = False + if data[key]: + data[key] = False + changed = changed + 1 + return (data, 0, changed) + + +def action_toggle(data, posX1, posY1, posX2, posY2): + changedOn = 0 + changedOff = 0 + + for posX in range(posX1, posX2+1): + for posY in range(posY1, posY2+1): + key = getPosKey(posX, posY) + if key not in data: + data[key] = False + if not data[key]: + data[key] = True + changedOn = changedOn + 1 + else: + data[key] = False + changedOff = changedOff + 1 + + return (data, changedOn, changedOff) + + +def main(): + RE_COORD = re.compile(r" (\d+),(\d+) through (\d+),(\d+)$") + lOn = 0 + grid = dict() + for line in read_file('input'): + match = re.search(RE_COORD, line) + posX1 = (int)(match.group(1)) + posY1 = (int)(match.group(2)) + posX2 = (int)(match.group(3)) + posY2 = (int)(match.group(4)) + changedOn = 0 + changedOff = 0 + if line.startswith("turn on "): + (grid, changedOn, changedOff) = action_turn_on(grid, posX1, posY1, posX2, posY2) + if line.startswith("turn off "): + (grid, changedOn, changedOff) = action_turn_off(grid, posX1, posY1, posX2, posY2) + if line.startswith("toggle "): + (grid, changedOn, changedOff) = action_toggle(grid, posX1, posY1, posX2, posY2) + lOn = lOn + changedOn - changedOff + + print lOn + + +if __name__ == "__main__": + main() diff --git a/06/part2.py b/06/part2.py new file mode 100644 index 0000000..bd0fa05 --- /dev/null +++ b/06/part2.py @@ -0,0 +1,69 @@ +#!/usr/bin/python + +import re + + +def read_file(filename): + file = open(filename, 'r') + while True: + line = file.readline() + if not line: + break + yield line + + +def getPosKey(posX, posY): + return "%03d%03d" % (posX, posY) + + +def action_turn_on(data, posX1, posY1, posX2, posY2): + changed = 0 + for posX in range(posX1, posX2+1): + for posY in range(posY1, posY2+1): + key = getPosKey(posX, posY) + if key not in data: + data[key] = 0 + data[key] = data[key] + 1 + changed = changed + 1 + return (data, changed, 0) + + +def action_turn_off(data, posX1, posY1, posX2, posY2): + changed = 0 + for posX in range(posX1, posX2+1): + for posY in range(posY1, posY2+1): + key = getPosKey(posX, posY) + if key not in data: + data[key] = 0 + if data[key] > 0: + data[key] = data[key] - 1 + changed = changed + 1 + return (data, 0, changed) + +def main(): + RE_COORD = re.compile(r" (\d+),(\d+) through (\d+),(\d+)$") + lOn = 0 + grid = dict() + for line in read_file('input'): + match = re.search(RE_COORD, line) + posX1 = (int)(match.group(1)) + posY1 = (int)(match.group(2)) + posX2 = (int)(match.group(3)) + posY2 = (int)(match.group(4)) + changedOn = 0 + changedOff = 0 + if line.startswith("turn on "): + (grid, changedOn, changedOff) = action_turn_on(grid, posX1, posY1, posX2, posY2) + if line.startswith("turn off "): + (grid, changedOn, changedOff) = action_turn_off(grid, posX1, posY1, posX2, posY2) + if line.startswith("toggle "): + (grid, changedOn, changedOff) = action_turn_on(grid, posX1, posY1, posX2, posY2) + (grid, changedOn, changedOff) = action_turn_on(grid, posX1, posY1, posX2, posY2) + changedOn = changedOn * 2 + changedOff = changedOff * 2 + lOn = lOn + changedOn - changedOff + + print lOn + +if __name__ == "__main__": + main() diff --git a/07/input b/07/input new file mode 100644 index 0000000..f180041 --- /dev/null +++ b/07/input @@ -0,0 +1,339 @@ +NOT dq -> dr +kg OR kf -> kh +ep OR eo -> eq +44430 -> b +NOT gs -> gt +dd OR do -> dp +eg AND ei -> ej +y AND ae -> ag +jx AND jz -> ka +lf RSHIFT 2 -> lg +z AND aa -> ac +dy AND ej -> el +bj OR bi -> bk +kk RSHIFT 3 -> km +NOT cn -> co +gn AND gp -> gq +cq AND cs -> ct +eo LSHIFT 15 -> es +lg OR lm -> ln +dy OR ej -> ek +NOT di -> dj +1 AND fi -> fj +kf LSHIFT 15 -> kj +NOT jy -> jz +NOT ft -> fu +fs AND fu -> fv +NOT hr -> hs +ck OR cl -> cm +jp RSHIFT 5 -> js +iv OR jb -> jc +is OR it -> iu +ld OR le -> lf +NOT fc -> fd +NOT dm -> dn +bn OR by -> bz +aj AND al -> am +cd LSHIFT 15 -> ch +jp AND ka -> kc +ci OR ct -> cu +gv AND gx -> gy +de AND dk -> dm +x RSHIFT 5 -> aa +et RSHIFT 2 -> eu +x RSHIFT 1 -> aq +ia OR ig -> ih +bk LSHIFT 1 -> ce +y OR ae -> af +NOT ca -> cb +e AND f -> h +ia AND ig -> ii +ck AND cl -> cn +NOT jh -> ji +z OR aa -> ab +1 AND en -> eo +ib AND ic -> ie +NOT eh -> ei +iy AND ja -> jb +NOT bb -> bc +ha OR gz -> hb +1 AND cx -> cy +NOT ax -> ay +ev OR ew -> ex +bn RSHIFT 2 -> bo +er OR es -> et +eu OR fa -> fb +jp OR ka -> kb +ea AND eb -> ed +k AND m -> n +et RSHIFT 3 -> ev +et RSHIFT 5 -> ew +hz RSHIFT 1 -> is +ki OR kj -> kk +NOT h -> i +lv LSHIFT 15 -> lz +as RSHIFT 1 -> bl +hu LSHIFT 15 -> hy +iw AND ix -> iz +lf RSHIFT 1 -> ly +fp OR fv -> fw +1 AND am -> an +ap LSHIFT 1 -> bj +u LSHIFT 1 -> ao +b RSHIFT 5 -> f +jq AND jw -> jy +iu RSHIFT 3 -> iw +ih AND ij -> ik +NOT iz -> ja +de OR dk -> dl +iu OR jf -> jg +as AND bd -> bf +b RSHIFT 3 -> e +jq OR jw -> jx +iv AND jb -> jd +cg OR ch -> ci +iu AND jf -> jh +lx -> a +1 AND cc -> cd +ly OR lz -> ma +NOT el -> em +1 AND bh -> bi +fb AND fd -> fe +lf OR lq -> lr +bn RSHIFT 3 -> bp +bn AND by -> ca +af AND ah -> ai +cf LSHIFT 1 -> cz +dw OR dx -> dy +gj AND gu -> gw +jg AND ji -> jj +jr OR js -> jt +bl OR bm -> bn +gj RSHIFT 2 -> gk +cj OR cp -> cq +gj OR gu -> gv +b OR n -> o +o AND q -> r +bi LSHIFT 15 -> bm +dy RSHIFT 1 -> er +cu AND cw -> cx +iw OR ix -> iy +hc OR hd -> he +0 -> c +db OR dc -> dd +kk RSHIFT 2 -> kl +eq LSHIFT 1 -> fk +dz OR ef -> eg +NOT ed -> ee +lw OR lv -> lx +fw AND fy -> fz +dz AND ef -> eh +jp RSHIFT 3 -> jr +lg AND lm -> lo +ci RSHIFT 2 -> cj +be AND bg -> bh +lc LSHIFT 1 -> lw +hm AND ho -> hp +jr AND js -> ju +1 AND io -> ip +cm AND co -> cp +ib OR ic -> id +NOT bf -> bg +fo RSHIFT 5 -> fr +ip LSHIFT 15 -> it +jt AND jv -> jw +jc AND je -> jf +du OR dt -> dv +NOT fx -> fy +aw AND ay -> az +ge LSHIFT 15 -> gi +NOT ak -> al +fm OR fn -> fo +ff AND fh -> fi +ci RSHIFT 5 -> cl +cz OR cy -> da +NOT ey -> ez +NOT ju -> jv +NOT ls -> lt +kk AND kv -> kx +NOT ii -> ij +kl AND kr -> kt +jk LSHIFT 15 -> jo +e OR f -> g +NOT bs -> bt +hi AND hk -> hl +hz OR ik -> il +ek AND em -> en +ao OR an -> ap +dv LSHIFT 1 -> ep +an LSHIFT 15 -> ar +fo RSHIFT 1 -> gh +NOT im -> in +kk RSHIFT 1 -> ld +hw LSHIFT 1 -> iq +ec AND ee -> ef +hb LSHIFT 1 -> hv +kb AND kd -> ke +x AND ai -> ak +dd AND do -> dq +aq OR ar -> as +iq OR ip -> ir +dl AND dn -> do +iu RSHIFT 5 -> ix +as OR bd -> be +NOT go -> gp +fk OR fj -> fl +jm LSHIFT 1 -> kg +NOT cv -> cw +dp AND dr -> ds +dt LSHIFT 15 -> dx +et RSHIFT 1 -> fm +dy RSHIFT 3 -> ea +fp AND fv -> fx +NOT p -> q +dd RSHIFT 2 -> de +eu AND fa -> fc +ba AND bc -> bd +dh AND dj -> dk +lr AND lt -> lu +he RSHIFT 1 -> hx +ex AND ez -> fa +df OR dg -> dh +fj LSHIFT 15 -> fn +NOT kx -> ky +gk OR gq -> gr +dy RSHIFT 2 -> dz +gh OR gi -> gj +lj AND ll -> lm +x OR ai -> aj +bz AND cb -> cc +1 AND lu -> lv +as RSHIFT 3 -> au +ce OR cd -> cf +il AND in -> io +dd RSHIFT 1 -> dw +NOT lo -> lp +c LSHIFT 1 -> t +dd RSHIFT 3 -> df +dd RSHIFT 5 -> dg +lh AND li -> lk +lf RSHIFT 5 -> li +dy RSHIFT 5 -> eb +NOT kt -> ku +at OR az -> ba +x RSHIFT 3 -> z +NOT lk -> ll +lb OR la -> lc +1 AND r -> s +lh OR li -> lj +ln AND lp -> lq +kk RSHIFT 5 -> kn +ea OR eb -> ec +ci AND ct -> cv +b RSHIFT 2 -> d +jp RSHIFT 1 -> ki +NOT cr -> cs +NOT jd -> je +jp RSHIFT 2 -> jq +jn OR jo -> jp +lf RSHIFT 3 -> lh +1 AND ds -> dt +lf AND lq -> ls +la LSHIFT 15 -> le +NOT fg -> fh +at AND az -> bb +au AND av -> ax +kw AND ky -> kz +v OR w -> x +kk OR kv -> kw +ks AND ku -> kv +kh LSHIFT 1 -> lb +1 AND kz -> la +NOT kc -> kd +x RSHIFT 2 -> y +et OR fe -> ff +et AND fe -> fg +NOT ac -> ad +jl OR jk -> jm +1 AND jj -> jk +bn RSHIFT 1 -> cg +NOT kp -> kq +ci RSHIFT 3 -> ck +ev AND ew -> ey +1 AND ke -> kf +cj AND cp -> cr +ir LSHIFT 1 -> jl +NOT gw -> gx +as RSHIFT 2 -> at +iu RSHIFT 1 -> jn +cy LSHIFT 15 -> dc +hg OR hh -> hi +ci RSHIFT 1 -> db +au OR av -> aw +km AND kn -> kp +gj RSHIFT 1 -> hc +iu RSHIFT 2 -> iv +ab AND ad -> ae +da LSHIFT 1 -> du +NOT bw -> bx +km OR kn -> ko +ko AND kq -> kr +bv AND bx -> by +kl OR kr -> ks +1 AND ht -> hu +df AND dg -> di +NOT ag -> ah +d OR j -> k +d AND j -> l +b AND n -> p +gf OR ge -> gg +gg LSHIFT 1 -> ha +bn RSHIFT 5 -> bq +bo OR bu -> bv +1 AND gy -> gz +s LSHIFT 15 -> w +NOT ie -> if +as RSHIFT 5 -> av +bo AND bu -> bw +hz AND ik -> im +bp AND bq -> bs +b RSHIFT 1 -> v +NOT l -> m +bp OR bq -> br +g AND i -> j +br AND bt -> bu +t OR s -> u +hz RSHIFT 5 -> ic +gk AND gq -> gs +fl LSHIFT 1 -> gf +he RSHIFT 3 -> hg +gz LSHIFT 15 -> hd +hf OR hl -> hm +1 AND gd -> ge +fo OR fz -> ga +id AND if -> ig +fo AND fz -> gb +gr AND gt -> gu +he OR hp -> hq +fq AND fr -> ft +ga AND gc -> gd +fo RSHIFT 2 -> fp +gl OR gm -> gn +hg AND hh -> hj +NOT hn -> ho +gl AND gm -> go +he RSHIFT 5 -> hh +NOT gb -> gc +hq AND hs -> ht +hz RSHIFT 3 -> ib +hz RSHIFT 2 -> ia +fq OR fr -> fs +hx OR hy -> hz +he AND hp -> hr +gj RSHIFT 5 -> gm +hf AND hl -> hn +hv OR hu -> hw +NOT hj -> hk +gj RSHIFT 3 -> gl +fo RSHIFT 3 -> fq +he RSHIFT 2 -> hf diff --git a/07/part1.py b/07/part1.py new file mode 100644 index 0000000..af4e752 --- /dev/null +++ b/07/part1.py @@ -0,0 +1,95 @@ +#!/usr/bin/python + +import re + +RE_WIRE = re.compile(r'^(.*) -> (.*)$') +RE_OPER_NOT = re.compile(r'^NOT (.*)$') +RE_OPER_AND = re.compile(r'^(.*) AND (.*)$') +RE_OPER_OR = re.compile(r'^(.*) OR (.*)$') +RE_OPER_LSHIFT = re.compile(r'^(.*) LSHIFT (.*)$') +RE_OPER_RSHIFT = re.compile(r'^(.*) RSHIFT (.*)$') +RE_OPER_VALUE = re.compile(r'^(\d+)$') +RE_OPER_COPY = re.compile(r'^([a-z]+)$') + + +class Wire: + + def __init__(self, name, source): + self.name = name + self.source = source + self.value = None + + +def getWireVaule(name, wires): + + if re.search(RE_OPER_VALUE, name): + return int(name) + + if wires[name].value: + return wires[name].value + + print "*%s -> %s" % (wires[name].source, wires[name].name) + # test on value + match = re.search(RE_OPER_VALUE, wires[name].source) + if match: + wires[name].value = int(match.group(1)) + + match = re.search(RE_OPER_COPY, wires[name].source) + if match: + value = getWireVaule(match.group(1), wires) + wires[name].value = value + + match = re.search(RE_OPER_NOT, wires[name].source) + if match: + value = getWireVaule(match.group(1), wires) + wires[name].value = ~value & 0xFFFF + + match = re.search(RE_OPER_AND, wires[name].source) + if match: + value1 = getWireVaule(match.group(1), wires) + value2 = getWireVaule(match.group(2), wires) + wires[name].value = value1 & value2 + + match = re.search(RE_OPER_OR, wires[name].source) + if match: + value1 = getWireVaule(match.group(1), wires) + value2 = getWireVaule(match.group(2), wires) + wires[name].value = value1 | value2 + + match = re.search(RE_OPER_LSHIFT, wires[name].source) + if match: + value1 = getWireVaule(match.group(1), wires) + value2 = int(match.group(2)) + wires[name].value = (value1 << value2) & 0xFFFF + + match = re.search(RE_OPER_RSHIFT, wires[name].source) + if match: + value1 = getWireVaule(match.group(1), wires) + value2 = int(match.group(2)) + wires[name].value = (value1 >> value2) & 0xFFFF + + return wires[name].value + + +def read_file(filename): + file = open(filename, 'r') + while True: + line = file.readline() + if not line: + break + yield line + + +def main(): + wire = dict() + for line in read_file('input'): + match = re.search(RE_WIRE, line) + if not match: + print "wrong operation syntax" + wire[match.group(2)] = Wire(match.group(2), match.group(1)) + + print wire + print getWireVaule("a", wire) + +if __name__ == "__main__": + main() diff --git a/07/part2.py b/07/part2.py new file mode 100644 index 0000000..56edec4 --- /dev/null +++ b/07/part2.py @@ -0,0 +1,98 @@ +#!/usr/bin/python + +import re + +RE_WIRE = re.compile(r'^(.*) -> (.*)$') +RE_OPER_NOT = re.compile(r'^NOT (.*)$') +RE_OPER_AND = re.compile(r'^(.*) AND (.*)$') +RE_OPER_OR = re.compile(r'^(.*) OR (.*)$') +RE_OPER_LSHIFT = re.compile(r'^(.*) LSHIFT (.*)$') +RE_OPER_RSHIFT = re.compile(r'^(.*) RSHIFT (.*)$') +RE_OPER_VALUE = re.compile(r'^(\d+)$') +RE_OPER_COPY = re.compile(r'^([a-z]+)$') + + +class Wire: + + def __init__(self, name, source): + self.name = name + self.source = source + self.value = None + + +def getWireVaule(name, wires): + + if re.search(RE_OPER_VALUE, name): + return int(name) + + if wires[name].value: + return wires[name].value + + print "*%s -> %s" % (wires[name].source, wires[name].name) + # test on value + match = re.search(RE_OPER_VALUE, wires[name].source) + if match: + wires[name].value = int(match.group(1)) + + match = re.search(RE_OPER_COPY, wires[name].source) + if match: + value = getWireVaule(match.group(1), wires) + wires[name].value = value + + match = re.search(RE_OPER_NOT, wires[name].source) + if match: + value = getWireVaule(match.group(1), wires) + wires[name].value = ~value & 0xFFFF + + match = re.search(RE_OPER_AND, wires[name].source) + if match: + value1 = getWireVaule(match.group(1), wires) + value2 = getWireVaule(match.group(2), wires) + wires[name].value = value1 & value2 + + match = re.search(RE_OPER_OR, wires[name].source) + if match: + value1 = getWireVaule(match.group(1), wires) + value2 = getWireVaule(match.group(2), wires) + wires[name].value = value1 | value2 + + match = re.search(RE_OPER_LSHIFT, wires[name].source) + if match: + value1 = getWireVaule(match.group(1), wires) + value2 = int(match.group(2)) + wires[name].value = (value1 << value2) & 0xFFFF + + match = re.search(RE_OPER_RSHIFT, wires[name].source) + if match: + value1 = getWireVaule(match.group(1), wires) + value2 = int(match.group(2)) + wires[name].value = (value1 >> value2) & 0xFFFF + + return wires[name].value + + +def read_file(filename): + file = open(filename, 'r') + while True: + line = file.readline() + if not line: + break + yield line + + +def main(): + wire = dict() + for line in read_file('input'): + match = re.search(RE_WIRE, line) + if not match: + print "wrong operation syntax" + wire[match.group(2)] = Wire(match.group(2), match.group(1)) + + value_a = getWireVaule("a", wire) + for key in wire.keys(): + wire[key].value = None + wire["b"].value = value_a + print getWireVaule("a", wire) + +if __name__ == "__main__": + main() diff --git a/08/input b/08/input new file mode 100644 index 0000000..94538e7 --- /dev/null +++ b/08/input @@ -0,0 +1,300 @@ +"qxfcsmh" +"ffsfyxbyuhqkpwatkjgudo" +"byc\x9dyxuafof\\\xa6uf\\axfozomj\\olh\x6a" +"jtqvz" +"uzezxa\"jgbmojtwyfbfguz" +"vqsremfk\x8fxiknektafj" +"wzntebpxnnt\"vqndz\"i\x47vvjqo\"" +"higvez\"k\"riewqk" +"dlkrbhbrlfrp\\damiauyucwhty" +"d\"" +"qlz" +"ku" +"yy\"\"uoao\"uripabop" +"saduyrntuswlnlkuppdro\\sicxosted" +"tj" +"zzphopswlwdhebwkxeurvizdv" +"xfoheirjoakrpofles\"nfu" +"q\xb7oh\"p\xce\"n" +"qeendp\"ercwgywdjeylxcv" +"dcmem" +"\"i\x13r\"l" +"ikso\xdcbvqnbrjduh\"uqudzki\xderwk" +"wfdsn" +"pwynglklryhtsqbno" +"hcoj\x63iccz\"v\"ttr" +"zf\x23\\hlj\\kkce\\d\\asy\"yyfestwcdxyfj" +"xs" +"m\"tvltapxdvtrxiy" +"bmud" +"k\"a" +"b\"oas" +"\"yexnjjupoqsxyqnquy\"uzfdvetqrc" +"vdw\xe3olxfgujaj" +"qomcxdnd\"\\cfoe\"" +"fpul" +"m\"avamefphkpv" +"vvdnb\\x\\uhnxfw\"dpubfkxfmeuhnxisd" +"hey\\" +"ldaeigghlfey" +"eure\"hoy\xa5iezjp\\tm" +"yygb\"twbj\\r\"\x10gmxuhmp\"" +"weirebp\x39mqonbtmfmd" +"ltuz\\hs\"e" +"ysvmpc" +"g\x8amjtt\"megl\"omsaihifwa" +"yimmm" +"iiyqfalh" +"cwknlaaf" +"q\x37feg\xc6s\"xx" +"uayrgeurgyp\\oi" +"xhug\"pt\"axugllbdiggzhvy" +"kdaarqmsjfx\xc3d" +"\"vkwla" +"d\"" +"tmroz\"bvfinxoe\\mum\"wmm" +"\"n\"bbswxne\\p\\yr\"qhwpdd" +"skzlkietklkqovjhvj\xfe" +"pbg\\pab\"bubqaf\"obzcwxwywbs\\dhtq" +"xxjidvqh\"lx\\wu\"ij" +"daef\x5fe\x5b\\kbeeb\x13qnydtboof" +"ogvazaqy\"j\x73" +"y" +"n\"tibetedldy\\gsamm\"nwu" +"wldkvgdtqulwkad" +"dpmxnj" +"twybw\"cdvf\"mjdajurokbce" +"ru\"\\lasij\"i" +"roc\\vra\\lhrm" +"pbkt\x60booz\"fjlkc" +"j\x4dytvjwrzt" +"\\uiwjkniumxcs" +"cbhm\"nexccior\"v\"j\"nazxilmfp\x47" +"qdxngevzrlgoq" +"\"lrzxftytpobsdfyrtdqpjbpuwmm\x9e" +"mdag\x0asnck\xc2ggj\"slb\"fjy" +"wyqkhjuazdtcgkcxvjkpnjdae" +"aixfk\xc0iom\x21vueob" +"dkiiakyjpkffqlluhaetires" +"ysspv\"lysgkvnmwbbsy" +"gy\"ryexcjjxdm\"xswssgtr" +"s" +"ddxv" +"qwt\"\x27puilb\"pslmbrsxhrz" +"qdg\xc9e\\qwtknlvkol\x54oqvmchn\\" +"lvo" +"b" +"fk\"aa\"\"yenwch\\\\on" +"srig\x63hpwaavs\\\x80qzk\"xa\"\xe6u\\wr" +"yxjxuj\"ghyhhxfj\"\xa6qvatre" +"yoktqxjxkzrklkoeroil" +"\"jfmik\"" +"smgseztzdwldikbqrh\"" +"jftahgctf\"hoqy" +"tcnhicr\"znpgckt\"ble" +"vqktnkodh\"lo\"a\\bkmdjqqnsqr" +"ztnirfzqq" +"s" +"xx" +"iqj\"y\\hqgzflwrdsusasekyrxbp\\ad" +"\\xzjhlaiynkioz\"\"bxepzimvgwt" +"s\x36rbw" +"mniieztwrisvdx" +"atyfxioy\x2b\\" +"irde\x85\x5cvbah\\jekw\"ia" +"bdmftlhkwrprmpat\"prfaocvp" +"w\\k" +"umbpausy" +"zfauhpsangy" +"p\"zqyw" +"wtztypyqvnnxzvlvipnq\"zu" +"deicgwq\\oqvajpbov\\or\"kgplwu" +"mbzlfgpi\\\\zqcidjpzqdzxityxa" +"lfkxvhma" +"\xf2yduqzqr\"\\fak\"p\"n" +"mpajacfuxotonpadvng" +"anb\\telzvcdu\\a\xf2flfq" +"lrs\"ebethwpmuuc\"\x86ygr" +"qmvdbhtumzc\"ci" +"meet" +"yopg\x0fdxdq\"h\\ugsu\xffmolxjv" +"uhy" +"fzgidrtzycsireghazscvmwcfmw\\t" +"cqohkhpgvpru" +"bihyigtnvmevx\"xx" +"xz" +"zofomwotzuxsjk\"q\"mc\"js\"dnmalhxd" +"\\ktnddux\\fqvt\"ibnjntjcbn" +"ia" +"htjadnefwetyp\xd5kbrwfycbyy" +"\"\\hkuxqddnao" +"meqqsz\x83luecpgaem" +"cvks\x87frvxo\"svqivqsdpgwhukmju" +"sgmxiai\\o\"riufxwjfigr\xdf" +"fgywdfecqufccpcdn" +"faghjoq\x28abxnpxj" +"zuppgzcfb\"dctvp\"elup\"zxkopx" +"xqs\x45xxdqcihbwghmzoa" +"anbnlp\\cgcvm\"hc" +"xf\"fgrngwzys" +"nrxsjduedcy\x24" +"\x71sxl\"gj\"sds\"ulcruguz\\t\\ssvjcwhi" +"jhj\"msch" +"qpovolktfwyiuyicbfeeju\x01" +"nkyxmb\"qyqultgt\"nmvzvvnxnb" +"ycsrkbstgzqb\"uv\\cisn" +"s" +"ueptjnn\"\"sh" +"lp\"z\"d\"mxtxiy" +"yzjtvockdnvbubqabjourf\"k\"uoxwle" +"\x82\"wqm\"" +"\xb5cwtuks\x5fpgh" +"wd" +"tbvf" +"ttbmzdgn" +"vfpiyfdejyrlbgcdtwzbnm" +"uc" +"otdcmhpjagqix" +"\\\xb1qso\"s" +"scowax" +"behpstjdh\xccqlgnqjyz\"eesn" +"r\xe1cbnjwzveoomkzlo\\kxlfouhm" +"jgrl" +"kzqs\\r" +"ctscb\x7fthwkdyko\"\x62pkf\"d\xe6knmhurg" +"tc\"kw\x3ftt" +"bxb\x5ccl" +"jyrmfbphsldwpq" +"jylpvysl\"\"juducjg" +"en\\m\"kxpq\"wpb\\\"" +"madouht\"bmdwvnyqvpnawiphgac\"" +"vuxpk\"ltucrw" +"aae\x60arr" +"ttitnne\"kilkrgssnr\xfdurzh" +"oalw" +"pc\"\"gktkdykzbdpkwigucqni\"nxiqx" +"dbrsaj" +"bgzsowyxcbrvhtvekhsh\"qgd" +"kudfemvk\"\"\"hkbrbil\"chkqoa" +"zjzgj\\ekbhyfzufy" +"\\acos\"fqekuxqzxbmkbnn\x1ejzwrm" +"elxahvudn\"txtmomotgw" +"\x2eoxmwdhelpr\"cgi\xf7pzvb" +"eapheklx" +"hfvma\"mietvc\"tszbbm\"czex" +"h\"iiockj\\\xc1et" +"d\"rmjjftm" +"qlvhdcbqtyrhlc\\" +"yy\"rsucjtulm\"coryri\"eqjlbmk" +"tv" +"r\"bfuht\\jjgujp\"" +"kukxvuauamtdosngdjlkauylttaokaj" +"srgost\"\"rbkcqtlccu\x65ohjptstrjkzy" +"yxwxl\\yjilwwxffrjjuazmzjs" +"dxlw\\fkstu\"hjrtiafhyuoh\"sewabne" +"\x88sj\"v" +"rfzprz\xec\"oxqclu\"krzefp\\q" +"cfmhdbjuhrcymgxpylllyvpni" +"ucrmjvmimmcq\x88\xd9\"lz" +"lujtt\"" +"gvbqoixn\"pmledpjmo\"flydnwkfxllf" +"dvxqlbshhmelsk\x8big\"l" +"mx\x54lma\x8bbguxejg" +"\x66jdati\xeceieo" +"\"iyyupixei\x54ff" +"xohzf\"rbxsoksxamiu" +"vlhthspeshzbppa\x4drhqnohjop\"\"mfjd" +"f\"tvxxla\"vurian\"\"idjq\x3aptm\xc3olep" +"gzqz" +"kbq\\wogye\\altvi\\hbvmodny" +"j\xd8" +"ofjozdhkblvndl" +"hbitoupimbawimxlxqze" +"ypeleimnme" +"xfwdrzsc\\oxqamawyizvi\\y" +"enoikppx\xa1ixe\"yo\"gumye" +"fb" +"vzf" +"zxidr" +"cu\x31beirsywtskq" +"lxpjbvqzztafwezd" +"\\jyxeuo\x18bv" +"b\"vawc\"p\\\\giern\"b" +"odizunx\"\"t\\yicdn\"x\"sdiz" +"\"\"tebrtsi" +"ctyzsxv\xa6pegfkwsi\"tgyltaakytccb" +"htxwbofchvmzbppycccliyik\xe5a" +"ggsslefamsklezqkrd" +"rcep\"fnimwvvdx\"l" +"zyrzlqmd\x12egvqs\\llqyie" +"\x07gsqyrr\\rcyhyspsvn" +"butg\"" +"gb" +"gywkoxf\"jsg\\wtopxvumirqxlwz" +"rj\"ir\"wldwveair\x2es\"dhjrdehbqnzl" +"ru\"elktnsbxufk\\ejufjfjlevt\\lrzd" +"\"widsvok" +"oy\"\x81nuesvw" +"ay" +"syticfac\x1cfjsivwlmy\"pumsqlqqzx" +"m" +"rjjkfh\x78cf\x2brgceg\"jmdyas\"\\xlv\xb6p" +"tmuvo\"\x3ffdqdovjmdmkgpstotojkv\"as" +"jd\\ojvynhxllfzzxvbn\"wrpphcvx" +"pz" +"\"twr" +"n\\hdzmxe\"mzjjeadlz" +"fb\"rprxuagvahjnri" +"rfmexmjjgh\\xrnmyvnatrvfruflaqjnd" +"obbbde\"co\"qr\"qpiwjgqahqm\\jjp\"" +"vpbq\"\"y\"czk\\b\x52ed\"lnzepobp" +"syzeajzfarplydipny\"y\"\xe8ad" +"mpyodwb" +"\x47rakphlqqptd" +"wa\"oj\"aiy" +"a" +"ropozx" +"q\x51nbtlwa" +"etukvgx\\jqxlkq" +"\"tp\"rah\"pg\"s\"bpdtes\\tkasdhqd" +"dn\"qqpkikadowssb\xcah\"dzpsf\\ect\"jdh" +"pxunovbbrrn\\vullyn\"bno\"\"\"myfxlp\"" +"qaixyazuryvkmoulhcqaotegfj\\mpzm" +"bvfrbicutzbjwn\\oml\"cf\"d\"ezcpv\"j" +"rmbrdtneudemigdhelmb" +"aq\\aurmbhy" +"wujqvzw" +"gf\"tssmvm\"gm\"hu\x9a\xb7yjawsa" +"hrhqqxow\xe2gsydtdspcfqy\"zw\\ou" +"ianwwf\\yko\\tdujhhqdi" +"xylz\"zpvpab" +"lwuopbeeegp" +"aoop\x49jhhcexdmdtun" +"\\\\mouqqcsgmz" +"tltuvwhveau\x43b\"ymxjlcgiymcynwt" +"gsugerumpyuhtjljbhrdyoj" +"lnjm\xb8wg\"ajh" +"zmspue\"nfttdon\\b\"eww" +"\"w\x67jwaq\x7ernmyvs\\rmdsuwydsd\"th" +"ogtgvtlmcvgllyv" +"z\"fqi\"rvddoehrciyl" +"yustxxtot\"muec\"xvfdbzunzvveq" +"mqslw" +"txqnyvzmibqgjs\xb6xy\x86nfalfyx" +"kzhehlmkholov" +"plpmywcnirrjutjguosh\\" +"pydbnqofv\"dn\\m" +"aegqof" +"eambmxt\\dxagoogl\\zapfwwlmk" +"afbmqitxxqhddlozuxcpjxgh" +"vgts" +"bfdpqtoxzzhmzcilehnflna" +"s\"idpz" +"\xcfhgly\"nlmztwybx\"ecezmsxaqw" +"aackfgndqcqiy" +"\x22unqdlsrvgzfaohoffgxzfpir\"s" +"abh\"ydv\"kbpdhrerl" +"bdzpg" +"ekwgkywtmzp" +"wtoodejqmrrgslhvnk\"pi\"ldnogpth" +"njro\x68qgbx\xe4af\"\\suan" diff --git a/08/input1 b/08/input1 new file mode 100644 index 0000000..3d32fb3 --- /dev/null +++ b/08/input1 @@ -0,0 +1,4 @@ +"" +"abc" +"aaa\"aaa" +"\x27" diff --git a/08/part1.py b/08/part1.py new file mode 100644 index 0000000..8dcada8 --- /dev/null +++ b/08/part1.py @@ -0,0 +1,48 @@ +#!/usr/bin/python + + +def read_file(filename): + file = open(filename, 'r') + while True: + line = file.readline() + if not line: + break + yield line.rstrip() + + +def getMemorySize(line): + count = 0 + pos = 0 + while pos < len(line): + if line[pos] != '\\': + pos += 1 + count += 1 + elif line[pos+1] == '\\': + pos += 2 + count += 1 + elif line[pos+1] == '"': + pos += 2 + count += 1 + elif line[pos+1] == 'x': + pos += 4 + count += 1 + else: + print "chyba" + return count + + +def main(): + + numCode = 0 + numMem = 0 + for line in read_file('input'): + numCode = numCode + len(line) + numMem = numMem + getMemorySize(line) - 2 + print line + + print numCode + print numMem + print numCode - numMem + +if __name__ == "__main__": + main() diff --git a/08/part2.py b/08/part2.py new file mode 100644 index 0000000..166c3d8 --- /dev/null +++ b/08/part2.py @@ -0,0 +1,48 @@ +#!/usr/bin/python + + +def read_file(filename): + file = open(filename, 'r') + while True: + line = file.readline() + if not line: + break + yield line.rstrip() + + +def getMemorySize(line): + count = 0 + pos = 0 + while pos < len(line): + if line[pos] != '\\': + pos += 1 + count += 1 + elif line[pos+1] == '\\': + pos += 2 + count += 4 + elif line[pos+1] == '"': + pos += 2 + count += 4 + elif line[pos+1] == 'x': + pos += 4 + count += 5 + else: + print "chyba" + return count + + +def main(): + + numCode = 0 + numMem = 0 + for line in read_file('input'): + numCode = numCode + len(line) + numMem = numMem + getMemorySize(line) + 4 + print line + + print numCode + print numMem + print numMem - numCode + +if __name__ == "__main__": + main() diff --git a/09/input b/09/input new file mode 100644 index 0000000..9850564 --- /dev/null +++ b/09/input @@ -0,0 +1,28 @@ +Faerun to Norrath = 129 +Faerun to Tristram = 58 +Faerun to AlphaCentauri = 13 +Faerun to Arbre = 24 +Faerun to Snowdin = 60 +Faerun to Tambi = 71 +Faerun to Straylight = 67 +Norrath to Tristram = 142 +Norrath to AlphaCentauri = 15 +Norrath to Arbre = 135 +Norrath to Snowdin = 75 +Norrath to Tambi = 82 +Norrath to Straylight = 54 +Tristram to AlphaCentauri = 118 +Tristram to Arbre = 122 +Tristram to Snowdin = 103 +Tristram to Tambi = 49 +Tristram to Straylight = 97 +AlphaCentauri to Arbre = 116 +AlphaCentauri to Snowdin = 12 +AlphaCentauri to Tambi = 18 +AlphaCentauri to Straylight = 91 +Arbre to Snowdin = 129 +Arbre to Tambi = 53 +Arbre to Straylight = 40 +Snowdin to Tambi = 15 +Snowdin to Straylight = 99 +Tambi to Straylight = 70 diff --git a/09/input1 b/09/input1 new file mode 100644 index 0000000..2bceede --- /dev/null +++ b/09/input1 @@ -0,0 +1,3 @@ +London to Dublin = 464 +London to Belfast = 518 +Dublin to Belfast = 141 diff --git a/09/part1.py b/09/part1.py new file mode 100644 index 0000000..2149afe --- /dev/null +++ b/09/part1.py @@ -0,0 +1,61 @@ +#!/usr/bin/python + +import re + +RE_DISTANCE = re.compile(r'^(.*) to (.*) = (\d+)$') + + +class Town: + + def __init__(self, name): + self.name = name + self.distance = dict() + + def addDistance(self, town, distance): + self.distance[town] = distance + + +def read_file(filename): + file = open(filename, 'r') + while True: + line = file.readline() + if not line: + break + yield line + + +def computePossiblePaths(town, neighbours, maxTowns, visited, journey): + visited.append(town) + if len(visited) == maxTowns: + print "%010d %s" % (journey, ",".join(visited)) + visited.pop() + return + for nei in neighbours[town].distance.keys(): + if nei in visited: + continue + distance = neighbours[town].distance[nei] + journey += distance + computePossiblePaths(nei, neighbours, maxTowns, visited, journey) + journey -= distance + visited.pop() + + +def main(): + towns = dict() + for line in read_file('input'): + match = re.search(RE_DISTANCE, line) + if not match: + print "wrong operation syntax" + if match.group(1) not in towns: + towns[match.group(1)] = Town(match.group(1)) + if match.group(2) not in towns: + towns[match.group(2)] = Town(match.group(2)) + towns[match.group(1)].addDistance(match.group(2), int(match.group(3))) + towns[match.group(2)].addDistance(match.group(1), int(match.group(3))) + + for town in towns.keys(): + print "Starting point: %s" % (town) + computePossiblePaths(town, towns, len(towns.keys()), [], 0) + +if __name__ == "__main__": + main() diff --git a/09/part2.py b/09/part2.py new file mode 100644 index 0000000..2149afe --- /dev/null +++ b/09/part2.py @@ -0,0 +1,61 @@ +#!/usr/bin/python + +import re + +RE_DISTANCE = re.compile(r'^(.*) to (.*) = (\d+)$') + + +class Town: + + def __init__(self, name): + self.name = name + self.distance = dict() + + def addDistance(self, town, distance): + self.distance[town] = distance + + +def read_file(filename): + file = open(filename, 'r') + while True: + line = file.readline() + if not line: + break + yield line + + +def computePossiblePaths(town, neighbours, maxTowns, visited, journey): + visited.append(town) + if len(visited) == maxTowns: + print "%010d %s" % (journey, ",".join(visited)) + visited.pop() + return + for nei in neighbours[town].distance.keys(): + if nei in visited: + continue + distance = neighbours[town].distance[nei] + journey += distance + computePossiblePaths(nei, neighbours, maxTowns, visited, journey) + journey -= distance + visited.pop() + + +def main(): + towns = dict() + for line in read_file('input'): + match = re.search(RE_DISTANCE, line) + if not match: + print "wrong operation syntax" + if match.group(1) not in towns: + towns[match.group(1)] = Town(match.group(1)) + if match.group(2) not in towns: + towns[match.group(2)] = Town(match.group(2)) + towns[match.group(1)].addDistance(match.group(2), int(match.group(3))) + towns[match.group(2)].addDistance(match.group(1), int(match.group(3))) + + for town in towns.keys(): + print "Starting point: %s" % (town) + computePossiblePaths(town, towns, len(towns.keys()), [], 0) + +if __name__ == "__main__": + main() diff --git a/10/part1.py b/10/part1.py new file mode 100644 index 0000000..d6b01b9 --- /dev/null +++ b/10/part1.py @@ -0,0 +1,26 @@ +#!/usr/bin/python + +import re + +RE_MATCH_LONGEST = re.compile(r'(.)(\1*)') + + +def lookAndSay(sequence): + pos = 0 + result = "" + while pos < len(sequence): + match = re.match(RE_MATCH_LONGEST, sequence[pos:]) + pos += len(match.group(2)) + 1 + result = "%s%d%s" % (result, len(match.group(2))+1, match.group(1)) + return result + + +def main(): + input = "1113222113" + for x in range(0, 40): + input = lookAndSay(input) + + print len(input) + +if __name__ == "__main__": + main() diff --git a/10/part2.py b/10/part2.py new file mode 100644 index 0000000..7cae7e7 --- /dev/null +++ b/10/part2.py @@ -0,0 +1,26 @@ +#!/usr/bin/python + +import re + +RE_MATCH_LONGEST = re.compile(r'(.)(\1*)') + + +def lookAndSay(sequence): + pos = 0 + result = "" + while pos < len(sequence): + match = re.match(RE_MATCH_LONGEST, sequence[pos:]) + pos += len(match.group(2)) + 1 + result = "%s%d%s" % (result, len(match.group(2))+1, match.group(1)) + return result + + +def main(): + input = "1113222113" + for x in range(0, 50): + input = lookAndSay(input) + + print len(input) + +if __name__ == "__main__": + main() diff --git a/README b/README new file mode 100644 index 0000000..b64dd95 --- /dev/null +++ b/README @@ -0,0 +1,2 @@ +http://adventofcode.com/ +