aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Voss <thomasvoss@live.com> 2021-10-29 23:02:39 +0200
committerThomas Voss <thomasvoss@live.com> 2021-10-29 23:02:39 +0200
commite7c9108b95e39d7ea5a29ae06d619c4727f11027 (patch)
tree237261eef3afd0720be77dbcbb9599fa66a24b67
Initial commit
-rw-r--r--.gitignore1
-rw-r--r--2015/01/.gitignore1
-rw-r--r--2015/01/Makefile7
-rw-r--r--2015/01/input1
-rw-r--r--2015/01/puzzles.c25
-rw-r--r--2015/02/input1000
-rwxr-xr-x2015/02/puzzle-1.awk20
-rwxr-xr-x2015/02/puzzle-2.awk20
-rw-r--r--2015/03/input1
-rw-r--r--2015/03/puzzle-1.awk6
-rw-r--r--2015/03/puzzle-2.awk11
-rwxr-xr-x2015/03/puzzles.sh4
-rw-r--r--2015/04/.gitignore1
-rw-r--r--2015/04/Makefile7
-rw-r--r--2015/04/input1
-rw-r--r--2015/04/puzzles.c35
-rw-r--r--2015/05/input1000
-rw-r--r--2015/05/puzzle-1.sed3
-rw-r--r--2015/05/puzzle-2.sed2
-rwxr-xr-x2015/05/puzzles.sh6
-rw-r--r--2015/06/input300
-rwxr-xr-x2015/06/puzzle-1.awk15
-rwxr-xr-x2015/06/puzzle-2.awk17
-rw-r--r--2015/08/input300
-rwxr-xr-x2015/08/puzzle-1.sh7
-rwxr-xr-x2015/08/puzzle-2.sh7
-rw-r--r--2015/10/.gitignore2
-rw-r--r--2015/10/Makefile12
-rw-r--r--2015/10/README10
-rw-r--r--2015/10/input1
-rw-r--r--2015/10/puzzles.go31
-rwxr-xr-x2015/10/puzzles.sh13
-rw-r--r--2015/11/input1
-rw-r--r--2015/11/puzzle-17
-rw-r--r--2015/11/puzzle-29
-rw-r--r--2015/12/input1
-rwxr-xr-x2015/12/puzzle-1.sh3
-rwxr-xr-x2015/12/puzzle-2.sh7
-rw-r--r--2015/14/input9
-rw-r--r--2015/14/puzzle-1.bc25
-rw-r--r--2015/14/puzzle-2.bc33
-rwxr-xr-x2015/14/puzzles.sh11
-rw-r--r--2015/15/input4
-rwxr-xr-x2015/15/puzzle-1.py39
-rwxr-xr-x2015/15/puzzle-2.py41
-rw-r--r--2015/16/input500
-rwxr-xr-x2015/16/puzzle-1.sh25
-rwxr-xr-x2015/16/puzzle-2.sh26
-rw-r--r--2015/17/input20
-rwxr-xr-x2015/17/puzzle-1.py18
-rwxr-xr-x2015/17/puzzle-2.py20
-rw-r--r--2015/18/input100
-rwxr-xr-x2015/18/puzzle-1.py49
-rwxr-xr-x2015/18/puzzle-2.py52
-rw-r--r--2020/01/.gitignore1
-rw-r--r--2020/01/Makefile7
-rw-r--r--2020/01/input200
-rw-r--r--2020/01/puzzles.c39
-rw-r--r--2020/02/input1000
-rwxr-xr-x2020/02/puzzle-1.awk10
-rwxr-xr-x2020/02/puzzle-2.awk19
-rw-r--r--2020/03/input323
-rwxr-xr-x2020/03/puzzle-1.awk14
-rwxr-xr-x2020/03/puzzle-2.awk36
-rw-r--r--2020/04/input1135
-rwxr-xr-x2020/04/puzzle-1.awk30
-rwxr-xr-x2020/04/puzzle-2.awk67
-rw-r--r--2020/05/.gitignore1
-rw-r--r--2020/05/Makefile6
-rw-r--r--2020/05/input908
-rw-r--r--2020/05/puzzle-1.awk2
-rw-r--r--2020/05/puzzle-2.awk11
-rwxr-xr-x2020/05/puzzles.sh4
-rw-r--r--2020/05/seatids.c37
-rw-r--r--2020/06/input2167
-rwxr-xr-x2020/06/puzzle-1.awk14
-rwxr-xr-x2020/06/puzzle-2.awk23
-rw-r--r--2020/07/input594
-rwxr-xr-x2020/07/puzzle-1.py38
-rwxr-xr-x2020/07/puzzle-2.py35
-rw-r--r--2020/08/.gitignore1
-rw-r--r--2020/08/Makefile7
-rw-r--r--2020/08/input653
-rw-r--r--2020/08/puzzles.c112
-rw-r--r--2020/09/input1000
-rwxr-xr-x2020/09/puzzle-1.py28
-rwxr-xr-x2020/09/puzzle-2.py25
-rw-r--r--2020/10/input108
-rwxr-xr-x2020/10/puzzle-1.sh7
-rwxr-xr-x2020/10/puzzle-2.py36
-rw-r--r--2020/11/.gitignore1
-rw-r--r--2020/11/Makefile7
-rw-r--r--2020/11/input98
-rw-r--r--2020/11/puzzles.c158
-rw-r--r--2020/12/.gitignore1
-rw-r--r--2020/12/Makefile7
-rw-r--r--2020/12/input778
-rw-r--r--2020/12/puzzle-1.c73
-rw-r--r--2020/12/puzzle-2.c79
-rw-r--r--2020/13/input2
-rwxr-xr-x2020/13/puzzle-1.py26
-rwxr-xr-x2020/13/puzzle-2.py40
-rw-r--r--2020/14/input578
-rwxr-xr-x2020/14/puzzle-1.py37
-rwxr-xr-x2020/14/puzzle-2.py48
-rw-r--r--2020/15/.gitignore1
-rw-r--r--2020/15/Makefile7
-rw-r--r--2020/15/puzzles.c31
-rw-r--r--2020/16/input269
-rwxr-xr-x2020/16/puzzle-1.py30
-rwxr-xr-x2020/16/puzzle-2.py81
-rw-r--r--2020/17/.gitignore1
-rw-r--r--2020/17/Makefile7
-rw-r--r--2020/17/input8
-rw-r--r--2020/17/puzzles.c104
-rw-r--r--2020/18/.gitignore1
-rw-r--r--2020/18/Makefile7
-rw-r--r--2020/18/input379
-rw-r--r--2020/18/puzzles.c126
-rw-r--r--2020/19/input562
-rwxr-xr-x2020/19/puzzle-1.py59
-rwxr-xr-x2020/19/puzzle-2.py84
-rw-r--r--LICENSE14
123 files changed, 16269 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..bd7fab4
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+.clang-format
diff --git a/2015/01/.gitignore b/2015/01/.gitignore
new file mode 100644
index 0000000..60d075d
--- /dev/null
+++ b/2015/01/.gitignore
@@ -0,0 +1 @@
+puzzle-[12]
diff --git a/2015/01/Makefile b/2015/01/Makefile
new file mode 100644
index 0000000..c32dafa
--- /dev/null
+++ b/2015/01/Makefile
@@ -0,0 +1,7 @@
+all:
+ ${CC} ${CFLAGS} -o puzzle-1 puzzles.c
+ ${CC} ${CFLAGS} -DPART2 -o puzzle-2 puzzles.c
+
+.PHONY: clean
+clean:
+ rm -f puzzle-[12]
diff --git a/2015/01/input b/2015/01/input
new file mode 100644
index 0000000..73e014e
--- /dev/null
+++ b/2015/01/input
@@ -0,0 +1 @@
+(((())))()((((((((())()(()))(()((((()(()(((()((()((()(()()()()()))(((()(()((((((((((())(()()((())()(((())))()(()(()((()(()))(()()()()((()((()(((()()(((((((()()())()((((()()(((((()(())()(())((())()()))()(((((((())(()())(()(((())(()))((())))(()((()())))()())((((())))(()(((((()(())(((()()((()((()((((((((((())(()())))))()))())()()((((()()()()()()((((((())())(((()())()((()()(((()()()))(((((()))(((()(()()()(()(()(((())()))(()(((()((())()(()())())))((()()()(()()(((()))(((()((((()(((((()()(()())((()())())(()((((((()(()()))((((()))))())((())()()((()(()))))((((((((()))(()()(((())())(())()((()()()()((()((()((()()(((())))(()((())()((((((((()((()(()()(((())())())))(())())))()((((()))))))())))()()))()())((()())()((()()()))(()()(((()(())((((())())((((((((()()()()())))()()()((((()()))))))()((((()(((()))(()()())))((()()(((()))()()())())(((())((()()(())()()()(((())))))()())((()))()))((())()()())()())()()(()))())))())()))(())((()(())))(()(())(()))))(()(())())(()(())(()(()))))((()())()))()((((()()))))())))()()())((())()((()()()))()(((()(()))))(())()()))(((()())))))))))(((())))()))())()))))()()(((())))))))()(()()(()))((()))))((())))((()((())))())))()()(()))())()(()((()())(()(()()())())(()()))()))))(()())()()))()()()()))(()(()(()))))))()(()))()))()()(()((())(()(())))()(((())(())())))))()(()(()))))()))(()()()(())()(()(())))()))))()()(((((())))))())()())())())()())()))))()))))))))())()()()()()()())))()))((())()))())))()((())()))))()))())))))))())()()()))()()(()((((()(((((((()(())((()())((()()))()))))(())))()()()(())((())()())))(())))(())))(((()()))()(())(((()(()))((())))())()))((((()))())()))))))))()(())())))(()))()(()()))())()()(())())))())()()(()())))()((()())(()(())(())))))))))))))(()))))()))))))()()())(()(((((()(()())))())()))(()))()))(()()))()())(()))())()(())((()()))))))())))())()(((())))(()(()))()()))()(()))))))((()())(()))))))()())))()()))))))))((((((((()()()(()))))))()())))())))()()((())()))((())(())))())())))()()()((()((()(())))())()(())))))))))()())))()()()()()()))()))((())())(()(()))))))(()()))()))(())))()))))))))))))(()))))))))()))))()))()())()))()()))))))()))))((()))))(()))())()(())))(()())((((()())))()))))(()))()(()()(())))))())))))()))))))())))())))))())))())())))())(()))))(())()(())))())()))((()()))))))())))((())))))))())))(())))))()()())))))())))))()))))))()))()()()(()(((()())())())(()))())))))((()(())(()))))))))(())))()()()())())(()))))()()()))()))())())())()(())))()(((()((((())))))))()))))))))))))))))))))((())()())(()))))()()))))))(()()(())())))())))((())))((())))))))))))))()))))()(()))))))())))))()))(()()())(()())))))))))()))))))(())))))()()))()())(((())))()))(()))))))))(())())))())))())())())()()))((())()(())()())()))()())(())(()))))()())))(()(((()))))))()(()())()()()))()))))))))()()()(())()())()(((((()))()())())(()))))()()()(())))())))()((()())))(()))())()(()())())(()))()()))((()()))((()()()()())))(())()))(()(())))((()()))))))))())))))))())()()))))))))))))))))(())()(())(())()())())()))()(()))))())())))))()())()(()))()()(())))(())())))))(()))))))))))))))())())(())(())))(((()))()))))())((())(()))())))))))())))))())))()))()))))))))))))())()))))()))))((()))(())))()(())))(())()))()))())))())))))))()(()())())))()()())))(())))))(()))))))))))))(()))()))()))())))(((()()()(())((()())))()())(((()))(())()))((()()()())))())(())(()))))()(((((())))(()))())())))))))((((()()()))())())()(()(()())))))))))()())())))(())))()())(((()(())())()()))())())))))))((()())((()()(()))(()(())))()))()))(()))(()))()()(()(((())((((()))()(()))((())()(()(()())()(()))()())))))(()))()))())()())))())))(())))((())(()())))))()))(())(()))()())()(()()((()(()))))))()(())(()())(())()))(((())()))(()()(()()()))))(()(())))()))))())))))())(()()()()()()(((())))(()()))()((())(((((()()())))(()))(()))()()))(((())())()(((()()()()))))(()))(())())))()())(()()())())))))))()))))((())))()())(()))(()(()))())))))())(())))))()()())())()))()()(())))(()))(())((((((())(()))(()))())()))(()()(())))()))(()()))()))()(())))(())))((()(()))(())()()())())))(((()()())(())()))))))()(((()(((((()()(((())(())))())()((()))))((()())()(())(((())))(((()((()(()(()))(()()))())(()))(())(())))()))))))((((()))()((((()(()))()))()()))))()(()(()))()(()((()(((()(()()(((()))))()(((()(()(()(((()(()())())()()(()(()())())(()((((())(()))()))(((((()()())(())()((()()())))()()(((()()))()((((((((()(())))())((()))))(())))(()))))((()((((()()(())(((((()))(((((((((((((()())))((((()(((()((())())()))((()))()(()()((()()()()(()()(()(()(((())()(()((((((()((()()((())()((((()((()()(()()())((()()()((()((())()(()(((()((())((((())(()))((()(()))(()())()((((((((()(((((((((((()))(()(((()(()()()((((())((())()())()))(())((())(()))(((()((()(())))(()))))((()()))))((((()(()(()())(()(())((((((((()((((()((()(((((()))())()(()))(()()((()(())(((((()(())()(((((()()))))))()(((())()(()()((((())()((())((()(((())(((()))((()()((((()(())))))((()((((()((()((()(((())((()))(((((((()(((()((((((((())()))((((())(((((()((((((((()(((()((()(((()()(((()((((((()()(()((((((((()()(()(()(())((((()())()))))(((()))((((())((((()())((()(())()((()((((((()((((((()(())))()())(((())())())()(())()(()())((()()((((())((((((())(()(((((()((((())()((((()(()(())(()())(((())()((())((((()))()((((((())(()(((()(((()((((((()(((()))(()()())())((()((()())()((((())(((()(()(((((((((())(())))()((()()()()(())((()))(((((((()(((((((((()(()))))(()((((((((()((((()((()()((((((()()(((((((()(()(())()(())((()()()((()(((((()())()(((((()())()()((()(()())(()()()(((()()(((((()((((((()()((()(()()()((((((((((((()((((((((()()(((()())))()(((()()(())())((((()((((()((((()()()(())(())((()(()(((((((((((((((()(())(())))))()()))((()(((()(())((()(((()(()()((((()()(((()(((()(((((()()((()(()(((()))((((((()((((((((()((()((())(((((()(((())(())())((()()))((((())()()((()(((()(((((()()(((()))(((()(()(((((((((((((()))((((((((()(((()))))())((((((((((((())((())((()())(((())((())(()((((((((((()(((())((()()(()((())(((((((((((()))((((((((((((()(()())((()((()((()(()(((()((((((((()()(()((()(()(((()))((()))(((((((((((((()(())((((((())(((()(())(()(()(()((()()))((((()((((()((((())))())((((()((((()))((((((()((((((()((()(((())))((())(()))(()((()((((()((()(((()()))((((()()()(((((((())(((())(()))())((((()())(((()(((((((((((()(()(()((()(((((((((((((((()()((((()((((((((()(((()()((()((((()))(((()(())((((((()((((())()((((()((()))(())()(()(((()((())())((((((()(()(())())(((())(()(()())(((((()((()((())()())(())))(((()(())))))))(((()(((()))()((()(((()()((()())()()))())))(((()))(()(((()(((((((((()(()(((((()()(((()())()()))))()(((()))(((()(()(()(()(()))()(())()))(()(((())))(()))))))))))(())((()((())((()(())()(())((()()((((()()((()()))((())(((()((()(())(())))()(()(((((()((()))())()(((((()()(((()(()((((((())(()))(())()))((()(()()))(())())()))(((())))(()((()(((())(())())))((()()((((((((((((((()((()(()()(()(((()))())()()((()()()(())(()))(()())(((())((())()(())()()(()()(())))((()(((()))))(((()()(()()))())((()((())()))((((()()()())((())))(((()(())(((((()(((((()((()(()((((()()(((()()()(((()())(((()()((((())(()))(((()))(())())((()))(((()((()))(((()()((())((()(((((()((((()()())((()))()((((()((()(()()()( \ No newline at end of file
diff --git a/2015/01/puzzles.c b/2015/01/puzzles.c
new file mode 100644
index 0000000..6690a64
--- /dev/null
+++ b/2015/01/puzzles.c
@@ -0,0 +1,25 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main(void)
+{
+ int c;
+ FILE *fp = fopen("input", "r");
+
+ register int floor = 0;
+ for (register unsigned int i = 1; (c = fgetc(fp)) != EOF; i++) {
+ floor += (c == '(') ? 1 : -1;
+#ifdef PART2
+ if (floor == -1) {
+ printf("%u\n", i);
+ return EXIT_SUCCESS;
+ }
+#endif
+ }
+
+ fclose(fp);
+ printf("%d\n", floor);
+
+ return EXIT_SUCCESS;
+}
diff --git a/2015/02/input b/2015/02/input
new file mode 100644
index 0000000..5f3335f
--- /dev/null
+++ b/2015/02/input
@@ -0,0 +1,1000 @@
+29x13x26
+11x11x14
+27x2x5
+6x10x13
+15x19x10
+26x29x15
+8x23x6
+17x8x26
+20x28x3
+23x12x24
+11x17x3
+19x23x28
+25x2x25
+1x15x3
+25x14x4
+23x10x23
+29x19x7
+17x10x13
+26x30x4
+16x7x16
+7x5x27
+8x23x6
+2x20x2
+18x4x24
+30x2x26
+6x14x23
+10x23x9
+29x29x22
+1x21x14
+22x10x13
+10x12x10
+20x13x11
+12x2x14
+2x16x29
+27x18x26
+6x12x20
+18x17x8
+14x25x1
+30x15x22
+17x18x7
+28x23x24
+15x12x25
+14x7x20
+29x23x8
+24x5x22
+6x22x8
+1x15x26
+14x5x1
+24x28x28
+17x23x23
+4x15x7
+23x8x11
+6x15x1
+23x18x13
+17x1x26
+23x13x17
+2x18x8
+22x22x1
+10x22x6
+28x29x20
+22x21x25
+14x8x23
+12x30x14
+8x7x5
+3x30x15
+4x3x29
+25x18x3
+16x7x16
+4x3x8
+9x16x30
+20x28x3
+28x24x6
+4x18x2
+23x18x5
+22x4x30
+15x30x9
+7x12x12
+3x22x29
+12x1x9
+9x2x25
+17x11x10
+25x24x7
+7x27x26
+26x4x12
+29x2x26
+19x24x12
+23x23x3
+26x28x16
+18x4x16
+25x30x18
+29x19x19
+16x3x27
+29x25x29
+18x19x5
+14x21x30
+19x13x26
+19x10x15
+9x4x7
+18x6x6
+24x25x29
+9x12x27
+15x3x22
+30x17x21
+18x19x28
+9x11x12
+8x28x22
+11x3x4
+28x17x20
+24x18x15
+11x12x13
+6x19x24
+28x4x5
+28x22x23
+13x29x2
+9x16x15
+29x28x1
+10x18x30
+19x11x12
+26x28x25
+23x17x13
+25x1x21
+17x1x27
+17x27x28
+28x13x15
+14x13x25
+11x29x7
+22x29x5
+13x6x14
+23x18x13
+25x7x17
+18x9x20
+21x11x2
+28x11x13
+13x25x1
+19x29x25
+16x29x4
+10x21x10
+7x25x17
+5x9x3
+1x15x6
+8x27x29
+23x6x30
+22x22x29
+6x20x30
+26x25x29
+10x19x19
+20x30x9
+5x30x24
+17x10x27
+30x14x30
+8x17x4
+7x18x6
+3x5x4
+24x17x15
+14x20x17
+22x27x15
+18x14x15
+23x9x11
+21x16x29
+7x18x21
+9x3x29
+10x13x4
+2x30x4
+23x20x4
+8x22x21
+29x28x4
+13x16x25
+21x9x11
+7x26x26
+13x23x30
+19x7x10
+9x23x21
+21x9x17
+9x21x15
+20x29x22
+23x13x15
+19x25x2
+12x11x30
+20x21x6
+21x6x17
+24x26x9
+29x21x29
+29x26x16
+6x16x1
+2x12x6
+6x7x20
+7x2x22
+6x22x4
+13x11x27
+25x27x14
+11x8x6
+26x11x14
+30x3x29
+27x21x20
+15x16x26
+6x22x10
+11x9x25
+23x13x6
+13x9x3
+30x22x13
+29x23x14
+25x19x6
+7x29x11
+19x18x5
+29x25x13
+25x24x27
+1x9x12
+22x9x17
+14x12x28
+19x21x17
+13x25x17
+14x25x12
+4x14x30
+7x15x28
+3x6x25
+6x2x16
+15x19x11
+17x30x20
+20x23x7
+26x21x6
+26x29x24
+2x4x30
+4x22x18
+13x3x28
+27x6x21
+5x3x27
+12x7x11
+28x11x9
+12x9x2
+1x22x20
+15x13x28
+14x19x16
+28x20x3
+20x4x9
+26x7x26
+18x19x25
+7x1x13
+20x23x29
+27x26x8
+11x15x15
+10x21x23
+29x2x11
+21x28x20
+3x18x23
+26x17x17
+14x26x17
+20x7x17
+18x12x8
+4x8x8
+8x15x23
+24x29x5
+1x25x8
+1x28x17
+16x18x13
+29x24x22
+13x16x10
+14x7x16
+15x11x29
+12x15x19
+17x6x28
+4x3x9
+15x16x8
+29x27x11
+2x24x20
+4x21x3
+29x24x27
+18x22x22
+7x8x18
+20x7x8
+19x9x2
+20x17x2
+2x29x10
+19x25x1
+28x9x3
+29x27x20
+7x21x7
+10x4x22
+26x8x5
+26x14x1
+5x27x9
+2x18x3
+3x27x17
+30x17x23
+30x11x20
+4x6x7
+6x29x27
+30x16x20
+24x30x28
+19x20x26
+18x1x25
+26x12x12
+19x15x29
+16x21x24
+23x13x26
+25x16x10
+8x9x18
+24x14x1
+24x15x21
+19x9x14
+8x23x11
+22x2x16
+29x9x26
+3x16x25
+15x20x30
+3x11x12
+15x2x3
+13x7x4
+2x7x27
+9x26x11
+30x24x19
+28x17x21
+10x8x2
+11x15x26
+10x12x20
+24x24x27
+25x26x16
+13x4x20
+25x13x11
+12x22x3
+20x7x1
+12x18x6
+26x8x20
+14x2x7
+23x12x1
+26x24x24
+27x26x23
+26x17x5
+17x24x2
+26x5x6
+23x5x1
+5x18x30
+24x21x19
+5x28x11
+21x20x14
+25x4x22
+26x24x11
+7x5x8
+13x1x30
+5x1x6
+14x5x2
+8x11x7
+13x20x1
+17x30x14
+29x22x10
+12x26x3
+27x17x3
+26x27x4
+5x26x17
+22x11x19
+8x26x3
+24x19x22
+7x1x4
+6x27x30
+4x28x14
+16x14x18
+4x5x20
+19x25x4
+15x15x1
+10x14x14
+16x18x24
+21x27x15
+5x5x10
+1x7x13
+16x2x8
+13x15x11
+3x25x10
+20x29x8
+12x3x2
+10x13x12
+25x27x1
+11x30x19
+7x19x13
+27x6x18
+16x21x19
+21x29x5
+16x23x12
+29x19x15
+5x5x10
+27x15x1
+13x16x22
+29x19x5
+8x12x9
+3x18x5
+13x25x3
+5x9x21
+10x20x16
+9x9x11
+23x21x1
+22x2x15
+27x8x13
+23x7x3
+26x30x15
+29x15x16
+16x27x13
+2x18x9
+10x27x8
+20x9x25
+10x2x17
+16x13x13
+21x26x1
+27x26x24
+9x30x16
+19x17x28
+25x15x1
+10x26x6
+10x11x11
+5x26x25
+30x4x15
+9x8x23
+14x25x7
+8x28x8
+28x18x24
+4x4x25
+16x25x11
+17x27x8
+15x16x9
+24x13x21
+17x3x27
+27x5x26
+8x27x12
+29x2x8
+24x23x30
+1x30x21
+6x18x20
+13x14x12
+25x30x23
+24x6x24
+12x7x21
+11x6x8
+8x30x30
+26x3x12
+28x6x5
+18x7x1
+7x6x20
+14x16x18
+11x22x15
+4x20x10
+19x24x19
+8x24x11
+4x9x10
+6x6x22
+10x9x29
+1x5x28
+19x25x29
+20x30x3
+15x13x13
+9x9x24
+20x14x29
+26x24x13
+2x25x8
+10x26x2
+12x19x12
+18x6x20
+4x5x14
+26x27x10
+16x26x20
+3x21x15
+2x26x18
+14x11x17
+26x26x25
+10x1x11
+17x19x19
+27x28x26
+9x2x10
+19x30x15
+23x30x14
+15x3x20
+2x14x22
+21x18x8
+22x4x29
+19x6x29
+9x26x29
+16x10x9
+22x12x22
+13x28x14
+25x14x28
+28x3x30
+10x17x1
+10x27x22
+10x23x19
+14x25x9
+11x24x8
+30x25x10
+22x13x28
+2x7x6
+11x20x8
+9x22x14
+19x16x9
+11x24x4
+11x17x2
+6x4x10
+26x10x10
+12x14x5
+27x10x3
+15x3x6
+11x7x19
+22x10x12
+21x26x10
+13x20x3
+27x8x8
+1x24x23
+24x9x22
+23x17x23
+3x28x19
+2x20x28
+23x17x24
+26x1x4
+4x1x12
+5x6x16
+13x22x13
+25x21x21
+20x21x12
+9x24x25
+17x16x12
+12x28x9
+18x16x27
+29x12x2
+30x12x15
+24x11x10
+4x9x22
+4x24x5
+19x11x5
+6x25x6
+1x20x17
+22x8x21
+11x26x4
+16x19x3
+8x12x8
+13x2x18
+10x5x11
+8x12x17
+21x2x5
+26x17x26
+23x18x17
+28x11x14
+1x4x27
+29x5x28
+5x9x10
+5x7x25
+20x15x27
+15x11x17
+12x14x1
+29x14x4
+18x14x18
+14x25x24
+26x14x18
+13x8x11
+30x1x23
+3x4x12
+12x24x9
+8x6x16
+14x15x30
+12x30x8
+22x11x18
+16x30x28
+17x18x4
+13x14x23
+2x28x8
+3x28x30
+29x30x8
+4x6x26
+6x30x17
+11x30x30
+19x4x3
+12x15x20
+22x28x4
+26x30x2
+6x12x7
+1x10x5
+25x29x7
+17x9x18
+16x21x29
+21x14x7
+15x16x11
+26x6x15
+8x24x7
+2x20x4
+2x9x3
+19x8x13
+18x7x22
+27x14x17
+2x13x8
+18x15x26
+15x27x27
+18x11x15
+1x29x20
+21x12x11
+20x2x15
+28x23x9
+1x1x17
+7x23x9
+30x9x27
+9x16x18
+15x24x28
+30x11x18
+29x26x10
+9x5x25
+2x1x19
+14x3x14
+6x3x6
+30x15x20
+20x17x27
+28x10x9
+14x24x28
+17x11x6
+12x3x6
+8x8x15
+23x14x21
+11x21x7
+5x13x30
+4x29x25
+30x28x24
+18x4x9
+3x15x6
+13x9x19
+30x14x7
+7x9x9
+17x11x26
+24x26x13
+16x21x16
+27x17x25
+2x21x11
+9x11x27
+3x3x7
+13x8x14
+20x20x26
+13x29x22
+30x11x1
+7x10x19
+27x5x9
+23x17x15
+21x6x13
+24x15x16
+18x4x14
+18x16x6
+22x11x18
+14x2x5
+15x3x7
+10x20x29
+16x1x10
+30x23x1
+10x15x11
+17x14x5
+22x8x13
+7x11x28
+26x17x3
+2x23x2
+28x13x19
+18x12x28
+22x23x16
+14x12x1
+20x8x19
+17x19x13
+29x2x12
+2x26x27
+29x16x4
+13x8x18
+16x15x30
+23x16x2
+28x8x27
+21x8x23
+13x20x26
+19x6x17
+17x30x15
+7x4x30
+2x13x30
+18x7x19
+4x13x27
+8x6x5
+18x20x25
+2x3x30
+23x27x13
+22x30x4
+23x25x25
+23x16x19
+25x3x1
+5x6x15
+11x29x12
+25x24x7
+16x7x20
+20x3x2
+12x27x15
+16x10x12
+1x3x14
+22x1x26
+2x24x18
+11x29x16
+15x2x9
+10x1x24
+21x8x11
+30x11x23
+6x30x21
+13x27x29
+14x6x5
+18x29x19
+12x4x28
+29x3x14
+10x30x28
+5x7x15
+14x1x10
+9x25x14
+7x24x18
+28x17x21
+18x13x25
+26x15x1
+21x1x19
+12x16x21
+4x6x13
+7x15x26
+17x19x5
+12x28x2
+1x20x19
+27x7x5
+17x26x8
+12x15x19
+5x23x10
+8x2x8
+16x13x12
+14x27x1
+26x29x3
+24x16x14
+14x13x13
+7x22x23
+2x9x30
+4x27x8
+26x27x15
+23x1x6
+25x29x18
+5x18x1
+20x8x20
+5x10x25
+30x25x15
+7x22x25
+28x26x17
+29x4x1
+21x11x27
+20x9x8
+25x22x12
+2x11x11
+23x2x16
+23x27x20
+2x13x28
+27x2x24
+11x1x17
+12x4x27
+16x20x22
+30x12x10
+5x15x4
+5x2x27
+12x4x25
+1x16x4
+27x4x4
+21x16x3
+27x26x3
+24x6x6
+24x12x12
+20x20x25
+8x29x2
+21x4x5
+2x4x8
+4x13x19
+3x20x10
+12x15x16
+6x5x4
+12x16x20
+22x19x17
+8x17x22
+25x16x15
+7x1x19
+10x1x7
+23x23x5
+28x6x12
+2x25x12
+10x27x12
+24x27x19
+14x14x20
+4x1x5
+16x27x29
+20x20x24
+28x24x30
+6x15x15
+9x15x30
+23x26x3
+17x24x21
+22x25x25
+18x29x10
+20x25x1
+24x11x16
+20x7x21
+20x7x9
+7x26x2
+5x18x1
+16x26x28
+4x10x18
+27x30x21
+26x9x9
+8x16x14
+6x27x8
+28x9x20
+13x13x4
+9x18x16
+18x15x18
+22x19x14
+14x10x17
+25x29x11
+1x18x19
+8x11x26
+18x6x14
+30x24x13
+27x1x27
+15x9x3
+2x29x17
+2x26x21
+22x9x9
+20x20x20
+22x28x2
+26x5x16
+11x3x14
+21x16x16
+18x26x7
+18x30x6
+7x11x12
+15x10x2
+27x2x16
+27x30x24
+28x14x24
+7x4x8
+6x28x15
+13x19x1
+22x26x30
+7x30x24
+2x17x21
+19x26x2
+19x24x15
+14x23x2
+21x27x15
+30x15x14
+21x29x5
+23x30x2
+4x1x2
+15x5x13
+21x2x30
+20x7x16
+1x21x25
+2x25x1
+12x29x5
+28x13x16
+26x3x12
+29x20x23
+28x12x20
+4x30x8
+16x15x16
+6x16x29
+2x28x13
+24x25x2
+26x15x22
+17x20x11
+18x12x7
+19x1x18
+8x27x13
+22x16x8
+19x26x17
+13x11x10
+22x12x3
+13x12x14
+29x17x9
+6x14x10
+14x20x10
+8x26x9
+25x13x22
+3x30x25
+14x28x1
+30x29x12
+3x17x15
+3x24x14
+28x24x22
+16x6x1
+20x25x14
+17x17x13
+6x19x27
+10x15x20
+8x23x20
+7x29x21
+18x9x25
+10x5x22
+2x27x27
+16x18x30
+15x5x12
+26x29x29
+28x11x10
+9x29x28
+24x15x23
+26x9x10
+5x1x25
+22x27x16
+7x29x3
+1x3x5
+8x7x29
+19x21x11
+28x13x30
+17x16x20
+5x10x25
+9x14x15
+15x14x23
+16x4x17
+21x8x2
+9x9x8
+22x22x4
+10x2x27
+12x19x10
+15x29x4
+22x14x7
+29x18x5
+1x7x27
+24x1x15
+23x23x26
+12x17x23
+26x10x24
+8x22x2
+8x1x10
+22x19x12
+2x23x13
+11x27x25
+26x15x27
+27x7x21
+18x9x6
+22x21x22
+7x12x26
+23x21x13
+14x3x8
+5x9x28
+29x29x15
+27x25x23
+12x2x24
+8x2x20
+29x19x4
+12x24x29
+2x27x28
+14x20x9
+28x6x25
+18x29x8
+19x11x30
+15x11x23
+18x7x7
+14x20x14
+26x18x22
+27x25x13
+12x10x30
+30x2x7
+28x10x1
+18x10x30
+22x11x5
+22x16x3
+25x15x9
+5x10x24
+4x28x8
+19x24x18
+3x4x25
+14x4x30
+11x26x3
+12x12x12
+26x7x24
+3x2x14
+1x27x7
+2x2x13
+3x26x26
+12x4x11
+12x17x20
+4x19x30
+5x18x10
+17x6x18
+19x30x20
+11x2x17
+30x13x19
+22x23x7
+17x28x2
+5x17x30
+7x11x4
+21x26x18
+15x28x4
+5x6x27
+12x6x16
+9x17x12
+27x20x5
+14x5x20
+27x14x6
+2x14x21
+4x28x30
+24x5x1
+19x29x29
+11x23x1
+8x16x21
+3x17x19
+10x13x5
+20x21x16
+23x3x6
+27x26x11
+3x2x22
+14x3x5
+10x9x8
diff --git a/2015/02/puzzle-1.awk b/2015/02/puzzle-1.awk
new file mode 100755
index 0000000..e316ba2
--- /dev/null
+++ b/2015/02/puzzle-1.awk
@@ -0,0 +1,20 @@
+#!/usr/bin/env -S awk -f
+
+function min(a, b, c)
+{
+ if (a <= b && a <= c)
+ return a
+ if (b <= a && b <= c)
+ return b
+ return c
+}
+
+BEGIN { FS = "x" }
+{
+ x = $1 * $2
+ y = $2 * $3
+ z = $1 * $3
+
+ sum += (2 * x) + (2 * y) + (2 * z) + min(x, y, z)
+}
+END { print sum }
diff --git a/2015/02/puzzle-2.awk b/2015/02/puzzle-2.awk
new file mode 100755
index 0000000..e031b94
--- /dev/null
+++ b/2015/02/puzzle-2.awk
@@ -0,0 +1,20 @@
+#!/usr/bin/env -S awk -f
+
+function min(a, b, c)
+{
+ if (a <= b && a <= c)
+ return a
+ if (b <= a && b <= c)
+ return b
+ return c
+}
+
+BEGIN { FS = "x" }
+{
+ x = $1 + $1 + $2 + $2
+ y = $2 + $2 + $3 + $3
+ z = $1 + $1 + $3 + $3
+
+ sum += $1 * $2 * $3 + min(x, y, z)
+}
+END { print sum }
diff --git a/2015/03/input b/2015/03/input
new file mode 100644
index 0000000..6e8d40e
--- /dev/null
+++ b/2015/03/input
@@ -0,0 +1 @@
+^^<<v<<v><v^^<><>^^<v<v^>>^^^><^>v^>v><><><<vv^^<^>^^<v^>v>v^v>>>^<>v<^<v^><^>>>>><<v>>^>>^>v^>><<^>v>v<>^v^v^vvv><>^^>v><v<><>^><^^<vv^v<v>^v>>^v^>v><>v^<vv>^><<v^>vv^<<>v>>><<<>>^<vv<^<>^^vv>>>^><<<<vv^v^>>><><^>v<>^>v<v^v<^vv><^v^><<<<>^<>v>^v>v<v<v<<>v<^<<<v>>>>>^^v>vv^^<>^<>^^^^<^^^v<v^^>v<^^v^^>v>^v^^^^>><<v<>v<>^v^<v<>><>^^><<^^<^^>vv<>v^<^v<vv<<<>^>^^>^<>v^^vv<>>v><<<>vvv<>v<>><^<^v<>^vv>^^v<v<v><^<>>vv<^>>^>>vv^v<vv^vv<^<<>>^v^<>^>>>>vv>^^>v>vv>v><^vv^<<v>^<<^^<v<v>vv<v^^<>^^v>^>>v><^<<vv<<v^vv^^^v>>v<<v^><vv^><vv<^vv<<vv^v<<^v<^^v>><<v^>>^^<>v>><<v<>>^^<v>>^^>>vvv^><<<<<^<^vv<^<><v<<>^^^<<<^>^^^<v<<vv>vv<>^<>v<^v>^<<<v<v<v>>^v<>>v<<^<<v<<>^<<<><><>^>>>>^>v^v<<v<v<<>>vv<^vvv^^^^<vv>vv>^v^^v^<v^v><^vv<^vv>v<^>vv<>>^>^><vv<><^>v>^v>vvv<>^>^v<><>vv>><^v^<><><v>>v^v^><^<^>vv>v<^>vvv>v<<<<<^<v<<vv<^^^<<>>^v<vv<^<>v>^<v<>><><>^<<v>v^>^<vv>><><>>^>^>><^<v>^^>^^>^^v^^<^v^^>v^^>>><<><v<v<<v^vv<><><>^<v>^<<^^v^>v>><>^^^><^vvv<^^^^^v><<><v<^^v><><>>^>vv<vvvv<<>>><v<^^^^v<<^><v>^vv<v^^v^vv<^^>^^<v>><<v^>v<^^>^<^<v<^^v>^<<v>^>>>^v<>v<^^^>vvv^v<<^><>>><vvv^<^^^<^>>v>>><v>^^vvv^vvv<^^^^v^v^<vv^<v>^<<^>v^v^<<><>><^v><v<><<>><<<>^v>v<>^<v^v>^vv>>^<>v^^<<v><^v>>v<>>^v^^>><^>v^<^v^^>><>v^>^v^v<<<v^<v^^v<^>v<><>vv>>>>^>v<>v<<<>^^>vv^v<><v^<>^<<<<>>^^>^v<v^v<<><>^v<>>^v^<<^<^>>>^vv<><v<^^<>v^>>v<^^v<v>>>^>><<><<<>><vv<v>>^v>><^<v><vv>^vv<v<>>><>v^><>vv<^^v^^^v<>><^vvv<<^<>v>>>v>><v><>>><>><v^><v^v<v>^v>v<v>>^^<^>^>v><>vv>^v><<>>>>>>>^<<^vv^^vvvv<^^><<<v<<>vvv<>^><<v<v^v^<<v>v<>>^<vv^<v<v>^<<^^vv>v>^<vv<<>v<v^<>v>>^v^^vvvv>^^>>v^v^^><<^>v>>^^>^<^^<>v<v>vv^vv>v<v>>^v<><^vv^<vv<v^^^v<^v^>>^v>>>^^<^<^>^v^>^>>>^v>^>^^^>>^<>v^^<>^v<<^^>^^<vv<>v<^v^>><^v^>^<>>^vv^vv^>v^<vvvvvv^>><^^<^v<^<v^<<^^<<v^<^>><>v><^v^v^^^v>v^<>^<<v<^^vvv<v>^^>^v^^<><vv^v^>v^<<>>vv<>>>>v>v<>^>>>v<>^^><v<v^^^<>^<^><>^><<v>><>^<<>>><<^<vvv<^><v>>^vv^v>><v<>vv^<<^^<<><v><<^<v<vv<<^v^vv>v^>>>v<<<<v<<>v>^vv<^v><v<v>v<^>^^vv>v><v>><<v<<v^v>>><>^<>><><<^<<^v^v<<v>v>v<v<^^>vv<^v^^^<v^<<<v<>v^><^v>^<^<v>>^<<<v>>v^<><>>^v<>vvv<vvvvv<^^><^>><^^>^>^v^vv<^><<^v>><^^v>^v<>^>vvvv><^>^<<v^^vv<v^^<><>v>^>>^<^<<<^v^^^>^>>^>><><<^>v^^<v>>v<<<<vvv<vvvv^<^<v^^<>^>vvv^<vv^v^v>^<<><v><^v^v^^^>^^>^vv<>v>>v^>vv^vv>v<^v^^>>^v^v<>>^^><<v<<>><>>>^>^<>^^v^^><^<>><<^<vv^^^^^>>vv^<v^<^>>>>v<<><<^>vv>vvv>^<><>>>>vv><<v^v<^^^<<^^^vv^<v<><><<<<>><<v^<>v>v^><>v^v^^><>v>v>^^v<^v<>>^^^^^<v>><v^>^^<v>><v^^>v<^<^>>>^><^^>><<>>^><>^^^>v^^^>^^v^<>^^><^>>><><^>>v<v^>v<^><v<v^<>v<^v>v^<^vv^^><<<><><^v^<v<^^>v>v^>>^^vv^<v>^v>^<^v<>^>^><^<v>^v><^<^<>v^^>^><>>><<v><<><>v<<^v^^<^><>^<><><v>v<^^<v<v>>^^<<>>^<v>><^><^<^>^^v<>v>>><><<>^>v><><<<<v^^^^v<>>^^^v>><<^v>^>>><vv^>>^vv<^<>>^<^^<^v>v<v<<<<<>^<<^<<<<<^<^>>^><<>><>v^v>^<^>v^<><vvv^>^v^v^v><^<v<>vv<<^<>^^^<>^v>^<v^^<v^v>v<>>^>v<<>v<>v^v>v<<<>>v>vv>>v<<>v<>v<^>^>^<v>>v>^>^^^<vv>v<<>>><v>^vvv^^>^^<^vv^^^^>v>^v^>v^^v^>>^v>^vv>^^v^<<<<>^<><^<^<<^^>v^^^v<>>vvv<v>>vv><v<v>^<^v>>^v<vv^<<v<vv><^^v^v>v<>^v<<<^^v^^^<^v>v^v^v>><vvv<<>v<>^v>vv^v>vv<<^v<v>^v>v>><^v<v<>v>>>><<<><vv><>^v^<^vvv>v<>><^v>^>><v>vv<><><>v><>>><^>vv>>^<>v^>>^><<<^><<>^v^>>><><>vv>^<>^>^v^^><^>>><<>v^<^vv>^<^vv>><v<>vv<v><><<^><>v<^^<^>vv^^^^vv<<v><>vv<><v>v<>>>>^><v><>^<><>v<>><<>^^vvv>^^^<><>>vvv^v>><>vv<vv>^^^v^<<>^^v<><<^^v<>^^>^<^^v>>v^v^^>>v>>>^<<^<>^>^^v>>>><vv<<>^v<<vv><<^^vv><^>vv<>>v<v>v^>v>>v^<vv<<<v><v^>vvv^^>vv^<<v>v^>>v^<>>><><<^^<^v>^>>>v>v>^v<>vv><vv<vvv<<v>v>^v<<<>><<><><>v^>>>v^>v^>>vv^^<v>^<>>><^>v^<>^^><v>v<><<<><v^v<<<v<v^>v^v>^>v<^<>v>v^^>>v>vv^v<>>^^^^<>v^>>>>>>>><v<^<<vvv<^v^>^v<^<<>>><<<^<<^>^>v^<>^<<<>v>><^vv^>^>^>>>^<vv><v^^^<v^<v<><v^vvv<>v<vvv^vv<<<v^<^<^vvvv^<<vv<^v><<>^>^<v^v^<^>v^><>>v^>v^>^>>v<>vv^v<<>^^>>vv<>vv>>^v<^vv>^v>v<v^vvv^<<^><>v^<><vv><>v^^><<<><>^>^v^<>><vv<^>v^v>v<>><v<<^>^<vv<^v>^<<v><^<^^vv^<>><v^>^vv^<>>^^^^v>v><^^^v^<<<>^<^<<>><>>v<<^v^>><><v^>>^vv^v>vv>>>>>>^^<<>v^>v^v>^^>>><vv^^^v>^v>>^^^<>><>v^<<<v<vv^^<v^<<<>v>v^^^<vv<>>^v>^v<^<<><>vv>^^^<^^vv<v<<vv>^^>vv>v<<^>^vv><^><v>^^^^v<<vv>v^<<^^>>^^vvvv^v^>vv>>v^<v>vvv<>>^><>>v^^>>^<>>vvvv^>><v^v<^^<^vv>>v<<^<<^><v^^><v^>v^>><<<v>v>v^>^v<v^vv<^^^v<^<vvvvv<<vvv>><>v<v<v<<^v<><<>vv>><v>><^>>^^v>^>><>vv^><<>>vv<<<^<^^>^<<^>>>><v<^v<<<>>v>vv<^>^v><>>v<v^v<>v^vvvv>v^>>v><<^<v>^^v>>vv^^>v>^v>^v^^>^<^vv<v<<^>vv<<^>>^<<^^>>^<^>v^><^vv>^^v><v^>>><>v^v>^v<^><<<>vv><v>v<><>>v^<>^^>^<>^<<^>>vv^><^<v<^^vvv>>v^>>v^>v>vv><>>v<^>><<<v<<vv><v<v<v>v<v>vv^vvv^vv^>^>v><vv<v^^<>>>>vv^>^<>v<^>^<^v>vv<^<<>>^<^<vv><^^<>^<<v^v^>v<<><v>v>><^v<<^vvv>v>v<<^^<^^>v<vv<v<v^v>^^^>^>vv<v<<^^v^<v<^>^^^vv>v<>>>vv>><><^><><<<vvv<<^^v^<v^<<^>>vv>vv^v^>>><v><<v^v>>v>>vv>^^vvv^>^^>^>^>^v<<^vv^>vvv^^vv><^>^v^>^><>v<^^vv<v><v^<><^<>><v>^^v^v>v^vv<>><^v>^<^v>^<>^v>>>><<vv^^^vv^>>><vv^v>>v><^v^vv><<^v<<>^^<v><^v>vvv<><^^><<^v><>^<^v<^^<^vvvv^^>>>>vv>v>>>v<v^><<<<v>>v^><v>>vv^v<vv<>vv<>vvv>>>><>>><>^v<v^v><vvv<<v^^v^v<>>><>>^vv<<v<><<vv<v^>^^vv><^v^v<v^vvv^v>v^^^vv>^><^vvv<<>^vvv^<v<v^v>>>>^<<<><<<<<^v<^^>>>>^>^<v^^^v<vvv<vv^<>v<<<^<^>>v^<v><<><<^^vvv^>v<>>^^>v>^v>>v<v><v>>>>^<^<^>v^v<vv<>^>><>^<<^vvv^^<>^<vvv<>v^>^^<<^>^vv><vvv>>v^v^>v><v>^<^^<>^>^>>>^^vvv^<<>v^<<>><>v<^<^>v^>^vv><v<^<<<^v>^>>^<^v^<<<<^v^><v^v>v^><<v<><<v^<<^<<v<<v><v><><^^^^>v>^^<v>>v<vvv<<<>><>>^><<><^<>>^^>vv<^><^v^><vvv>>>vvv<<vv^<^^^<^>^<>>^>>^v^<^^v>^<v<<>^^v<^vv^><vvv>>^v><<^<v^<><><>>^>vv<<>^^^v^^<v<>><>>vv>v^>vvv^^v<vv<^<^>>^>>^>>v^<<<v^>v^<^v^vv^><^<^v<<v<<>v>^v^<<<v^vv<v<<>^^<v>>>^<v<^>^^v<v>>>><vv<^^<<>><<v<v>^^v^>>^^>>^v^<^v>v^v^v^v^>v^vv<><>^^<>^><^^^<<<^<v>v<<>^<^^^^^v^<^<<^^>^vv<>v^>><>>^>v>v<>^>v<v^>>><>^<><v>>>^>^>>v^><v<>v><^vv^>v<<v>v<><<vv<<v>^><^<v^>v<<v^v<<><v><>v<v><>^^<v<>><<>v>vv<<v>^v<v>vv><><>vv^<<>^>^<^>>>^v>v<^v^^^vv<>>>^<<^>>><<^^v^>v^<^v>vvv>v^^vv>^^>>v<>^<<>^<><^^v^>><>^>v>>^^^<<^^v<>^^>^<>^>><^>^vvv><^>^<^>^>>vv<^>>^v>>^<>>^^>>>v^<v>>v<<v<^>>v^^vv>v><^v^^><vv^v<^>v<<>v^^<><>^>vvv><^^^>^v^>v>>^vvv<^vv>^^>^>>v<>><<^v<<v^>^><>vv^<<^^vv><v>>^<^><^<v>^v<v>^<<>^v^^>v^>>^^^<^vv>v^>>>vv<<>v>>>^>v^^<v^v^^v^>>v<v<<v>^<<>>vv<<^v>v<<vv<<^<^v<^<><^^>v>>v>v^>><vv<^v<^>^>>v>^><<^<<>^v<v>>><^^<^<<<v^^>^>vv<<>^<>^<v^<<^v>vv>^^^v<^v><v<<<<<vv>vv>^^^^>v>v><<^<<<^vv><^<<<><v>><v^v>v<<v^^<v^>v>^v^v^<^<^vv>vvv<^^v<>v<<<<>v<v^<vvv^^^<<^<^<<>^<<><<<>v<^>^^v<^^v^>vv>vvv>v><v^^<<>>^><^>>v<<vv>v<<^^^v<<^v^^><><<<><<>v>^<<>v<<<^v>><v^v<^v<v^vv>v>><<^<><^v^^v<v>^>^>vvvv<<><<>>^<vv>^^><v<>v>v<v^^>^><>>><^><<><<<^<>v^><vv^^^^>>^v^>v^<>>v>^^><^<^v^<v^>>v>^vvv<>>v<v^v><>^vvvv<v^<<v^<<^^vv>><<<<<<v><<<v<v^v^^<v^^<>v<<<<^v<<><<v^<^><v<vv<v^v^<v^^vv<v^v<<<>^<<>vv<v<^>^<<><vv<<vv<v<^<^<>><^^<<>>>vv>>>>>>^v<v<>>v^v^^<v^<<<<>><<^v^^^<>^<vv>>>><>v^v^vvv^>>v>><v^v<<<^v>>^^<<^^vv><<<^^^<<<v><^^>>>>vvv^v<^>^^>v<^<><vv<v<>v>>>^vv<<^<v>^v^>^>^v>v>v^v^>v<<v>><>><v^^<<^>>>><<^v^<>^v<vv><>vvv^>v>v<v<v^>^<><><>^>>><v<<<v^vv><>^>^^<<v^>>v^^>^<v>><>><>v^v^^v>>>>vv>>^v<<^v^<>^>v^^>^^<<vvvvvvv>^<v^<<^<<>><<<^^^v^^^^v<^<>v<^^<>vv^^v^<>^<<^>>v>v<<<^^^^vvv^<^<><>v<<v^<^<>>><<><<<v<v<v><vv>^^<vv<<vv<<<v<^>^^vv<v<>><<>>>^v<<>^>>>v^>v>^^<>^<vv<><^>v>^>>>><>^^>v^^v>^vv^^v^><<<>>v<>v<vv<vv^v^v<^v^<^^><<<><vv^^>^<^<<>v>>>>^<<v>v<v>vv<^><^<v><<^>v>>v><<v<<^v^<>>^>>>^v^v>v^^vv^>^<^^>>^><^vv^^vv^<>>^^^^<^^><><v<>>^>>^><vv^>^vvv<^<<v^^<<<>^><>>>^^<><v<v<><<v^^^^^<^<^<<>><<>>>>^<<>>>^<^v^>><<^>>>^<<v>^>><>^<v>^<><v>^v^^vv<><^>vv^^v^<^^^v^vvv^>><>>v<<vv<>>^<^vvv<<^^><vvv^^<v<>vv^^<<>><v>><^^vvv<<<^>^<><^>vv^><^<<>vv<<v>>vv>v>v^<vv><vv><<>^^^^v^^^^<v>^<<^><><^^v^>v>^>><^><<>v^<v>>>^vvv>>^<^<>^^v^vv^^v><<vv^<>>>v<<<>v>^<>v<<>v^>^<<><<><v<v<v<>v^>v<><^^>^<^v^^><^>vv>^>vv<v<^v>vv>^^><<>vv^>^v<<^<<^<<>v<v<^<v>v>>^><v^^v^v>>>><v^v^<<<vv<<^^<>>v^v<^v>v>^^^v<v><v^^^vv<>v^v<^<>v><><v^<>>vv>v><>v>^v<><<<<<<v<>>v^vv<<<<v<<v><^<>^>><>^^vv>^<^<<>vv>>vv<vvv>><><v<>><^<v>^><^<<v>><v><v>^<v>><>v^^^^v<v^^v<>^^vv<>v<>v>^vv^><v^<<^<>^<>^^^>v^>>>v><<^>>v<^v<>^^<v<><v^v<v>v<><v<vv><<>v<^<^>v<>v^>v>^^<<<^^vv^<><<<>>v>^^<>v>>>><v<v<^^^v<v<v^><<>v^v<>v>><<<<v^<><^<<^>^<vvv<v^^v>>v^vv^><^v^^<>^^><<v^>>vv>^<v^vv<^^v<>>vvv<^v^>>^<v<v>>^>^^<<^>^>^v><>>^<^^v>^>>^^<><>>>^^>^^vvv>v<^^<>v^v^^<v<<^<v^v^<<>v^v<v<<v<>>><<^^^>>v>^vv>^>^^v<>^^<>v^^<><v<v<vvv^<vv<<>v^><<><v<>vv<<^vvvv><<<v>v>v^>v^<>v^>^<v<vvv^>^<>^>^^v<>><<<><v<^^>^v<v>^^v^v<<<^v^<>^<>v>^^>v<v<v>v>^^<<<><<^>v<v<^vv^v><^^<<vv>^<<v><>^>>>>><v^v<<<^>^v^v<<v<>vvv<<>v>v>>^v^v^>><<<<>v^<v<><<>>>^>>^>><<v> \ No newline at end of file
diff --git a/2015/03/puzzle-1.awk b/2015/03/puzzle-1.awk
new file mode 100644
index 0000000..13b1209
--- /dev/null
+++ b/2015/03/puzzle-1.awk
@@ -0,0 +1,6 @@
+BEGIN { x = y = 1; homes[x][y] = 1; acc = 1 }
+$0 == "^" { if (!homes[x][++y]++) acc++; next }
+$0 == ">" { if (!homes[++x][y]++) acc++; next }
+$0 == "v" { if (!homes[x][--y]++) acc++; next }
+$0 == "<" { if (!homes[--x][y]++) acc++; next }
+END { print acc }
diff --git a/2015/03/puzzle-2.awk b/2015/03/puzzle-2.awk
new file mode 100644
index 0000000..0857009
--- /dev/null
+++ b/2015/03/puzzle-2.awk
@@ -0,0 +1,11 @@
+BEGIN { sx = sy = rx = ry = 1; homes[sx][sy] = 1; acc = 1 }
+ { santa = santa ? 0 : 1 }
+santa == 0 && $0 == "^" { if (!homes[rx][++ry]++) acc++; next }
+santa == 0 && $0 == ">" { if (!homes[++rx][ry]++) acc++; next }
+santa == 0 && $0 == "v" { if (!homes[rx][--ry]++) acc++; next }
+santa == 0 && $0 == "<" { if (!homes[--rx][ry]++) acc++; next }
+santa == 1 && $0 == "^" { if (!homes[sx][++sy]++) acc++; next }
+santa == 1 && $0 == ">" { if (!homes[++sx][sy]++) acc++; next }
+santa == 1 && $0 == "v" { if (!homes[sx][--sy]++) acc++; next }
+santa == 1 && $0 == "<" { if (!homes[--sx][sy]++) acc++; next }
+END { print acc }
diff --git a/2015/03/puzzles.sh b/2015/03/puzzles.sh
new file mode 100755
index 0000000..6007df1
--- /dev/null
+++ b/2015/03/puzzles.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+
+fold -w1 input | awk -f puzzle-1.awk
+fold -w1 input | awk -f puzzle-2.awk
diff --git a/2015/04/.gitignore b/2015/04/.gitignore
new file mode 100644
index 0000000..60d075d
--- /dev/null
+++ b/2015/04/.gitignore
@@ -0,0 +1 @@
+puzzle-[12]
diff --git a/2015/04/Makefile b/2015/04/Makefile
new file mode 100644
index 0000000..10ec8f9
--- /dev/null
+++ b/2015/04/Makefile
@@ -0,0 +1,7 @@
+all:
+ ${CC} ${CFLAGS} -lmd -DINPUT=\"$$(cat input)\" -o puzzle-1 puzzles.c
+ ${CC} ${CFLAGS} -lmd -DINPUT=\"$$(cat input)\" -DPART2 -o puzzle-2 puzzles.c
+
+.PHONY: clean
+clean:
+ rm -f puzzle-[12]
diff --git a/2015/04/input b/2015/04/input
new file mode 100644
index 0000000..bf3e46f
--- /dev/null
+++ b/2015/04/input
@@ -0,0 +1 @@
+bgvyzdsv
diff --git a/2015/04/puzzles.c b/2015/04/puzzles.c
new file mode 100644
index 0000000..22833a2
--- /dev/null
+++ b/2015/04/puzzles.c
@@ -0,0 +1,35 @@
+#include <sys/types.h>
+
+#include <md5.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define BUFFER 128
+#ifdef PART2
+ #define ZEROS "000000"
+ #define NUM_ZEROS 6
+#else
+ #define ZEROS "00000"
+ #define NUM_ZEROS 5
+#endif
+
+int
+main(void)
+{
+ unsigned int i = 0;
+ char buffer[MD5_DIGEST_STRING_LENGTH], digest[BUFFER];
+ MD5_CTX ctx;
+
+ do {
+ snprintf(digest, BUFFER, INPUT "%u", i);
+
+ MD5Init(&ctx);
+ MD5Update(&ctx, (uint8_t *) digest, strlen(digest));
+ MD5End(&ctx, buffer);
+ } while (strncmp(buffer, ZEROS, NUM_ZEROS) && ++i);
+
+ printf("%u\n", i);
+ return EXIT_SUCCESS;
+}
diff --git a/2015/05/input b/2015/05/input
new file mode 100644
index 0000000..a9b6e77
--- /dev/null
+++ b/2015/05/input
@@ -0,0 +1,1000 @@
+sszojmmrrkwuftyv
+isaljhemltsdzlum
+fujcyucsrxgatisb
+qiqqlmcgnhzparyg
+oijbmduquhfactbc
+jqzuvtggpdqcekgk
+zwqadogmpjmmxijf
+uilzxjythsqhwndh
+gtssqejjknzkkpvw
+wrggegukhhatygfi
+vhtcgqzerxonhsye
+tedlwzdjfppbmtdx
+iuvrelxiapllaxbg
+feybgiimfthtplui
+qxmmcnirvkzfrjwd
+vfarmltinsriqxpu
+oanqfyqirkraesfq
+xilodxfuxphuiiii
+yukhnchvjkfwcbiq
+bdaibcbzeuxqplop
+ivegnnpbiyxqsion
+ybahkbzpditgwdgt
+dmebdomwabxgtctu
+ibtvimgfaeonknoh
+jsqraroxudetmfyw
+dqdbcwtpintfcvuz
+tiyphjunlxddenpj
+fgqwjgntxagidhah
+nwenhxmakxqkeehg
+zdoheaxqpcnlhnen
+tfetfqojqcdzlpbm
+qpnxkuldeiituggg
+xwttlbdwxohahwar
+hjkwzadmtrkegzye
+koksqrqcfwcaxeof
+wulwmrptktliyxeq
+gyufbedqhhyqgqzj
+txpunzodohikzlmj
+jloqfuejfkemcrvu
+amnflshcheuddqtc
+pdvcsduggcogbiia
+yrioavgfmeafjpcz
+uyhbtmbutozzqfvq
+mwhgfwsgyuwcdzik
+auqylgxhmullxpaa
+lgelzivplaeoivzh
+uyvcepielfcmswoa
+qhirixgwkkccuzlp
+zoonniyosmkeejfg
+iayfetpixkedyana
+ictqeyzyqswdskiy
+ejsgqteafvmorwxe
+lhaiqrlqqwfbrqdx
+ydjyboqwhfpqfydc
+dwhttezyanrnbybv
+edgzkqeqkyojowvr
+rmjfdwsqamjqehdq
+ozminkgnkwqctrxz
+bztjhxpjthchhfcd
+vrtioawyxkivrpiq
+dpbcsznkpkaaclyy
+vpoypksymdwttpvz
+hhdlruwclartkyap
+bqkrcbrksbzcggbo
+jerbbbnxlwfvlaiw
+dwkasufidwjrjfbf
+kkfxtjhbnmqbmfwf
+vmnfziwqxmioukmj
+rqxvcultipkecdtu
+fhmfdibhtjzkiqsd
+hdpjbuzzbyafqrpd
+emszboysjuvwwvts
+msyigmwcuybfiooq
+druyksfnbluvnwoh
+fvgstvynnfbvxhsx
+bmzalvducnqtuune
+lzwkzfzttsvpllei
+olmplpvjamynfyfd
+padcwfkhystsvyfb
+wjhbvxkwtbfqdilb
+hruaqjwphonnterf
+bufjobjtvxtzjpmj
+oiedrjvmlbtwyyuy
+sgiemafwfztwsyju
+nsoqqfudrtwszyqf
+vonbxquiiwxnazyl
+yvnmjxtptujwqudn
+rrnybqhvrcgwvrkq
+taktoxzgotzxntfu
+quffzywzpxyaepxa
+rfvjebfiddcfgmwv
+iaeozntougqwnzoh
+scdqyrhoqmljhoil
+bfmqticltmfhxwld
+brbuktbyqlyfpsdl
+oidnyhjkeqenjlhd
+kujsaiqojopvrygg
+vebzobmdbzvjnjtk
+uunoygzqjopwgmbg
+piljqxgicjzgifso
+ikgptwcjzywswqnw
+pujqsixoisvhdvwi
+trtuxbgigogfsbbk
+mplstsqclhhdyaqk
+gzcwflvmstogdpvo
+tfjywbkmimyyqcjd
+gijutvhruqcsiznq
+ibxkhjvzzxgavkha
+btnxeqvznkxjsgmq
+tjgofgauxaelmjoq
+sokshvyhlkxerjrv
+ltogbivktqmtezta
+uduwytzvqvfluyuf
+msuckpthtgzhdxan
+fqmcglidvhvpirzr
+gwztkqpcwnutvfga
+bsjfgsrntdhlpqbx
+xloczbqybxmiopwt
+orvevzyjliomkkgu
+mzjbhmfjjvaziget
+tlsdxuhwdmghdyjb
+atoecyjhwmznaewi
+pyxpyvvipbqibiox
+ajbfmpqqobfsmesj
+siknbzefjblnohgd
+eqfhgewbblwdfkmc
+opylbscrotckkrbk
+lbwxbofgjkzdxkle
+ceixfjstaptdomvm
+hnkrqxifjmmjktie
+aqykzeuzvvetoygd
+fouahjimfcisxima
+prkzhutbqsyrhjzx
+qqwliakathnsbzne
+sayhgqtlcqqidqhj
+ygduolbysehdudra
+zricvxhdzznuxuce
+ucvzakslykpgsixd
+udirhgcttmyspgsb
+yuwzppjzfsjhhdzi
+gtqergjiuwookwre
+xvxexbjyjkxovvwf
+mlpaqhnnkqxrmwmm
+ezuqbrjozwuqafhb
+mcarusdthcbsonoq
+weeguqeheeiigrue
+pngtfugozxofaqxv
+copphvbjcmfspenv
+jiyahihykjjkdaya
+gdqnmesvptuyrfwp
+vbdscfywqmfxbohh
+crtrfuxyjypzubrg
+seihvevtxywxhflp
+fvvpmgttnapklwou
+qmqaqsajmqwhetpk
+zetxvrgjmblxvakr
+kpvwblrizaabmnhz
+mwpvvzaaicntrkcp
+clqyjiegtdsswqfm
+ymrcnqgcpldgfwtm
+nzyqpdenetncgnwq
+cmkzevgacnmdkqro
+kzfdsnamjqbeirhi
+kpxrvgvvxapqlued
+rzskbnfobevzrtqu
+vjoahbfwtydugzap
+ykbbldkoijlvicbl
+mfdmroiztsgjlasb
+quoigfyxwtwprmdr
+ekxjqafwudgwfqjm
+obtvyjkiycxfcdpb
+lhoihfnbuqelthof
+eydwzitgxryktddt
+rxsihfybacnpoyny
+bsncccxlplqgygtw
+rvmlaudsifnzhcqh
+huxwsyjyebckcsnn
+gtuqzyihwhqvjtes
+zreeyomtngvztveq
+nwddzjingsarhkxb
+nuqxqtctpoldrlsh
+wkvnrwqgjooovhpf
+kwgueyiyffudtbyg
+tpkzapnjxefqnmew
+ludwccvkihagvxal
+lfdtzhfadvabghna
+njqmlsnrkcfhtvbb
+cajzbqleghhnlgap
+vmitdcozzvqvzatp
+eelzefwqwjiywbcz
+uyztcuptfqvymjpi
+aorhnrpkjqqtgnfo
+lfrxfdrduoeqmwwp
+vszpjvbctblplinh
+zexhadgpqfifcqrz
+ueirfnshekpemqua
+qfremlntihbwabtb
+nwznunammfexltjc
+zkyieokaaogjehwt
+vlrxgkpclzeslqkq
+xrqrwfsuacywczhs
+olghlnfjdiwgdbqc
+difnlxnedpqcsrdf
+dgpuhiisybjpidsj
+vlwmwrikmitmoxbt
+sazpcmcnviynoktm
+pratafauetiknhln
+ilgteekhzwlsfwcn
+ywvwhrwhkaubvkbl
+qlaxivzwxyhvrxcf
+hbtlwjdriizqvjfb
+nrmsononytuwslsa
+mpxqgdthpoipyhjc
+mcdiwmiqeidwcglk
+vfbaeavmjjemfrmo
+qzcbzmisnynzibrc
+shzmpgxhehhcejhb
+wirtjadsqzydtyxd
+qjlrnjfokkqvnpue
+dxawdvjntlbxtuqc
+wttfmnrievfestog
+eamjfvsjhvzzaobg
+pbvfcwzjgxahlrag
+omvmjkqqnobvnzkn
+lcwmeibxhhlxnkzv
+uiaeroqfbvlazegs
+twniyldyuonfyzqw
+wgjkmsbwgfotdabi
+hnomamxoxvrzvtew
+ycrcfavikkrxxfgw
+isieyodknagzhaxy
+mgzdqwikzullzyco
+mumezgtxjrrejtrs
+nwmwjcgrqiwgfqel
+wjgxmebfmyjnxyyp
+durpspyljdykvzxf
+zuslbrpooyetgafh
+kuzrhcjwbdouhyme
+wyxuvbciodscbvfm
+kbnpvuqwmxwfqtqe
+zddzercqogdpxmft
+sigrdchxtgavzzjh
+lznjolnorbuddgcs
+ycnqabxlcajagwbt
+bnaudeaexahdgxsj
+rlnykxvoctfwanms
+jngyetkoplrstfzt
+tdpxknwacksotdub
+yutqgssfoptvizgr
+lzmqnxeqjfnsxmsa
+iqpgfsfmukovsdgu
+qywreehbidowtjyz
+iozamtgusdctvnkw
+ielmujhtmynlwcfd
+hzxnhtbnmmejlkyf
+ftbslbzmiqkzebtd
+bcwdqgiiizmohack
+dqhfkzeddjzbdlxu
+mxopokqffisxosci
+vciatxhtuechbylk
+khtkhcvelidjdena
+blatarwzfqcapkdt
+elamngegnczctcck
+xeicefdbwrxhuxuf
+sawvdhjoeahlgcdr
+kmdcimzsfkdfpnir
+axjayzqlosrduajb
+mfhzreuzzumvoggr
+iqlbkbhrkptquldb
+xcvztvlshiefuhgb
+pkvwyqmyoazocrio
+ajsxkdnerbmhyxaj
+tudibgsbnpnizvsi
+cxuiydkgdccrqvkh
+cyztpjesdzmbcpot
+nnazphxpanegwitx
+uphymczbmjalmsct
+yyxiwnlrogyzwqmg
+gmqwnahjvvdyhnfa
+utolskxpuoheugyl
+mseszdhyzoyavepd
+ycqknvbuvcjfgmlc
+sknrxhxbfpvpeorn
+zqxqjetooqcodwml
+sesylkpvbndrdhsy
+fryuxvjnsvnjrxlw
+mfxusewqurscujnu
+mbitdjjtgzchvkfv
+ozwlyxtaalxofovd
+wdqcduaykxbunpie
+rlnhykxiraileysk
+wgoqfrygttlamobg
+kflxzgxvcblkpsbz
+tmkisflhativzhde
+owsdrfgkaamogjzd
+gaupjkvkzavhfnes
+wknkurddcknbdleg
+lltviwincmbtduap
+qwzvspgbcksyzzmb
+ydzzkumecryfjgnk
+jzvmwgjutxoysaam
+icrwpyhxllbardkr
+jdopyntshmvltrve
+afgkigxcuvmdbqou
+mfzzudntmvuyhjzt
+duxhgtwafcgrpihc
+tsnhrkvponudumeb
+sqtvnbeiigdzbjgv
+eczmkqwvnsrracuo
+mhehsgqwiczaiaxv
+kaudmfvifovrimpd
+lupikgivechdbwfr
+mwaaysrndiutuiqx
+aacuiiwgaannunmm
+tjqjbftaqitukwzp
+lrcqyskykbjpaekn
+lirrvofbcqpjzxmr
+jurorvzpplyelfml
+qonbllojmloykjqe
+sllkzqujfnbauuqp
+auexjwsvphvikali
+usuelbssqmbrkxyc
+wyuokkfjexikptvv
+wmfedauwjgbrgytl
+sfwvtlzzebxzmuvw
+rdhqxuechjsjcvaf
+kpavhqkukugocsxu
+ovnjtumxowbxduts
+zgerpjufauptxgat
+pevvnzjfwhjxdoxq
+pmmfwxajgfziszcs
+difmeqvaghuitjhs
+icpwjbzcmlcterwm
+ngqpvhajttxuegyh
+mosjlqswdngwqsmi
+frlvgpxrjolgodlu
+eazwgrpcxjgoszeg
+bbtsthgkjrpkiiyk
+tjonoglufuvsvabe
+xhkbcrofytmbzrtk
+kqftfzdmpbxjynps
+kmeqpocbnikdtfyv
+qjjymgqxhnjwxxhp
+dmgicrhgbngdtmjt
+zdxrhdhbdutlawnc
+afvoekuhdboxghvx
+hiipezngkqcnihty
+bbmqgheidenweeov
+suprgwxgxwfsgjnx
+adeagikyamgqphrj
+zzifqinoeqaorjxg
+adhgppljizpaxzld
+lvxyieypvvuqjiyc
+nljoakatwwwoovzn
+fcrkfxclcacshhmx
+ownnxqtdhqbgthch
+lmfylrcdmdkgpwnj
+hlwjfbvlswbzpbjr
+mkofhdtljdetcyvp
+synyxhifbetzarpo
+agnggugngadrcxoc
+uhttadmdmhidpyjw
+ohfwjfhunalbubpr
+pzkkkkwrlvxiuysn
+kmidbxmyzkjrwjhu
+egtitdydwjxmajnw
+civoeoiuwtwgbqqs
+dfptsguzfinqoslk
+tdfvkreormspprer
+zvnvbrmthatzztwi
+ffkyddccrrfikjde
+hrrmraevdnztiwff
+qaeygykcpbtjwjbr
+purwhitkmrtybslh
+qzziznlswjaussel
+dfcxkvdpqccdqqxj
+tuotforulrrytgyn
+gmtgfofgucjywkev
+wkyoxudvdkbgpwhd
+qbvktvfvipftztnn
+otckgmojziezmojb
+inxhvzbtgkjxflay
+qvxapbiatuudseno
+krpvqosbesnjntut
+oqeukkgjsfuqkjbb
+prcjnyymnqwqksiz
+vuortvjxgckresko
+orqlyobvkuwgathr
+qnpyxlnazyfuijox
+zwlblfkoklqmqzkw
+hmwurwtpwnrcsanl
+jzvxohuakopuzgpf
+sfcpnxrviphhvxmx
+qtwdeadudtqhbely
+dbmkmloasqphnlgj
+olylnjtkxgrubmtk
+nxsdbqjuvwrrdbpq
+wbabpirnpcsmpipw
+hjnkyiuxpqrlvims
+enzpntcjnxdpuqch
+vvvqhlstzcizyimn
+triozhqndbttglhv
+fukvgteitwaagpzx
+uhcvukfbmrvskpen
+tizcyupztftzxdmt
+vtkpnbpdzsaluczz
+wodfoyhoekidxttm
+otqocljrmwfqbxzu
+linfbsnfvixlwykn
+vxsluutrwskslnye
+zbshygtwugixjvsi
+zdcqwxvwytmzhvoo
+wrseozkkcyctrmei
+fblgtvogvkpqzxiy
+opueqnuyngegbtnf
+qxbovietpacqqxok
+zacrdrrkohfygddn
+gbnnvjqmkdupwzpq
+qgrgmsxeotozvcak
+hnppukzvzfmlokid
+dzbheurndscrrtcl
+wbgdkadtszebbrcw
+fdmzppzphhpzyuiz
+bukomunhrjrypohj
+ohodhelegxootqbj
+rsplgzarlrknqjyh
+punjjwpsxnhpzgvu
+djdfahypfjvpvibm
+mlgrqsmhaozatsvy
+xwktrgyuhqiquxgn
+wvfaoolwtkbrisvf
+plttjdmguxjwmeqr
+zlvvbwvlhauyjykw
+cigwkbyjhmepikej
+masmylenrusgtyxs
+hviqzufwyetyznze
+nzqfuhrooswxxhus
+pdbdetaqcrqzzwxf
+oehmvziiqwkzhzib
+icgpyrukiokmytoy
+ooixfvwtiafnwkce
+rvnmgqggpjopkihs
+wywualssrmaqigqk
+pdbvflnwfswsrirl
+jeaezptokkccpbuj
+mbdwjntysntsaaby
+ldlgcawkzcwuxzpz
+lwktbgrzswbsweht
+ecspepmzarzmgpjm
+qmfyvulkmkxjncai
+izftypvwngiukrns
+zgmnyjfeqffbooww
+nyrkhggnprhedows
+yykzzrjmlevgffah
+mavaemfxhlfejfki
+cmegmfjbkvpncqwf
+zxidlodrezztcrij
+fseasudpgvgnysjv
+fupcimjupywzpqzp
+iqhgokavirrcvyys
+wjmkcareucnmfhui
+nftflsqnkgjaexhq
+mgklahzlcbapntgw
+kfbmeavfxtppnrxn
+nuhyvhknlufdynvn
+nviogjxbluwrcoec
+tyozixxxaqiuvoys
+kgwlvmvgtsvxojpr
+moeektyhyonfdhrb
+kahvevmmfsmiiqex
+xcywnqzcdqtvhiwd
+fnievhiyltbvtvem
+jlmndqufirwgtdxd
+muypbfttoeelsnbs
+rypxzbnujitfwkou
+ubmmjbznskildeoj
+ofnmizdeicrmkjxp
+rekvectjbmdnfcib
+yohrojuvdexbctdh
+gwfnfdeibynzjmhz
+jfznhfcqdwlpjull
+scrinzycfhwkmmso
+mskutzossrwoqqsi
+rygoebkzgyzushhr
+jpjqiycflqkexemx
+arbufysjqmgaapnl
+dbjerflevtgweeoj
+snybnnjlmwjvhois
+fszuzplntraprmbj
+mkvaatolvuggikvg
+zpuzuqygoxesnuyc
+wnpxvmxvllxalulm
+eivuuafkvudeouwy
+rvzckdyixetfuehr
+qgmnicdoqhveahyx
+miawwngyymshjmpj
+pvckyoncpqeqkbmx
+llninfenrfjqxurv
+kzbjnlgsqjfuzqtp
+rveqcmxomvpjcwte
+bzotkawzbopkosnx
+ktqvpiribpypaymu
+wvlzkivbukhnvram
+uohntlcoguvjqqdo
+ajlsiksjrcnzepkt
+xsqatbldqcykwusd
+ihbivgzrwpmowkop
+vfayesfojmibkjpb
+uaqbnijtrhvqxjtb
+hhovshsfmvkvymba
+jerwmyxrfeyvxcgg
+hncafjwrlvdcupma
+qyvigggxfylbbrzt
+hiiixcyohmvnkpgk
+mmitpwopgxuftdfu
+iaxderqpceboixoa
+zodfmjhuzhnsqfcb
+sthtcbadrclrazsi
+bkkkkcwegvypbrio
+wmpcofuvzemunlhj
+gqwebiifvqoeynro
+juupusqdsvxcpsgv
+rbhdfhthxelolyse
+kjimpwnjfrqlqhhz
+rcuigrjzarzpjgfq
+htxcejfyzhydinks
+sxucpdxhvqjxxjwf
+omsznfcimbcwaxal
+gufmtdlhgrsvcosb
+bssshaqujtmluerz
+uukotwjkstgwijtr
+kbqkneobbrdogrxk
+ljqopjcjmelgrakz
+rwtfnvnzryujwkfb
+dedjjbrndqnilbeh
+nzinsxnpptzagwlb
+lwqanydfirhnhkxy
+hrjuzfumbvfccxno
+okismsadkbseumnp
+sfkmiaiwlktxqvwa
+hauwpjjwowbunbjj
+nowkofejwvutcnui
+bqzzppwoslaeixro
+urpfgufwbtzenkpj
+xgeszvuqwxeykhef
+yxoldvkyuikwqyeq
+onbbhxrnmohzskgg
+qcikuxakrqeugpoa
+lnudcqbtyzhlpers
+nxduvwfrgzaailgl
+xniuwvxufzxjjrwz
+ljwithcqmgvntjdj
+awkftfagrfzywkhs
+uedtpzxyubeveuek
+bhcqdwidbjkqqhzl
+iyneqjdmlhowwzxx
+kvshzltcrrururty
+zgfpiwajegwezupo
+tkrvyanujjwmyyri
+ercsefuihcmoaiep
+ienjrxpmetinvbos
+jnwfutjbgenlipzq
+bgohjmrptfuamzbz
+rtsyamajrhxbcncw
+tfjdssnmztvbnscs
+bgaychdlmchngqlp
+kfjljiobynhwfkjo
+owtdxzcpqleftbvn
+ltjtimxwstvzwzjj
+wbrvjjjajuombokf
+zblpbpuaqbkvsxye
+gwgdtbpnlhyqspdi
+abipqjihjqfofmkx
+nlqymnuvjpvvgova
+avngotmhodpoufzn
+qmdyivtzitnrjuae
+xfwjmqtqdljuerxi
+csuellnlcyqaaamq
+slqyrcurcyuoxquo
+dcjmxyzbzpohzprl
+uqfnmjwniyqgsowb
+rbmxpqoblyxdocqc
+ebjclrdbqjhladem
+ainnfhxnsgwqnmyo
+eyytjjwhvodtzquf
+iabjgmbbhilrcyyp
+pqfnehkivuelyccc
+xgjbyhfgmtseiimt
+jwxyqhdbjiqqqeyy
+gxsbrncqkmvaryln
+vhjisxjkinaejytk
+seexagcdmaedpcvh
+lvudfgrcpjxzdpvd
+fxtegyrqjzhmqean
+dnoiseraqcoossmc
+nwrhmwwbykvwmgep
+udmzskejvizmtlce
+hbzvqhvudfdlegaa
+cghmlfqejbxewskv
+bntcmjqfwomtbwsb
+qezhowyopjdyhzng
+todzsocdkgfxanbz
+zgjkssrjlwxuhwbk
+eibzljqsieriyrzr
+wamxvzqyycrxotjp
+epzvfkispwqynadu
+dwlpfhtrafrxlyie
+qhgzujhgdruowoug
+girstvkahaemmxvh
+baitcrqmxhazyhbl
+xyanqcchbhkajdmc
+gfvjmmcgfhvgnfdq
+tdfdbslwncbnkzyz
+jojuselkpmnnbcbb
+hatdslkgxtqpmavj
+dvelfeddvgjcyxkj
+gnsofhkfepgwltse
+mdngnobasfpewlno
+qssnbcyjgmkyuoga
+glvcmmjytmprqwvn
+gwrixumjbcdffsdl
+lozravlzvfqtsuiq
+sicaflbqdxbmdlch
+inwfjkyyqbwpmqlq
+cuvszfotxywuzhzi
+igfxyoaacoarlvay
+ucjfhgdmnjvgvuni
+rvvkzjsytqgiposh
+jduinhjjntrmqroz
+yparkxbgsfnueyll
+lyeqqeisxzfsqzuj
+woncskbibjnumydm
+lltucklragtjmxtl
+ubiyvmyhlesfxotj
+uecjseeicldqrqww
+xxlxkbcthufnjbnm
+lhqijovvhlffpxga
+fzdgqpzijitlogjz
+efzzjqvwphomxdpd
+jvgzvuyzobeazssc
+hejfycgxywfjgbfw
+yhjjmvkqfbnbliks
+sffvfyywtlntsdsz
+dwmxqudvxqdenrur
+asnukgppdemxrzaz
+nwqfnumblwvdpphx
+kqsmkkspqvxzuket
+cpnraovljzqiquaz
+qrzgrdlyyzbyykhg
+opoahcbiydyhsmqe
+hjknnfdauidjeydr
+hczdjjlygoezadow
+rtflowzqycimllfv
+sfsrgrerzlnychhq
+bpahuvlblcolpjmj
+albgnjkgmcrlaicl
+pijyqdhfxpaxzdex
+eeymiddvcwkpbpux
+rqwkqoabywgggnln
+vckbollyhgbgmgwh
+ylzlgvnuvpynybkm
+hpmbxtpfosbsjixt
+ocebeihnhvkhjfqz
+tvctyxoujdgwayze
+efvhwxtuhapqxjen
+rusksgefyidldmpo
+nkmtjvddfmhirmzz
+whvtsuadwofzmvrt
+iiwjqvsdxudhdzzk
+gucirgxaxgcassyo
+rmhfasfzexeykwmr
+hynlxcvsbgosjbis
+huregszrcaocueen
+pifezpoolrnbdqtv
+unatnixzvdbqeyox
+xtawlpduxgacchfe
+bdvdbflqfphndduf
+xtdsnjnmzccfptyt
+nkhsdkhqtzqbphhg
+aqcubmfkczlaxiyb
+moziflxpsfubucmv
+srdgnnjtfehiimqx
+pwfalehdfyykrohf
+sysxssmvewyfjrve
+brsemdzosgqvvlxe
+bimbjoshuvflkiat
+hkgjasmljkpkwwku
+sbnmwjvodygobpqc
+bbbqycejueruihhd
+corawswvlvneipyc
+gcyhknmwsczcxedh
+kppakbffdhntmcqp
+ynulzwkfaemkcefp
+pyroowjekeurlbii
+iwksighrswdcnmxf
+glokrdmugreygnsg
+xkmvvumnfzckryop
+aesviofpufygschi
+csloawlirnegsssq
+fkqdqqmlzuxbkzbc
+uzlhzcfenxdfjdzp
+poaaidrktteusvyf
+zrlyfzmjzfvivcfr
+qwjulskbniitgqtx
+gjeszjksbfsuejki
+vczdejdbfixbduaq
+knjdrjthitjxluth
+jweydeginrnicirl
+bottrfgccqhyycsl
+eiquffofoadmbuhk
+lbqfutmzoksscswf
+xfmdvnvfcnzjprba
+uvugkjbkhlaoxmyx
+wadlgtpczgvcaqqv
+inzrszbtossflsxk
+dbzbtashaartczrj
+qbjiqpccefcfkvod
+hluujmokjywotvzy
+thwlliksfztcmwzh
+arahybspdaqdexrq
+nuojrmsgyipdvwyx
+hnajdwjwmzattvst
+sulcgaxezkprjbgu
+rjowuugwdpkjtypw
+oeugzwuhnrgiaqga
+wvxnyymwftfoswij
+pqxklzkjpcqscvde
+tuymjzknntekglqj
+odteewktugcwlhln
+exsptotlfecmgehc
+eeswfcijtvzgrqel
+vjhrkiwmunuiwqau
+zhlixepkeijoemne
+pavfsmwesuvebzdd
+jzovbklnngfdmyws
+nbajyohtzfeoiixz
+ciozmhrsjzrwxvhz
+gwucrxieqbaqfjuv
+uayrxrltnohexawc
+flmrbhwsfbcquffm
+gjyabmngkitawlxc
+rwwtggvaygfbovhg
+xquiegaisynictjq
+oudzwuhexrwwdbyy
+lengxmguyrwhrebb
+uklxpglldbgqsjls
+dbmvlfeyguydfsxq
+zspdwdqcrmtmdtsc
+mqfnzwbfqlauvrgc
+amcrkzptgacywvhv
+ndxmskrwrqysrndf
+mwjyhsufeqhwisju
+srlrukoaenyevykt
+tnpjtpwawrxbikct
+geczalxmgxejulcv
+tvkcbqdhmuwcxqci
+tiovluvwezwwgaox
+zrjhtbgajkjqzmfo
+vcrywduwsklepirs
+lofequdigsszuioy
+wxsdzomkjqymlzat
+iabaczqtrfbmypuy
+ibdlmudbajikcncr
+rqcvkzsbwmavdwnv
+ypxoyjelhllhbeog
+fdnszbkezyjbttbg
+uxnhrldastpdjkdz
+xfrjbehtxnlyzcka
+omjyfhbibqwgcpbv
+eguucnoxaoprszmp
+xfpypldgcmcllyzz
+aypnmgqjxjqceelv
+mgzharymejlafvgf
+tzowgwsubbaigdok
+ilsehjqpcjwmylxc
+pfmouwntfhfnmrwk
+csgokybgdqwnduwp
+eaxwvxvvwbrovypz
+nmluqvobbbmdiwwb
+lnkminvfjjzqbmio
+mjiiqzycqdhfietz
+towlrzriicyraevq
+obiloewdvbrsfwjo
+lmeooaajlthsfltw
+ichygipzpykkesrw
+gfysloxmqdsfskvt
+saqzntehjldvwtsx
+pqddoemaufpfcaew
+mjrxvbvwcreaybwe
+ngfbrwfqnxqosoai
+nesyewxreiqvhald
+kqhqdlquywotcyfy
+liliptyoqujensfi
+nsahsaxvaepzneqq
+zaickulfjajhctye
+gxjzahtgbgbabtht
+koxbuopaqhlsyhrp
+jhzejdjidqqtjnwe
+dekrkdvprfqpcqki
+linwlombdqtdeyop
+dvckqqbnigdcmwmx
+yaxygbjpzkvnnebv
+rlzkdkgaagmcpxah
+cfzuyxivtknirqvt
+obivkajhsjnrxxhn
+lmjhayymgpseuynn
+bbjyewkwadaipyju
+lmzyhwomfypoftuu
+gtzhqlgltvatxack
+jfflcfaqqkrrltgq
+txoummmnzfrlrmcg
+ohemsbfuqqpucups
+imsfvowcbieotlok
+tcnsnccdszxfcyde
+qkcdtkwuaquajazz
+arcfnhmdjezdbqku
+srnocgyqrlcvlhkb
+mppbzvfmcdirbyfw
+xiuarktilpldwgwd
+ypufwmhrvzqmexpc
+itpdnsfkwgrdujmj
+cmpxnodtsswkyxkr
+wayyxtjklfrmvbfp
+mfaxphcnjczhbbwy
+sjxhgwdnqcofbdra
+pnxmujuylqccjvjm
+ivamtjbvairwjqwl
+deijtmzgpfxrclss
+bzkqcaqagsynlaer
+tycefobvxcvwaulz
+ctbhnywezxkdsswf
+urrxxebxrthtjvib
+fpfelcigwqwdjucv
+ngfcyyqpqulwcphb
+rltkzsiipkpzlgpw
+qfdsymzwhqqdkykc
+balrhhxipoqzmihj
+rnwalxgigswxomga
+ghqnxeogckshphgr
+lyyaentdizaumnla
+exriodwfzosbeoib
+speswfggibijfejk
+yxmxgfhvmshqszrq
+hcqhngvahzgawjga
+qmhlsrfpesmeksur
+eviafjejygakodla
+kvcfeiqhynqadbzv
+fusvyhowslfzqttg
+girqmvwmcvntrwau
+yuavizroykfkdekz
+jmcwohvmzvowrhxf
+kzimlcpavapynfue
+wjudcdtrewfabppq
+yqpteuxqgbmqfgxh
+xdgiszbuhdognniu
+jsguxfwhpftlcjoh
+whakkvspssgjzxre
+ggvnvjurlyhhijgm
+krvbhjybnpemeptr
+pqedgfojyjybfbzr
+jzhcrsgmnkwwtpdo
+yyscxoxwofslncmp
+gzjhnxytmyntzths
+iteigbnqbtpvqumi
+zjevfzusnjukqpfw
+xippcyhkfuounxqk
+mcnhrcfonfdgpkyh
+pinkcyuhjkexbmzj
+lotxrswlxbxlxufs
+fmqajrtoabpckbnu
+wfkwsgmcffdgaqxg
+qfrsiwnohoyfbidr
+czfqbsbmiuyusaqs
+ieknnjeecucghpoo
+cevdgqnugupvmsge
+gjkajcyjnxdrtuvr
+udzhrargnujxiclq
+zqqrhhmjwermjssg
+ggdivtmgoqajydzz
+wnpfsgtxowkjiivl
+afbhqawjbotxnqpd
+xjpkifkhfjeqifdn
+oyfggzsstfhvticp
+kercaetahymeawxy
+khphblhcgmbupmzt
+iggoqtqpvaebtiol
+ofknifysuasshoya
+qxuewroccsbogrbv
+apsbnbkiopopytgu
+zyahfroovfjlythh
+bxhjwfgeuxlviydq
+uvbhdtvaypasaswa
+qamcjzrmesqgqdiz
+hjnjyzrxntiycyel
+wkcrwqwniczwdxgq
+hibxlvkqakusswkx
+mzjyuenepwdgrkty
+tvywsoqslfsulses
+jqwcwuuisrclircv
+xanwaoebfrzhurct
+ykriratovsvxxasf
+qyebvtqqxbjuuwuo
+telrvlwvriylnder
+acksrrptgnhkeiaa
+yemwfjhiqlzsvdxf
+banrornfkcymmkcc
+ytbhxvaeiigjpcgm
+crepyazgxquposkn
+xlqwdrytzwnxzwzv
+xtrbfbwopxscftps
+kwbytzukgseeyjla
+qtfdvavvjogybxjg
+ytbmvmrcxwfkgvzw
+nbscbdskdeocnfzr
+sqquwjbdxsxhcseg
+ewqxhigqcgszfsuw
+cvkyfcyfmubzwsee
+dcoawetekigxgygd
+ohgqnqhfimyuqhvi
+otisopzzpvnhctte
+bauieohjejamzien
+ewnnopzkujbvhwce
+aeyqlskpaehagdiv
+pncudvivwnnqspxy
+ytugesilgveokxcg
+zoidxeelqdjesxpr
+ducjccsuaygfchzj
+smhgllqqqcjfubfc
+nlbyyywergronmir
+prdawpbjhrzsbsvj
+nmgzhnjhlpcplmui
+eflaogtjghdjmxxz
+qolvpngucbkprrdc
+ixywxcienveltgho
+mwnpqtocagenkxut
+iskrfbwxonkguywx
+ouhtbvcaczqzmpua
+srewprgddfgmdbao
+dyufrltacelchlvu
+czmzcbrkecixuwzz
+dtbeojcztzauofuk
+prrgoehpqhngfgmw
+baolzvfrrevxsyke
+zqadgxshwiarkzwh
+vsackherluvurqqj
+surbpxdulvcvgjbd
+wqxytarcxzgxhvtx
+vbcubqvejcfsgrac
+zqnjfeapshjowzja
+hekvbhtainkvbynx
+knnugxoktxpvoxnh
+knoaalcefpgtvlwm
+qoakaunowmsuvkus
+ypkvlzcduzlezqcb
+ujhcagawtyepyogh
+wsilcrxncnffaxjf
+gbbycjuscquaycrk
+aduojapeaqwivnly
+ceafyxrakviagcjy
+nntajnghicgnrlst
+vdodpeherjmmvbje
+wyyhrnegblwvdobn
+xlfurpghkpbzhhif
+xyppnjiljvirmqjo
+kglzqahipnddanpi
+omjateouxikwxowr
+ocifnoopfglmndcx
+emudcukfbadyijev
+ooktviixetfddfmh
+wtvrhloyjewdeycg
+cgjncqykgutfjhvb
+nkwvpswppeffmwad
+hqbcmfhzkxmnrivg
+mdskbvzguxvieilr
+anjcvqpavhdloaqh
+erksespdevjylenq
+fadxwbmisazyegup
+iyuiffjmcaahowhj
+ygkdezmynmltodbv
+fytneukxqkjattvh
+woerxfadbfrvdcnz
+iwsljvkyfastccoa
+movylhjranlorofe
+drdmicdaiwukemep
+knfgtsmuhfcvvshg
+ibstpbevqmdlhajn
+tstwsswswrxlzrqs
+estyydmzothggudf
+jezogwvymvikszwa
+izmqcwdyggibliet
+nzpxbegurwnwrnca
+kzkojelnvkwfublh
+xqcssgozuxfqtiwi
+tcdoigumjrgvczfv
+ikcjyubjmylkwlwq
+kqfivwystpqzvhan
+bzukgvyoqewniivj
+iduapzclhhyfladn
+fbpyzxdfmkrtfaeg
+yzsmlbnftftgwadz
diff --git a/2015/05/puzzle-1.sed b/2015/05/puzzle-1.sed
new file mode 100644
index 0000000..9cba7ad
--- /dev/null
+++ b/2015/05/puzzle-1.sed
@@ -0,0 +1,3 @@
+/ab\|cd\|pq\|xy/d
+/\(.\)\1/!d
+/\(.*[aeiou].*\)\{3\}/p
diff --git a/2015/05/puzzle-2.sed b/2015/05/puzzle-2.sed
new file mode 100644
index 0000000..908afdf
--- /dev/null
+++ b/2015/05/puzzle-2.sed
@@ -0,0 +1,2 @@
+/\(.\).\1/!d
+/\(..\).*\1/p
diff --git a/2015/05/puzzles.sh b/2015/05/puzzles.sh
new file mode 100755
index 0000000..57ddb11
--- /dev/null
+++ b/2015/05/puzzles.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env sh
+
+# Could do this with just grep(1) and skip using wc(1), but I am lazy
+
+sed -nf puzzle-1.sed input | wc -l
+sed -nf puzzle-2.sed input | wc -l
diff --git a/2015/06/input b/2015/06/input
new file mode 100644
index 0000000..495311e
--- /dev/null
+++ b/2015/06/input
@@ -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
diff --git a/2015/06/puzzle-1.awk b/2015/06/puzzle-1.awk
new file mode 100755
index 0000000..97165cf
--- /dev/null
+++ b/2015/06/puzzle-1.awk
@@ -0,0 +1,15 @@
+#!/usr/bin/env -S awk -f
+
+function setlights(val, toggle)
+{
+ for (i = from[1]; i <= to[1]; i++) {
+ for (j = from[2]; j <= to[2]; j++)
+ lights[i][j] = toggle ? (lights[i][j] ? 0 : 1) : val
+ }
+}
+
+$1 == "toggle" { split($2, from, ","); split($4, to, ","); setlights(0, 1) }
+$2 ~ /on|off/ { split($3, from, ","); split($5, to, ",") }
+$2 == "on" { setlights(1, 0) }
+$2 == "off" { setlights(0, 0) }
+END { for (i = 0; i <= 999; i++) for (j = 0; j <= 999; j++) count += lights[i][j]; print count }
diff --git a/2015/06/puzzle-2.awk b/2015/06/puzzle-2.awk
new file mode 100755
index 0000000..97ae1f8
--- /dev/null
+++ b/2015/06/puzzle-2.awk
@@ -0,0 +1,17 @@
+#!/usr/bin/env -S awk -f
+
+function setlights(val)
+{
+ for (i = from[1]; i <= to[1]; i++) {
+ for (j = from[2]; j <= to[2]; j++) {
+ if (!(val == -1 && lights[i][j] == 0))
+ lights[i][j] += val
+ }
+ }
+}
+
+$1 == "toggle" { split($2, from, ","); split($4, to, ","); setlights(2) }
+$2 ~ /on|off/ { split($3, from, ","); split($5, to, ",") }
+$2 == "on" { setlights(1) }
+$2 == "off" { setlights(-1) }
+END { for (i = 0; i <= 999; i++) for (j = 0; j <= 999; j++) count += lights[i][j]; print count }
diff --git a/2015/08/input b/2015/08/input
new file mode 100644
index 0000000..94538e7
--- /dev/null
+++ b/2015/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/2015/08/puzzle-1.sh b/2015/08/puzzle-1.sh
new file mode 100755
index 0000000..ee35d69
--- /dev/null
+++ b/2015/08/puzzle-1.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env sh
+
+X=$(tr -d '\n' <input | wc -c)
+Y=$(sed 's/\(^"\|"$\)//g; s/\\x[a-f0-9]\{2\}/./g; s/\\[\\"]/./g' input \
+ | tr -d '\n' \
+ | wc -c)
+expr $X - $Y
diff --git a/2015/08/puzzle-2.sh b/2015/08/puzzle-2.sh
new file mode 100755
index 0000000..a00f13f
--- /dev/null
+++ b/2015/08/puzzle-2.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env sh
+
+X=$(sed 's/\("\|\\\)/\\&/g; s/^/../' input \
+ | tr -d '\n' \
+ | wc -c)
+Y=$(tr -d '\n' <input | wc -c)
+expr $X - $Y
diff --git a/2015/10/.gitignore b/2015/10/.gitignore
new file mode 100644
index 0000000..3971a19
--- /dev/null
+++ b/2015/10/.gitignore
@@ -0,0 +1,2 @@
+puzzle-[12]
+tmp[12].go
diff --git a/2015/10/Makefile b/2015/10/Makefile
new file mode 100644
index 0000000..8d258e1
--- /dev/null
+++ b/2015/10/Makefile
@@ -0,0 +1,12 @@
+all:
+ m4 -D INPUT=\"$$(cat input)\" -D LOOPS=40 -U len puzzles.go >tmp1.go
+ m4 -D INPUT=\"$$(cat input)\" -D LOOPS=50 -U len puzzles.go >tmp2.go
+ go build tmp1.go
+ go build tmp2.go
+ mv tmp1 puzzle-1
+ mv tmp2 puzzle-2
+ rm tmp[12].go
+
+.PHONY: clean
+clean:
+ rm -f puzzle-[12] tmp[12].go
diff --git a/2015/10/README b/2015/10/README
new file mode 100644
index 0000000..1102d82
--- /dev/null
+++ b/2015/10/README
@@ -0,0 +1,10 @@
+======
+ NOTE
+======
+
+I did not come up with the shell script solution myself, that is why I also included the very slow
+Go solution. The shell script solution comes from this Reddit post:
+
+ https://www.reddit.com/r/adventofcode/comments/3w6h3m/comment/cxtsigs/
+
+I felt that this solution was just too epic, so I included it here.
diff --git a/2015/10/input b/2015/10/input
new file mode 100644
index 0000000..13dcd63
--- /dev/null
+++ b/2015/10/input
@@ -0,0 +1 @@
+3113322113
diff --git a/2015/10/puzzles.go b/2015/10/puzzles.go
new file mode 100644
index 0000000..65de02f
--- /dev/null
+++ b/2015/10/puzzles.go
@@ -0,0 +1,31 @@
+package main
+
+import (
+ "fmt"
+ "strconv"
+)
+
+func process(num string) string {
+ var newnum string
+
+ for i := 0; i < len(num); {
+ c := num[i]
+ j := 0
+ for i < len(num) && num[i] == c {
+ i++
+ j++
+ }
+ newnum += strconv.Itoa(j)
+ newnum = string(append([]byte(newnum), c))
+ }
+
+ return newnum
+}
+
+func main() {
+ num := INPUT
+ for i := 0; i < LOOPS; i++ {
+ num = process(num)
+ }
+ fmt.Println(len(num))
+}
diff --git a/2015/10/puzzles.sh b/2015/10/puzzles.sh
new file mode 100755
index 0000000..291ac96
--- /dev/null
+++ b/2015/10/puzzles.sh
@@ -0,0 +1,13 @@
+#!/usr/bin/env sh
+
+output()
+{
+ echo $in | tr -d '\n' | wc -c
+}
+
+in=$(cat input)
+for i in $(seq 1 50); do
+ in=$(echo "$in" | fold -w1 | uniq -c | tr -d '\n ')
+ [ $i -eq 40 ] && output
+done
+output
diff --git a/2015/11/input b/2015/11/input
new file mode 100644
index 0000000..a45c477
--- /dev/null
+++ b/2015/11/input
@@ -0,0 +1 @@
+hepxcrrq
diff --git a/2015/11/puzzle-1 b/2015/11/puzzle-1
new file mode 100644
index 0000000..b0e5756
--- /dev/null
+++ b/2015/11/puzzle-1
@@ -0,0 +1,7 @@
+The starting string is "hepxcrrq"
+
+The string must contain two sets of non-overlapping duplicates, this is best done as having the last
+5 characters be "xxyzz". The first 3 characters aren't illegal, so we don't need to change them.
+This gives an end result of "hepxxyzz".
+
+QED. (I hope)
diff --git a/2015/11/puzzle-2 b/2015/11/puzzle-2
new file mode 100644
index 0000000..444ce35
--- /dev/null
+++ b/2015/11/puzzle-2
@@ -0,0 +1,9 @@
+This continues from the last puzzle, so our starting string is "hepxxyzz"
+
+Following the theme of the previous puzzle, we want to create an "xxyzz" pattern in the lowest
+amount of increments possible. Since the string currently ends in "xxyzz", we know that the next
+possible value we could have that satisfies this property is "aabcc". In order to go from "xxyzz" to
+"aabcc" however, you need to overflow which would increment the "p" to a "q". This gives an end
+result of "heqaabcc".
+
+QED.
diff --git a/2015/12/input b/2015/12/input
new file mode 100644
index 0000000..bd91fda
--- /dev/null
+++ b/2015/12/input
@@ -0,0 +1 @@
+[["green",[{"e":"green","a":77,"d":{"c":"violet","a":"yellow","b":"violet"},"c":"yellow","h":"red","b":144,"g":{"a":["yellow",-48,72,87,{"e":"violet","c":123,"a":101,"b":87,"d":"red","f":88},{"e":"red","c":2,"a":1,"g":"blue","b":"green","d":"violet","f":170},"orange",171,162]},"f":"orange","i":"orange"},49,[{"c":{"e":"violet","a":-44,"d":115,"c":117,"h":194,"b":{"e":-17,"a":172,"d":"green","c":197,"h":53,"b":106,"g":"violet","f":-10},"g":"red","f":"orange"},"a":-49,"b":["violet","orange","blue"]}],"green"]],["orange"],{"e":"blue","a":["red","yellow"],"d":{"a":[{"c":{"a":181,"b":["orange",-40,"red","orange","yellow",31,60,71,"yellow"]},"a":[114,-40],"b":"orange"},["green",93,10,{"c":11,"a":170,"b":[161,-3],"d":-16},58,{"e":{"c":-2,"a":117,"b":"violet"},"c":["blue","yellow","red","violet","yellow",123,113],"a":"orange","g":19,"b":108,"d":"red","f":"yellow"},{"e":"green","c":"yellow","a":{"e":28,"c":"red","a":"violet","b":"red","d":"green"},"g":"yellow","b":116,"d":148,"f":"red"},[15],["green","green",43],"blue"],[133],"green",134,"violet",{"c":"red","a":[71,41,"blue"],"b":"yellow","d":"violet"},132,[10,"violet",[182,"green","green","orange"],78,{"c":"blue","a":[100,-36,"blue","violet",-10,"orange"],"b":{"e":"orange","c":"blue","a":160,"g":"green","b":190,"d":"red","f":186}},16],[{"c":"green","a":"violet","b":20,"d":"red"},"green","blue",{"c":[0,84,184,"orange",-34,"blue","orange",0,"violet","violet"],"a":10,"b":89},"green",182,127,-2,196]]},"c":-20,"h":[[165,[180,"yellow",-5,16,"red",[{"e":"orange","a":"orange","d":"orange","c":"yellow","h":"red","b":182,"g":21,"f":"violet"},"red",69,"violet",10,"red","orange"]],[160,"blue",{"e":"yellow","c":"violet","a":"green","g":43,"b":[-40,"yellow","yellow",118,57,"green","violet","yellow","violet"],"d":"yellow","f":"blue"}],130,{"e":["yellow",58,"green",139,"violet","red"],"c":"green","a":"green","g":{"e":163,"c":33,"a":15,"b":78,"d":"green"},"b":86,"d":"orange","f":58},"red","red",{"a":37}],"yellow",{"e":44,"a":{"a":136,"b":"yellow"},"d":"yellow","j":39,"c":[-28,["violet",{"e":"red","a":150,"d":189,"c":76,"h":"orange","b":"yellow","g":164,"f":"orange"}],{"e":12,"a":"red","d":"yellow","c":"yellow","h":102,"b":"yellow","g":"red","f":147},"violet",[40,"red",24,193,105,179,"violet","green",{"a":"yellow","b":"violet"}],39,-25,{"a":127},126,{"e":"red","c":151,"a":-46,"b":"green","d":"violet"}],"h":"red","b":122,"g":93,"f":["violet",{"c":102,"a":-16,"b":39,"d":176},"red",187,{"e":"blue","a":172,"d":{"a":-5},"c":25,"h":{"a":"red"},"b":"blue","g":["yellow","red"],"f":{"e":158,"c":85,"a":"blue","g":"green","b":"violet","d":125,"f":93},"i":11},"violet"],"i":[195,{"a":"blue"},48,[44,25,"green","red","violet",172,"orange",49]]},["yellow",[{"e":-4,"a":"red","d":"green","c":"blue","h":"green","b":"green","g":190,"f":30,"i":-2},"green","violet",{"e":92,"c":-11,"a":{"e":"orange","c":0,"a":47,"g":"blue","b":"orange","d":"yellow","f":-47},"b":40,"d":193},97,"violet",[51,168,"violet",{"c":-45,"a":167,"b":"orange"},"blue","orange",64],[188,"green",91,-10,66,"green"],"green","blue"],"green",-42,{"e":"red","c":"red","a":199,"g":84,"b":"blue","d":["blue",194,["green",88,110,-23,"yellow","green",15,"violet"]],"f":"red"}],{"e":"blue","c":-33,"a":-34,"b":"blue","d":81}],"b":{"e":"violet","c":165,"a":"violet","b":{"a":"red","b":"yellow"},"d":[6,71,"orange","orange",{"a":96},74,"yellow"]},"g":["yellow",["orange",[-27],[[[8,"red","blue",-46,62,"yellow",94],[60,"violet",141,"green"],16,"green","yellow","blue",81,[93,"red",183,"blue","red",30,-16,"red","red","yellow"],-21,139],{"c":"blue","a":"orange","b":"violet","d":51}],"blue","yellow",["violet",19,"orange","yellow","red","violet","blue","violet",{"e":"yellow","a":"violet","d":137,"c":"blue","h":197,"b":"orange","g":{"e":"yellow","c":"orange","a":18,"b":42,"d":183,"f":142},"f":68}],"green",["blue",85,"violet"]]],"f":"green"},[92,{"c":-26,"a":{"c":["orange","orange",{"e":131,"c":192,"a":-38,"g":16,"b":27,"d":"yellow","f":-46},120,"orange",-28,-18,3],"a":["red",-15,{"e":56,"c":-15,"a":150,"g":"blue","b":"orange","d":"violet","f":70},-44,{"e":"green","c":53,"a":"blue","b":"blue","d":-34,"f":"violet"},"orange",[161,"orange",-19,{"e":27,"c":98,"a":"violet","g":"yellow","b":-45,"d":191,"f":"green"}]],"b":-41,"d":[["orange","red","yellow",120,140],[{"e":-1,"c":"orange","a":"yellow","b":"yellow","d":86},42,[78,140,"orange","green","orange",-49,159],"yellow","red",90,{"c":"green","a":62,"b":"violet"}],"violet",178,30,"green",186]},"b":"red","d":"violet"},{"e":-21,"a":{"e":{"e":{"e":"orange","c":115,"a":199,"b":-43,"d":"yellow"},"a":"blue","d":"green","c":"blue","h":"violet","b":"red","g":"violet","f":{"a":5}},"a":[{"e":"green","a":[20,"yellow",23,100,"orange",142,"red",-3],"d":19,"c":18,"h":"blue","b":"yellow","g":"yellow","f":{"a":-33}}],"d":"yellow","j":"yellow","c":["red",-2,95,-1,"green","violet",12],"h":"orange","b":{"e":[94,-14,"orange",68],"c":["blue","yellow",[-12,"yellow",126,"orange",199,"red",133],{"e":-14,"a":40,"d":-48,"c":5,"h":"orange","b":"red","g":"yellow","f":"red","i":"orange"},"blue",[-35,87,84,"yellow"],"red","red",86,"yellow"],"a":11,"g":{"e":-34,"a":"orange","d":"blue","j":"blue","c":"yellow","h":"yellow","b":"violet","g":42,"f":188,"i":53},"b":"yellow","d":{"e":"red","c":84,"a":"violet","b":"orange","d":87},"f":["blue","yellow","red",{"c":"orange","a":"blue","b":61},"violet",20,-22,129]},"g":{"e":28,"c":170,"a":["green",98,"orange",150,"orange"],"b":"blue","d":"blue"},"f":"blue","i":[{"e":"green","a":"blue","d":19,"c":177,"h":-18,"b":{"e":-19,"a":"green","d":"yellow","c":172,"h":"red","b":"red","g":"yellow","f":"yellow"},"g":{"c":-36,"a":"red","b":"violet"},"f":121},141,"violet",113,81]},"d":{"e":133,"a":19,"d":-27,"c":{"c":["yellow"],"a":105,"b":{"a":"orange"},"d":{"e":"yellow","c":"orange","a":"orange","b":163,"d":"violet","f":"red"}},"h":"yellow","b":161,"g":110,"f":[[137,6,[195,"violet",179,93,"green",130,"blue","yellow"],70,"orange",-8,-28,"orange",{"e":59,"a":"red","d":128,"j":88,"c":"violet","h":188,"b":0,"g":0,"f":"green","i":2}],86,"green","orange",68,"yellow"]},"c":{"e":"violet","a":-49,"d":["blue",140],"c":-29,"h":["red",4,-45,165,["yellow","blue","blue"]],"b":"blue","g":{"e":{"e":{"e":"blue","c":168,"a":51,"b":-28,"d":"orange","f":"violet"},"c":"violet","a":"green","g":"blue","b":-29,"d":121,"f":69},"a":"violet","d":["orange",[12,192,"green",-17,160,"blue"],131,"blue",41,{"e":"violet","a":"green","d":"blue","c":182,"h":"red","b":10,"g":"blue","f":-37,"i":151},"blue"],"c":{"e":"orange","a":182,"d":155,"j":18,"c":-41,"h":119,"b":148,"g":"green","f":104,"i":141},"h":16,"b":"blue","g":[137],"f":"green","i":-35},"f":[["green","red",19,"yellow","blue","red"],["red",37,[36,"red",-38,183,"violet",-17,119,93],130,-20,77,[64,115,66,"green"]],-13,-23,"green",100,"orange",{"a":"orange","b":"red"}]},"h":["red",{"e":28,"c":{"c":"green","a":149,"b":["orange",137,"violet",184,"orange","green","red",20,72]},"a":114,"g":["blue",{"e":"yellow","a":104,"d":"red","c":-17,"h":"blue","b":"violet","g":"orange","f":"red","i":"red"},181,21,"blue","orange",111,{"e":39,"a":"orange","d":196,"j":119,"c":143,"h":-42,"b":"green","g":190,"f":-43,"i":37}],"b":"orange","d":{"e":["green",44,"green",177,"violet",-44,160,"violet",85,95],"a":{"e":138,"c":"yellow","a":"yellow","b":"blue","d":"green"},"d":"violet","j":"blue","c":100,"h":"blue","b":104,"g":-28,"f":189,"i":"orange"},"f":[121,{"c":110,"a":68,"b":5,"d":57},[108],15,"red",[83,"blue","green",-16,"yellow"],"green"]},[[80],160,68,187,"green","green",94,113,2,163],34,"orange",["yellow",{"e":72,"c":["green",11,"green","green","orange"],"a":{"c":"violet","a":13,"b":66,"d":36},"g":"blue","b":"yellow","d":140,"f":145},"red",53,-11,"yellow","blue",148,{"e":"violet","a":"violet","d":83,"c":"yellow","h":103,"b":-23,"g":36,"f":[154,"red",62,112,35],"i":"violet"}],{"e":174,"a":-49,"d":58,"j":114,"c":"violet","h":[162,"red",54,-8,[142,178,"red",26,"violet",71,-20,38,"orange"],"orange","yellow",[49,25,"violet","green","blue",189,"green","yellow",-25,55],"red"],"b":-13,"g":156,"f":[48,107,-15,167],"i":"blue"},["red",{"a":"red","b":"red"},"violet",[73,"blue","violet","red"],["red","red"],63,-12,108]],"b":{"c":"violet","a":{"a":-39,"b":166},"b":183},"g":36,"f":[45,"yellow","blue","violet",26,7,[[156,-18,"yellow"],-4,-37,[129,-11,["yellow",179,"violet","red","yellow","violet"],"red","red",133],17,"green",137,"red",-9,"yellow"],"yellow",[{"e":"green","a":"yellow","d":52,"c":127,"h":132,"b":38,"g":"yellow","f":"violet","i":"red"},"yellow","red",{"e":{"c":60,"a":126,"b":88},"a":159,"d":"red","j":70,"c":23,"h":195,"b":178,"g":"red","f":"yellow","i":"blue"},13,-37,[196,146,145,"orange",60,"violet",["red",144,51,"red",-26,172,"yellow","red",52,"yellow"],157,"green"],[{"a":-7,"b":"red"},123,{"e":"yellow","c":"orange","a":"orange","b":40,"d":"blue"},139,"green","red",48,{"e":165,"a":60,"d":83,"c":"yellow","h":186,"b":34,"g":"blue","f":178,"i":33},[116,"yellow",179,18,32]],"red"]]},{"c":[6,{"e":{"c":79,"a":82,"b":"orange"},"a":"blue","d":[38,"red",37,[12,134,139,"violet",102,60,"green",82,91],"orange",84],"j":"orange","c":["yellow","green","blue","violet",{"e":"orange","c":157,"a":"green","b":"blue","d":"violet","f":"blue"},64,["violet",176,-7,137,"red",57,"yellow"],"yellow",["blue",170,159],"orange"],"h":170,"b":[3],"g":"violet","f":"violet","i":186},{"e":{"e":"yellow","c":"red","a":"blue","g":["violet",104],"b":124,"d":42,"f":"violet"},"c":-43,"a":-28,"b":[6],"d":[0,97,{"e":-9,"a":"violet","d":31,"c":23,"h":40,"b":76,"g":"red","f":94},["violet"],124,68,"green",37]},[84,{"e":"yellow","c":18,"a":"orange","b":"blue","d":"red"},["yellow",66],81,"orange",-22,-10,"green",139],"red","yellow"],"a":25,"b":"yellow"},[{"e":25,"a":{"e":["violet",22,103,{"e":193,"c":"red","a":"yellow","g":"violet","b":"yellow","d":-33,"f":29},{"e":-10,"a":77,"d":"blue","c":-15,"h":74,"b":-4,"g":"orange","f":153},"yellow",176,94,"green",141],"c":"blue","a":146,"b":-26,"d":-7,"f":149},"d":"green","c":["violet"],"h":"orange","b":[[23,"violet","blue","violet","violet",-40],"orange","yellow"],"g":57,"f":[{"e":141,"a":"yellow","d":"red","c":138,"h":118,"b":{"a":"yellow","b":"red"},"g":133,"f":{"e":169,"c":"violet","a":"green","g":193,"b":"orange","d":"violet","f":-17},"i":"yellow"},72,"green","violet",[106,"red","red","red","yellow",180,"orange",{"a":"green","b":"green"},111,"blue"],147],"i":-7},[[62,65,158,"blue",86,"yellow"],[71,[168,179,"yellow","red","green"],-7],"violet"],"violet",["yellow","red","blue","orange",78,47,{"c":"orange","a":"violet","b":152},[-37,"yellow"],-11,6]],"red",{"e":"red","a":"orange","d":{"e":"red","a":10,"d":"blue","c":{"c":"green","a":91,"b":"yellow","d":-28},"h":158,"b":[["orange"]],"g":"blue","f":[[137,157,50,10,"blue",-12,"violet",76,76,80],[164,46,"orange",-23,{"a":"green"},"yellow","green","green","yellow",48],47]},"j":{"e":["orange",{"e":191,"c":"orange","a":25,"g":"red","b":"yellow","d":148,"f":"orange"},-34,"orange","orange",-36],"a":[{"e":198,"a":["blue",80,121,36,102],"d":{"e":"green","a":"blue","d":76,"j":"red","c":127,"h":"yellow","b":"yellow","g":"yellow","f":163,"i":"red"},"c":"yellow","h":73,"b":"red","g":"green","f":"red"},"violet",{"e":133,"a":"blue","d":"green","j":3,"c":"violet","h":144,"b":25,"g":"green","f":102,"i":"green"},{"e":{"a":"violet","b":"green"},"a":"green","d":[86],"c":"green","h":3,"b":{"c":"orange","a":"orange","b":"yellow","d":193},"g":-34,"f":-35,"i":"green"}],"d":[{"e":"violet","a":"blue","d":{"c":79,"a":"red","b":0,"d":"violet"},"c":77,"h":"violet","b":"green","g":-47,"f":"green"},-49,90],"j":"blue","c":"yellow","h":["violet","green",28,"green",97,"orange"],"b":53,"g":{"e":21,"a":{"c":42,"a":"blue","b":"red"},"d":"violet","c":142,"h":158,"b":"blue","g":["orange",197,"blue","green","yellow",-3,15,-38],"f":62},"f":{"a":32},"i":79},"c":{"e":[{"e":[125,"yellow",-43,"orange","red"],"c":3,"a":"orange","b":"orange","d":{"e":195,"c":16,"a":"yellow","b":94,"d":-20,"f":-13},"f":"yellow"},89,["orange"],"violet"],"c":{"e":"red","a":"orange","d":5,"j":{"a":92,"b":142},"c":22,"h":"blue","b":"orange","g":{"a":[-13,199,"green",133,-41,-22,"orange",169],"b":[134,"blue"]},"f":183,"i":["green",-24,"violet"]},"a":116,"g":[{"e":57,"a":["blue",144,44,43,"orange",34,"yellow",126,"red"],"d":"green","c":"violet","h":"orange","b":"violet","g":"violet","f":[196,60],"i":-21},[168],["red","violet","yellow","green","yellow","green","blue",113,{"e":"orange","a":"red","d":-7,"c":-29,"h":"orange","b":-44,"g":"red","f":-32}],{"a":116},"blue"],"b":{"c":{"e":-41,"a":"orange","d":154,"c":"yellow","h":-12,"b":"yellow","g":"blue","f":"violet","i":105},"a":-23,"b":2},"d":161,"f":"orange"},"h":[187,{"c":"yellow","a":"orange","b":"orange","d":"red"},[[58,"blue"],[111,["yellow","green","green","violet","green"],"orange","blue",112,-45],31,"violet"]],"b":{"e":[[13,"blue",-19,"blue","yellow",144,23,17,110],"violet",{"c":"orange","a":"yellow","b":73,"d":"red"},9,115,"blue","violet","yellow","blue","green"],"a":[-9,"yellow","violet",183,"red",14,"blue",192,"yellow",165],"d":"blue","j":{"e":[86],"a":-14,"d":"yellow","j":"violet","c":"violet","h":{"e":85,"a":["red","yellow",114,111,129,37,71,"blue"],"d":"yellow","c":43,"h":11,"b":72,"g":128,"f":"red"},"b":11,"g":183,"f":34,"i":187},"c":122,"h":{"c":[93,132,"yellow","yellow",91],"a":"green","b":"orange"},"b":[{"e":"blue","a":"green","d":"blue","j":{"e":"orange","a":"violet","d":"orange","j":"yellow","c":"yellow","h":"orange","b":"green","g":"orange","f":"green","i":"green"},"c":186,"h":"yellow","b":145,"g":112,"f":"orange","i":"orange"},100,139,-11,{"e":103,"c":["green","red",-40,90,"violet","violet","yellow"],"a":140,"g":"red","b":"violet","d":"red","f":"blue"},{"c":-43,"a":"orange","b":66},"red",["red","orange",["blue",187],76,192,50,"yellow","violet"]],"g":38,"f":"blue","i":[129,[30,"green",157,92,181,176],{"e":"violet","a":127,"d":172,"j":"yellow","c":148,"h":171,"b":"yellow","g":{"e":115,"a":"red","d":48,"c":-12,"h":"blue","b":"orange","g":"red","f":78},"f":135,"i":79}]},"g":[[173,131,"yellow",193,162,"yellow"],[-5,{"e":[116,102,"orange","yellow"],"a":189,"d":136,"c":{"e":72,"a":"blue","d":-13,"j":"yellow","c":90,"h":"violet","b":169,"g":"orange","f":"blue","i":"blue"},"h":186,"b":"orange","g":"red","f":"orange"},{"e":-8,"a":-37,"d":104,"c":"violet","h":"orange","b":-31,"g":25,"f":168,"i":119},"green",32,[[197,"orange","violet"]],"yellow",{"e":["red",-16,"yellow"],"a":"blue","d":31,"c":"yellow","h":"red","b":"red","g":"violet","f":20,"i":"violet"},31,80],22,{"e":{"e":"red","a":125,"d":"yellow","j":111,"c":34,"h":193,"b":100,"g":"orange","f":31,"i":15},"c":{"e":75,"a":13,"d":-29,"c":["green"],"h":-46,"b":{"a":58},"g":100,"f":{"c":"violet","a":"red","b":-35},"i":["violet","green","orange","violet",183,0,-27,96]},"a":"red","b":[95,"orange","blue","green",170,{"e":3,"a":"blue","d":125,"j":-25,"c":10,"h":25,"b":"blue","g":182,"f":141,"i":27},["violet",7,76,-37,"red",59,"yellow",29]],"d":78,"f":88}],"f":["violet",72],"i":[96,["green","orange",63,"red",83,"yellow"],[{"e":"red","a":{"e":"orange","a":"green","d":183,"c":"orange","h":"yellow","b":146,"g":-1,"f":"red","i":"orange"},"d":"green","j":"red","c":"red","h":"yellow","b":"violet","g":-9,"f":182,"i":"red"},-49,17,"orange",187,-2,[178,"red","red",131,195,[94,-26,"blue","green",0,1,101]]],-25,14,"violet",{"c":"blue","a":"green","b":"orange"},198,-2]},9],[{"e":["green",177,[-38],{"e":"green","a":[147,"green",[56,93,"violet","red"],82,{"e":"blue","a":"orange","d":"red","c":30,"h":"blue","b":10,"g":"orange","f":"orange","i":82},193],"d":"violet","j":69,"c":"green","h":161,"b":-12,"g":{"e":125,"c":-33,"a":-42,"g":70,"b":{"c":81,"a":52,"b":"red","d":"violet"},"d":["violet"],"f":39},"f":["red","green",74,158,14],"i":"yellow"},[144,88,["yellow","violet",-1,"blue",109,[53,86,-36,91,"violet","green",59,15],171,"blue"]],185],"c":{"e":{"a":92},"a":67,"d":"violet","c":"blue","h":[71,"violet",25,154,{"e":16,"a":"red","d":"red","j":"violet","c":54,"h":"violet","b":160,"g":"orange","f":{"e":-47,"a":"green","d":"blue","c":56,"h":175,"b":118,"g":97,"f":"red"},"i":"yellow"},{"e":[107,"violet","violet","blue",-4,"blue","green",82,"red"],"c":{"e":"yellow","c":"violet","a":"orange","b":"blue","d":"green"},"a":172,"b":131,"d":"green","f":43},"red","green",["red","green","violet","violet",132,"green",153,195,-41,[128]]],"b":"yellow","g":"green","f":{"c":72,"a":{"c":"green","a":"violet","b":"green","d":180},"b":48,"d":["blue",70,60,"orange",139,183,"red","red",{"a":"red","b":123},"yellow"]},"i":[66,77,"green","violet",25,[193,"orange",78,"red",["violet","red",163,37,"yellow"]]]},"a":"red","b":175,"d":0,"f":[{"e":38,"a":"yellow","d":"violet","c":68,"h":{"e":"orange","c":129,"a":"blue","b":"green","d":106,"f":"orange"},"b":"red","g":"green","f":{"e":91,"c":46,"a":"blue","g":"red","b":"yellow","d":92,"f":"yellow"}},["green",65,150,86,"orange"],"green",{"c":"green","a":30,"b":"yellow"}]},["blue",70,143,{"a":"green","b":[{"e":83,"c":63,"a":-2,"g":{"e":"green","c":"orange","a":-46,"b":"yellow","d":"red"},"b":39,"d":"red","f":123},"orange",57,34,{"c":"yellow","a":{"c":"blue","a":"green","b":"blue"},"b":"orange","d":{"e":"blue","a":158,"d":"red","c":69,"h":122,"b":6,"g":93,"f":"yellow","i":163}},{"e":183,"c":99,"a":"orange","g":76,"b":42,"d":31,"f":118}]},{"e":31,"c":["orange",186,58,{"e":"violet","c":9,"a":115,"b":[115,"yellow",19,"violet","blue","yellow"],"d":106}],"a":{"e":"red","c":{"a":82,"b":180},"a":71,"b":"yellow","d":100},"g":{"c":68,"a":"red","b":{"a":"blue","b":70}},"b":"yellow","d":"violet","f":-4},"yellow",[{"a":"yellow"},[{"e":"violet","a":159,"d":"violet","c":"blue","h":{"a":195,"b":-16},"b":97,"g":74,"f":126,"i":83},-49,"orange","orange",20,{"e":-37,"c":82,"a":"blue","b":"yellow","d":"orange"},"violet","green",5],"blue",{"a":-2},{"e":-39,"c":"yellow","a":-3,"b":127,"d":[196]},{"c":"red","a":-1,"b":"orange","d":166},{"e":{"e":"red","a":97,"d":"orange","j":47,"c":84,"h":-36,"b":-5,"g":"red","f":"yellow","i":113},"c":55,"a":{"e":[13,108,137,"green","green",-9,71,-36,"orange","blue"],"a":"violet","d":95,"c":6,"h":125,"b":"orange","g":"orange","f":130},"b":-28,"d":[97,46,[-7,"violet",146,155,166,"orange","orange","yellow",148,"red"],"orange",40,"red"]}],[{"c":"violet","a":"yellow","b":64,"d":"orange"},{"e":{"e":"violet","c":"blue","a":{"e":"yellow","a":-41,"d":181,"c":101,"h":"orange","b":"orange","g":"blue","f":51},"g":-25,"b":"red","d":41,"f":1},"a":25,"d":{"e":"orange","a":"green","d":-9,"c":"orange","h":71,"b":"red","g":137,"f":133},"j":[["yellow",116],93,"orange","violet","blue",150,34],"c":66,"h":"violet","b":-49,"g":[60,194,[136,-37,160,"red","orange","red",179,"red"]],"f":[-24,"violet",35],"i":"blue"},{"e":92,"c":"blue","a":"red","b":"blue","d":"green"},"red",[126],96,"red",198],87],{"e":{"e":["orange","violet",{"e":"green","a":-42,"d":103,"c":["violet",-48,37,122,107,"orange","blue",97],"h":"blue","b":92,"g":"orange","f":0},"blue",197,-9,"yellow",{"a":["orange","blue",186,"blue","green","red","red",48,"red","green"],"b":195},121,"blue"],"a":96,"d":"orange","j":94,"c":66,"h":{"a":["violet"],"b":"orange"},"b":"violet","g":191,"f":{"e":"red","c":-32,"a":[149,[69,"green",84,25,"red"],"yellow","violet",4,"violet","green",69],"b":"blue","d":148,"f":111},"i":93},"a":[181],"d":{"e":{"e":{"e":"red","c":36,"a":143,"b":82,"d":11},"a":168,"d":"orange","j":-45,"c":159,"h":"red","b":{"e":120,"a":-37,"d":"green","c":"green","h":"red","b":59,"g":"violet","f":173},"g":166,"f":"orange","i":"yellow"},"a":158,"d":"green","c":126,"h":[[159,"violet","violet","green",101,"orange",141],"violet",122,"yellow","red",79],"b":13,"g":"red","f":{"a":"orange"},"i":{"a":89,"b":{"e":[-20,"green",6,58,18],"a":-17,"d":137,"c":[-25,"orange",95,"yellow","green"],"h":3,"b":"violet","g":26,"f":"green","i":168}}},"c":["orange",{"e":163,"a":{"a":6},"d":-25,"c":164,"h":[-47,"yellow","orange",[139,93,93,"yellow","violet","red",-12],"blue",-32,136,10],"b":"orange","g":"blue","f":174}],"h":["blue",-34,-29,{"e":"violet","a":3,"d":"green","j":"red","c":"orange","h":"green","b":"red","g":"green","f":124,"i":{"e":186,"c":"violet","a":168,"g":110,"b":[127,136,31,109,"blue","red","blue","violet",79,91],"d":"red","f":["violet",191,-15,-22]}}],"b":[124,{"e":-38,"a":{"a":"yellow"},"d":[130,{"c":158,"a":"blue","b":103,"d":197},-36,[153,-6,173,121,"yellow",94,168,"violet",77,-35],168,"red",{"e":-32,"a":"red","d":46,"c":82,"h":91,"b":"blue","g":"yellow","f":"orange","i":174},"green"],"j":[189,-43,41],"c":[185],"h":[182],"b":[139,"violet",-44],"g":"yellow","f":"red","i":["red",-18,"violet","red",31,"red",115,-49,["yellow","yellow","violet","blue","violet","violet"]]},143,"yellow",["violet","red",["blue","violet",{"a":-49},41,"orange","blue"],{"a":"orange"},[93,-8,"yellow",-39]],166,155,"red","violet","orange"],"g":"violet","f":"red","i":[85,126,{"e":{"e":"red","c":-42,"a":51,"b":"yellow","d":"red","f":{"e":130,"c":"violet","a":115,"g":"violet","b":-28,"d":-3,"f":"blue"}},"a":92,"d":114,"c":"violet","h":{"e":-41,"a":"red","d":57,"j":82,"c":"violet","h":"green","b":"red","g":2,"f":-20,"i":78},"b":"yellow","g":"violet","f":86,"i":67},147,146,-33,"blue","violet"]},{"e":[[{"a":174},21,"orange","green","blue",{"e":127,"c":{"c":0,"a":197,"b":"yellow"},"a":"blue","b":["yellow",153,9,"blue"],"d":136}],"blue"],"c":[{"c":"red","a":[-5,"green",["violet"],-47,19,173],"b":106,"d":"yellow"},182,[21,106,"violet",10,"green",20,"orange"],["green"],{"e":-25,"c":"blue","a":"violet","b":["red",27,"blue",21,193,"green",["green","green"]],"d":["orange"],"f":18},"yellow","yellow",{"e":{"e":"violet","a":"green","d":"violet","c":"red","h":171,"b":["red",149,"violet"],"g":"yellow","f":"blue","i":"green"},"c":[86,-30,"orange",56,123,"green"],"a":65,"b":[86,129,"yellow","blue",87,127,182],"d":4,"f":[-36,179,"red",-9,27,{"c":111,"a":178,"b":"yellow","d":25},"red","blue"]},[-3,5,["orange","blue"],70],"yellow"],"a":[{"e":{"c":-15,"a":"red","b":-18,"d":"green"},"a":-42,"d":{"c":-47,"a":"red","b":"green","d":"yellow"},"c":{"e":56,"a":"green","d":"yellow","c":"orange","h":"yellow","b":"blue","g":-35,"f":179,"i":"green"},"h":"blue","b":[35,153],"g":193,"f":{"e":{"e":37,"c":86,"a":"green","g":170,"b":"violet","d":"red","f":-33},"c":187,"a":16,"b":147,"d":19,"f":"red"},"i":88},"green","blue",{"e":{"e":"orange","a":"blue","d":"orange","c":150,"h":-12,"b":"green","g":"red","f":145,"i":"red"},"c":"red","a":"yellow","b":"yellow","d":"blue"},196,{"e":"green","c":186,"a":"green","g":-18,"b":"red","d":[102,"green","orange",[-6,160,128,"green","violet",48,"violet","yellow",50],"blue","green","orange",[199,59,20,15,126]],"f":[[120,"red",69],49,18,84,"red","green",["orange","blue",-31,"green","red",198,115]]},{"e":"yellow","a":196,"d":["orange",{"e":"violet","a":21,"d":"green","c":"red","h":"green","b":18,"g":48,"f":174,"i":"orange"},{"a":-1,"b":"green"},"green"],"c":106,"h":"blue","b":"blue","g":"yellow","f":{"e":-4,"a":61,"d":18,"c":122,"h":"green","b":84,"g":165,"f":"orange"}}],"b":[43,{"e":137,"c":"green","a":"green","b":75,"d":125}],"d":{"e":178,"c":[-21,[116,20,"yellow","blue",161,"orange","blue",30,{"c":181,"a":-30,"b":3}],"orange",-9,"orange",["violet","green",54],"orange",[-20,97,{"c":59,"a":115,"b":-48,"d":-22},28,{"e":59,"c":"green","a":"green","b":"yellow","d":"green","f":-27}],{"a":"violet"},{"e":"blue","c":50,"a":"orange","b":"yellow","d":"orange","f":{"a":"red","b":"green"}}],"a":"orange","b":134,"d":-3,"f":{"e":"violet","a":"orange","d":"green","c":80,"h":"red","b":[140],"g":"red","f":"red"}}},-47,[-28,{"a":[46,["blue",-45,172,193,"blue","green",-2],122,{"a":"green","b":92},-35,[136,[-8,127,20,91,45,"orange"],"green","orange",["orange","yellow",92,162,48,"orange","violet",197],"blue","orange",57,172],"green",135],"b":{"e":[173,{"e":89,"a":96,"d":"orange","c":"orange","h":"green","b":74,"g":"yellow","f":60,"i":135},-11,3,"blue","violet","blue"],"c":160,"a":"blue","b":60,"d":"green","f":"red"}},{"e":[12,"orange"],"c":{"e":45,"c":{"e":-26,"a":86,"d":"yellow","c":["yellow",128,180,135,102,186,"red",194,"green"],"h":"violet","b":{"c":90,"a":-47,"b":56},"g":"blue","f":"red","i":28},"a":71,"b":"violet","d":25},"a":182,"b":"green","d":111,"f":"violet"},{"c":[-21,{"e":[157,13,"red",180,"yellow","green","red",59],"c":-49,"a":82,"b":69,"d":{"e":"orange","a":"yellow","d":98,"j":60,"c":"red","h":199,"b":172,"g":120,"f":"yellow","i":98}},[53,[-23,"orange",135,102,165,170,172,"violet"],"yellow","blue","green",105,97],[74,"violet","orange",["yellow",56,"orange",81,"violet"],"orange",177,75,11],"blue","yellow","blue","red",["blue"]],"a":{"a":-36,"b":"orange"},"b":5,"d":"green"},179,-26,{"a":"green","b":[163,{"a":"orange","b":-35},{"e":180,"a":"blue","d":40,"j":"orange","c":"green","h":"orange","b":"orange","g":131,"f":53,"i":169}]}]],[[{"e":153,"c":"orange","a":"yellow","g":{"e":-4,"c":{"e":115,"c":"red","a":121,"b":151,"d":"red"},"a":"orange","b":194,"d":"orange"},"b":{"a":30},"d":["green",[31,["violet"],["orange",152,"yellow","red"],"yellow"],"violet",{"a":"violet"},171,"violet",{"c":"violet","a":"orange","b":"orange"},"green"],"f":{"e":"yellow","c":["green","red"],"a":"red","g":-17,"b":-3,"d":-42,"f":150}},"orange",{"c":["orange"],"a":"red","b":{"c":-32,"a":{"a":"blue","b":"orange"},"b":{"c":75,"a":{"e":"green","a":101,"d":-3,"j":"violet","c":56,"h":166,"b":192,"g":-5,"f":-22,"i":100},"b":"yellow"},"d":159},"d":{"e":"violet","a":"yellow","d":["green","orange","blue","green"],"j":"yellow","c":[23,"green","blue","yellow","violet","red"],"h":[149,-24,"red",152],"b":-12,"g":"red","f":89,"i":169}},[{"e":{"e":"violet","a":[124,"blue","orange","green",160],"d":113,"c":"red","h":"blue","b":["violet","red","violet",104],"g":85,"f":179,"i":{"e":"orange","a":"violet","d":"violet","j":"yellow","c":191,"h":"red","b":53,"g":-25,"f":"green","i":169}},"a":[147,120],"d":"green","j":["yellow",["yellow",108,"violet",114,"green",195,25,"green"],"green","orange"],"c":["orange",148,141,"yellow",32,-24],"h":124,"b":"orange","g":[121,"blue","red","violet",-18],"f":"violet","i":"red"},["violet","green",94,91,"blue"],{"c":[9,"violet",-18,69,"orange","orange",-24,"yellow","yellow"],"a":"yellow","b":150,"d":73}],110,["blue",-9,"blue","yellow",{"e":[163,45,67],"c":135,"a":50,"b":[43,26,18,120,"green","blue",10,"green",68,-2],"d":{"e":136,"a":15,"d":89,"c":[65,"green",108,122,"yellow","violet","yellow"],"h":"green","b":{"e":125,"a":21,"d":51,"c":153,"h":33,"b":158,"g":"blue","f":26,"i":"green"},"g":-33,"f":[-16,14,"red","red",126,"violet",-16]}},"red",{"e":120,"c":"red","a":{"e":"green","a":"yellow","d":18,"c":150,"h":185,"b":["yellow","red","violet",48,"violet","blue"],"g":"green","f":{"a":"yellow"}},"g":[12,"blue",168,"orange",{"a":"red"},168,"red"],"b":-2,"d":{"e":"violet","c":"yellow","a":86,"g":155,"b":3,"d":-24,"f":149},"f":"yellow"}],[{"c":"green","a":91,"b":"green"},[{"e":"red","c":98,"a":{"c":"red","a":-49,"b":176,"d":105},"b":"red","d":169,"f":"blue"},-46,"green","blue",-30,{"c":154,"a":72,"b":"yellow"},[161,85]],111,"blue",172,57,{"a":-23,"b":"green"},81,[160,["blue","green","green",157],137,["blue",["violet",162],[153,"yellow","orange","violet",127,"green",148,182,29,150],-33,168,"blue"],95]]],["yellow",132,{"c":16,"a":[113],"b":"red","d":{"e":"green","c":24,"a":{"a":"red"},"g":125,"b":["violet",2,101],"d":"green","f":132}},89],[{"e":"yellow","c":[68,"green",[160,146],175,"orange",185,"blue",[198,[179,"yellow","green",72,33,112,179,"violet",194,1]]],"a":["blue","violet",153,"blue",{"a":77,"b":"yellow"},-19,"yellow","green"],"b":"yellow","d":29,"f":{"c":"violet","a":"violet","b":-18}},"yellow",{"e":["violet","green",["red","red","blue",126,137,47,["blue","blue","green",102,"orange","yellow","green"],"red"],[["blue","orange",16,-2],"green","orange","yellow",27,150,0],{"e":62,"c":"yellow","a":"blue","b":94,"d":10,"f":31},[-47,{"e":"green","a":"yellow","d":197,"j":99,"c":"yellow","h":152,"b":"orange","g":85,"f":"green","i":"green"},174,"blue","green"],106],"c":["blue",118,[120,161,-41,["violet"],"violet","yellow"],"red"],"a":["orange","green","red",58,"green",5,178,191,-43],"b":62,"d":"violet"},{"e":97,"a":[["yellow",122,"orange","red",{"e":165,"c":"blue","a":63,"g":"violet","b":"blue","d":"yellow","f":77},[104,118,"green","red","orange",61]],{"c":124,"a":86,"b":"violet"},"yellow",{"e":[98,110,40,104,126,90,140,"blue",46],"a":-42,"d":[77,"green","red",-28,"blue",88,29,-9,-28],"j":-3,"c":"green","h":{"e":153,"c":45,"a":"green","g":127,"b":"red","d":183,"f":"orange"},"b":3,"g":0,"f":["blue","green",62,"red","yellow","green"],"i":"orange"},127,171,[118,[119,"blue"],15,87,"orange",{"e":-34,"c":"violet","a":18,"b":153,"d":37,"f":"red"}],"red"],"d":"red","c":["yellow","red","blue","red","violet","red",-13,179],"h":100,"b":{"e":"orange","a":48,"d":"red","c":{"e":"violet","a":"violet","d":"orange","c":["violet","yellow","blue","yellow"],"h":"red","b":"violet","g":149,"f":"green"},"h":"yellow","b":46,"g":"blue","f":184},"g":16,"f":36,"i":{"e":"green","a":-4,"d":{"c":{"e":"yellow","a":"blue","d":177,"j":"violet","c":"red","h":140,"b":131,"g":137,"f":53,"i":28},"a":16,"b":161},"c":48,"h":[53,7,[137,80,113,160,"blue",105]],"b":"blue","g":"orange","f":"green"}},"yellow",{"c":["orange",{"e":-11,"c":-36,"a":"green","b":"yellow","d":"yellow","f":{"a":186}},-4,170,"green","green",16,123],"a":-29,"b":{"c":"orange","a":"blue","b":"orange"}},{"c":[[161,"violet","blue"],"yellow","yellow",["red",22,["red",92,103,126,-13,67,"blue"],-21,136,"violet",[193]],"blue",-15],"a":{"e":179,"a":1,"d":"yellow","c":[92,15],"h":"orange","b":{"e":-6,"a":"violet","d":"yellow","j":155,"c":198,"h":-18,"b":14,"g":"blue","f":-39,"i":"orange"},"g":{"a":"yellow"},"f":"blue"},"b":87},"yellow",{"c":"blue","a":[{"e":"red","a":"blue","d":"orange","c":"orange","h":-27,"b":"yellow","g":47,"f":{"e":"violet","a":"green","d":185,"j":"orange","c":"violet","h":138,"b":-3,"g":"blue","f":"red","i":150}},{"e":75,"c":168,"a":[12,"blue","green"],"g":{"c":"blue","a":"green","b":107},"b":-36,"d":"orange","f":72},2,[120,"green",182,"yellow",-23,"red"],"green",{"e":"blue","a":"orange","d":"blue","c":157,"h":"green","b":58,"g":"blue","f":-39},"red","orange",32],"b":"violet"},{"e":178,"a":{"c":{"e":59,"a":186,"d":"orange","c":{"a":"violet"},"h":"green","b":198,"g":{"a":"blue","b":"blue"},"f":"orange","i":2},"a":"red","b":[95,130,"blue","violet",98]},"d":176,"c":-38,"h":["yellow",128,"green",39,74,"yellow",5],"b":"blue","g":"violet","f":"orange"}],{"a":{"e":135,"c":{"e":{"e":["orange",-44,81,-11,-1,47,"orange",-36],"c":10,"a":12,"b":"red","d":{"e":"violet","c":"violet","a":161,"b":192,"d":133},"f":77},"c":92,"a":"yellow","g":["blue"],"b":{"e":"violet","a":-48,"d":"orange","c":"blue","h":"orange","b":-40,"g":81,"f":77},"d":102,"f":"yellow"},"a":127,"b":"violet","d":{"e":130,"a":36,"d":148,"c":"yellow","h":117,"b":"orange","g":"orange","f":-19,"i":["green",{"e":"red","a":191,"d":159,"j":"violet","c":"red","h":147,"b":"blue","g":"red","f":"red","i":"green"},"blue",62]},"f":-5},"b":[["green",-36,62,"green","blue",{"c":"violet","a":{"a":-4},"b":"violet","d":88},{"e":"yellow","c":166,"a":["blue"],"g":50,"b":146,"d":"blue","f":142},"yellow"]]},["red","blue",{"e":{"a":-16},"a":[["violet",{"e":"blue","a":171,"d":"blue","c":"blue","h":"green","b":"green","g":"orange","f":"yellow"},186,"orange",195,87,"green",[67,158,"blue",23]],25],"d":[159,74],"c":-28,"h":{"e":-16,"a":"red","d":55,"c":158,"h":167,"b":"red","g":27,"f":{"e":"yellow","c":[34,"blue",-22,"orange"],"a":94,"b":-30,"d":["blue",133,39,102,"orange"]}},"b":119,"g":{"e":104,"c":90,"a":["orange","blue",158,-34,"violet"],"g":"green","b":33,"d":["violet",125,"yellow","yellow",117,["blue",25,"orange"],["red",193,-23,"red","green",146,173],"red","yellow",10],"f":50},"f":47,"i":{"e":[121,144,172,171,{"e":"green","a":9,"d":"violet","c":-33,"h":64,"b":-4,"g":45,"f":75}],"a":8,"d":{"c":68,"a":["yellow","red","green"],"b":"violet","d":9},"c":"blue","h":17,"b":199,"g":115,"f":[["green",108,113,"red",6,"violet","violet","green",57,"green"],"orange",177,"red",34,"blue","red"],"i":-25}},{"e":"blue","a":["orange","yellow",["violet",27,"violet",128,120,{"e":"green","a":"orange","d":"orange","j":"blue","c":"yellow","h":"yellow","b":"yellow","g":139,"f":132,"i":81},"blue","red",53],7,"orange","violet",{"c":"yellow","a":{"a":-11},"b":"orange","d":87},"violet"],"d":[{"a":175},[163,"orange",185],[-30,109,194,119,170,"green","violet","yellow",125,"red"],"blue",{"e":"green","c":152,"a":37,"b":"red","d":["orange"],"f":"orange"},69,"yellow",{"e":{"e":"yellow","c":"violet","a":144,"b":"yellow","d":141,"f":"blue"},"c":"blue","a":"green","g":"yellow","b":178,"d":"yellow","f":-8},"green",["green","orange",-42,"orange"]],"c":"red","h":54,"b":"orange","g":["green",2,146,-6,{"e":52,"a":"orange","d":"red","c":"yellow","h":141,"b":35,"g":{"e":"violet","a":"blue","d":"yellow","c":"blue","h":100,"b":119,"g":"blue","f":"yellow"},"f":136,"i":"yellow"},194,["yellow",139,"green",["blue",14,"green","blue","blue",119,"violet",-5],{"a":61,"b":"orange"},"violet"]],"f":20},{"c":"orange","a":{"e":135,"c":"violet","a":111,"g":{"a":"red","b":96},"b":186,"d":33,"f":127},"b":{"e":83,"a":"yellow","d":"orange","c":"blue","h":"orange","b":0,"g":"orange","f":164,"i":"blue"},"d":-28},-42,{"e":"green","c":{"e":-20,"c":"yellow","a":66,"b":156,"d":"violet"},"a":[-9,129],"g":74,"b":{"e":"violet","c":"green","a":[52,"blue",["green",-8,"green","green"],"red",188,43,"green",{"e":"orange","a":40,"d":-6,"c":"orange","h":93,"b":"green","g":103,"f":"red"}],"g":{"e":"red","c":"yellow","a":16,"b":7,"d":70},"b":{"e":133,"a":150,"d":{"a":34,"b":"green"},"j":166,"c":156,"h":79,"b":"red","g":178,"f":-37,"i":163},"d":"blue","f":"green"},"d":{"c":"blue","a":"violet","b":177,"d":80},"f":[61,88,"yellow",{"c":"blue","a":"orange","b":"violet","d":"yellow"},{"c":119,"a":"violet","b":{"a":"red"},"d":84},95,170]},{"e":191,"c":2,"a":"orange","b":{"a":[-9,"green","violet",["green",132,"red",61,85],3,2]},"d":["green","yellow","violet",-46,48,"green"]}],["violet",["yellow"],["blue",{"e":-15,"c":{"e":["green","violet",0,3,183,165,-1,"orange","blue"],"a":"violet","d":20,"c":"violet","h":"yellow","b":60,"g":"violet","f":163,"i":135},"a":71,"b":{"c":[115,"green",25,"yellow","blue",66],"a":"yellow","b":"green"},"d":"violet","f":{"e":"yellow","c":"blue","a":"blue","b":59,"d":[69,71,"yellow","red",99,"green","yellow",144,43,-38]}},"yellow","blue","orange",55,{"c":[-9,-16,"green",100,28,"red","blue","blue",174],"a":-31,"b":106,"d":"violet"},"blue"],[141,[32,"orange",{"c":-6,"a":-7,"b":64},["blue",{"e":-24,"c":"yellow","a":153,"b":"orange","d":"blue","f":"violet"},"violet",-28,197,"yellow","green","green"],2,{"e":"violet","c":"red","a":"red","b":"yellow","d":"yellow"},["yellow"],"red"],["green",[-16,47],"blue",87,"red","green"],105,"violet",[[127,"violet",81],"red","blue",[193,178,-6],20,"red",61],-2,"blue",-35],{"c":-12,"a":189,"b":"red"},[12,196,["red",27,["violet","green",15,["yellow","green",152,56,187,"yellow",69],"violet"]],127,{"a":"yellow"},-35,[[180,{"c":"yellow","a":191,"b":"violet","d":"red"},41,33,-5],188,"red","violet",23,100,30,91,-15],"blue"],[[129,"blue",{"a":"red"},"violet","green",56,["yellow"],180,[156,"violet"],-49],48,"red",38,{"a":{"e":93,"a":"yellow","d":170,"c":{"e":116,"a":5,"d":89,"j":"blue","c":"blue","h":"red","b":"blue","g":-2,"f":"red","i":-7},"h":148,"b":149,"g":"red","f":-18,"i":-44}},101,183],[25,16,123]],{"e":{"c":"orange","a":{"e":[{"c":"green","a":"orange","b":100,"d":-30}],"a":187,"d":"green","c":{"a":122},"h":-10,"b":118,"g":-12,"f":63},"b":{"e":["violet","yellow","yellow",167,163,5],"a":-28,"d":[-2,61,"red",-18,"red",{"e":"yellow","a":"orange","d":"yellow","j":"green","c":"orange","h":-10,"b":-32,"g":115,"f":141,"i":164},"red",["violet",99,"orange","blue","orange","green","green","violet","yellow"]],"c":-24,"h":"blue","b":"violet","g":47,"f":156},"d":195},"a":{"a":[176]},"d":["violet",[["green",180,"violet","yellow"],{"e":133,"a":"violet","d":{"e":57,"a":"yellow","d":57,"j":"violet","c":"red","h":33,"b":"green","g":"yellow","f":"green","i":79},"j":"orange","c":"violet","h":62,"b":"blue","g":-37,"f":"violet","i":93},-43,"violet",103,"yellow",194,56],{"e":-19,"c":"yellow","a":"orange","b":-19,"d":"red","f":"yellow"}],"c":162,"h":[73,"green",[87,{"a":"green"}],[56,"green",[["green",-2,"green",-47,"yellow",-39,47],"red",129,[90,181,50,"green","green","green","blue",7,"violet"],-3,9,-12,171],"red","orange",159,["violet","yellow",77,86,"yellow","yellow","red",185],145,[81,133]],"yellow",-3,[{"c":["orange",108,82],"a":"violet","b":{"a":"yellow","b":"yellow"},"d":42}],"orange",[-27,["green",{"c":"violet","a":"violet","b":"orange","d":15},78],"red",23],"orange"],"b":{"e":"yellow","a":46,"d":[118,31,142,{"e":-48,"a":"blue","d":"green","c":"violet","h":69,"b":"orange","g":178,"f":"orange","i":"green"},{"e":109,"a":"orange","d":-7,"c":42,"h":168,"b":"blue","g":157,"f":{"a":93,"b":142},"i":38},[59,80],"orange",73,"violet"],"c":122,"h":{"e":153,"c":"yellow","a":11,"b":"orange","d":101},"b":"blue","g":"orange","f":[{"e":48,"c":-39,"a":77,"g":-33,"b":"yellow","d":30,"f":36},153,{"c":"violet","a":78,"b":63,"d":"orange"},117],"i":"red"},"g":"yellow","f":{"a":"orange","b":[{"a":87},"violet","orange",96,154,"orange","violet",{"a":[-45],"b":103}]}},"red"],[{"e":"violet","a":{"e":167,"a":{"e":"orange","c":{"e":"red","c":76,"a":"green","b":"violet","d":146,"f":152},"a":"violet","b":-8,"d":76,"f":"red"},"d":[102,"yellow","blue","blue",22,73],"c":"red","h":{"e":{"c":92,"a":178,"b":{"e":-43,"a":"yellow","d":136,"j":"red","c":193,"h":98,"b":"orange","g":49,"f":"yellow","i":"violet"}},"a":54,"d":138,"j":[0,[177,178],"red",52,[87,"violet",123,"orange","orange","yellow",48,"yellow"],"violet",100,"blue"],"c":3,"h":"green","b":175,"g":{"e":[175,-25,-47,"orange",60,185],"a":["orange",-49,156],"d":"yellow","j":8,"c":-28,"h":129,"b":[89,-12,67,"green",195,"red","violet",150,"red",106],"g":"violet","f":-29,"i":123},"f":"orange","i":71},"b":[172,["yellow","violet","green","blue",194],-46,{"a":102,"b":"green"}],"g":[{"e":{"c":23,"a":"yellow","b":-25},"a":"blue","d":"green","j":185,"c":"yellow","h":["orange","violet",-21],"b":{"c":191,"a":197,"b":"yellow"},"g":115,"f":-41,"i":"blue"},-17,[-23,64,"red",8,"orange",[105,-11,29,-23,30,65,15],170],"yellow","yellow",-46,"green","orange",143],"f":177},"d":"red","c":"red","h":135,"b":{"e":"red","a":"orange","d":["violet",[23,"red","violet","orange",66,{"c":"orange","a":"green","b":169,"d":57},"blue",125,"green"],110,135,[-40,"violet","yellow",-26,-23,44],"orange",28],"c":"orange","h":107,"b":91,"g":105,"f":{"e":{"e":164,"c":180,"a":"blue","b":"yellow","d":144},"c":"violet","a":"violet","g":95,"b":"red","d":"violet","f":"green"},"i":156},"g":["violet",108,["blue","yellow","red",[23,"yellow",3,159,112],{"e":-41,"c":"green","a":22,"b":"violet","d":"blue","f":"blue"},"violet",-27,"green","violet",-17],"green",{"e":{"e":[-19,96,-28,"orange"],"c":"yellow","a":"yellow","g":124,"b":97,"d":{"a":"blue"},"f":"green"},"a":46,"d":["blue",118,"yellow","yellow","yellow","green",["yellow",-10,90,167,"red",54,-15]],"j":106,"c":"red","h":[{"e":"red","c":28,"a":"yellow","b":170,"d":"blue","f":105},-40,"orange",188,"yellow",142],"b":117,"g":"violet","f":{"a":[-5,"red",46,182,"red","orange"]},"i":"yellow"},["orange",88,18,{"e":"blue","a":"violet","d":"blue","c":"violet","h":"violet","b":196,"g":103,"f":67,"i":13}],"blue","blue"],"f":-19,"i":{"a":166}},164],[{"e":{"e":"blue","a":13,"d":{"e":{"e":"orange","a":88,"d":"red","c":"yellow","h":[93,79],"b":"orange","g":109,"f":34,"i":-13},"a":-44,"d":"red","j":[173,78,"red",{"e":"yellow","a":-32,"d":"blue","j":"violet","c":"blue","h":119,"b":"green","g":-30,"f":193,"i":95},"orange",-43,-16],"c":["green",{"e":41,"c":"red","a":109,"b":159,"d":59},173,18,"violet",21,"red"],"h":"blue","b":44,"g":{"a":129,"b":-10},"f":-26,"i":27},"j":"red","c":{"a":{"c":-28,"a":"green","b":188,"d":"blue"},"b":"blue"},"h":[183,[118,[-7,"orange"],132,[23,175,"yellow","green",11,178,171,"orange","blue",18],134,1,"green",[-9,99],103,-25],"red",[65,"red","blue"],"violet","blue"],"b":"yellow","g":164,"f":-9,"i":{"c":51,"a":"green","b":115,"d":{"a":27,"b":"red"}}},"a":[{"e":[143,"violet",128,"red","yellow",185,"green","red","red"],"a":29,"d":"red","c":170,"h":[131,"violet",96,{"a":"yellow","b":"green"},139,22,176,"yellow",[-46,-14,"red","blue",83,141],[132,108,"blue","blue","green",197,"yellow"]],"b":"blue","g":"orange","f":"yellow","i":[-9]},"violet",56,[169,12,155,["red",197,{"e":"violet","a":22,"d":"violet","c":84,"h":"red","b":70,"g":"violet","f":-41},47,"violet"],[["green","green",179,56,"green","violet",171,"violet","violet"],"blue","red","green",-17,"green",190],"green","red",146,60],"yellow","red","yellow","violet"],"d":[[141,40,"yellow",1,"blue","green","yellow",{"e":13,"a":"blue","d":"red","c":"red","h":176,"b":"violet","g":164,"f":4,"i":"violet"}]],"c":72,"h":15,"b":"yellow","g":{"e":[-12,"blue",["red","blue",11],29,{"e":59,"c":"red","a":{"e":55,"a":"blue","d":"orange","c":"yellow","h":"violet","b":-19,"g":"green","f":"violet","i":197},"b":"orange","d":"violet","f":90},[-14,154,"violet","orange",74,{"e":"yellow","a":"violet","d":66,"c":"yellow","h":80,"b":"yellow","g":"yellow","f":"orange","i":"blue"},"green","red",116,149],"green",108],"c":{"c":28,"a":"blue","b":"yellow","d":"blue"},"a":36,"b":["orange","green","orange","green","red",46,55,"blue",["violet",98,[163,-35,163,-28],"blue","red",155,"blue"],-8],"d":163},"f":[9,"green",{"c":"green","a":"violet","b":68,"d":"yellow"},114,33,1,-25]},["red",[-20,{"c":"yellow","a":"red","b":"green","d":{"a":"red"}},"red",[[141,76],[174],100,{"e":126,"c":39,"a":["violet",94,"orange",102,"blue"],"b":55,"d":"yellow","f":"yellow"},146,{"c":169,"a":"red","b":"red"},[["green",-48,"violet","orange"],[80,-7,-22,"yellow","orange","yellow",185,"orange"],"green","violet","orange"],"red"],"yellow"],[{"a":["orange","blue"],"b":[{"a":-42,"b":"violet"},"green",99,-20,"blue"]},{"c":"blue","a":"violet","b":14,"d":9},"green",{"c":["blue",148,[38,139,125,52,"red",40,190,"yellow",21,"violet"],"violet",110,"green"],"a":{"c":97,"a":[35,"orange",44,"red",87,"orange","blue",61,"yellow"],"b":176,"d":144},"b":137},85,[192,-37,"orange",{"c":"yellow","a":-10,"b":[71]},"yellow",176,["green",14],{"a":102},-39],"violet",164],-9,"blue",[["blue"],70]]]]
diff --git a/2015/12/puzzle-1.sh b/2015/12/puzzle-1.sh
new file mode 100755
index 0000000..7b509fe
--- /dev/null
+++ b/2015/12/puzzle-1.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env sh
+
+tr -c '\-0-9' '\n' <input | squash | paste -sd+ | bc
diff --git a/2015/12/puzzle-2.sh b/2015/12/puzzle-2.sh
new file mode 100755
index 0000000..e97fc8a
--- /dev/null
+++ b/2015/12/puzzle-2.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env sh
+
+jq 'walk(if type == "object" then del(select(.[] == "red")) end)' input \
+ | tr -c '\-0-9' '\n' \
+ | squash \
+ | paste -sd+ \
+ | bc
diff --git a/2015/14/input b/2015/14/input
new file mode 100644
index 0000000..2af1170
--- /dev/null
+++ b/2015/14/input
@@ -0,0 +1,9 @@
+Vixen can fly 19 km/s for 7 seconds, but then must rest for 124 seconds.
+Rudolph can fly 3 km/s for 15 seconds, but then must rest for 28 seconds.
+Donner can fly 19 km/s for 9 seconds, but then must rest for 164 seconds.
+Blitzen can fly 19 km/s for 9 seconds, but then must rest for 158 seconds.
+Comet can fly 13 km/s for 7 seconds, but then must rest for 82 seconds.
+Cupid can fly 25 km/s for 6 seconds, but then must rest for 145 seconds.
+Dasher can fly 14 km/s for 3 seconds, but then must rest for 38 seconds.
+Dancer can fly 3 km/s for 16 seconds, but then must rest for 37 seconds.
+Prancer can fly 25 km/s for 6 seconds, but then must rest for 143 seconds.
diff --git a/2015/14/puzzle-1.bc b/2015/14/puzzle-1.bc
new file mode 100644
index 0000000..d36cafd
--- /dev/null
+++ b/2015/14/puzzle-1.bc
@@ -0,0 +1,25 @@
+/* Return the largest element from array `a` of length `l` */
+define max(a[], l)
+{
+ auto m, i
+ for (i = 0; i < l; i++) {
+ if (a[i] > m)
+ m = a[i]
+ }
+ return m
+}
+
+/* Return the kilometers traveled by a raindeer that flys with speed `s` km/s for `t` seconds before
+ * needing to rest for `r` seconds.
+ */
+define calc(s, t, r)
+{
+ auto a, d
+ while (d + t <= 2503) {
+ a += s * t
+ d += t + r
+ }
+ if (d < 2503)
+ a += s * (2503 - d)
+ return a
+}
diff --git a/2015/14/puzzle-2.bc b/2015/14/puzzle-2.bc
new file mode 100644
index 0000000..4a41277
--- /dev/null
+++ b/2015/14/puzzle-2.bc
@@ -0,0 +1,33 @@
+scale = 0
+
+/* Return the largest element from array `a` of length `l` */
+define max(a[], l)
+{
+ auto m, i
+ for (i = 0; i < l; i++) {
+ if (a[i] > m)
+ m = a[i]
+ }
+ return m
+}
+
+define calc(speed[], time[], rest[], n)
+{
+ auto i, j, k, p[], d[]
+
+ for (i = 0; i < 2503; i++) {
+ for (j = k = 0; j < n; j++) {
+ if (i % (time[j] + rest[j]) < time[j])
+ d[j] += speed[j]
+ if (d[j] > k)
+ k = d[j]
+ }
+
+ for (j = 0; j < n; j++) {
+ if (d[j] == k)
+ p[j] += 1
+ }
+ }
+
+ return max(p[], n)
+}
diff --git a/2015/14/puzzles.sh b/2015/14/puzzles.sh
new file mode 100755
index 0000000..b55642d
--- /dev/null
+++ b/2015/14/puzzles.sh
@@ -0,0 +1,11 @@
+#!/usr/bin/env sh
+
+# I use bc-gh(1), but it's just Gavin Howards implementation of bc(1)
+
+sed -e 's|[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\).*|x[y++] = calc(\1, \2, \3)|' \
+ -e '$amax(x[], y)' input \
+ | bc-gh -q puzzle-1.bc
+
+sed -e 's|[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\).*|speed[n] = \1; time[n] = \2; rest[n++] = \3|' \
+ -e '$acalc(speed[], time[], rest[], n)' input \
+ | bc-gh -q puzzle-2.bc
diff --git a/2015/15/input b/2015/15/input
new file mode 100644
index 0000000..d1af06e
--- /dev/null
+++ b/2015/15/input
@@ -0,0 +1,4 @@
+Sugar: capacity 3, durability 0, flavor 0, texture -3, calories 2
+Sprinkles: capacity -3, durability 3, flavor 0, texture 0, calories 9
+Candy: capacity -1, durability 0, flavor 4, texture 0, calories 1
+Chocolate: capacity 0, durability 0, flavor -2, texture 2, calories 8
diff --git a/2015/15/puzzle-1.py b/2015/15/puzzle-1.py
new file mode 100755
index 0000000..806737c
--- /dev/null
+++ b/2015/15/puzzle-1.py
@@ -0,0 +1,39 @@
+#!/usr/bin/env python3
+
+from math import prod
+import itertools
+import re
+
+
+def main() -> None:
+ data: list[list[int]] = []
+ with open("input", "r", encoding="utf-8") as f:
+ for line in f.readlines():
+ m = re.match(
+ r"[^\-0-9]+([\-0-9]+)[^\-0-9]+([\-0-9]+)[^\-0-9]+([\-0-9]+)[^\-0-9]+([\-0-9]+)",
+ line,
+ )
+ data.append([int(m.group(1)), int(m.group(2)), int(m.group(3)), int(m.group(4))])
+
+ total: int = 0
+ for i in range(100):
+ for j in range(100 - i):
+ for k in range(100 - i - j):
+ if i + j + k > 100:
+ continue
+ h = 100 - i - j - k
+
+ parts: list[int] = []
+ parts.append(data[0][0] * i + data[1][0] * j + data[2][0] * k + data[3][0] * h)
+ parts.append(data[0][1] * i + data[1][1] * j + data[2][1] * k + data[3][1] * h)
+ parts.append(data[0][2] * i + data[1][2] * j + data[2][2] * k + data[3][2] * h)
+ parts.append(data[0][3] * i + data[1][3] * j + data[2][3] * k + data[3][3] * h)
+
+ if not any(map(lambda x: x < 0, parts)):
+ total = max(total, prod(parts))
+
+ print(total)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/2015/15/puzzle-2.py b/2015/15/puzzle-2.py
new file mode 100755
index 0000000..ec03a82
--- /dev/null
+++ b/2015/15/puzzle-2.py
@@ -0,0 +1,41 @@
+#!/usr/bin/env python3
+
+from math import prod
+import itertools
+import re
+
+
+def main() -> None:
+ data: list[list[int]] = []
+ with open("input", "r", encoding="utf-8") as f:
+ for line in f.readlines():
+ m = re.match(
+ r"[^\-0-9]+([\-0-9]+)[^\-0-9]+([\-0-9]+)[^\-0-9]+([\-0-9]+)[^\-0-9]+([\-0-9]+)[^\-0-9]+([0-9]+)",
+ line,
+ )
+ data.append(list(map(int, [m.group(i) for i in range(1, 6)])))
+
+ total: int = 0
+ for i in range(100):
+ for j in range(100 - i):
+ for k in range(100 - i - j):
+ if i + j + k > 100:
+ continue
+ h = 100 - i - j - k
+ if data[0][4] * i + data[1][4] * j + data[2][4] * k + data[3][4] * h != 500:
+ continue
+
+ parts: list[int] = []
+ parts.append(data[0][0] * i + data[1][0] * j + data[2][0] * k + data[3][0] * h)
+ parts.append(data[0][1] * i + data[1][1] * j + data[2][1] * k + data[3][1] * h)
+ parts.append(data[0][2] * i + data[1][2] * j + data[2][2] * k + data[3][2] * h)
+ parts.append(data[0][3] * i + data[1][3] * j + data[2][3] * k + data[3][3] * h)
+
+ if not any(map(lambda x: x < 0, parts)):
+ total = max(total, prod(parts))
+
+ print(total)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/2015/16/input b/2015/16/input
new file mode 100644
index 0000000..ddaeefc
--- /dev/null
+++ b/2015/16/input
@@ -0,0 +1,500 @@
+Sue 1: cars: 9, akitas: 3, goldfish: 0
+Sue 2: akitas: 9, children: 3, samoyeds: 9
+Sue 3: trees: 6, cars: 6, children: 4
+Sue 4: trees: 4, vizslas: 4, goldfish: 9
+Sue 5: akitas: 9, vizslas: 7, cars: 5
+Sue 6: vizslas: 6, goldfish: 6, akitas: 3
+Sue 7: pomeranians: 5, samoyeds: 0, perfumes: 10
+Sue 8: cars: 10, pomeranians: 7, goldfish: 8
+Sue 9: trees: 2, vizslas: 7, samoyeds: 6
+Sue 10: perfumes: 5, pomeranians: 4, children: 9
+Sue 11: vizslas: 5, perfumes: 8, cars: 10
+Sue 12: children: 10, cars: 6, perfumes: 5
+Sue 13: cats: 4, samoyeds: 7, pomeranians: 8
+Sue 14: perfumes: 6, goldfish: 10, children: 7
+Sue 15: perfumes: 4, pomeranians: 3, cars: 6
+Sue 16: perfumes: 7, cars: 9, pomeranians: 6
+Sue 17: goldfish: 3, cars: 6, vizslas: 7
+Sue 18: perfumes: 6, cars: 7, goldfish: 3
+Sue 19: trees: 0, akitas: 3, pomeranians: 8
+Sue 20: goldfish: 6, trees: 2, akitas: 6
+Sue 21: pomeranians: 9, akitas: 9, samoyeds: 9
+Sue 22: vizslas: 2, cars: 9, perfumes: 5
+Sue 23: goldfish: 10, samoyeds: 8, children: 9
+Sue 24: akitas: 4, goldfish: 1, vizslas: 5
+Sue 25: goldfish: 10, trees: 8, perfumes: 6
+Sue 26: vizslas: 5, akitas: 8, trees: 1
+Sue 27: trees: 3, cars: 6, perfumes: 2
+Sue 28: goldfish: 8, trees: 7, akitas: 10
+Sue 29: children: 5, trees: 1, goldfish: 10
+Sue 30: vizslas: 3, perfumes: 8, akitas: 3
+Sue 31: cars: 6, children: 10, perfumes: 7
+Sue 32: cars: 10, perfumes: 3, goldfish: 10
+Sue 33: perfumes: 9, vizslas: 3, akitas: 4
+Sue 34: perfumes: 10, vizslas: 7, children: 8
+Sue 35: cars: 5, perfumes: 5, vizslas: 9
+Sue 36: trees: 9, cars: 9, akitas: 7
+Sue 37: samoyeds: 9, perfumes: 2, cars: 10
+Sue 38: akitas: 7, cars: 5, trees: 5
+Sue 39: goldfish: 8, trees: 9, cars: 10
+Sue 40: trees: 0, cats: 1, pomeranians: 1
+Sue 41: pomeranians: 6, perfumes: 9, samoyeds: 1
+Sue 42: vizslas: 6, akitas: 3, pomeranians: 1
+Sue 43: vizslas: 2, perfumes: 3, pomeranians: 6
+Sue 44: akitas: 5, pomeranians: 0, vizslas: 10
+Sue 45: vizslas: 4, goldfish: 1, cars: 5
+Sue 46: cars: 4, vizslas: 8, cats: 0
+Sue 47: cats: 5, children: 8, pomeranians: 2
+Sue 48: vizslas: 3, perfumes: 6, cats: 0
+Sue 49: akitas: 7, perfumes: 0, trees: 7
+Sue 50: trees: 4, akitas: 10, vizslas: 2
+Sue 51: goldfish: 10, cars: 9, trees: 4
+Sue 52: cars: 5, children: 9, perfumes: 0
+Sue 53: vizslas: 5, cars: 3, cats: 8
+Sue 54: cars: 5, akitas: 1, goldfish: 10
+Sue 55: akitas: 10, vizslas: 2, cars: 6
+Sue 56: cats: 6, trees: 0, cars: 4
+Sue 57: vizslas: 1, akitas: 1, samoyeds: 7
+Sue 58: samoyeds: 6, vizslas: 1, akitas: 7
+Sue 59: akitas: 9, cars: 8, vizslas: 1
+Sue 60: cars: 6, vizslas: 7, goldfish: 0
+Sue 61: pomeranians: 5, akitas: 6, vizslas: 2
+Sue 62: samoyeds: 2, cats: 8, goldfish: 7
+Sue 63: vizslas: 10, goldfish: 7, samoyeds: 9
+Sue 64: perfumes: 2, trees: 1, akitas: 6
+Sue 65: cars: 8, perfumes: 10, vizslas: 9
+Sue 66: akitas: 8, vizslas: 8, perfumes: 8
+Sue 67: goldfish: 7, cars: 9, samoyeds: 9
+Sue 68: perfumes: 2, children: 7, akitas: 1
+Sue 69: perfumes: 7, vizslas: 9, akitas: 1
+Sue 70: samoyeds: 3, vizslas: 1, trees: 1
+Sue 71: vizslas: 8, goldfish: 7, trees: 9
+Sue 72: goldfish: 8, cars: 6, trees: 9
+Sue 73: perfumes: 5, cars: 10, samoyeds: 7
+Sue 74: pomeranians: 4, perfumes: 3, cars: 5
+Sue 75: samoyeds: 1, perfumes: 1, pomeranians: 1
+Sue 76: goldfish: 4, cats: 6, akitas: 7
+Sue 77: perfumes: 5, akitas: 4, vizslas: 8
+Sue 78: perfumes: 4, cats: 3, children: 4
+Sue 79: vizslas: 5, pomeranians: 9, samoyeds: 7
+Sue 80: cars: 3, samoyeds: 5, pomeranians: 7
+Sue 81: vizslas: 2, samoyeds: 4, perfumes: 2
+Sue 82: trees: 1, akitas: 10, vizslas: 9
+Sue 83: vizslas: 0, akitas: 2, samoyeds: 5
+Sue 84: perfumes: 5, vizslas: 7, children: 8
+Sue 85: cats: 3, children: 2, trees: 0
+Sue 86: cars: 3, perfumes: 2, goldfish: 2
+Sue 87: trees: 1, akitas: 7, vizslas: 0
+Sue 88: trees: 1, akitas: 2, samoyeds: 1
+Sue 89: cars: 4, vizslas: 8, akitas: 1
+Sue 90: perfumes: 5, cats: 3, vizslas: 0
+Sue 91: samoyeds: 7, cats: 6, goldfish: 8
+Sue 92: samoyeds: 10, cats: 0, cars: 7
+Sue 93: cars: 6, akitas: 7, samoyeds: 2
+Sue 94: perfumes: 0, goldfish: 6, trees: 9
+Sue 95: cars: 6, pomeranians: 2, samoyeds: 8
+Sue 96: cars: 2, trees: 9, samoyeds: 4
+Sue 97: goldfish: 5, trees: 1, children: 0
+Sue 98: akitas: 9, goldfish: 7, children: 6
+Sue 99: goldfish: 9, akitas: 0, pomeranians: 0
+Sue 100: samoyeds: 6, children: 8, vizslas: 5
+Sue 101: vizslas: 6, cars: 5, goldfish: 4
+Sue 102: vizslas: 6, akitas: 2, perfumes: 6
+Sue 103: samoyeds: 3, akitas: 7, children: 4
+Sue 104: cars: 3, perfumes: 10, cats: 6
+Sue 105: vizslas: 9, pomeranians: 0, cars: 1
+Sue 106: cats: 6, samoyeds: 8, pomeranians: 5
+Sue 107: cars: 7, trees: 4, akitas: 10
+Sue 108: perfumes: 3, vizslas: 1, goldfish: 9
+Sue 109: trees: 6, cars: 8, goldfish: 5
+Sue 110: pomeranians: 2, children: 1, vizslas: 7
+Sue 111: akitas: 0, vizslas: 8, cars: 0
+Sue 112: goldfish: 3, vizslas: 6, akitas: 2
+Sue 113: akitas: 10, pomeranians: 7, perfumes: 7
+Sue 114: cars: 10, cats: 2, vizslas: 8
+Sue 115: akitas: 8, trees: 1, vizslas: 2
+Sue 116: vizslas: 2, akitas: 7, perfumes: 1
+Sue 117: goldfish: 0, vizslas: 10, trees: 9
+Sue 118: trees: 3, cars: 0, goldfish: 0
+Sue 119: perfumes: 7, goldfish: 5, trees: 9
+Sue 120: children: 9, vizslas: 3, trees: 5
+Sue 121: vizslas: 1, goldfish: 7, akitas: 10
+Sue 122: perfumes: 1, cars: 6, trees: 1
+Sue 123: akitas: 2, vizslas: 0, goldfish: 7
+Sue 124: vizslas: 10, pomeranians: 7, akitas: 0
+Sue 125: perfumes: 4, cats: 5, vizslas: 2
+Sue 126: cars: 6, samoyeds: 8, akitas: 3
+Sue 127: trees: 9, goldfish: 7, akitas: 9
+Sue 128: cars: 8, trees: 0, perfumes: 2
+Sue 129: pomeranians: 7, vizslas: 2, perfumes: 6
+Sue 130: vizslas: 9, pomeranians: 3, trees: 6
+Sue 131: vizslas: 7, cars: 9, perfumes: 1
+Sue 132: akitas: 2, pomeranians: 9, vizslas: 7
+Sue 133: trees: 9, pomeranians: 10, samoyeds: 0
+Sue 134: children: 4, akitas: 10, perfumes: 4
+Sue 135: vizslas: 1, cats: 1, trees: 8
+Sue 136: samoyeds: 7, cars: 8, goldfish: 5
+Sue 137: perfumes: 0, children: 1, pomeranians: 10
+Sue 138: vizslas: 4, perfumes: 5, cars: 5
+Sue 139: trees: 2, perfumes: 8, goldfish: 0
+Sue 140: cars: 10, akitas: 5, goldfish: 7
+Sue 141: children: 4, trees: 3, goldfish: 8
+Sue 142: cars: 8, perfumes: 6, trees: 7
+Sue 143: akitas: 6, goldfish: 0, trees: 10
+Sue 144: akitas: 7, pomeranians: 10, perfumes: 10
+Sue 145: trees: 10, vizslas: 3, goldfish: 4
+Sue 146: samoyeds: 4, akitas: 3, perfumes: 6
+Sue 147: akitas: 8, perfumes: 2, pomeranians: 10
+Sue 148: cars: 2, perfumes: 0, goldfish: 8
+Sue 149: goldfish: 6, akitas: 7, perfumes: 6
+Sue 150: cars: 2, pomeranians: 5, perfumes: 4
+Sue 151: goldfish: 1, cars: 5, trees: 0
+Sue 152: pomeranians: 4, cars: 7, children: 1
+Sue 153: goldfish: 8, cars: 1, children: 10
+Sue 154: cars: 6, perfumes: 8, trees: 1
+Sue 155: akitas: 4, perfumes: 6, pomeranians: 2
+Sue 156: pomeranians: 5, cars: 4, akitas: 1
+Sue 157: cats: 5, cars: 9, goldfish: 8
+Sue 158: vizslas: 5, samoyeds: 1, children: 7
+Sue 159: vizslas: 1, perfumes: 3, akitas: 1
+Sue 160: goldfish: 10, pomeranians: 9, perfumes: 5
+Sue 161: samoyeds: 3, trees: 7, cars: 2
+Sue 162: cars: 2, pomeranians: 1, vizslas: 6
+Sue 163: vizslas: 3, perfumes: 5, akitas: 6
+Sue 164: vizslas: 1, trees: 0, akitas: 5
+Sue 165: vizslas: 5, cars: 6, pomeranians: 8
+Sue 166: cars: 10, perfumes: 2, trees: 9
+Sue 167: cars: 10, pomeranians: 6, perfumes: 4
+Sue 168: akitas: 7, trees: 10, goldfish: 7
+Sue 169: akitas: 1, perfumes: 10, cars: 10
+Sue 170: akitas: 5, samoyeds: 8, vizslas: 6
+Sue 171: children: 3, akitas: 2, vizslas: 3
+Sue 172: goldfish: 5, vizslas: 5, perfumes: 9
+Sue 173: perfumes: 5, goldfish: 10, trees: 5
+Sue 174: akitas: 5, vizslas: 2, children: 7
+Sue 175: perfumes: 5, cars: 7, samoyeds: 2
+Sue 176: cars: 8, vizslas: 10, akitas: 7
+Sue 177: perfumes: 7, children: 8, goldfish: 7
+Sue 178: cars: 1, pomeranians: 9, samoyeds: 0
+Sue 179: perfumes: 6, cars: 2, trees: 6
+Sue 180: trees: 3, vizslas: 7, children: 3
+Sue 181: vizslas: 8, samoyeds: 2, trees: 9
+Sue 182: perfumes: 3, cats: 1, children: 5
+Sue 183: akitas: 9, cats: 6, children: 3
+Sue 184: pomeranians: 9, cars: 6, perfumes: 8
+Sue 185: vizslas: 9, trees: 0, akitas: 9
+Sue 186: perfumes: 6, cars: 5, goldfish: 5
+Sue 187: perfumes: 4, cats: 7, vizslas: 2
+Sue 188: akitas: 7, cars: 4, children: 10
+Sue 189: akitas: 0, goldfish: 7, vizslas: 5
+Sue 190: akitas: 5, cars: 5, cats: 6
+Sue 191: cars: 6, children: 0, perfumes: 3
+Sue 192: cats: 2, perfumes: 10, goldfish: 7
+Sue 193: trees: 1, perfumes: 0, cars: 8
+Sue 194: perfumes: 9, children: 4, cats: 6
+Sue 195: akitas: 7, trees: 3, goldfish: 6
+Sue 196: goldfish: 8, cars: 8, samoyeds: 0
+Sue 197: cats: 0, akitas: 10, vizslas: 0
+Sue 198: goldfish: 1, perfumes: 3, cars: 8
+Sue 199: akitas: 10, vizslas: 5, samoyeds: 6
+Sue 200: pomeranians: 9, goldfish: 9, samoyeds: 7
+Sue 201: samoyeds: 0, goldfish: 7, akitas: 6
+Sue 202: vizslas: 0, goldfish: 2, akitas: 1
+Sue 203: goldfish: 3, children: 0, vizslas: 8
+Sue 204: cars: 8, trees: 2, perfumes: 2
+Sue 205: cars: 4, perfumes: 5, goldfish: 8
+Sue 206: vizslas: 3, trees: 2, akitas: 1
+Sue 207: cars: 7, goldfish: 5, trees: 1
+Sue 208: goldfish: 1, cars: 6, vizslas: 8
+Sue 209: cats: 4, trees: 1, children: 0
+Sue 210: cats: 10, children: 0, perfumes: 0
+Sue 211: cars: 4, pomeranians: 7, samoyeds: 5
+Sue 212: cars: 2, pomeranians: 10, trees: 1
+Sue 213: trees: 10, cats: 5, cars: 10
+Sue 214: perfumes: 5, trees: 1, vizslas: 1
+Sue 215: akitas: 10, vizslas: 8, samoyeds: 8
+Sue 216: vizslas: 2, cats: 5, pomeranians: 3
+Sue 217: akitas: 10, perfumes: 0, cats: 10
+Sue 218: trees: 8, cats: 5, vizslas: 2
+Sue 219: goldfish: 10, perfumes: 8, children: 2
+Sue 220: samoyeds: 9, trees: 8, vizslas: 7
+Sue 221: children: 7, trees: 6, cars: 6
+Sue 222: cats: 4, akitas: 5, pomeranians: 0
+Sue 223: trees: 8, goldfish: 2, perfumes: 8
+Sue 224: pomeranians: 9, cars: 8, akitas: 5
+Sue 225: akitas: 10, vizslas: 0, trees: 2
+Sue 226: akitas: 8, cats: 6, cars: 7
+Sue 227: trees: 1, akitas: 3, goldfish: 4
+Sue 228: pomeranians: 6, cats: 3, goldfish: 3
+Sue 229: trees: 10, perfumes: 3, vizslas: 7
+Sue 230: perfumes: 8, cars: 7, akitas: 0
+Sue 231: perfumes: 10, goldfish: 4, cars: 6
+Sue 232: goldfish: 7, trees: 3, cats: 2
+Sue 233: perfumes: 6, trees: 4, akitas: 4
+Sue 234: goldfish: 9, cats: 4, cars: 7
+Sue 235: pomeranians: 6, vizslas: 0, akitas: 6
+Sue 236: samoyeds: 5, cars: 5, children: 4
+Sue 237: vizslas: 10, cars: 4, goldfish: 4
+Sue 238: goldfish: 3, samoyeds: 7, akitas: 2
+Sue 239: cats: 8, children: 2, vizslas: 7
+Sue 240: cars: 9, perfumes: 4, trees: 9
+Sue 241: trees: 8, vizslas: 2, goldfish: 5
+Sue 242: cars: 6, trees: 3, vizslas: 3
+Sue 243: cats: 6, children: 7, cars: 4
+Sue 244: cats: 10, perfumes: 2, goldfish: 7
+Sue 245: akitas: 8, cats: 10, perfumes: 8
+Sue 246: vizslas: 8, akitas: 5, perfumes: 10
+Sue 247: goldfish: 2, vizslas: 5, akitas: 7
+Sue 248: akitas: 3, perfumes: 0, trees: 10
+Sue 249: cats: 4, vizslas: 5, pomeranians: 6
+Sue 250: children: 3, vizslas: 7, perfumes: 2
+Sue 251: cars: 0, pomeranians: 10, perfumes: 0
+Sue 252: akitas: 0, goldfish: 9, cars: 6
+Sue 253: perfumes: 7, cars: 4, samoyeds: 5
+Sue 254: akitas: 9, trees: 10, cars: 4
+Sue 255: samoyeds: 10, children: 6, akitas: 7
+Sue 256: trees: 8, goldfish: 8, perfumes: 8
+Sue 257: goldfish: 3, akitas: 2, perfumes: 6
+Sue 258: cats: 7, trees: 0, vizslas: 1
+Sue 259: perfumes: 7, cars: 7, akitas: 7
+Sue 260: goldfish: 0, vizslas: 0, samoyeds: 2
+Sue 261: vizslas: 2, children: 2, cats: 3
+Sue 262: vizslas: 2, pomeranians: 9, samoyeds: 3
+Sue 263: cats: 1, akitas: 3, vizslas: 1
+Sue 264: pomeranians: 10, trees: 2, goldfish: 7
+Sue 265: samoyeds: 5, trees: 7, perfumes: 4
+Sue 266: perfumes: 10, cars: 1, pomeranians: 3
+Sue 267: trees: 6, goldfish: 1, cars: 0
+Sue 268: cars: 6, samoyeds: 4, pomeranians: 5
+Sue 269: goldfish: 3, vizslas: 3, akitas: 3
+Sue 270: children: 5, cats: 0, cars: 4
+Sue 271: goldfish: 3, perfumes: 8, pomeranians: 7
+Sue 272: samoyeds: 6, cars: 7, perfumes: 10
+Sue 273: trees: 4, cars: 2, vizslas: 7
+Sue 274: samoyeds: 10, perfumes: 9, goldfish: 6
+Sue 275: cars: 4, trees: 2, perfumes: 7
+Sue 276: akitas: 3, perfumes: 9, cars: 9
+Sue 277: akitas: 8, vizslas: 2, cats: 6
+Sue 278: trees: 5, goldfish: 7, akitas: 3
+Sue 279: perfumes: 9, cars: 8, vizslas: 2
+Sue 280: trees: 3, vizslas: 0, children: 0
+Sue 281: cars: 7, trees: 2, cats: 5
+Sue 282: vizslas: 4, cars: 10, cats: 3
+Sue 283: akitas: 10, cats: 3, samoyeds: 9
+Sue 284: trees: 7, children: 5, goldfish: 6
+Sue 285: cars: 2, perfumes: 5, cats: 7
+Sue 286: samoyeds: 5, trees: 10, goldfish: 6
+Sue 287: goldfish: 10, perfumes: 4, trees: 7
+Sue 288: vizslas: 9, trees: 9, perfumes: 0
+Sue 289: trees: 4, goldfish: 9, vizslas: 8
+Sue 290: vizslas: 3, cars: 3, trees: 2
+Sue 291: goldfish: 2, akitas: 2, trees: 2
+Sue 292: children: 1, cars: 0, vizslas: 5
+Sue 293: trees: 5, akitas: 4, goldfish: 6
+Sue 294: akitas: 3, vizslas: 7, pomeranians: 5
+Sue 295: goldfish: 10, vizslas: 3, trees: 1
+Sue 296: cars: 2, trees: 1, akitas: 0
+Sue 297: akitas: 10, vizslas: 6, samoyeds: 2
+Sue 298: children: 5, trees: 1, samoyeds: 9
+Sue 299: perfumes: 9, trees: 6, vizslas: 1
+Sue 300: akitas: 7, pomeranians: 6, vizslas: 6
+Sue 301: cats: 7, children: 6, vizslas: 7
+Sue 302: trees: 2, vizslas: 7, samoyeds: 4
+Sue 303: goldfish: 0, samoyeds: 10, cars: 4
+Sue 304: pomeranians: 9, children: 3, vizslas: 5
+Sue 305: akitas: 8, vizslas: 4, cars: 5
+Sue 306: akitas: 0, perfumes: 2, pomeranians: 10
+Sue 307: akitas: 9, cars: 0, trees: 2
+Sue 308: vizslas: 10, goldfish: 8, akitas: 6
+Sue 309: trees: 0, cats: 6, perfumes: 2
+Sue 310: vizslas: 10, cars: 1, trees: 4
+Sue 311: goldfish: 8, perfumes: 6, cats: 3
+Sue 312: goldfish: 0, children: 1, akitas: 2
+Sue 313: pomeranians: 10, trees: 6, samoyeds: 6
+Sue 314: vizslas: 5, akitas: 4, pomeranians: 2
+Sue 315: goldfish: 7, trees: 0, akitas: 5
+Sue 316: goldfish: 4, vizslas: 5, cars: 7
+Sue 317: perfumes: 7, cats: 10, cars: 4
+Sue 318: samoyeds: 10, cars: 9, trees: 7
+Sue 319: pomeranians: 8, vizslas: 6, cars: 3
+Sue 320: cars: 4, cats: 9, akitas: 4
+Sue 321: cars: 6, trees: 2, perfumes: 6
+Sue 322: goldfish: 1, cats: 2, perfumes: 4
+Sue 323: akitas: 6, cats: 5, cars: 8
+Sue 324: cats: 4, vizslas: 9, akitas: 0
+Sue 325: children: 8, samoyeds: 9, trees: 4
+Sue 326: vizslas: 2, samoyeds: 10, perfumes: 7
+Sue 327: goldfish: 7, pomeranians: 4, akitas: 10
+Sue 328: perfumes: 8, cats: 4, akitas: 10
+Sue 329: trees: 0, cars: 9, goldfish: 3
+Sue 330: trees: 5, samoyeds: 7, perfumes: 8
+Sue 331: cars: 4, perfumes: 2, goldfish: 0
+Sue 332: vizslas: 4, pomeranians: 7, akitas: 1
+Sue 333: akitas: 4, goldfish: 3, perfumes: 0
+Sue 334: samoyeds: 3, akitas: 10, vizslas: 0
+Sue 335: goldfish: 1, akitas: 7, vizslas: 6
+Sue 336: perfumes: 1, goldfish: 1, pomeranians: 8
+Sue 337: children: 5, cars: 4, cats: 4
+Sue 338: vizslas: 5, cars: 10, cats: 3
+Sue 339: trees: 2, goldfish: 3, cars: 1
+Sue 340: trees: 10, goldfish: 6, perfumes: 2
+Sue 341: akitas: 5, trees: 6, cats: 3
+Sue 342: cars: 10, children: 8, goldfish: 0
+Sue 343: cats: 2, akitas: 0, pomeranians: 4
+Sue 344: perfumes: 1, vizslas: 3, cars: 3
+Sue 345: samoyeds: 8, cats: 5, perfumes: 8
+Sue 346: cars: 5, akitas: 10, trees: 2
+Sue 347: vizslas: 9, akitas: 9, cars: 3
+Sue 348: cars: 3, perfumes: 1, pomeranians: 9
+Sue 349: akitas: 1, cars: 4, perfumes: 0
+Sue 350: perfumes: 8, vizslas: 2, trees: 6
+Sue 351: pomeranians: 5, akitas: 9, cats: 8
+Sue 352: pomeranians: 8, vizslas: 3, goldfish: 10
+Sue 353: trees: 2, pomeranians: 0, goldfish: 6
+Sue 354: cats: 5, akitas: 7, goldfish: 6
+Sue 355: goldfish: 6, children: 4, trees: 10
+Sue 356: children: 1, trees: 3, akitas: 7
+Sue 357: trees: 2, samoyeds: 10, goldfish: 3
+Sue 358: samoyeds: 10, cats: 0, goldfish: 0
+Sue 359: perfumes: 3, children: 6, pomeranians: 1
+Sue 360: cars: 10, pomeranians: 1, samoyeds: 5
+Sue 361: samoyeds: 9, pomeranians: 7, perfumes: 6
+Sue 362: goldfish: 6, trees: 8, perfumes: 9
+Sue 363: samoyeds: 10, pomeranians: 9, children: 10
+Sue 364: perfumes: 3, goldfish: 7, cars: 9
+Sue 365: cats: 3, children: 4, samoyeds: 8
+Sue 366: trees: 0, cars: 10, vizslas: 10
+Sue 367: pomeranians: 10, children: 8, perfumes: 2
+Sue 368: cars: 5, vizslas: 0, samoyeds: 3
+Sue 369: trees: 1, goldfish: 8, cars: 8
+Sue 370: vizslas: 0, cars: 2, perfumes: 5
+Sue 371: trees: 2, cars: 3, vizslas: 8
+Sue 372: trees: 10, children: 9, cats: 1
+Sue 373: pomeranians: 3, perfumes: 1, vizslas: 0
+Sue 374: vizslas: 0, perfumes: 6, trees: 0
+Sue 375: vizslas: 7, pomeranians: 1, akitas: 10
+Sue 376: vizslas: 8, trees: 2, cars: 10
+Sue 377: perfumes: 9, cats: 5, goldfish: 5
+Sue 378: cats: 0, akitas: 10, perfumes: 9
+Sue 379: cars: 4, akitas: 1, trees: 1
+Sue 380: cars: 4, perfumes: 5, trees: 3
+Sue 381: goldfish: 3, akitas: 5, samoyeds: 9
+Sue 382: goldfish: 7, perfumes: 5, trees: 5
+Sue 383: akitas: 4, cats: 6, cars: 8
+Sue 384: children: 6, goldfish: 10, akitas: 7
+Sue 385: akitas: 7, vizslas: 5, perfumes: 10
+Sue 386: children: 7, vizslas: 10, akitas: 10
+Sue 387: goldfish: 6, akitas: 7, trees: 2
+Sue 388: vizslas: 6, trees: 1, akitas: 2
+Sue 389: cars: 5, vizslas: 3, akitas: 7
+Sue 390: vizslas: 4, cats: 8, perfumes: 7
+Sue 391: akitas: 3, trees: 0, children: 2
+Sue 392: cats: 7, cars: 3, children: 9
+Sue 393: trees: 10, vizslas: 3, goldfish: 7
+Sue 394: perfumes: 0, goldfish: 7, akitas: 4
+Sue 395: cats: 6, cars: 7, vizslas: 0
+Sue 396: vizslas: 4, perfumes: 6, goldfish: 5
+Sue 397: pomeranians: 8, trees: 1, akitas: 9
+Sue 398: goldfish: 7, pomeranians: 6, samoyeds: 9
+Sue 399: perfumes: 10, cars: 1, trees: 8
+Sue 400: trees: 0, goldfish: 9, children: 6
+Sue 401: trees: 1, cars: 6, pomeranians: 8
+Sue 402: perfumes: 9, cars: 0, vizslas: 10
+Sue 403: samoyeds: 4, akitas: 1, vizslas: 9
+Sue 404: perfumes: 0, trees: 2, cars: 4
+Sue 405: akitas: 0, perfumes: 5, samoyeds: 4
+Sue 406: akitas: 8, vizslas: 6, children: 2
+Sue 407: children: 1, trees: 8, goldfish: 10
+Sue 408: pomeranians: 4, trees: 10, cars: 9
+Sue 409: perfumes: 5, vizslas: 5, akitas: 4
+Sue 410: trees: 1, akitas: 10, vizslas: 6
+Sue 411: samoyeds: 0, goldfish: 9, perfumes: 7
+Sue 412: goldfish: 7, samoyeds: 10, trees: 1
+Sue 413: samoyeds: 0, pomeranians: 10, vizslas: 6
+Sue 414: children: 2, cars: 10, samoyeds: 2
+Sue 415: trees: 2, goldfish: 8, cars: 0
+Sue 416: samoyeds: 4, goldfish: 9, trees: 2
+Sue 417: trees: 8, akitas: 10, perfumes: 3
+Sue 418: samoyeds: 9, goldfish: 2, cars: 1
+Sue 419: akitas: 2, perfumes: 8, trees: 2
+Sue 420: children: 3, goldfish: 6, perfumes: 5
+Sue 421: akitas: 8, perfumes: 2, samoyeds: 6
+Sue 422: vizslas: 10, akitas: 4, pomeranians: 3
+Sue 423: cats: 8, perfumes: 3, trees: 4
+Sue 424: cars: 2, children: 4, pomeranians: 8
+Sue 425: pomeranians: 4, samoyeds: 2, goldfish: 4
+Sue 426: perfumes: 6, cars: 4, goldfish: 4
+Sue 427: akitas: 0, goldfish: 7, perfumes: 5
+Sue 428: perfumes: 4, cars: 3, akitas: 5
+Sue 429: trees: 0, vizslas: 0, goldfish: 1
+Sue 430: perfumes: 4, vizslas: 2, cars: 7
+Sue 431: goldfish: 7, pomeranians: 8, trees: 0
+Sue 432: goldfish: 7, children: 9, trees: 3
+Sue 433: akitas: 1, vizslas: 10, trees: 2
+Sue 434: perfumes: 2, cars: 4, goldfish: 10
+Sue 435: pomeranians: 6, vizslas: 9, trees: 1
+Sue 436: cars: 9, trees: 0, goldfish: 0
+Sue 437: trees: 1, goldfish: 1, vizslas: 8
+Sue 438: goldfish: 7, samoyeds: 8, children: 2
+Sue 439: children: 1, cats: 7, vizslas: 8
+Sue 440: cats: 2, pomeranians: 6, goldfish: 4
+Sue 441: perfumes: 7, cats: 3, vizslas: 6
+Sue 442: akitas: 4, samoyeds: 5, cars: 2
+Sue 443: akitas: 3, perfumes: 3, cats: 9
+Sue 444: perfumes: 10, akitas: 6, trees: 0
+Sue 445: cars: 5, children: 9, perfumes: 8
+Sue 446: vizslas: 10, cars: 3, perfumes: 5
+Sue 447: children: 9, perfumes: 1, cars: 10
+Sue 448: akitas: 0, goldfish: 8, trees: 3
+Sue 449: cars: 7, akitas: 8, children: 3
+Sue 450: cars: 4, akitas: 9, cats: 0
+Sue 451: perfumes: 4, samoyeds: 5, goldfish: 6
+Sue 452: perfumes: 10, akitas: 1, cars: 7
+Sue 453: trees: 1, goldfish: 3, vizslas: 6
+Sue 454: goldfish: 8, pomeranians: 6, trees: 10
+Sue 455: akitas: 5, vizslas: 8, goldfish: 10
+Sue 456: cats: 5, trees: 4, samoyeds: 0
+Sue 457: perfumes: 8, cars: 0, cats: 3
+Sue 458: akitas: 1, trees: 10, vizslas: 2
+Sue 459: vizslas: 6, akitas: 3, children: 10
+Sue 460: perfumes: 7, trees: 9, goldfish: 8
+Sue 461: children: 6, vizslas: 4, perfumes: 5
+Sue 462: vizslas: 6, akitas: 8, perfumes: 9
+Sue 463: goldfish: 8, cars: 4, trees: 10
+Sue 464: pomeranians: 8, cars: 5, vizslas: 0
+Sue 465: cats: 10, goldfish: 7, akitas: 1
+Sue 466: cats: 2, children: 1, cars: 6
+Sue 467: perfumes: 3, samoyeds: 6, cars: 0
+Sue 468: samoyeds: 10, pomeranians: 6, trees: 2
+Sue 469: children: 2, perfumes: 2, pomeranians: 4
+Sue 470: cats: 1, perfumes: 5, vizslas: 9
+Sue 471: vizslas: 5, perfumes: 2, akitas: 7
+Sue 472: samoyeds: 8, goldfish: 6, cats: 1
+Sue 473: goldfish: 10, perfumes: 9, cars: 4
+Sue 474: samoyeds: 0, cars: 4, vizslas: 4
+Sue 475: trees: 2, cars: 7, akitas: 8
+Sue 476: vizslas: 3, perfumes: 5, goldfish: 1
+Sue 477: cats: 7, cars: 4, trees: 1
+Sue 478: vizslas: 8, akitas: 3, goldfish: 0
+Sue 479: cars: 6, cats: 3, perfumes: 2
+Sue 480: goldfish: 1, children: 9, vizslas: 3
+Sue 481: pomeranians: 5, vizslas: 1, cars: 10
+Sue 482: children: 5, perfumes: 5, cats: 1
+Sue 483: perfumes: 2, goldfish: 7, trees: 6
+Sue 484: akitas: 2, goldfish: 4, perfumes: 10
+Sue 485: samoyeds: 3, goldfish: 0, akitas: 1
+Sue 486: trees: 8, vizslas: 9, goldfish: 0
+Sue 487: goldfish: 8, samoyeds: 0, trees: 0
+Sue 488: perfumes: 7, cars: 5, trees: 0
+Sue 489: vizslas: 3, pomeranians: 2, perfumes: 5
+Sue 490: cars: 5, perfumes: 5, akitas: 5
+Sue 491: children: 8, trees: 1, pomeranians: 4
+Sue 492: pomeranians: 0, akitas: 1, vizslas: 8
+Sue 493: akitas: 10, perfumes: 10, samoyeds: 8
+Sue 494: perfumes: 6, vizslas: 4, cats: 6
+Sue 495: children: 6, pomeranians: 5, samoyeds: 4
+Sue 496: vizslas: 1, trees: 5, akitas: 1
+Sue 497: vizslas: 10, perfumes: 10, pomeranians: 3
+Sue 498: samoyeds: 3, trees: 2, cars: 5
+Sue 499: cats: 6, children: 3, perfumes: 0
+Sue 500: pomeranians: 10, cats: 3, vizslas: 5
diff --git a/2015/16/puzzle-1.sh b/2015/16/puzzle-1.sh
new file mode 100755
index 0000000..3550231
--- /dev/null
+++ b/2015/16/puzzle-1.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env sh
+
+# Definitely there is a better way to do this, but this is fine
+# Original solution was just me using regex in vim lol
+
+sed '/children/!s/$/, children: 3/' input \
+ | sed '/cats/!s/$/, cats: 7/' \
+ | sed '/samoyeds/!s/$/, samoyeds: 2/' \
+ | sed '/pomeranians/!s/$/, pomeranians: 3/' \
+ | sed '/akitas/!s/$/, akitas: 0/' \
+ | sed '/vizslas/!s/$/, vizslas: 0/' \
+ | sed '/goldfish/!s/$/, goldfish: 5/' \
+ | sed '/trees/!s/$/, trees: 3/' \
+ | sed '/cars/!s/$/, cars: 2/' \
+ | sed '/perfumes/!s/$/, perfumes: 1/' \
+ | grep 'children: 3' \
+ | grep 'cats: 7' \
+ | grep 'samoyeds: 2' \
+ | grep 'pomeranians: 3' \
+ | grep 'akitas: 0' \
+ | grep 'vizslas: 0' \
+ | grep 'goldfish: 5' \
+ | grep 'trees: 3' \
+ | grep 'cars: 2' \
+ | sed -n '/perfumes: 1/s/Sue \([0-9]*\).*/\1/p'
diff --git a/2015/16/puzzle-2.sh b/2015/16/puzzle-2.sh
new file mode 100755
index 0000000..e854c7c
--- /dev/null
+++ b/2015/16/puzzle-2.sh
@@ -0,0 +1,26 @@
+#!/usr/bin/env sh
+
+# Definitely there is a better way to do this, but this is fine
+# Original solution was just me using regex in vim lol
+
+sed '/children/!s/$/, children: 3/' input \
+ | sed '/cats/!s/$/, cats: 8/' \
+ | sed '/samoyeds/!s/$/, samoyeds: 2/' \
+ | sed '/pomeranians/!s/$/, pomeranians: 2/' \
+ | sed '/akitas/!s/$/, akitas: 0/' \
+ | sed '/vizslas/!s/$/, vizslas: 0/' \
+ | sed '/goldfish/!s/$/, goldfish: 4/' \
+ | sed '/trees/!s/$/, trees: 4/' \
+ | sed '/cars/!s/$/, cars: 2/' \
+ | sed '/perfumes/!s/$/, perfumes: 1/' \
+ | sed 's/$/ /' \
+ | grep 'children: 3' \
+ | grep 'samoyeds: 2' \
+ | grep 'akitas: 0' \
+ | grep 'vizslas: 0' \
+ | grep 'cars: 2' \
+ | grep 'perfumes: 1' \
+ | grep 'goldfish: [0-4][ ,]' \
+ | grep 'pomeranians: [0-2][ ,]' \
+ | grep 'cats: \([8-9]\|[1-9][0-9]\)' \
+ | sed -n '/trees: \([4-9]\|[1-9][0-9]\)/s/Sue \([0-9]*\).*/\1/p'
diff --git a/2015/17/input b/2015/17/input
new file mode 100644
index 0000000..09ebd46
--- /dev/null
+++ b/2015/17/input
@@ -0,0 +1,20 @@
+43
+3
+4
+10
+21
+44
+4
+6
+47
+41
+34
+17
+17
+44
+36
+31
+46
+9
+27
+38
diff --git a/2015/17/puzzle-1.py b/2015/17/puzzle-1.py
new file mode 100755
index 0000000..b201e5b
--- /dev/null
+++ b/2015/17/puzzle-1.py
@@ -0,0 +1,18 @@
+#!/usr/bin/env python3
+
+import itertools
+
+
+def main() -> None:
+ with open("input", "r", encoding="utf-8") as f:
+ nums = list(map(int, f.readlines()))
+
+ combs: list[tuple[int, ...]] = []
+ for n in range(len(nums) + 1):
+ combs += list(itertools.combinations(nums, n))
+
+ print(len(list(filter(lambda x: sum(x) == 150, combs))))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/2015/17/puzzle-2.py b/2015/17/puzzle-2.py
new file mode 100755
index 0000000..43f8922
--- /dev/null
+++ b/2015/17/puzzle-2.py
@@ -0,0 +1,20 @@
+#!/usr/bin/env python3
+
+import itertools
+
+
+def main() -> None:
+ with open("input", "r", encoding="utf-8") as f:
+ nums = list(map(int, f.readlines()))
+
+ combs: list[tuple[int, ...]] = []
+ for n in range(len(nums) + 1):
+ combs += list(itertools.combinations(nums, n))
+
+ combs = list(filter(lambda x: sum(x) == 150, combs))
+ conts = min(map(len, combs))
+ print(len(list(filter(lambda x: len(x) == conts, combs))))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/2015/18/input b/2015/18/input
new file mode 100644
index 0000000..5efaa1b
--- /dev/null
+++ b/2015/18/input
@@ -0,0 +1,100 @@
+#...##......#......##.##..#...##......##.#.#.###.#.#..#..#......####..#......###.#.#....#..##..###..
+####..#.#...#....#.#####.##.##.#..#.......#....#.##...###.###..#.#.#........#..#.#.##...##..#.####.#
+...#..##...#.#.###.#.###..#.##.####.###...#...........#.###..##.#.##.#.###...#.#..###....#.###.#..#.
+.#...##...####.#..#.....#..#...#.#.##...#...##..#.#.###....#..###.....##..#.###..###.....##..###...#
+..##.#####....##..#.#..##.##..######...#..###.######.....#..##...#.#..##..##..#..#..#..##.#.#.#.#...
+.###.###.###...##...##..###..##.###.#.....##..##.#.#########...##..##.#..##.#..##..####..#.#.#.#####
+#.#####..###.###.##.##.#...#.#.#.#..#.###...#..##.###.#...####.#..#.#.....###..#..####..#.#.#...##..
+....#...##.....#....####.##.#.###..#.#.##..#.#...##.###.###..#.##..#.#.##..##..#.##.###..#.#.###.###
+##.##...#.##...#.#..#.#..#...###...###.#..#..#.#####..###.#......#.....###.#####.#.#..#.#.#.##..#.#.
+#.#..#.....#.....##.#..##...###..##...##...###.#.###.#..#.#.###...##..##..#.###...#.#######.#...#.#.
+#.#.....####.#..#.##...#.##....#####.###.#.....#####....###..#........##..####...#...#.###....#..###
+##.#.##..#.#.##.#.....##.#.....###.####.#..######.....####.#.#..##.#.##...#..#.#.....#.####.#.......
+#..#..#.#..#.######.##..##.####.....##.#.##.#.######..#.#....#.#...#.#..#..#.#.###.#..#.#.#..#...###
+####..####.#.#.###.....#.#.#.##..#.##.##.##.#..##..##.#.##.....#.#..#.####.....###.#..#.####.#.#..##
+###.##..##.#.##..#..##...#.#####.##.#....##.####.#.##....#..###.#.#.##...#.....#.#.#.#.#..##.#.#..#.
+......#..####...##.##...#.##.##...##..#..##.###..#...#..##...#.#....###.####...#.##.###.#.##.####.##
+..#...#####.#.#..#.##....#..#...#..####.....###...##.###....#..#.###...#........#.#.##..#..#.#.....#
+#######.#.#.###.###..######.##..#####.##.###.###....####.#..##.##...###.#..############.#.##....##.#
+#.#...##.###.#.###..#.#.#.#.#.#..##..####.#..##.....#.##..#.##...##.#..##..#.#.#....##....##.#..#.#.
+..#.#.####.....###..#######.#.#.#.#...##.#####.....##...##...##.###..######.###..#...####.#..###.###
+.#.##....#.#.##..##.#.##.##..######...#.....#..#.#.#.#.....#.#..##.#.#.......#######....#.......#...
+..###.##.##..##....#.###...#.....##..##......###...##..###.##...##.###.#.#.#.###.###.#.#...###..#...
+.##.#.#...#...##.#.#...#..#..#.#...##.#.##...##..#....#.#..##.#..#.#..#.#.....#..#.#...#######.#.##.
+...####....#.###.#..###..##...##..#.#.#.###...#..##.##.##..##.#...#..#.##.....#.#........#..#.#.####
+.....##..###...#....#.#.#.#...###.###...#.#...#.#.####....#..####...###..#..######..##.##..###.#####
+#####.##..#....###.###....##.....#.#..#....#.#####.##.#.####.#.##...#..###...###..##...#.###.#####..
+###.##..........########.######....####.###.#..##...#.##.####.#.....##..#####..###...#####.....#.#.#
+##..#####.##.#.#####.#.##.##..#.##....########.#####.#...#.###.##...#.###.#.#..#....##.#..#...#.#.#.
+.##.#....#..#...#..#####..#..##.#......#..#....########...#..#...#.....####.#...##...#.###.#.#..##.#
+.##.##.#.##.#.##...#.#.#..##.##.###.#..##..#...###.##.###.#####.#.###..#..###.#...#.###.#...#..#.#.#
+.#..#..#.#..#..###..#....###.####.##.#.###.#.##.###.#.##.###.###...###...###.#...####...#.##.##.#.#.
+###..##...###...#..##.#..#.#...##....###.##.##..#####....###..#..#....#..###.###.#...#.##...#.#.#..#
+#....#.......##.....#.##...#..#.###.#.##..##..#.##..#.###..##.##...#####.#..#####..#####..#####....#
+.####.####....###..###.#.##.####.##.#...####.#.###.#.....#...####..#####.###..#.#.###.##.##...##..#.
+####..##...##.########...##..###..#..###.##.#.#.#........#.#####.#...#.###.####.#..####..#.#.#....##
+###.#..#...###.#..#..#.###...##..###.##.#.#...#..#...####..##....#.#..#..##.#.#...#####.###.#..#.#.#
+...##....#.###.#.#..##...##.###.#..#..#......#...#.#..####.#.##..######.####.#...#..#..#..##.#.#.##.
+##.####.#...#..#.#.##..##.#.#.###..##...####......#..######.#......#.##.#....##...###.#.#..#......##
+#.....#...#######.##.#..#.#...###.#..#.####....#.#.##.#.##...###..#...#.###.##..#.###..#.##...#####.
+#####.##...#..#.#.#.......#.##..#####..#####...###..##.#.#..###.#.#####.####..#.#..##...#.##...#.###
+.##.#..#######.###.#.####.....##...#.##.#.#..#...##....####......######.#..######.....##########.##.
+##...#.#..#.##.###.#.#.#.##.###.##..##.##.##...#.#..###.#######..#.....#####..#....######.#..##..###
+.#.#.###.....#..##..#.#..##..#.###...###.#..##...#...#.#####.#.#####..###.#..#...##..#.#..#..####...
+.#......##..#.....####.###....##.###.....###.##........#.###.##..#..#.#######.#.######..##..###.....
+..##.#.#..#.##...#.###.###...######..#..#.#..#....###.#.#....#..........#...##.##.##.#..##..#.#####.
+###.###.#..#.##..##.#..#..##.....##.....#..#######.#..#.#.#.####.###..###.#.#..#.##.##.####.###.####
+#.#.#..#....########.#..#..#...##..#.##..#.#..##..####...##.....#.##.#.#...########..#.###.#..#.#.##
+.##.....#...#.#...##.##....###...##..#.####...#..#.#..#..#.##..#.###.##.####.##..####.....##.#.....#
+....####.#.##.#.##.#..##.#.######.##.####..#...####.#..###.#.#..#..##.#.#.....##.#####.#.####...#.#.
+#..#####.#####.....##....######..##....#..#.#.###.#####.....##.##.####.#...##...#.##.#.#####.##.#...
+##.####..###.#....#...#.#.#.#.###.#####.#.####..####...####......##..#..#..#.#.##...########....#...
+.###.#.#.#.#..####.##.#..######..#.#.###.....#.#......#.#.#.#..####.##...##.#####.#.##..##..#..#.#..
+.....###...#...#.####.###.#.#.#.#.....#....#.####.###.##.##.##.#######......#.####......#....##.....
+##..#..#.#.##..#...#..##.##.##..###.#....##.##....####.#.##.###....#.##.#.#.##...##.###...#..#..####
+...#.#..##..##.#...##.##...#.#......#.#.##..###....####.##...#.#.###.#..#..#.####..##..##..#####.###
+.##.##..##########.##...#.##.####.#.#######.##.#.##.##..#...##....########.###..##.##.##.#..##.#.#.#
+#####.#....#.##..#.....#......##.##..#.##.###..##.......###..##.#.###.##.###....####.#..#.###..#.#.#
+.#...#..#.##....##....#...####....#...#..#...####...########.###.#..##.#.#.##..###..#.#.###.....##.#
+##..##.....###......#..###.##.####.##.####.#.#....#..#...#..#.#..#.###.#...#...#..##.##...#..#######
+.....##..###..##...#####.#.#.....###.#.#..####...#.#.#..#..####..##.#..###.####.#....##..###....#..#
+#.#.##.#....#.#####.#....##...#...##...##....#.#.......#....#..#...###.###.#.####..####....#.##.#.#.
+..##...##..###.#.#.##.#..#....#.#.....##.###.#.###.###.....#...#.#..#######.#####..#.###...##......#
+#......###..#....#.#..#.###.##.#...##..###.####.#.#....#.##..#.###..##.#..#####..##.###.....#..###..
+##.#.##..##.###.#..##.....#.##.....###....##.####.######.#...#..###....#.#...#.##.....###....#..#.#.
+.##.#.#.#.##..#.#.#..##..#.###.####....#..###.######..####.#.....###.##..#...###.#..######.##.#.##..
+...##.####.#..##.#####.##.#...##..#..#...#.#.#.#####...#....#..###...#..#....#.#.##.#.######.#..####
+..#.#.#.#...#.######.#.....#..#.#..###....#.#.########...#....#.#.##..#...##...#.#..#.#.###....##...
+#####..#..##..#..##..#..#.#.##.#....#####.####.##.#.###..##..##....#.....#.#####.#...#.#####.##.#.#.
+#.#..#####...####.###.###.....####.###.....##...##...#..#..#######.#.##....##..####.....##...#..#..#
+#.#.###.#.#..##..#....#.#...#.#.##.##..#.##.....##...#.#..##.......##.#.###..#####.#.##....#.##.....
+...#.......#....#.#.####.#.###.###..#....#..##.#..####........#.##..#...#.#...###.#..#.#.#...#...#..
+...##.#####.##.#.###.##.##.#.##..##.#.#.#.#.#.##.#..##...##.#.#..#..##.##.#####.#.###...#####..#..#.
+#######.#..#..#....##.#.#..####.#..#..###...#..#.......###.#.#.####....#.###...#.#.###.#.#.#.#..###.
+..##.##.#.##.###....###.##.#.###.#...#....#.####..###..###.#.#..#...##.#.#.#..##.###..###.#.##...###
+######..######..##..##.#.#.##.##.#..##..#.#.#.##..#.#...#...#.#.#..######.#..#.#.######..#......##.#
+#.#####.....#.......#########..###.##...#...##.#.#..#...#####...#...#..#.###.#..#.#...###.#.#.#...#.
+#....##....###...##.##.#...##.........##.#.#..#.#.##.#.######.#####..#..###.###.#...#.#.##.######...
+#.#...###.#.###.##.#.######.#######.###.##..#.#.#...######.##.####.##..#.#.#.#......##..##.........#
+..###..##....#.....##...#.#.###.#.#.....##.#...###.####.#...#...##..##.#.#.####..###...######....#.#
+..###.#.##.####.#..#.##....##..#####....#..##.##.#..#######...#.####...##.#.#.##.........#....#....#
+.##.#...#.####..#.#...#.##..######.##..##.#.###.##..###.###....##..#.##.##..##.#...###.##.##.###....
+#...###.###.#..#....#.......#..#.....###..#.###.##.##....#.####.#.####.##..##..#..#.....#....##.#.#.
+.##.#..#..#.##.......#.####.#######.....#.##.##.#.....#.#..#....######.#..###.##.##.....#.####..##.#
+###..#.###.#..####.....##....#..####....#.##.##..#...######.#########...#.#....##...###.#..#.##...#.
+#..###..##..#.#.##.###.#.#.##...###.#...##.##..#.###....###..#.#...#.###..######.#..#.###..#..#..#.#
+.#........##.#.###..###.#.#.##.....##.##.#.#...##..#.##....###..#.#.#.#.##....#.##..#.#...###...#...
+####.####..#....#.#.#..#..##.......##.####...###.##..#.#.##.#..##..######.......##.#.##..#...#.....#
+..#..#..###..##.##..######.#..###..###.#.##..##.#..#####.#.#.#.##..#.##..##.##......####.#..........
+...##.##..###.#...###....#.#.#.#.....#.##.....##...#...#......####...##.##....##.#..#.####.#..###.#.
+..#.....####.#.###.#####..#..###..#..#.#...#####...###.###....#.###..#...#..#..#.#..#.##..##.#.#....
+..##.#####...###.###.........#....##.####.##..#.#..#.#...#...##.##.##..#.#.##.########......#####...
+...###.#.#..#...#.###.###.......##.###.#..#.##########...#..#.#.#.##.#.###...######..#.#...###.##...
+.#.#.#######.#..##.##..##...#...####...#..#####.#..##...###.#.#...#.##...#......#..##.####..#.....##
+.##.##.#.#......#######..###.....##.#.##..###......#....####...#.###.#.##.#........#..#....##.....##
+#...#.###.#.##...##.####....#...#.###..#.#.....#.#....#.#.#.##...#.#..#####.#.#..#..#..#....#...####
+.....##...###......#####..##.##.##...##.#.#####..##...#.#.#.#.###...###.##.####..#.#..#.#..#.####.##
+#..#..##.#.##.#.##.#.#.#..###....###.##.#.##.#...#.#..#...#....###.#..#.#.######.#...####..#..##.#.#
+#..#.#..#...###.#..##.#...#...##.#......#...#..#..####..##.....#.###...#.#..#.#....#.#####.##.###...
+###....#.#..#.#..###..#.##......#...#..#..##.#..###..##..#..#.####..#...########..##.#.##.#.#.#...#.
+.#.#.##.##.###..#...#.#....#..#.##..#.#.#.#.##.##.#####...#........####..###..####.#####..#.##.#.##.
diff --git a/2015/18/puzzle-1.py b/2015/18/puzzle-1.py
new file mode 100755
index 0000000..ef6d36e
--- /dev/null
+++ b/2015/18/puzzle-1.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python3
+
+
+def neighbours(data: list[list[str]], x: int, y: int) -> int:
+ acc = 0
+
+ for x1, y1 in [
+ (x - 1, y - 1),
+ (x - 1, y),
+ (x - 1, y + 1),
+ (x, y - 1),
+ (x, y + 1),
+ (x + 1, y - 1),
+ (x + 1, y),
+ (x + 1, y + 1),
+ ]:
+ try:
+ if x1 >= 0 and y1 >= 0 and data[x1][y1] == "#":
+ acc += 1
+ except IndexError:
+ pass
+
+ return acc
+
+
+def simulate(data: list[list[str]]) -> list[list[str]]:
+ ndata = [["." for i in range(100)] for j in range(100)]
+
+ for i in range(100):
+ for j in range(100):
+ if data[i][j] == "#" and neighbours(data, i, j) in [2, 3]:
+ ndata[i][j] = "#"
+ elif data[i][j] == "." and neighbours(data, i, j) == 3:
+ ndata[i][j] = "#"
+
+ return ndata
+
+def main() -> None:
+ with open("input", "r", encoding="utf-8") as f:
+ data = [list(l.strip()) for l in f.readlines()]
+
+ for i in range(100):
+ data = simulate(data)
+
+ print(sum(data[i].count("#") for i in range(100)))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/2015/18/puzzle-2.py b/2015/18/puzzle-2.py
new file mode 100755
index 0000000..9a998b8
--- /dev/null
+++ b/2015/18/puzzle-2.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python3
+
+
+def neighbours(data: list[list[str]], x: int, y: int) -> int:
+ acc = 0
+
+ for x1, y1 in [
+ (x - 1, y - 1),
+ (x - 1, y),
+ (x - 1, y + 1),
+ (x, y - 1),
+ (x, y + 1),
+ (x + 1, y - 1),
+ (x + 1, y),
+ (x + 1, y + 1),
+ ]:
+ try:
+ if x1 >= 0 and y1 >= 0 and data[x1][y1] == "#":
+ acc += 1
+ except IndexError:
+ pass
+
+ return acc
+
+
+def simulate(data: list[list[str]]) -> list[list[str]]:
+ ndata = [["." for i in range(100)] for j in range(100)]
+
+ for i in range(100):
+ for j in range(100):
+ if (i, j) in [(0, 0), (0, 99), (99, 0), (99, 99)]:
+ ndata[i][j] = "#"
+ elif data[i][j] == "#" and neighbours(data, i, j) in [2, 3]:
+ ndata[i][j] = "#"
+ elif data[i][j] == "." and neighbours(data, i, j) == 3:
+ ndata[i][j] = "#"
+
+ return ndata
+
+def main() -> None:
+ with open("input", "r", encoding="utf-8") as f:
+ data = [list(l.strip()) for l in f.readlines()]
+ data[0][0], data[0][99], data[99][0], data[99][99] = "#", "#", "#", "#"
+
+ for i in range(100):
+ data = simulate(data)
+
+ print(sum(data[i].count("#") for i in range(100)))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/2020/01/.gitignore b/2020/01/.gitignore
new file mode 100644
index 0000000..60d075d
--- /dev/null
+++ b/2020/01/.gitignore
@@ -0,0 +1 @@
+puzzle-[12]
diff --git a/2020/01/Makefile b/2020/01/Makefile
new file mode 100644
index 0000000..c32dafa
--- /dev/null
+++ b/2020/01/Makefile
@@ -0,0 +1,7 @@
+all:
+ ${CC} ${CFLAGS} -o puzzle-1 puzzles.c
+ ${CC} ${CFLAGS} -DPART2 -o puzzle-2 puzzles.c
+
+.PHONY: clean
+clean:
+ rm -f puzzle-[12]
diff --git a/2020/01/input b/2020/01/input
new file mode 100644
index 0000000..127b7a7
--- /dev/null
+++ b/2020/01/input
@@ -0,0 +1,200 @@
+1293
+1207
+1623
+1675
+1842
+1410
+85
+1108
+557
+1217
+1506
+1956
+1579
+1614
+1360
+1544
+1946
+1666
+1972
+1814
+1699
+1778
+1529
+2002
+1768
+1173
+1407
+1201
+1264
+1739
+1774
+1951
+1980
+1428
+1381
+1714
+884
+1939
+1295
+1694
+1168
+1971
+1352
+1462
+1828
+1402
+1433
+1542
+1144
+1331
+1427
+1261
+1663
+1820
+1570
+1874
+1486
+1613
+1769
+1721
+1753
+1142
+1677
+2010
+1640
+1465
+1171
+534
+1790
+2005
+1604
+1891
+1247
+1281
+1867
+1403
+2004
+1668
+1416
+2001
+1359
+686
+1965
+1728
+1551
+1565
+1128
+1832
+1757
+1350
+1808
+1711
+1799
+1590
+1989
+1547
+1140
+1905
+1368
+1179
+1902
+1473
+1908
+1859
+1257
+1394
+1244
+1800
+1695
+1731
+1474
+1781
+1885
+1154
+1990
+1929
+1193
+1302
+1831
+1226
+1418
+1400
+1435
+1645
+1655
+1843
+1227
+1481
+1754
+1290
+1685
+1498
+71
+1286
+1137
+1288
+1758
+1987
+1471
+1839
+1545
+1682
+1615
+1475
+1849
+1985
+1568
+1795
+1184
+1863
+1362
+1271
+1802
+1944
+1821
+1880
+1788
+1733
+1150
+1314
+1727
+1434
+1833
+1312
+1457
+160
+1629
+1967
+1505
+1239
+1266
+1838
+1687
+1630
+1591
+1893
+1450
+1234
+1755
+1523
+1533
+1499
+1865
+1725
+1444
+1517
+1167
+1738
+1519
+1263
+1901
+1627
+1644
+1771
+1812
+1270
+1497
+1707
+1708
+1396
diff --git a/2020/01/puzzles.c b/2020/01/puzzles.c
new file mode 100644
index 0000000..29384e0
--- /dev/null
+++ b/2020/01/puzzles.c
@@ -0,0 +1,39 @@
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define BUFFER 200
+
+int
+main(void)
+{
+ int nums[BUFFER];
+ FILE *fp;
+
+ if (!(fp = fopen("input", "r")))
+ err(EXIT_FAILURE, "fopen");
+
+ for (int i = 0; i < BUFFER; i++)
+ fscanf(fp, "%d", &nums[i]);
+
+ fclose(fp);
+
+ /* Inefficient, but small sample size so it's fine */
+ for (int i = 0; i < BUFFER - 1; i++) {
+ for (int j = i + 1; j < BUFFER; j++) {
+#ifdef PART2
+ for (int k = j + 1; k < BUFFER; k++) {
+ if (nums[i] + nums[j] + nums[k] == 2020) {
+ printf("%d\n", nums[i] * nums[j] * nums[k]);
+ return EXIT_SUCCESS;
+ }
+ }
+#else
+ if (nums[i] + nums[j] == 2020) {
+ printf("%d\n", nums[i] * nums[j]);
+ return EXIT_SUCCESS;
+ }
+#endif
+ }
+ }
+}
diff --git a/2020/02/input b/2020/02/input
new file mode 100644
index 0000000..45e8c19
--- /dev/null
+++ b/2020/02/input
@@ -0,0 +1,1000 @@
+5-6 s: zssmssbsms
+3-6 j: jjjjjrrj
+4-7 k: kfkgkkkkk
+2-3 n: nkbgfnn
+7-12 h: hhhhhhdhhhhhfhhhh
+1-4 v: nvvv
+6-9 h: hhthplhgmpzsmhhxhh
+6-7 r: rrtrrrgrgcc
+10-15 h: sdbhvbhfjhwllmrpdv
+3-4 s: bsss
+5-7 s: sstjsswsspldr
+10-14 b: bzbqbbbkpvbblbnrbs
+4-11 s: sssmcskwsssssss
+2-10 v: rlttvvnvvvvvvksm
+4-5 x: xkrxx
+2-5 m: bfmmmmm
+11-14 r: rlprrtrcrxcrgrrhrr
+4-16 l: dzllmllldnllblwcr
+3-4 t: nplr
+3-5 x: jcxxgkxtjwwgh
+3-4 j: msjcjqjgxmjsjfjjj
+1-6 z: zgkkdzww
+3-5 q: pgqqbq
+17-19 t: tttkttwtttttttttttt
+5-11 n: nqnlfknntdn
+11-12 c: ccccccccccgc
+2-14 x: pxmvfrrwlbzxhk
+4-5 g: gcggwggxv
+4-5 h: phbzhhhqhl
+4-5 h: hwbhk
+1-2 t: tgmq
+16-19 l: llllbjlfvnlhwlllqfp
+4-6 r: srrrqggrs
+1-3 g: nggwhvcl
+1-8 f: pffffffff
+2-3 l: lllll
+13-15 d: ddrdkdddmdmdddd
+11-13 r: rrrgrkrrdrwrrr
+3-10 x: xxxxxxxtxq
+6-7 p: pspzpvlpxnplhtpc
+3-8 f: fsfkfbffvxfc
+3-5 z: zzzvwzsfktz
+4-7 c: cccgccc
+11-12 n: nnnnnnnnnnzn
+12-13 n: nnnnnnnmznnpnnn
+4-7 q: wqqzgqgfg
+5-13 p: tgplpbpmvgpppktps
+12-13 x: zwcxlnhwpsvxm
+7-10 r: rrrrrrnrrrrgr
+1-5 r: rlrrj
+15-18 l: nlllllslcllllllllcl
+10-11 w: wnwwzwwwwwwwmwrwr
+10-11 j: njmmjjjcjjv
+3-6 z: vgbdvzgzzzzw
+7-8 r: bbcvxzrqpqskcmhwsvx
+4-5 c: rgvcgmccc
+6-9 d: ddddddddd
+6-7 g: gggsggg
+4-7 c: ffclfbcdmcvnshw
+3-5 n: xnznv
+6-7 d: ddddddk
+1-2 r: rjvprt
+6-7 p: ppphppp
+1-11 p: ppppppppppxppp
+10-16 x: bxxnxpxxxcxjxtxnw
+4-8 s: hzsvsswc
+10-12 p: lpwswppppvppphp
+2-3 d: bdcddnxc
+4-6 s: ssscssp
+18-19 k: kkkkkkkjkkkkkkkkkzk
+4-6 x: ncxpxx
+6-8 h: xhhhqxrhhhfh
+15-16 p: qppjnpzfvppzdppgppp
+1-7 d: dwvdddddc
+3-4 w: wlshzvqw
+4-16 s: sbwgjshsznhdsssjts
+4-8 t: ptttbkbhtt
+11-12 w: wwddwwwwwwwj
+2-6 z: zkzzzzzhzzzz
+3-6 b: bbxbbb
+3-6 z: zztzzq
+2-3 h: hhjhh
+1-5 x: xptxl
+10-11 n: nnwnnnnnndrnpp
+5-6 s: jsswmjzkrspsms
+2-7 n: nnnnnnnn
+4-6 q: qqqhgxg
+5-6 r: rrrrqrr
+4-5 k: kstjksjbkhhfpzkl
+5-6 n: nnnnqpldn
+11-13 w: mptdwqgfkwwzb
+3-4 x: ccxxmxfzfztxvxdg
+2-13 w: wwwwwgjwwwwwwwwwwww
+1-5 m: mrmkjqhdcqbz
+7-8 l: lldllllh
+7-17 d: ddvddddktmckjbmds
+3-8 n: htnnnnqlv
+3-8 v: chvkvjkvxl
+8-12 t: rtffbltcbtttwtqbvt
+1-8 n: nhnbvdwq
+6-11 b: bblbbmbbbbbbbbbbb
+4-7 s: rssbphs
+8-9 q: wqqdqqqwqq
+10-11 f: sfwfffdffhntffj
+4-5 x: xlxbxx
+2-4 d: lvdd
+3-6 t: djtcsmjrrt
+7-11 v: lvvvvvxvvvv
+3-4 c: ccpc
+3-17 g: nzgjkrpwbfcgzqjvtth
+8-15 l: lnhlllgllvgllbgscl
+10-11 z: zzzzmzzzzmzzjz
+3-10 b: bwntlkjnfbm
+5-6 f: vffxnfjffp
+1-4 s: dvcssdw
+11-13 c: cccctcfccckct
+4-6 m: cmtzbmkqqgbmpsmbxwkw
+11-13 j: jhjjcjmjjjqjvj
+6-7 q: qqqqqqqq
+4-10 f: fmxffftfnbm
+7-10 n: cdnrfrnvpmmhpnmxbnx
+8-9 z: zzzzzzzvz
+2-9 h: zrvhddntmhjhhh
+11-12 g: gggggggggggg
+1-2 h: vhtgfg
+1-2 g: gggp
+1-2 r: nrktwt
+2-8 b: bslkbbbbb
+1-5 q: lrfqmq
+10-14 q: qbqbqpqqqrqdqqq
+7-16 r: nvrrzhsgrwthgbrqkqh
+4-5 z: zzzzh
+3-8 v: nkvwfvlvv
+8-9 z: zzzzzzzfs
+2-4 w: vrlrss
+1-2 j: jnqswjgps
+7-8 f: ffzffffwff
+11-12 k: klwqntvkpcthq
+5-13 k: kkkkkkkkkkkklk
+2-5 w: wwwdxgwwszb
+1-13 q: cqqqqtqqdmmnqm
+3-8 q: bqtlqqzn
+3-12 n: xnzdxdnndpnnqhcnnnnn
+6-7 r: kqhrrrxldrmwr
+3-5 k: hjkdp
+5-6 h: hhhqhrmhbh
+14-15 v: vvvvvvvwvvvvkvvvv
+2-10 h: nbcpsmpvph
+8-9 r: rjrrrrrrp
+8-10 j: jjjjjjjcjt
+8-13 l: jkfllllllxldvplvll
+5-11 m: mmmmmmmmmmmm
+5-6 v: vhvvgvv
+12-13 n: nndnnnnnnnnnb
+3-4 f: wfmfjfffnfflf
+4-14 l: llllllvllllllf
+10-13 f: vvtfcfxfwdfmnf
+4-8 w: wxwwwghwpwrtwww
+5-8 g: tsggmgcggg
+9-11 w: wcwwwwwwwlqw
+8-10 z: zzzzzzzpzz
+2-4 m: mmrm
+16-17 k: kdkkkkkkkkwkkkpklkkk
+4-8 k: kkkkkkkn
+2-5 p: wpppqtwkpbptmlds
+6-8 f: ffbffnff
+2-16 z: ffzjwnbbljfzgfrlz
+3-18 j: jjqdrpcjjjjjjbfbjjj
+10-11 v: vjvvvvvvvvm
+3-8 f: fmnpffflfnd
+13-14 n: nmnnnnnnnnnnnr
+3-11 k: jrkrkjzccwhlxkgkh
+1-4 z: pzzzhzz
+6-7 k: kvknwkj
+2-10 l: cllblhlwlq
+3-4 n: nnnng
+3-6 w: tjlzwwc
+12-17 l: llllvlllllllllllw
+2-4 h: dhhlmhqddhnh
+1-2 r: rsqjd
+10-13 s: zszlssssssjsswpssssz
+2-6 v: vmvvdxvv
+9-13 m: qpmdmzmmxjswmmmmm
+19-20 f: pzjnfzfwfcffffxmfffl
+1-5 n: nnnsknnnn
+13-14 r: rrkrrrrrrrrrrr
+9-10 h: hhhhhhphfh
+6-8 x: ppcxlxhl
+1-3 z: bzxwzjhcgwcjgfgrlc
+8-9 n: nnnnnnnwwn
+5-6 g: qcgghgg
+3-4 p: ppxp
+7-9 b: phbbtbsbffbjbbb
+5-13 t: tcstttjtzdnhkt
+10-12 k: mkckkkkkkbkkk
+4-5 v: twcpvvzvjsvzqvwkbc
+17-18 m: bflhwmndwmkcmqsmmgkm
+14-16 t: ptttrtttpttttttfhtlt
+7-10 b: bxbrbbbnmcbbvbb
+6-9 r: rwvrrpmmr
+10-11 h: hxhhhhhhhhx
+4-5 h: hmhth
+1-3 l: lldl
+1-2 d: dqhsxsqmmndx
+10-13 l: llllhlqllslld
+18-19 z: zzzzzzzzzpzzzzzzzcpz
+5-6 j: jjjjjp
+7-9 t: tttttttttt
+6-8 t: tttttttzc
+5-17 x: xxxxxxxxxxxxxxxxxxxx
+16-20 x: xdxxxxxwxxxxxcxpxsxw
+3-4 f: ffxf
+4-9 q: mqqcqqqqqqd
+2-6 z: zdjnzjtr
+4-7 p: phppppv
+11-12 m: mgmshkmmbmqmmmmm
+2-5 b: ztltbbpgxmbbptqb
+4-10 v: vjvwlvfqmrhffvbkfv
+1-3 k: xdcthk
+3-9 s: ssssssssm
+9-18 w: whjwnwwwkwbwwwwwwwww
+16-17 j: jjjkcjjjjpjjjjjjdjjt
+9-12 b: bdvjzbwbbgbbqb
+2-6 f: ffrrsj
+3-8 t: tttttttwt
+5-7 c: cczcmcxc
+5-6 z: tfwszq
+8-9 k: kkkrskkdkkr
+5-7 h: hhwhhhghh
+8-14 m: smfgmmmkmmmmmmmpxmnn
+8-9 w: gwwmplbkjf
+1-8 z: kjzwvtvdhpkzjzlxpjq
+3-5 b: mgbqbbb
+3-4 g: skltgpcng
+7-8 k: cxxkktkc
+12-20 b: fbbmcbbhkbbbbhbbbbbz
+6-19 k: gvflkkgqbkckcmlcqkl
+10-11 l: llllllllkdll
+3-4 g: ggqg
+5-6 d: ddddzd
+4-5 n: nvnnn
+4-5 j: jsjsjj
+1-4 m: mmmmmmmmmmmmmmmmm
+11-15 c: fljcwwlnbfzxfqt
+3-4 l: lwlndjl
+7-10 w: wqwwvwwwwjw
+15-16 k: fkkkvkkklbkkxkdkkr
+3-4 z: zszz
+5-7 z: xzzhlzzzplzzq
+8-9 z: zzzzkzzzk
+2-13 h: hhhhhhhhhhhhqbhh
+6-9 n: dnnzwdnncqnjnnvm
+6-10 r: rkwlrdsrrrzrrrr
+1-4 b: bbbwbb
+1-2 b: vbxm
+5-11 m: jrkbkmmmmmmmw
+2-3 n: wnmntnxdkl
+11-12 f: ffwfnffffvxfffff
+1-2 m: xhgmxvmkzj
+10-14 s: sssrnsssssssssrsv
+3-9 x: xxxxpxxxgx
+2-7 d: pddwwpbv
+2-5 l: lljslz
+3-4 g: ggkg
+9-13 r: crrrlwzbrvjzt
+4-5 k: kkzpkfk
+2-4 q: kqqxq
+6-8 c: tcmcccccccfccgcchc
+7-17 r: nrsdshrrqhjllsrjrjxr
+1-3 b: bpgkwcbnb
+3-8 t: zdnjtvttjgt
+6-7 v: gpgnwkgnvkv
+5-7 v: vmvcnjvvvmv
+4-7 z: zvrjzxzzdxzlpz
+3-9 m: cdlplfjrmvbdvm
+7-8 w: wwjwwwwww
+13-15 q: qqqqqqqqhqjqrqjjqrq
+8-9 v: vvvvvvvvg
+3-6 f: qfffffjf
+2-4 d: nddpxd
+1-3 q: bqmqqqqq
+14-16 j: jjxjbjjjjjfjjjjfgj
+5-6 t: ttttgtt
+14-18 l: llllllllllllllllwbll
+11-15 c: kscccdcdccdccccc
+15-17 v: vvvvvjvvvlvvvvhqvvv
+5-6 b: bbbbnl
+3-10 r: rrrrrrtrqkjr
+11-13 w: wwwwhwwwwwskw
+13-14 h: hhhhhhhhxhhhhs
+8-9 k: kkkkkkzkw
+11-12 m: mmmmvmmmdmmcm
+2-9 k: kffkknkfkkkkkgkk
+4-13 d: dggdndznddddc
+4-7 t: kksmtmdswzvt
+2-4 z: ppzccxtbcnwswtlc
+11-14 r: rrrrrprrrrrrrvr
+14-15 x: xxxxxblxxxxxxtxxxc
+7-9 b: bkxjjjbtbtlhgrtmb
+4-5 p: fgzdp
+5-8 l: ncrlljltnllll
+1-2 x: mxgcx
+7-12 x: xxxxxxxxnxxr
+1-2 r: rkrrrrlnrrrr
+6-10 q: qqbqbqqqqqqzrqz
+2-9 b: bsbbbcvbcxcrbbbbgpcd
+12-19 x: xtlrxvxsxxjxxxknxxcx
+2-3 p: mzpptxpg
+3-5 d: gkdzgdjlzbfvcbhtgl
+5-9 t: ttttnzttt
+15-16 q: qsqqqqqqqqkqqnwqqq
+12-14 q: qqqqqqqqqqlfqpz
+3-8 b: lslqgrzbgbjzthlgnrmc
+9-12 m: wmxmmsmmvmcm
+3-4 t: qxttt
+3-11 m: kbzljjmbpxmt
+14-15 n: nnnnnnnnnnfnnnvnsnnn
+11-17 l: lclglllclzflllbllt
+6-7 m: msmmmmskq
+6-10 c: ccccccxccc
+9-13 l: plpgntbglpbgfj
+5-8 l: llxltljlws
+3-7 z: zqzlztgzkzszb
+11-15 k: kkkkkkkkkkkkfkqkk
+15-16 l: mgxlzbvfwbdmptlbjwz
+9-13 j: jjjjjjgjjjjjjj
+7-8 z: zzkzzzzbz
+14-15 j: jjjjjjjjjjjjjlv
+3-7 q: qqdtqgqq
+2-4 c: cccpzn
+4-7 k: hkkxkkk
+2-5 k: kxkkkk
+14-15 w: jwwwwwvwwwwwwwpw
+2-6 g: gmrgdgnwdbhggxgh
+5-14 q: djqtxqxkmgqxqqcplwqq
+14-15 q: qqqqqqqqqqqqqqq
+3-7 x: dqxqxxtrx
+8-13 j: jjjjjjjbjjjjjjjjjj
+18-19 r: rrrrrrrrrrrrrrrrrcr
+3-14 x: xxsxxxxxxxxxxxxx
+7-14 s: kknsngsgkfswjlsns
+3-4 z: zzjz
+2-4 z: zzzd
+1-3 d: dqzdgzwdjmdcpfpfd
+3-4 p: jppj
+14-15 c: lcccctcccccczzdcccc
+14-15 f: fffffffmrfffffpffx
+1-5 c: qcvvrcqm
+2-11 t: trcltttgttttt
+8-9 j: jjjljfjkjjj
+1-12 t: wttttttttttttt
+7-14 q: gsqqqqgmqqqqclqxdq
+5-7 h: hhhhslrlhwsmphc
+14-15 x: cxrxxxxxxxxxvxrz
+3-6 k: rkkkkkk
+3-4 t: dtmttt
+1-8 z: zzzzzzzgzz
+3-17 t: rtlwttmttttxtttttttt
+4-7 w: wwwswww
+3-4 w: qvsww
+8-11 g: ggggdgqdgggnh
+14-16 q: qqqqqqqqqqqqqqqqq
+11-12 d: ddddddtddrbddd
+10-12 v: wvhvxqpvvbvqvtvmv
+6-11 c: cpckcmcctccc
+5-9 r: djrcrrrrrrmr
+5-9 t: ttbcmnbzt
+6-11 f: lwxssffcfks
+12-17 v: vvvvqjvvvqvzvvnvvck
+11-13 k: kwvtzwczgdwqwp
+3-6 l: zdglhlklllhk
+15-17 x: xxxxxxxxxxxxxxpxsnx
+2-7 s: swdsssx
+4-8 v: xvxvxgmvvvqwvhtqt
+17-19 n: nnnnnnnnnnhnnnnnnntn
+2-4 p: jtppkrgpfph
+15-16 v: vvvvvvvvvvvvvvrfv
+6-9 q: wqxqqdvdqq
+14-16 w: wpwwwwwtwwwwwcwwwdbw
+5-6 k: kjrrnk
+6-13 w: qfcjlwtlbwgvp
+2-3 b: sbbbx
+1-3 b: bpbf
+2-7 r: dsrrnbmdf
+3-13 w: wwwwswjmwwwwdww
+3-5 l: dzhll
+7-9 l: llqllfzxw
+2-5 n: cdkhngnnf
+4-12 q: dqqkqklqqqqh
+14-15 b: twbbbbgbfkbbbbgcbt
+10-16 q: qqnqzbqqzgqrqqqqqqqx
+1-3 x: sjltfnnx
+9-16 g: tcghdqfsqbcllvdsckx
+6-9 w: pwhwjwwxdwjw
+3-5 l: rlxlflz
+7-18 p: pppppppppppppppppppp
+4-14 t: wvfglxkbtrqxkjjtqccl
+15-16 b: bbhnbbqqfbbbsbcz
+3-4 n: znpnfntn
+6-9 v: vvvvvvvhfz
+17-18 p: pppppppppppppppprp
+2-18 n: lnnnnjpnnnnnnnnnnt
+12-14 b: bvtbbbbbbbbbbs
+2-6 r: rrrwrrrr
+3-4 f: fpfk
+1-4 s: skcrmsczxwxrn
+4-7 n: nnnpnkz
+5-17 j: jkjjgjjjjjjjjjjjj
+7-8 n: nnnnnnpnjsn
+1-5 j: rdjhp
+3-5 f: hdfff
+1-3 j: qqjj
+2-3 j: vhjrz
+7-15 r: jrrrrrrrbrrrrrr
+3-6 r: pwdpzr
+6-10 n: lncrcndstsww
+10-11 m: jmqqmmvshmj
+3-5 s: sjjnsvshs
+11-12 v: vvlvwvvhvgvkcvv
+6-8 c: wcpcclcc
+10-12 x: dxxxxxxxxgxxx
+5-7 s: sssssst
+2-6 j: jksjjkjj
+3-4 w: wqrw
+2-4 c: qgzdchzcsc
+4-6 c: cwngwcxwdcpspfccgdcl
+9-10 g: ggvggggxgrgg
+5-17 h: hhrwhhfwtrfhzhhblxxv
+4-13 g: ppcgtcqgdzswgjtp
+3-10 r: rmhwrbtrrwktcqrr
+2-7 l: vqhgljg
+2-9 l: llgmcllqglllczl
+14-16 c: zmccccccccbccnccccfc
+10-11 z: zzzzzzzzfzz
+5-10 b: bbbbbbhrxbbbb
+7-9 b: bbnbbbgbb
+9-11 t: tlttttttqtstm
+11-13 p: pfmwgpzppppgppppp
+14-15 d: ddqdddddddddddpd
+5-11 x: xcxvxxqvgnlxzxfdp
+12-16 x: xxtxxgrxlxzzwgxm
+15-16 z: ztzzzzzzzzzzzzlz
+2-6 j: jdjjjjjjjj
+4-6 p: zqjkgfctlwqplppj
+1-2 d: ddzdd
+14-16 v: vvvvvvkvvvvvbjvvcvv
+3-4 x: xxxxxk
+16-19 t: ttttttrtttmttttqttc
+8-14 b: pbcbsbhbbbbbbgbn
+2-9 v: vkvvvvvvvvvv
+3-6 x: xxxxxnxl
+13-14 r: rrrrrrsrrrrrrjr
+10-12 x: xxxmxtxwxvxxpxx
+4-5 h: hntfhzwhhhv
+11-16 z: zzzzzzzzzzqzzzzzz
+3-8 h: qfhhhhhmd
+1-4 r: rbrw
+3-5 q: mqqqqqscq
+2-9 n: nnnnnnnnnn
+12-15 v: vvbvgvvvvvvvvvcqvv
+8-10 j: jjjgjrjjjkjj
+9-14 m: mmmmmmmmmmmzml
+5-7 v: zvvvvvwx
+13-14 t: tttttttttttttkt
+3-6 l: lvwxlll
+6-7 w: xhbgnlg
+11-12 z: zzzzzzzzzzwzz
+1-11 m: mmxrltjrmmmwm
+9-10 b: bbbbbtbbbrbbb
+6-8 n: xnnpkncnhlv
+14-17 w: wwwjwtwwntsgwwrwm
+12-18 z: zzzzzzzzzzbqzzdzzz
+1-8 j: kjsjnjjm
+14-18 h: hhhqhhhhhhhhhbhhhr
+7-15 n: cpxrrxnvbmwktqg
+6-8 w: twtwwdwnwww
+1-2 s: sfwss
+1-6 z: zzcrqfjkcrkcxnwzz
+6-18 n: nnnnnnnnknnnnnnnnw
+4-10 z: zzzzgzzzzzz
+6-9 s: xvrcshqcsmslsshtscj
+2-16 w: gwbljbgmwzgpfjtqnjkj
+10-12 j: gwjjjjjkjjtjjjjjj
+2-5 p: prpps
+5-6 f: fffffr
+4-5 r: rjnvr
+6-9 c: csccccqpgccc
+12-14 g: ggggggdggggdgg
+9-12 p: pppkpfppppplp
+5-11 f: mhfpffffdfzdrnskfwff
+6-8 h: hhhhnxhhh
+18-19 m: mmmmvsmmmmmmmmvmmzm
+7-9 g: ggptdsgzg
+1-7 f: kffzqmfp
+10-12 p: pppppptppppk
+10-11 f: vfftfffffffff
+10-11 f: rxxlzzpvcfbtzfww
+3-7 b: bbhrhrb
+4-7 j: tjjgjwfnrh
+10-12 g: gkggpgggggzfrggvgdhg
+7-8 z: gpqfckkzknzrvgngpfh
+6-9 c: cccgcnfckgt
+2-11 x: zlfxsxslzcxp
+16-19 j: jfjjkltpxlqjbvjjjbt
+13-17 k: kkkkkkkkkkkkkkcknw
+5-9 f: ffxhfxflf
+7-9 g: gprnxtxlgndg
+1-2 l: tjllwll
+7-9 w: wwbwccwwvcwwwz
+6-7 n: ntmklznfl
+4-7 r: rrrlrrpr
+7-12 v: vhmvvvgvvvvs
+5-7 t: vfwgctwq
+16-17 m: mmmmmmmmmmmmmmmjm
+11-13 j: jjjjjjjjjjfjg
+4-7 d: dfdddcdwzdrd
+7-14 j: jgjjljmmjjzkgjjjqx
+10-11 b: bdhbblbbbxhbbd
+8-17 k: kkkkxvnrmkkskkkkk
+13-15 v: vvvvvvvvvvvvvvv
+3-7 t: ltptttf
+1-2 q: qqqkj
+11-13 t: tmttttntttttft
+4-6 t: xgtxrt
+9-12 q: fqqpvqqqhcqzqqq
+5-8 s: qdjtcsfssss
+2-17 c: ccdccccccczqcccccc
+3-11 q: qqpqqqqqqqqq
+4-12 l: qkqxllknxltdlzlsllj
+2-8 r: qlrddbplz
+16-17 l: xllllllllllllllgb
+8-12 j: kjdfjjjjjjrpjfhjjrj
+8-9 d: qvddsrddvpvbddbdddm
+4-5 p: pptss
+4-6 c: cccscc
+4-5 c: cccrc
+1-6 r: rzrzfd
+1-4 t: tttzz
+6-8 d: ddgdsjdd
+6-8 c: cccdccccccq
+6-9 k: kkkkkvkkk
+1-4 m: pmrm
+15-17 d: ddddddddddcdddzdd
+6-10 b: cljmbjbtbbz
+6-11 l: lllllwllllvlll
+13-14 r: rrrrrrrrrrprrmrrrrg
+3-5 w: hnwbd
+3-8 f: fffxfffz
+5-9 z: zhzzztzqnzzpl
+3-4 x: jxvgxhrd
+8-9 x: xxgxxxxxjxx
+3-6 z: zlvzfzbzzzb
+2-3 v: jvrvq
+10-11 q: kqjqtpzqwbqzqh
+9-10 g: ghgxgcggdg
+5-8 r: srmrrqps
+3-4 k: kgkkk
+3-4 f: dfsflf
+3-4 m: mmmxm
+10-11 x: xxxxjxxmxwxx
+16-17 n: nnnnnnqnnntnnnnnnnnn
+2-13 l: lfblltnlrllll
+1-4 l: blblllnnlllj
+4-17 k: nkltzflkkjmmknxwkf
+4-6 s: sstssfssssssssss
+1-2 f: fkvbs
+3-5 v: vvvhcvv
+1-3 t: nttttttt
+1-3 p: ppnnppph
+10-15 q: qqqqqqqqqqwqnrqq
+2-18 v: vvvvvvvvvvvvvvvvvv
+2-3 r: zgrrbrmhqtxc
+19-20 x: xxxxxxxxxxxxxxxxxxxv
+10-16 n: nzvfnnnnnnnnnnffn
+3-4 d: dvdcdw
+3-16 l: vrqhbhvmlrllllfl
+14-16 c: cccbcpcccccccwccc
+7-9 l: lmlnllllll
+7-9 r: rfrrrqlrrrsbr
+9-19 s: snmbxvrcsssnhpswrss
+5-6 s: ssssks
+4-9 l: llllbllllllllz
+5-9 w: wwwwdbwwwww
+2-4 w: mvvw
+17-18 v: vvvvvvvvvvvvvvvvrvv
+8-9 h: hhhhhhhhh
+3-4 n: ntcn
+3-4 b: nbbr
+8-11 b: bbkbbbbfvbbb
+5-8 d: nddnjcdd
+12-13 v: vvvvvvvvvvzvh
+2-5 k: kfxlc
+3-4 r: rrrm
+10-16 k: kkkkkkkkkpxkkkkkkkkk
+5-6 z: zzzzdm
+12-18 p: rrpplpwppgppvpppppp
+9-15 x: vxpfxftcxlmzccz
+7-8 g: kpgmghgrkgggqbnhggg
+4-13 k: kkkkkhbktkwbkcvk
+2-7 g: bgggcgtxg
+18-19 q: qqqqqqqqqqqqqkqqqhqq
+12-16 r: rmdvrrrqrbgdxprrr
+4-5 v: lrvxvjlxvfkcbsvv
+1-10 l: lllwllllnllvlllll
+1-5 t: ttttmt
+1-3 v: vfrdvj
+9-12 j: jhjwjbjjjjjpjw
+3-10 m: mnrdhxmmmm
+3-11 n: ngnzbxwgcddgtwvxtrt
+2-4 q: dqqq
+5-9 z: zgdzzzsfzzxslvzwzp
+1-10 x: xjxxxxxxxlxx
+3-4 x: gnlvxwt
+5-10 q: dqqqqdqqfqqqqqqq
+8-9 p: nmpcpppzpnpcpppn
+5-6 f: fffffr
+6-8 h: ghhphhnhmhhhhhz
+6-9 h: hhkshhhkhh
+3-4 v: cffvrv
+7-8 h: qvzvlzxhhqlsrjrgjwf
+5-6 t: ntjztwjttv
+3-4 b: bbbs
+4-5 k: kjkmk
+5-7 k: bvbhkkv
+6-16 j: jjqjjvjjjjjjjjjl
+7-8 t: rtlmzxtr
+9-10 n: nznnnnnnhnn
+3-4 b: tmnbdrbjbnfksm
+3-4 q: lqqq
+5-6 b: bbbgbbz
+6-8 l: llvtlllzll
+12-16 s: stvsnzssssssssml
+1-4 k: jkkk
+4-7 t: ttttztttttt
+14-15 j: jjrjjzjjjjjjjghj
+4-11 j: jxqjjxjjjjth
+4-10 v: fvsktttspv
+3-7 g: tdgwkspnggpfg
+2-18 r: rrfbmqhrldrcqrprrrrl
+6-7 r: rrrrrfrr
+4-6 f: fjffxqzdffr
+8-10 l: llllllllkb
+8-12 s: wsgssfssssss
+14-15 d: xddddfddddwdtvddddd
+2-10 f: fffffkfwcr
+12-16 l: llllllllllgtldll
+6-7 r: rrrrrkrrr
+9-12 q: lqqqqmqhnqqq
+8-13 q: qdfqqqqqqqqhl
+2-6 g: gjfjgggvng
+1-3 z: qzzz
+8-10 p: ppppppppzbp
+7-12 f: dstffffzfkczfffff
+1-15 k: kkkkkpdkkkkkmxf
+3-6 w: whwwwmkqf
+16-17 g: gpnglggggggggggdcg
+5-15 s: nsssnssgssssssssss
+14-15 q: qqqqqmqqqqqqqqx
+2-11 s: psslpssssrsssdssrmp
+1-6 d: hdndpdd
+3-6 q: sqpqqnpsqjrqq
+1-5 b: qbbbb
+1-3 v: vvsv
+4-5 q: qqqqjqtfqqqtqqn
+6-9 h: hhhhhhhhhh
+7-8 r: rrrrsndrrr
+3-4 r: brrtb
+3-8 t: fjtkttxtzt
+10-11 b: bcbfbbbbbbkb
+1-6 l: llzssp
+16-17 f: ffffffffffffffffn
+3-4 l: clml
+13-14 h: hhhhhhhhhmhnhnhh
+9-12 t: lthttttbtthcctv
+3-8 x: xxfkbjhxlqxvxxthxb
+2-3 l: llrlmlw
+1-10 h: hhhhhhhhkhhhhhh
+14-18 l: llllllllflllbllllc
+14-15 b: bspvbkbpkkbmgjn
+10-12 z: zzzwzzxzzzsxzpz
+5-7 d: dhmtldrqddmdw
+1-4 g: bqzfgqg
+7-10 j: wxjbgbjdlz
+3-14 q: csqgmhfqgfqlcnw
+1-3 m: mmkmltxmn
+1-5 l: llllcll
+1-3 b: bcbbjzwfdmmnsrtqbsnl
+2-4 s: sszs
+14-17 k: kkkmkzkkkkskkkkkbk
+5-6 g: gnggcg
+4-15 t: dfmlshpqhhmwptzkwgt
+2-3 w: drwtngwhgw
+5-6 t: tttttrn
+15-16 b: bbbbbbbbbbbrbbbr
+7-11 s: tswssqssfstsssbzs
+8-11 j: jjjbdjjjjsjj
+4-7 c: mjclkfccpccfcjchqg
+11-13 q: qqqqqqqqqqqqqqq
+4-5 r: rgrdrb
+8-9 n: nnnnnnnntn
+12-13 g: gggxgggggggzgg
+7-8 q: qqqqqqqq
+9-10 m: gcqmlctsmfmstprmmmkm
+2-6 h: dhhhhlh
+19-20 b: qkzbbbhbwbtbvqbdpfrt
+5-11 k: skkkkkqkhkkkz
+10-12 l: lllllllplwllf
+3-5 x: hxxxb
+4-5 z: zdzzwtzz
+5-9 f: fmqfffffmpq
+2-3 w: xwkg
+6-8 x: xxxxxxckxnq
+10-13 k: khkkkkkkkkkkbx
+7-15 j: xjjjjjjtjjtjjdljjjjj
+2-4 p: mpckqmgpbzcb
+2-3 r: rwrz
+5-12 t: xhgntttllqtpjzttltt
+4-12 q: bwwfvqwrmmbqt
+1-3 g: cgpggg
+7-11 j: vjjjwjjjrvrjbj
+6-11 j: jjjjjjjjjjr
+4-8 k: klkkwjkkkvkfk
+8-16 p: pppppppvppppjpzs
+4-5 m: mmmhr
+13-14 t: tstttttttttttw
+4-6 n: hmnbznk
+14-15 z: zzdzzzzqzzzzwzg
+1-6 p: hsjlxpppwv
+1-18 d: tddddddddddvdmddddd
+2-4 n: nznjn
+6-10 v: fqvvszfvvtx
+13-18 k: qbckrkkmkkktnkknkk
+1-6 n: lnfxntnznnbq
+3-9 n: lvnwnlnxnggnvdnqpz
+1-3 k: skkjb
+1-7 m: mwmrcjt
+3-5 k: kfkmw
+6-7 f: crfbrfcjdjvm
+10-11 m: mmmmmmmmmmz
+6-7 t: ttsgttzb
+4-6 f: fjfbff
+10-12 m: mmmmmmmmmmmmb
+10-11 z: wzzzzzzzzszz
+6-11 z: nbdmzzztpzh
+10-13 f: ffdfdfffxlffgf
+3-4 s: vcksscsk
+1-5 f: ffvfcpffgfww
+13-15 c: cccccccpcccchcc
+1-16 x: xxxrxxxxxgxxxxxxx
+6-9 v: kfxvvvgvlvvjvvs
+14-17 f: cfxfdffbjmbjdfptg
+6-7 s: sssssss
+15-16 b: bbbbbbbwbbbbbbpb
+2-4 w: wdww
+1-7 m: mpmtmsmmmpm
+4-7 z: tzzpzzz
+1-2 q: qdqx
+6-12 g: gcggwxrjkjgtrgt
+14-18 m: mmfmmmvmmdmmjmmmmq
+17-19 j: jjjzjjjjzmbsjjqjplj
+2-5 m: ljxmmcnmmgmt
+3-8 w: wwwwwwwt
+5-7 b: bbbbbzsn
+1-17 t: btttttttttttttttttt
+1-2 s: svsss
+5-6 p: pppmmr
+2-7 m: vrgmmjmhm
+15-16 w: wwwwwwwwwwwwwwgw
+10-11 q: pqqqqqqqqlqqq
+7-8 k: kjbkkjdkzc
+5-9 x: xmxxtxxxxxx
+13-14 v: vvvvvvvvvvvvqvv
+1-4 z: lzzszz
+4-5 x: xxxkxf
+13-14 h: hhhhhshhhhhhpfhh
+6-8 s: sssgsssvn
+14-17 l: nsgfxplzbmljjstld
+6-13 j: jjjjjjjjjjjjjjjjvjjj
+10-11 q: qqqqqqlqqrq
+7-8 l: llfplllwll
+13-16 h: hhhhhhhhhhhhhhhp
+5-8 s: ssfsssgc
+3-4 b: bbbn
+16-17 p: ppppppppppppppppn
+5-7 w: wwwwcww
+6-14 d: ddlhgjtldncddvdrsd
+10-12 h: hhhhhhhhhhhrh
+4-5 s: ssrss
+1-7 z: wkzcvczpcskxfzxxxmzh
+4-7 h: rphjtkh
+3-5 k: mdtzkjfkq
+2-3 c: cwcc
+2-6 r: rrnrrmrrlrrr
+10-14 n: ntjrrpfpxxwdznjvmh
+3-10 h: flhtwzhhhh
+3-8 v: vvnkvvvp
+6-8 n: bnnnndnnnnnnnn
+2-11 p: hpnppgfmpbp
+3-8 h: khhmlhxjshsbf
+3-4 l: jllnlglrqz
+4-9 g: ggqbghggg
+5-6 w: wwwwlwwb
+1-9 s: hssssssssssss
+1-5 j: jjjjbjj
+8-10 s: dssrssssgstssss
+3-6 c: cctccccp
+7-9 v: vvnvvvvvpv
+5-16 t: zmspstpctqgrbmlt
+8-14 m: mpmmmmjqmmmnmmm
+13-16 c: cbdxwzfbjpkvcpdp
+3-19 w: wlwwkfxwfwzkvjxjnthw
+13-14 l: ldllllllllllmll
+8-14 s: spssshxjfnsjsssskkkj
+2-7 c: cmccdcpcw
+5-14 t: psntttqxbxdqstvkttb
+8-9 z: zzzzzzzzbz
+4-9 n: lnmnwcvntmhrznc
+1-4 v: tvvv
+2-8 d: ddqddqtdscsfddblqk
+1-2 t: wttttv
+5-6 n: nnrnxnnn
+4-14 c: zccscgzpzvwlwcjqpfjl
+3-11 g: gglggggfggg
+11-18 d: ddddddddddfddddddd
+1-7 q: qsqkgpf
+2-11 q: qqfqqqqnqqhlqqq
+8-9 c: ccccsccwcp
+4-7 m: mmmqmmmm
+7-17 c: cxscnqkjdfkcgqzccdkc
+4-5 b: bbbzb
+3-4 l: llll
+1-2 j: ljcn
+11-16 r: rrdrrrrrrrrrrrrz
+1-15 l: rrlkklllllllgqllk
+14-15 b: bpbbbbbbmbbbbbpwb
+2-3 q: xcqqh
+1-3 q: qwckphmm
+1-6 d: dwdtsfxzvdqbbhlhwtk
+3-6 n: nmmzcnnmn
+6-7 q: qqqqqzq
+1-2 z: jzpzz
+2-6 r: rrrfmrvlr
+3-4 n: nncn
+2-3 l: plblwq
+2-7 g: gggckcqgwsk
+12-13 q: qqqqqqqqqzqxqqq
+16-17 s: sssssssjsssssssqs
+1-10 h: hjvvvknhmh
+11-12 z: zzzzzpzzzczlzz
+6-13 q: qqqjrbqcqqqqqxq
+6-9 p: ppcpkfpppptp
+15-16 p: pplpppppppppppjdh
+7-9 c: hqswstxxcnl
+2-4 x: ngbxbqszx
+1-2 g: sgfxt
+6-7 x: bxgnxxt
+16-18 j: mjjtjjjjjjjjljjzjjj
+13-14 c: ccpccvcccccccgc
+3-7 s: fksrgsbcnfmkxdwd
+1-4 q: qwpmqjlbhqfnpdjgqjqx
+2-3 p: ptpp
+4-8 k: sbkkskgc
+4-11 j: gjjbjnjjjnnj
+1-16 f: fffbwjwfmfqcjffmf
+6-8 b: wbbbbwbbbb
+1-3 z: rzzv
+2-4 v: wvcjnjmdbjjjvptcsv
+4-7 b: bmjdfpfwqvgpbb
+9-15 f: fdfqffhfpfnffpwfffhf
+4-7 t: ttwbttjtdt
+3-14 d: ddhdddddddmsdddddddd
+3-4 z: vsmm
+7-8 w: wwwwwwhw
+3-4 r: rrrlvwvqztszhmr
+4-5 c: ccctkcn
+1-3 g: ggmpdspfbvb
+3-4 c: cccc
+5-6 p: pqgppspbkpgxvcsp
+7-13 n: nnnnlxnvnnmng
+9-14 l: lqlllllxlllllzll
+6-12 l: llllllllljlxll
+3-8 g: jbkzsshsmsngghn
+1-4 r: trrrrz
+3-4 p: kppg
+1-5 w: whljvw
+11-14 v: svnrvvtmvccgcxjfbpkd
+12-18 q: rqqvfqqqqqtvqqqmqq
+12-18 m: mxmmmqmpmmwmmmmmmm
+8-9 k: hkvnxnmkpkmplkkkkkkv
+6-8 p: ppppppppp
+3-5 t: qpxdtctb
+15-18 z: zzzzzzzzhzzzzzbtzzt
+10-11 t: ttswttttmttttt
+10-11 f: ffffxffffffs
+2-3 j: hjrj
+6-10 x: xxxctxxjgdz
+10-11 r: brrcrrrhwlz
+9-10 s: sxssssqssksq
+7-13 n: bnkwlnnncnnvnnnnn
+11-13 f: lffffffffgffcfffffc
+2-4 z: qczzfcztz
+10-12 q: qxqqqqqcqqjqqqw
+6-9 h: hhjhhhhhrqhch
+3-4 l: xjmllb
+2-5 m: mmmhm
+1-2 w: pwkzww
+3-7 s: sgccssszvssnqssj
+6-8 j: jjgpjjnj
+9-13 s: zjhskrssshssvqdxsrns
+7-9 b: bbbbbbfbd
+8-10 c: cwczgzcccgcctscfx
+4-8 s: ssssmgssslrssp
+14-20 z: jzjszzzzzzzzptzlzzzz
+5-6 d: dsdddhd
+6-7 z: zzzzzzh
+2-8 f: fpzsgwsh
+2-4 d: dddd
+5-6 w: wwwdwc
+3-4 r: crnr
+4-7 s: zssdvsz
+19-20 x: xxxxxxxxxxxxxhxxxxhx
+7-8 g: ggggggkg
+8-10 f: fffwfcfvdfffff
+5-6 v: vvvvmv
+9-14 k: wkpkknkkklkknkkkkkc
+3-4 h: hhhjhhht
+1-5 c: cbccrcbcdczgccfct
+13-15 x: xxxxxxkxxxxdxpzqxxx
+13-15 b: bbbbbbbbbbbbgbb
+1-4 v: wvvvnm
+5-8 v: zczvdvmvjvzv
+8-9 p: gsppkptps
+8-17 r: srrrrhjnrrdrrvrrhrv
+9-13 l: lmlclllglqllmlll
+1-4 g: gfgj
+2-8 c: jtvmkcccdmccfxh
+5-7 l: llztkvlb
+2-7 v: fvlbrrtdpv
+7-9 b: bbbbjbwbbd
+6-8 j: jsjjjjjjj
+3-5 w: wwwbwbgjmlrvfhkvfqp
+15-17 l: llllllllllllllfll
+13-14 z: dzzzzzzzzzzzzwz
+11-13 z: zzzzzxzzzzzzg
+3-4 b: pgbntlqbtbbbnp
+7-12 z: zzpzjzzzmzzzzjzjzz
+2-11 h: dtjsvvjkvghq
+3-5 p: zpcjpp
+14-17 z: zzzbzzznwzzzzzzzzzzz
+3-6 h: nxhlfxlxngphhbdb
+7-10 n: tjnnnncwnnvnnn
+1-2 b: bfbm
+13-16 t: ttdttttttrttztttt
+9-10 t: jthtfttttttttt
+8-9 z: cvfzzfnzzzzzlfzz
+15-16 b: bbbbjbbpbbbcbbmm
+3-9 x: rrqxxgxxt
+4-18 j: qqqjlzcjfnjddjnqzvh
+3-14 q: qqzqqqqqqqqqqdqq
+5-6 h: hhhlch
+5-11 z: zzjdzjzdtzww
+2-9 w: wwwswwgbftlr
+3-4 l: hlllbgdczpl
+5-8 c: wwcvccckcccc
+1-3 j: czjzxblj
+1-3 z: vjzjz
+11-16 m: mmmmmxrmmmmmtmxkmmhd
+4-10 h: gzkhhxplhhhh
+3-7 d: smdxmdfpn
+12-17 t: tttttttntttdttttt
+3-4 f: kfffjwhbllp
+4-10 h: hhgkvhhhnqhh
+14-18 w: whlchwwqwwlrwjdbwww
+4-6 z: szjzhjhpzzmgz
+3-9 x: xxxxxxxxq
+5-6 x: rxprlx
+3-4 b: pbbbbb
+11-13 g: ggggggggggggh
+2-3 b: bfbb
+6-7 d: dddddvd
+2-10 p: ppskvdctvpsn
+12-18 r: rrrrsrrrrrrfrrrrrrr
+4-5 c: ckclcc
+8-13 v: vvtmtvvvvvvvvvzwp
+4-18 j: qmdwjqqlpznldltqvjm
+1-4 j: dbcjpzk
+4-5 f: ffmfqvzf
+8-10 p: pprptnfvpphvppp
+7-8 z: zzzzzzzzz
+10-11 n: xnnnnnnnnnnn
+10-17 v: jwmqwvplsvvvfhhll
+5-6 w: wwwwqtw
+5-13 c: cccwbcccccccncfc
+13-17 r: rrrrrrrrrrdrrrcrldn
+2-15 b: nbnknkblbdbbhxxn
+17-19 n: jwmjbxxvcrqlwpsknnz
+5-16 x: xxxxxxxxxxjxxxxnx
+1-7 m: mmmmmmvm
+4-5 r: rrrrv
+6-7 c: xkdzcscg
diff --git a/2020/02/puzzle-1.awk b/2020/02/puzzle-1.awk
new file mode 100755
index 0000000..77971dc
--- /dev/null
+++ b/2020/02/puzzle-1.awk
@@ -0,0 +1,10 @@
+#!/usr/bin/env -S awk -f
+
+{
+ split($1, bounds, "-")
+ freq = gsub(substr($2, 1, 1), "&") - 1
+ if (freq >= bounds[1] && freq <= bounds[2])
+ count++
+}
+
+END { print count }
diff --git a/2020/02/puzzle-2.awk b/2020/02/puzzle-2.awk
new file mode 100755
index 0000000..24398e7
--- /dev/null
+++ b/2020/02/puzzle-2.awk
@@ -0,0 +1,19 @@
+#!/usr/bin/env -S awk -f
+
+{
+ split($1, pos, "-")
+ split($3, str, "")
+ char = substr($2, 1, 1)
+
+ # Count the frequency of char
+ freq = 0
+ if (str[pos[1]] == char)
+ freq++
+ if (str[pos[2]] == char)
+ freq++
+
+ if (freq == 1)
+ count++
+}
+
+END { print count }
diff --git a/2020/03/input b/2020/03/input
new file mode 100644
index 0000000..6673c40
--- /dev/null
+++ b/2020/03/input
@@ -0,0 +1,323 @@
+....#..#.......#........#....#.
+..##.#.#.#...................#.
+....#.#.##..#....#......#......
+.........#.#......##.....#.....
+..........#.###.##...##........
+#....#.#.......##.....#..#.....
+#...........#.#...#..#..##.##..
+......##.............#.....#...
+..##..........###..#.#..##.....
+...........#........#......##..
+..##...........##..............
+..#......###.#.....#.#.#.......
+..#..#..#..........#.#....#....
+.#.....##......................
+...#...##..#...#.........#..##.
+.#......#..#..#...#......#.##..
+..##.##.......#..#.....#..#...#
+..............#..#..#...#......
+...#...#....##.....#...#...#...
+......................#...#....
+.......#......#...#..##...#.#..
+##......#..#.....#....#.....#..
+....#.#.##.#.#....#............
+#.....##.............#.........
+..........#...........#.#.....#
+...#...##....#.#........#..#...
+................#..#.##.##....#
+......#...#...##...##....#.....
+##....#..#..#...#..#...........
+#..................#...#.#..#..
+....##....##.#....#..#......#..
+.....#...........#.........##..
+..#..............#.........#..#
+......##....................#..
+..#.....###...####...#...#.##..
+#..#.#......#.....#.......#.#..
+##.#.........######........#...
+..#....###...#.#..............#
+.....#..............#.........#
+....#......#..#.........#...#..
+.....###.....#.###.......###...
+#.#..#.....#....##...#........#
+..##....#..#.........#...#.#...
+..#..##.............#....#.#.#.
+..##.#..#.#.#.........##.......
+#.#..#.........#..............#
+#..#.........###.......#.#..#.#
+.............#...#....#......#.
+..........#.#...##.###.....#.#.
+..#.....#......................
+.......#......###.#.......#....
+....#....#.........#...###.#.#.
+.#.............#............#..
+....#..#.............#.#....#..
+....#.....#...#...##.#.........
+..#...#...#..................#.
+........#....#.....#...........
+.....##.......#...#.#..#..#....
+...#............#..#.#.........
+......................#........
+....#......#.....#.#....#......
+.....#..#.........#.........##.
+...............#.....#....##...
+...#.#.#...#..#...........#....
+.#....###......##...#.#.#.#....
+.....#...#....####....##.......
+..#......#..#.....##.#...#.....
+...#.##..#....#..##.....#......
+..#......#...#...##.....#...#..
+......#.....#........#.........
+..#.#....#..............##....#
+..#...#......##............#...
+.##.#.......#.......#......#..#
+...##.##...#.....#.......#..#..
+......##..#....#.......#.......
+.....#..#..#.#.....#.....#...##
+##.#...#.#.#.....#...#.#.#.##.#
+...................###...#..#..
+.#.....##.#......#........#....
+.##...##.#..........#...#....#.
+......#..............#.#......#
+...#.......#..#...........#....
+.###...#............##..#...##.
+##..#.#.........#............#.
+#...#.#......#.##...........#.#
+.#.#...#........#......##......
+....#...#...#.....#...#....#...
+...##...........##.........#...
+.........#...#..###............
+..#........#...............#...
+.............#....#.#..........
+........#......#.#.......#....#
+.................#....##.#.##..
+..#...##........#..............
+#..#........#...#....#.........
+......#.#.....#.....#..###.#..#
+....#............#...#.#.#.....
+............#..........#...#...
+..........#....##.#.........#..
+..............#...#...#..#.....
+#......#....#..##....#......##.
+...#....#.................#....
+.#.##.............#...#....##..
+....#..#.........#..#....#....#
+..#.....##..#......#.#..#......
+..#..#.....#........#...#..#..#
+.........##.#.##.#.......#....#
+..#.......##.##...#.....#.....#
+.............##...#...........#
+..#......#..#....#...#..#.##...
+....#........#......#.........#
+.......#........#..#.#.#..##..#
+..#......#...........##...#....
+.....#..#.#...#..............##
+.#..#......#......#........#..#
+...##...............#....#.....
+.......#...#.......##..#.......
+.....#....#...#...#..#.....#.#.
+...#.........#.....#...........
+...#.....###....#....#...#...#.
+#..#.....#.........#.........#.
+.................#.#.....#....#
+...........#..........#..#.....
+........#.#....#...#..#.....###
+#............................#.
+..##..#..#...##.........#......
+......##....#.#...#.........#..
+......#..##.#......#..#.....#..
+...#.......##....#.#....#......
+.....#........#...#............
+#.......#...#.........#......#.
+......#......#....#..#.........
+..#.#........#..#......#....#..
+.#..#.#..........##....###.#..#
+...#....#.##..#...#....#.......
+..#.....#......#.###.......#...
+..............................#
+.....#..#...#...........#......
+.##...#....##....#.#.#.#....#.#
+.#...#....#...#........#.......
+....#............#...##..#.....
+....##..#....#....#.....#....##
+.............#..##.#.#.#.......
+#.......#.#.#.......#..#..#....
+#..#...........#.......###..#..
+.#..##.#.....#........#........
+..#.#.......#............#..#..
+...........#..#............##.#
+.....#.......#.....#..#.##.#..#
+......#......##.....##.........
+..##.#..#.#..#..#..............
+.....#.............##...#.#.##.
+.#......##.#..........#........
+..#..#.........#.....#.#.#.....
+..#.....#.......#.....#..#.....
+#.#.#........#.#...#....#..#...
+.#.#.......#............#....#.
+......#..................#....#
+.#...#...#.....#.#..........#..
+.#..##....####...........#.#...
+..##.....#...#.#....#....#.....
+#.....................#....#.#.
+###..###.#.#...........#.....##
+......#......#..........#......
+...#......#.##.....#......###.#
+.............#..#.#...........#
+..#.............#.#..#.....#...
+...#...............#....##...##
+........#.................#....
+#..###.....#.......##.#......##
+....#.#..............#.........
+#..........#.....#..##...#.....
+................#...#..#....#..
+..#...#....##..........#.#.....
+......#........##......#..#...#
+...#....#..#.....#.......#...#.
+.#.....#..#...#..###....#......
+....#.........#....#.#.#.....#.
+#.#....#...#....#.....#..##....
+.......#..#..#..........#...#..
+..#.#..#.....##.#.#............
+..#....#.....#..##..#..#.#..#..
+..#.##.#...........#...#..#....
+.........#........#...#........
+..#.#.#.......##.........#.##..
+#.#..........#.#...#..#......##
+.#..#....................#.#...
+.##......#................#...#
+..##.#######......#....#.......
+....#...##.#....#.#............
+.##....#...##.......#...#..#...
+...........#...#...#...#..#....
+#...#.....#.......#....#.....#.
+.............#.................
+........#.#.......#...#.#.#....
+..............#............#.#.
+......#......##..#.......#....#
+##...#..................#......
+.....#......###.....#.......#.#
+.....#.#............#.#........
+..#.#..#............#....#.#...
+##.#.###.#.#.#..#......#.......
+...##........#..#.....#.#.#..#.
+##......#.##.....####..#.......
+............#...#..#...#..#....
+...#..#................##.#..#.
+.#....#.#...........##.#.#...#.
+####..#...........#.......###..
+.......#.................#.....
+.......#....#.......##....#....
+..#.........#...#....#.........
+..........#..#...#.#...##..#...
+....##..........#.........##...
+#.........##..#.#..#.......#...
+.#...........#....#...#...#.#..
+....#..#.....#...##....#.#....#
+.#....#.....#......#..##.##.#.#
+#......#..#.......##...........
+...#..#...#.#.................#
+......#.......##....##.#......#
+....#....#.#.#.....#....#....#.
+..#..........#.##...##..#......
+...#..#........#....#.#..#....#
+##.......#........#..........#.
+.#........#.......#...#..##...#
+..#..#..##..#...........#...###
+..#......#..........#..##......
+.#.....#..#.#...#...#.........#
+#.#......##....................
+#...#.....##...........#.......
+........#...#....#.......##....
+...#.##...#....#....#..#..#..#.
+...#..#......##....#..#..##....
+#...#..........#.#.............
+##..#........##.....#.........#
+.....#......#.#...###..#.......
+#..##.#..#.###...........##..#.
+.....#....#..........#.......#.
+##.........##.#................
+....#.........#............##..
+.......#........#......#..#..##
+.#...#...##..#....#..#.........
+.............#...#.#........#..
+......#..#...#..#.###..#.......
+........##.#..#.#..#..#........
+#.##..#..#..........#...##..###
+.##...#............#.#...##..#.
+................#....##.#...#..
+#.................#..........#.
+...#..#..#.....................
+..#...##.#.#...................
+.....#...#.......#............#
+..#..#.........#..##.#..#.#...#
+.....#.#.....#.#.......#.....#.
+..................#..#....#.#..
+..#.....###.##.......##....#.#.
+..#......##.......#....##.#....
+....#...................#..##.#
+.......#....#.##.#.......#....#
+..#...#......#..#...###....#.#.
+..#..#.#....#...........#.....#
+.....#..#..#.......#........#..
+......#.##.#......#...........#
+#...#....#.#..##.##..#..##.....
+#...##....#.#...##........#....
+..##............#.#.#..........
+....#.....#.#..#.......#..#....
+#..#.#.....#..#..##...#..##....
+...##........#...........#...#.
+.####......#..##.........#.#...
+.......#.......................
+.................#....#..#.....
+.........##......###...........
+.##......#.#.#....#.#...#..###.
+....#......##.###.#.#..#.......
+..........#.......##......##..#
+...........#.......#..##.......
+.....###..#..............##....
+........##..#.#.#......#....#..
+#....#.........................
+...........#...............##..
+......#.................#......
+.....#...#..##...##...#...#....
+..........#.#...##.####......#.
+..#.#.....##....#...........#..
+..........#....#..#....##...#..
+.#.......#..##...#...#.....#...
+...##....#.#......##...##....#.
+#.......#.......#.##.#...#.#...
+#...#..................#......#
+..#.......#...............#..##
+#.....#..................#....#
+.##.....#.....#......####.....#
+..#........#...#.#........#...#
+..##.....#....#...#...........#
+..#..#.....##..#.##...#........
+..........###..#....##.....#...
+...#...#....#.##.#...#.#.......
+..##......#.......#.......##...
+............#............#.....
+.##....#.........#.............
+....#....#....#........##...#.#
+.......##......................
+..........#.#.................#
+......##.#...#.........#.....#.
+..#...#......#..#.............#
+..........###.#..#.#...#..#..#.
+#..#.#..#....##...#...#.#...#..
+.#........##...#......#.##.....
+...###.#...##..............##..
+#.#.#...#...#..#....#.#..#.....
+.#.#.##..#....#......#.#.......
+...#..#.#....##...........#..#.
+.....##..##......#.#...........
+......#.....#....####....#.....
+.#.#.#...#..#..#...........#...
+.....#......................#..
+.........#.........#.###.##....
+.....#......##..........#......
+..#...........##...........#...
+..............#.........#.....#
+..#....#..#...#...##.#.........
+.#.#.#....#..........#.........
diff --git a/2020/03/puzzle-1.awk b/2020/03/puzzle-1.awk
new file mode 100755
index 0000000..3eac2ba
--- /dev/null
+++ b/2020/03/puzzle-1.awk
@@ -0,0 +1,14 @@
+#!/usr/bin/env -S awk -f
+
+BEGIN { x = 1 }
+{
+ len = split($0, obs, "")
+
+ if (x > len)
+ x -= len
+ if (obs[x] == "#")
+ count++
+
+ x += 3
+}
+END { print count }
diff --git a/2020/03/puzzle-2.awk b/2020/03/puzzle-2.awk
new file mode 100755
index 0000000..88e0625
--- /dev/null
+++ b/2020/03/puzzle-2.awk
@@ -0,0 +1,36 @@
+#!/usr/bin/env -S awk -f
+
+BEGIN {
+ slope[1] = 1
+ slope[2] = 1
+ slope[3] = 1
+ slope[4] = 1
+ slope[5] = 1
+}
+
+{
+ len = split($0, obs, "")
+
+ right = 1
+ for (i = 1; i < 5; i++) {
+ if (slope[i] > len)
+ slope[i] -= len
+
+ if (obs[slope[i]] == "#")
+ count[i]++
+
+ slope[i] += right
+ right += 2
+ }
+
+ # Specific code for slope 5
+ if (NR % 2 == 1) {
+ if (slope[5] > len)
+ slope[5] -= len
+
+ if (obs[slope[5]++] == "#")
+ count[5]++
+ }
+}
+
+END { print count[1] * count[2] * count[3] * count[4] * count[5] }
diff --git a/2020/04/input b/2020/04/input
new file mode 100644
index 0000000..c49fb69
--- /dev/null
+++ b/2020/04/input
@@ -0,0 +1,1135 @@
+eyr:2029 pid:157374862
+byr:1991 ecl:amb hcl:#a97842 hgt:178cm
+
+byr:1962 pid:547578491 eyr:2028 ecl:hzl hgt:65in iyr:2013 hcl:#623a2f
+
+hgt:71in eyr:2037
+ecl:#8e276e hcl:z iyr:2019
+byr:2022 pid:157cm
+
+hcl:#733820 hgt:175 eyr:2028 iyr:2011
+pid:87786389
+ecl:hzl byr:1980
+
+hgt:163in hcl:z pid:8261494508 cid:136 ecl:grn eyr:1958
+byr:2030 iyr:1991
+
+iyr:2021
+hcl:6708a3
+ecl:zzz eyr:2034 byr:2010
+hgt:189cm
+pid:466438311
+
+iyr:2012 pid:9720867166 byr:2006 eyr:2022 hgt:72cm ecl:utc hcl:#c0946f
+
+ecl:#353bc9
+iyr:2020 pid:874363951 cid:113
+hcl:z eyr:2040 hgt:76in byr:1975
+
+eyr:1971
+byr:1955 pid:193cm hgt:189cm hcl:#ceb3a1 ecl:grn
+iyr:2023
+
+byr:2014
+iyr:2026 eyr:1978 hcl:z cid:312 pid:8294818417
+hgt:169in ecl:#82bb02
+
+ecl:amb
+byr:1936 hcl:#7d3b0c pid:429853734
+cid:342 iyr:2010 eyr:2025 hgt:160cm
+
+byr:2025 hgt:176in hcl:a490ac
+ecl:#956d3f iyr:2027
+eyr:2021 pid:9858101884
+
+hgt:142 pid:175cm
+eyr:1952 byr:2004 iyr:2007 ecl:#da035e hcl:#623a2f
+cid:194
+
+hgt:156cm
+pid:349122810 hcl:#b6652a eyr:2026 byr:1948 ecl:lzr iyr:2020
+
+byr:1997 ecl:blu
+hcl:#888785 pid:381094641 iyr:2014 hgt:192cm eyr:2027
+
+hcl:7b10a2 ecl:lzr byr:2022
+eyr:2035
+pid:#38b715 hgt:190in iyr:2029
+
+pid:188cm byr:2014
+cid:241 ecl:#dda9bd hcl:#8f6ebc
+hgt:188cm iyr:2014 eyr:2029
+
+hgt:76cm ecl:gmt hcl:z iyr:2024
+pid:3283057785
+byr:2019 eyr:2026
+
+iyr:2010 pid:284327216 hgt:191cm
+byr:1970
+hcl:#18171d
+ecl:grn
+eyr:2023
+
+byr:1929 eyr:2026 cid:194 ecl:oth hgt:156cm pid:224596482 hcl:#b6652a iyr:2013
+
+eyr:2030 byr:1958 hgt:190cm
+pid:162950579 iyr:2010
+ecl:brn
+cid:250 hcl:#fffffd
+
+ecl:xry iyr:2025 pid:#0155c1
+hcl:#341e13
+eyr:2027 hgt:163cm byr:2025
+
+hcl:#602927 pid:908859481 byr:1962 ecl:hzl
+iyr:2021 eyr:2028 hgt:180cm
+
+iyr:1966 eyr:1976 pid:#bbfe21 hcl:63454a cid:259
+ecl:blu
+byr:2024 hgt:69cm
+
+ecl:#644daf
+byr:2021 eyr:2040
+hcl:bc83fe
+iyr:1976 hgt:59in pid:60311335
+
+iyr:2018
+pid:121801570 hgt:182cm ecl:blu byr:1922 cid:265 eyr:2024 hcl:#888785
+
+byr:1933
+pid:232653422 ecl:gry hcl:#18171d
+hgt:171cm eyr:2035 iyr:2011
+
+ecl:oth iyr:2015 byr:1937
+pid:828621370 hcl:#602927
+eyr:2026
+hgt:193cm
+
+iyr:2010 ecl:grn eyr:2022
+hcl:af37d1 pid:761632482 hgt:65in cid:93
+byr:1993
+
+hgt:169cm cid:121
+iyr:2018
+hcl:#6b5442
+pid:059725560 ecl:oth
+byr:1972 eyr:2028
+
+eyr:2024 byr:2023 ecl:gry
+iyr:2017
+pid:778551716 cid:256 hcl:#733820 hgt:184cm
+
+hcl:#ceb3a1 pid:613277258 byr:1941 hgt:67cm eyr:2029
+ecl:hzl
+iyr:2017
+
+ecl:hzl iyr:2012 pid:498418959 eyr:2022
+byr:1929 hgt:164cm hcl:#a97842 cid:226
+
+hgt:157cm eyr:2029
+byr:1922 iyr:2014 ecl:grn cid:233 hcl:#888785 pid:802870003
+
+hgt:184cm
+ecl:oth hcl:#888785 iyr:2010 byr:1929 eyr:2030
+pid:063671905
+
+hcl:#888785 hgt:144 eyr:1961
+iyr:2005
+byr:2027
+cid:164 pid:41787324
+ecl:utc
+
+hcl:#7d3b0c
+pid:570743051 byr:2022 eyr:1975
+iyr:2018 ecl:utc hgt:188in
+
+eyr:2028 pid:970460968
+hgt:161cm
+iyr:2017 ecl:amb
+cid:318 byr:1967 hcl:#cfa07d
+
+hgt:183cm eyr:2036 hcl:070713 iyr:1959
+cid:242 byr:2011 pid:#0855a5 ecl:lzr
+
+hcl:#ceb3a1 eyr:2023 iyr:2016
+ecl:oth hgt:84
+pid:156cm byr:1949
+
+eyr:2025 ecl:brn hgt:172cm pid:487559063 iyr:2013
+hcl:#efcc98
+byr:1985
+
+eyr:2023 hcl:#6b5442 byr:2021 hgt:75cm iyr:1943
+pid:427375038 ecl:#70c167
+
+ecl:hzl
+eyr:2028 byr:1957 iyr:2010
+hcl:#602927
+hgt:151cm pid:755290924
+
+cid:184 hgt:172cm
+pid:7056500139 iyr:2016 byr:2016
+hcl:e40e08 ecl:#d21247
+
+ecl:oth
+eyr:2025
+iyr:2010 byr:1971 cid:128 pid:932834922
+hcl:#602927
+hgt:167cm
+
+ecl:brn hgt:61in iyr:2016 hcl:#341e13
+pid:918193693 byr:1972 eyr:2029 cid:56
+
+byr:1956 iyr:2020 eyr:2030 hgt:72in
+pid:179969841
+ecl:blu
+
+ecl:#09fd92 cid:209 hgt:69cm iyr:2014
+eyr:2028 pid:#2ad9c0 hcl:#b6652a
+byr:2012
+
+ecl:lzr byr:1980 cid:104
+iyr:1965 pid:57029893 hcl:z
+eyr:2030 hgt:64cm
+
+pid:496149551
+hcl:#6b5442 hgt:181cm byr:1978 iyr:2017
+eyr:2026
+cid:291 ecl:hzl
+
+iyr:2018 hcl:#ceb3a1
+eyr:2021 cid:183 pid:612653062
+ecl:oth
+byr:1982
+
+hgt:153cm pid:877597531 ecl:gry
+iyr:2014 hcl:#866857 cid:333
+byr:1953
+eyr:2022
+
+iyr:2015
+ecl:brn
+pid:823959694 byr:1998 hcl:#18171d
+eyr:2025 hgt:174cm
+
+iyr:2012 cid:93
+ecl:oth pid:142618419 byr:1955 hgt:193cm eyr:1977 hcl:#602927
+
+hcl:z ecl:dne iyr:1926 eyr:2026 pid:175cm hgt:150 byr:2023 cid:234
+
+hgt:61cm iyr:1965 byr:1956
+pid:224946350 cid:105
+eyr:1951 hcl:#733820 ecl:amb
+
+hcl:#866857
+byr:1970 pid:447859408
+eyr:2030
+hgt:65in iyr:2011 ecl:grn
+
+cid:184 eyr:1976 byr:2021 hgt:187cm
+pid:858786336 ecl:#0d63e1 hcl:z
+
+hgt:178cm iyr:1986 hcl:51ac0c ecl:dne eyr:2023 pid:180cm
+
+hcl:#cfa07d pid:002093179
+ecl:oth
+byr:1983 hgt:159cm iyr:2016 eyr:2025
+
+ecl:gry hcl:#c0946f
+byr:2009 pid:#e00fc8
+hgt:62in cid:150 iyr:2013 eyr:1957
+
+byr:1942 ecl:oth eyr:2020 pid:765036664 hcl:#6b5442 iyr:2015 cid:155
+
+ecl:hzl iyr:2014
+hcl:#efcc98 hgt:179cm eyr:2028
+byr:1921 pid:#666905
+
+ecl:utc eyr:2040 hcl:669f5b pid:981368190
+byr:2006 iyr:1949
+hgt:179in
+
+ecl:#062fcd eyr:2035 byr:1962 iyr:2026 hcl:z hgt:161cm pid:75591618
+
+hcl:#b25ef5 pid:434943296
+ecl:oth hgt:165cm
+iyr:2013 eyr:2020
+cid:78 byr:1924
+
+iyr:2018 ecl:oth byr:1972 eyr:2028 pid:035313920
+hgt:59in hcl:#fffffd
+
+hgt:185cm
+hcl:#6b5442
+cid:102 iyr:2020 byr:2001
+eyr:2028 pid:003365121 ecl:amb
+
+pid:90937712 hcl:z hgt:173in byr:2012 ecl:blu iyr:2009 eyr:2039
+
+pid:509460932 eyr:2026
+hgt:71in iyr:2010 cid:138 byr:1929 ecl:grn
+
+ecl:xry
+hgt:119
+pid:051834447 eyr:2033
+iyr:2030 hcl:z byr:2030
+
+pid:443984745 eyr:2026 ecl:oth
+byr:1948 hcl:#a97842 hgt:168cm
+iyr:2017
+
+hcl:#602927 iyr:2020 cid:161 pid:069708283 hgt:178cm byr:1960
+eyr:2022 ecl:hzl
+
+iyr:2026 hcl:766b30 eyr:2032 byr:2030 pid:40361792 hgt:158in ecl:#b300dc
+
+eyr:1998 pid:#5c21e4 iyr:2029 ecl:#bef182
+byr:1944 hgt:166in
+hcl:#b6652a cid:317
+
+ecl:amb
+eyr:2024
+hcl:#a97842
+pid:086765271 hgt:183cm iyr:2018 cid:314 byr:2001
+
+hgt:163in pid:491612094 iyr:2028
+cid:82 ecl:#8a052d
+hcl:#ceb3a1
+eyr:2018
+
+byr:1970 eyr:2039
+hgt:174in hcl:#623a2f
+iyr:2020 cid:154 ecl:grn pid:103138652
+
+pid:73895324 eyr:2026 byr:1952 ecl:brn hcl:#733820 hgt:159in iyr:2015
+
+hcl:#623a2f ecl:brn eyr:2026 hgt:185cm pid:791563822 iyr:2019 byr:1951
+
+hcl:#fffffd
+iyr:2014 hgt:83 cid:101 pid:724483094
+eyr:1995 byr:2015 ecl:lzr
+
+hcl:#ceb3a1
+iyr:2013
+eyr:2021 byr:1994 ecl:hzl
+pid:037849486 hgt:60in
+
+pid:63340670 iyr:1995 hcl:b54c2b hgt:71cm
+cid:184 byr:2004 ecl:dne eyr:2026
+
+hgt:169cm
+ecl:brn byr:1947 iyr:2014 cid:224 hcl:#7374df
+
+hcl:#623a2f
+pid:471948403 ecl:gry
+hgt:154cm
+eyr:2023 iyr:2016 byr:1925
+
+eyr:2024 hgt:180cm hcl:#efcc98 iyr:2020 ecl:gry byr:1961 pid:318184801
+
+ecl:blu iyr:2012 eyr:2020 hgt:190cm
+byr:1977
+pid:331654452 hcl:#cfa07d
+
+pid:812502106 byr:1938
+eyr:2020 hgt:169cm ecl:oth hcl:#341e13 iyr:2011
+
+cid:286 byr:1942 eyr:2034 hgt:116
+ecl:utc
+iyr:2023 hcl:#602927 pid:181cm
+
+ecl:amb iyr:2011 hcl:#cfa07d eyr:2029 byr:1975
+hgt:183cm pid:548900689
+
+ecl:utc pid:182cm
+hgt:60cm
+eyr:1989 iyr:1993 hcl:z
+
+iyr:1985 hgt:186 byr:2018
+eyr:2001 pid:9257131167
+hcl:261a65 ecl:lzr
+
+hgt:152
+byr:1922 pid:72992226
+iyr:1968
+ecl:dne eyr:2028 hcl:5c2950
+
+ecl:grn
+byr:1943 hgt:74in eyr:2022
+pid:135491924
+iyr:2011 hcl:#623a2f
+
+iyr:2026 pid:7955389103
+cid:311
+ecl:#b81171 hcl:z eyr:1935 byr:2024
+
+byr:1974 iyr:2010 hgt:165cm
+ecl:amb cid:343 eyr:2023
+pid:972786259 hcl:#6b5442
+
+iyr:2020 byr:1936
+ecl:gry hcl:#efcc98 hgt:170cm eyr:2021 pid:520354073
+
+hgt:185cm hcl:#ceb3a1
+pid:317012754 byr:1991
+cid:199 iyr:2011
+ecl:blu eyr:2028
+
+ecl:#e4e01f byr:2008
+cid:293 iyr:2013 hcl:z pid:#368f7a eyr:2036
+
+eyr:2022 pid:424388475 iyr:2008 hcl:z hgt:61cm
+ecl:zzz byr:1985
+
+hcl:#18171d iyr:2014
+cid:88
+byr:1951 eyr:2021 pid:812441789 hgt:181cm ecl:blu
+
+ecl:amb eyr:2029 hgt:70in pid:580245172
+iyr:2010 byr:1927
+hcl:#a97842
+cid:284
+
+hcl:#3b85ed
+ecl:gry eyr:2029 pid:417534919 byr:1960
+iyr:2010 hgt:71in
+
+hcl:#c0946f
+pid:824103775 hgt:157cm iyr:2018 ecl:brn eyr:2024 byr:1961
+
+pid:673501373
+eyr:2033
+ecl:#06523f hcl:z byr:2030 iyr:1978 hgt:153cm
+
+iyr:2019
+hcl:#a97842 byr:1951 hgt:183cm eyr:2024 ecl:blu
+pid:346079429
+
+eyr:1937 pid:964649406
+hgt:162
+cid:66
+ecl:#f89cc0
+hcl:#866857 byr:2024
+
+hgt:114 ecl:#e7ed3a
+byr:2029 cid:190
+eyr:2026 iyr:1986 hcl:z pid:185cm
+
+hcl:#cfa07d hgt:192cm
+pid:12494711 eyr:2028
+iyr:2020
+ecl:brn byr:2004
+
+pid:710015269
+byr:2011 eyr:2033 hgt:181cm
+ecl:#fb2702
+
+cid:259 pid:208799387
+eyr:2025 hcl:#623a2f byr:1947 ecl:oth hgt:164cm iyr:2014
+
+ecl:brn eyr:2025 pid:432178809 hcl:#341e13
+cid:50
+hgt:192cm iyr:2012
+byr:1994
+
+hgt:150in pid:4902585462 ecl:#7074ad cid:230 iyr:2019 eyr:1931 hcl:z byr:2007
+
+ecl:gry
+byr:1942
+hcl:#602927 cid:178 iyr:2014 hgt:193cm pid:349100081 eyr:2030
+
+byr:1923 hcl:#cfa07d eyr:2021 ecl:brn pid:591544598 hgt:157cm
+iyr:2016
+
+hcl:e15737
+iyr:2017 byr:2030
+eyr:1994 pid:470833249
+hgt:181cm cid:70 ecl:grn
+
+eyr:2030
+hcl:#866857 pid:569423049 byr:1948
+ecl:oth
+
+eyr:2026
+byr:2006
+hcl:#ceb3a1
+iyr:2010 pid:094156115 hgt:64cm ecl:oth
+
+byr:2002 cid:215 ecl:hzl
+hcl:#602927 iyr:2015 pid:53150410 hgt:168cm eyr:2028
+
+iyr:2016 hcl:#7d3b0c hgt:162cm
+byr:1937 eyr:2020 ecl:hzl pid:728906226
+
+byr:1921
+iyr:2018 hcl:#888785
+eyr:2026 hgt:185cm pid:164432370 ecl:brn
+
+ecl:gry iyr:2011
+eyr:2026 hgt:190cm
+hcl:#866857 pid:884570088 byr:1996
+
+ecl:blu
+cid:257
+iyr:2016 byr:1989
+eyr:2024 hgt:179cm hcl:#c0946f pid:418340261
+
+pid:9367990743 hcl:z hgt:182in ecl:utc
+byr:1988 eyr:2025
+
+ecl:hzl hgt:157cm
+iyr:2010 eyr:2027
+hcl:#fffffd byr:1956
+
+eyr:2024 pid:834302242 ecl:hzl
+iyr:2015 cid:97 hgt:188cm hcl:#888785 byr:1927
+
+ecl:brn eyr:2021 byr:1958
+hcl:#a97842 hgt:170cm pid:256795932 iyr:2017
+
+hcl:756c4a
+pid:812879747
+byr:2002
+eyr:2027 ecl:blu iyr:1952 hgt:66cm
+
+pid:#c5e14f
+iyr:2026 byr:2028 hgt:162 hcl:87ba57
+eyr:1952 ecl:lzr
+
+hcl:#341e13 hgt:81 eyr:2021 iyr:2029 cid:262 ecl:amb pid:61006868
+byr:2011
+
+pid:#e58702 cid:145 hcl:#866857
+ecl:grn iyr:2028 hgt:192in eyr:2025 byr:2017
+
+iyr:2026 byr:1969
+ecl:grn
+hgt:70cm cid:140 hcl:e0f231 eyr:2027
+pid:2832019
+
+cid:112 eyr:2028 iyr:2018 hcl:#7d3b0c pid:868808117 byr:1985 ecl:blu
+
+iyr:2017
+pid:350399038
+cid:72 hcl:#ceb3a1
+ecl:gry
+hgt:151cm byr:1946 eyr:2029
+
+eyr:2026 hgt:174cm iyr:2010 pid:534641153 hcl:#733820 byr:1965
+
+hgt:66cm
+byr:2010 ecl:gmt eyr:2039
+iyr:2024 hcl:z
+
+pid:626085326
+byr:1971 eyr:2024
+hcl:#cfa07d hgt:170cm
+ecl:hzl iyr:2019
+
+hgt:185cm pid:995661846 ecl:hzl iyr:2016 byr:1963 hcl:#a97842 eyr:2023
+
+ecl:grt iyr:1976 byr:2010
+pid:170cm
+cid:343 hcl:#7d3b0c hgt:171cm
+
+pid:732695396
+ecl:zzz hgt:151in byr:1955
+eyr:2035 iyr:2026 hcl:z
+
+hgt:187cm hcl:#341e13 iyr:2015 pid:556697270 eyr:2025 ecl:blu byr:1926
+
+ecl:oth
+pid:515980529
+hgt:168cm eyr:2023
+byr:1983 iyr:2012 hcl:#341e13
+
+byr:2010
+hgt:189cm iyr:2016
+hcl:#8ff71e
+eyr:2010
+ecl:blu
+pid:317940449
+
+iyr:2013 hgt:157cm hcl:#a97842 pid:967988435
+ecl:blu cid:214 eyr:2027 byr:1960
+
+pid:2666548509 cid:208 hgt:72cm hcl:#7d3b0c eyr:2040 byr:2008
+ecl:amb
+iyr:1926
+
+eyr:2039
+pid:203432895 hgt:154cm byr:1949
+iyr:2010
+hcl:z cid:144 ecl:xry
+
+pid:984689798 byr:2016 iyr:1999 ecl:utc
+eyr:2037 hgt:68cm hcl:z
+
+byr:1969 cid:230 hgt:72cm eyr:2032
+ecl:gry pid:849701444
+hcl:#c0946f
+iyr:2012
+
+eyr:2026
+pid:588870142
+hcl:#ae5619 hgt:173cm
+cid:189
+ecl:grn byr:1996 iyr:2013
+
+byr:1973
+hcl:#cfa07d ecl:blu
+hgt:193cm eyr:2028 cid:115 pid:786380485 iyr:2011
+
+hcl:#fffffd eyr:2028 hgt:155cm pid:499022582
+ecl:blu byr:1977 iyr:2014
+cid:212
+
+ecl:#92bb4b
+pid:815154669 byr:1923 eyr:2023
+hgt:183cm iyr:1929 hcl:#ceb3a1
+
+byr:1966 eyr:2021 iyr:2020 hcl:#6b5442 ecl:hzl
+pid:3508035599
+hgt:70in
+
+ecl:amb
+hcl:#18171d
+byr:1927
+hgt:177cm pid:555764540 iyr:2018 eyr:2025 cid:90
+
+hgt:139 ecl:#878a7d byr:2006 cid:275 iyr:1980 hcl:60fca6 eyr:1952 pid:001439727
+
+byr:1985
+hgt:174cm ecl:gry
+iyr:2018
+cid:204 hcl:#733820
+pid:141048398 eyr:2027
+
+ecl:gmt hcl:#6b5442 hgt:158cm
+iyr:2025
+byr:2030 pid:966397365 eyr:2029
+
+byr:1962 hgt:166cm pid:261989937 cid:320 eyr:2026
+iyr:2015 hcl:#c0946f
+ecl:hzl
+
+pid:852283506 iyr:2018 eyr:2020 byr:1981 hcl:#733820
+ecl:hzl
+hgt:162cm
+
+pid:3873488100 iyr:1982 ecl:grn
+hgt:63cm eyr:1936
+byr:2011 hcl:8d118a
+
+iyr:1937
+hcl:817646
+byr:2026 eyr:2031 pid:#47591d hgt:183in
+ecl:blu
+
+eyr:2025 hgt:153cm iyr:2015 pid:498382864
+cid:307
+byr:1943
+hcl:#f66fe1 ecl:oth
+
+iyr:2017 hgt:66in byr:1948 hcl:#b6652a eyr:2025
+pid:188366364
+ecl:amb
+
+ecl:lzr
+pid:453174702 iyr:2028 eyr:2032 cid:228 byr:2011 hcl:z
+hgt:172cm
+
+hgt:186cm eyr:2030 cid:316 hcl:z byr:1994
+iyr:2012 ecl:amb pid:993162839
+
+hgt:160cm
+ecl:grn pid:523473760 byr:1993
+iyr:2016 eyr:2025 hcl:#602927 cid:261
+
+iyr:2016 pid:520973843 ecl:gry
+eyr:2023 cid:232
+byr:1944 hgt:159cm hcl:#cfa07d
+
+byr:1969 hcl:#1d37de hgt:184cm eyr:2027 pid:088048141
+iyr:2016 cid:307 ecl:hzl
+
+eyr:2040 iyr:2012 pid:723592140
+hgt:61cm hcl:#18171d ecl:dne
+
+eyr:2025
+ecl:oth pid:4697392468
+hgt:183cm iyr:2017 hcl:b07d71
+byr:1996
+
+ecl:amb eyr:2022 cid:143 pid:806594272 hgt:158cm byr:1977 iyr:2014
+hcl:#866857
+
+ecl:blu
+eyr:2022 iyr:2018 byr:1983 hgt:167cm cid:321 hcl:#efcc98
+pid:344179526
+
+byr:1925 eyr:2021
+hgt:193cm iyr:2020 ecl:grn
+hcl:#888785
+
+iyr:2018
+cid:319 byr:1972 hgt:181cm hcl:#fffffd eyr:2023 pid:493780616
+
+eyr:2021
+hcl:#733820
+ecl:#e91c71
+iyr:2020 pid:451676066 hgt:166in
+byr:1993
+
+eyr:2026
+hcl:#b6652a ecl:blu byr:1999 iyr:2020
+hgt:163cm pid:955741810
+
+iyr:2016 hgt:179cm hcl:#602927
+pid:673271332 byr:1963 eyr:2027 ecl:amb
+
+byr:1927
+iyr:2015 hcl:#866857
+ecl:oth
+hgt:159cm
+pid:992992996 eyr:2030
+
+pid:283188332 hgt:168cm hcl:#6b5442
+eyr:2027 byr:2028 ecl:hzl iyr:2030
+
+byr:1944 pid:628012522 eyr:2020
+hcl:#866857
+iyr:2019 ecl:amb
+hgt:168cm
+
+cid:317 pid:333228098 hgt:158cm iyr:2014 byr:1958 eyr:2024 hcl:#a97842 ecl:oth
+
+hcl:#733820
+cid:314 ecl:oth byr:1938 eyr:2030 hgt:71in
+pid:790938694 iyr:2014
+
+iyr:2020 ecl:grt eyr:2018
+hgt:155cm
+pid:1034925815 hcl:#623a2f cid:304
+
+ecl:brn hgt:158cm hcl:#38fe6c eyr:2030 byr:1926 pid:0860404500 iyr:1993 cid:348
+
+byr:1998
+hgt:185cm
+ecl:brn eyr:2021 pid:567032567 hcl:#733820 cid:328 iyr:2017
+
+pid:491430863 cid:146 hgt:181cm eyr:2026 iyr:2015 ecl:amb byr:1950 hcl:#c0946f
+
+eyr:2033 cid:289
+pid:396679011 ecl:oth byr:1988
+hgt:156in
+hcl:#cfa07d iyr:2029
+
+ecl:grn iyr:2015
+byr:1986 hcl:#a97842 hgt:62in
+pid:403990108 eyr:2030
+
+pid:42635067 cid:301
+iyr:2027 hgt:173in
+byr:2004 hcl:z
+eyr:2034
+
+byr:2020 hcl:#fffffd
+hgt:180in eyr:2040 pid:304951921
+iyr:2030 ecl:#1aaf20
+
+iyr:2020 hcl:#888785 ecl:hzl hgt:181cm byr:1992 eyr:2021 pid:936006959
+
+hgt:172in ecl:#fd71a7
+hcl:787715 pid:363058480 byr:2020
+iyr:2022
+eyr:2034
+
+iyr:2018 ecl:blu eyr:2029 hcl:#cfa07d hgt:155cm byr:1937 pid:851148031
+
+byr:2014
+cid:222 ecl:zzz hgt:67cm eyr:2040 pid:#8ab0e2 hcl:z iyr:2027
+
+hgt:180cm hcl:#375883 eyr:2027 byr:1925 ecl:brn
+iyr:2011
+pid:158752719
+
+byr:1935 ecl:oth eyr:2027 pid:041108579
+hcl:#602927 iyr:2011 hgt:190cm
+
+hcl:#a97842 pid:131728607 ecl:blu iyr:2014 hgt:176cm eyr:2020
+byr:1921
+
+pid:11754457
+iyr:2018
+hgt:65cm eyr:2038
+ecl:dne hcl:z
+cid:293
+byr:1940
+
+eyr:2023
+iyr:2016
+byr:1930
+ecl:hzl
+cid:212
+hcl:#733820 hgt:59in
+pid:319501919
+
+cid:278
+eyr:1967 hcl:#ceb3a1 pid:#9f5254 hgt:177in byr:1977 iyr:2030
+
+hcl:#ceb3a1 byr:1998 hgt:72in cid:202 ecl:gry pid:463378493 iyr:2015
+eyr:2030
+
+hcl:#7d3b0c hgt:164cm ecl:hzl byr:1960 eyr:2023
+iyr:2017
+
+ecl:hzl hcl:#866857 byr:1986 iyr:2018 eyr:2027 hgt:176cm pid:928057092
+
+pid:431113230 hgt:186cm eyr:2025
+iyr:2018 ecl:amb byr:1973 hcl:#623a2f
+
+hcl:#cfa07d hgt:179cm iyr:2017 pid:760075190 ecl:amb eyr:2030
+
+hcl:#602927
+iyr:2012
+pid:571020910 ecl:#b6715d byr:1943 eyr:2028
+hgt:161cm
+
+hgt:176cm cid:121 pid:654127593 ecl:brn hcl:#160d38 iyr:2015
+eyr:2021 byr:1997
+
+eyr:2021 byr:1929
+pid:192025713
+hcl:#c0946f iyr:2012 ecl:oth hgt:179cm
+
+eyr:2024 ecl:gry
+hgt:158cm byr:1932 hcl:#ceb3a1
+iyr:2010
+pid:521188306
+
+eyr:2028 ecl:brn
+hcl:#efcc98
+hgt:157cm
+iyr:2012
+pid:212547203 byr:1970
+
+eyr:2029 pid:182693366 hcl:#623a2f hgt:130 byr:1972
+cid:310
+iyr:2010 ecl:amb
+
+byr:1944 iyr:2013
+ecl:brn cid:335
+hgt:163cm
+eyr:2025 hcl:#7d3b0c pid:405230824
+
+hcl:#ceb3a1 iyr:2015 pid:572001387 byr:1962
+ecl:amb hgt:151cm
+
+byr:1928
+eyr:2022
+iyr:2018 ecl:blu
+hcl:#602927 pid:767081131
+
+byr:1948 hgt:180in pid:188cm
+ecl:hzl
+eyr:2013 hcl:e0b9f3 iyr:1975
+
+hcl:#c0946f byr:1989
+eyr:1980 hgt:67cm pid:538025041
+iyr:2014 ecl:gry
+
+eyr:2028 pid:958756919 hcl:#733820 byr:1945 cid:158 ecl:blu
+hgt:168cm iyr:2018
+
+cid:200 hcl:#fffffd
+byr:2015 ecl:gry eyr:2031 hgt:59 pid:065027646
+iyr:1967
+
+byr:1999 ecl:hzl pid:813536928 iyr:2015 cid:296 hcl:#6b5442
+eyr:2025 hgt:186cm
+
+byr:2000 iyr:2012
+hcl:#fffffd
+cid:263 hgt:68in pid:105489529
+ecl:amb eyr:2024
+
+eyr:2026 hcl:#602927 hgt:181cm
+byr:1982
+pid:603871531 iyr:2018 ecl:blu
+
+cid:302 pid:387895477 eyr:2027
+hcl:#cfa07d hgt:191cm iyr:2015
+ecl:hzl byr:1940
+
+iyr:2018 cid:165
+ecl:blu hgt:181cm byr:1994 eyr:2026 pid:077013268
+
+eyr:2022 hgt:174in iyr:2010 byr:2023
+hcl:#733820 ecl:oth
+pid:311692961
+
+ecl:#10f2a9 pid:964417986
+eyr:2024 hcl:#0aeec7 byr:1965 iyr:1943 hgt:167cm
+
+hcl:#341e13 iyr:2020
+ecl:brn
+hgt:188cm eyr:2021 byr:1952
+pid:077471062
+
+byr:1950 cid:110 hgt:160cm eyr:2026
+hcl:#623a2f
+iyr:2013
+pid:972823574
+
+pid:553704996 hgt:171cm
+eyr:2028 iyr:2017
+hcl:#18171d byr:1954 ecl:blu
+
+hgt:180cm ecl:brn eyr:2029 pid:707999496 hcl:#cfa07d byr:1960
+
+pid:9325738036 iyr:1996 hgt:152in byr:2004 cid:292 hcl:14a56f
+eyr:2031
+ecl:#dbd99d
+
+byr:1957
+eyr:2021 pid:557648216 ecl:amb hcl:#7d3b0c hgt:186cm
+iyr:2020
+
+hcl:#602927 hgt:186cm pid:604175608
+iyr:2013 eyr:2026 ecl:oth byr:1991 cid:65
+
+ecl:gry
+iyr:2012 hgt:154cm
+pid:872898058 eyr:2030 hcl:#341e13 byr:1994
+
+pid:228236326
+iyr:2013 cid:347 byr:1942
+eyr:2021 ecl:brn
+hgt:165cm
+hcl:#fffffd
+
+pid:392777182 cid:189 hcl:#cfa07d eyr:2027 hgt:191cm ecl:blu byr:1978
+
+hgt:158in iyr:2028
+pid:5145408095 byr:2012 ecl:#94c57d hcl:z eyr:1996
+
+byr:1949 eyr:2021
+ecl:#5ffbeb iyr:1948 pid:42650064 hcl:z hgt:167cm
+
+iyr:2013 ecl:xry cid:100
+hgt:138 byr:2013
+eyr:1944 hcl:92b68c
+
+hgt:187cm
+ecl:grn hcl:#602927
+iyr:2010
+eyr:2022 byr:1949 cid:280 pid:251802347
+
+ecl:grn
+cid:219
+iyr:2018 hgt:165cm
+pid:703878503 eyr:2024 hcl:#b6652a
+byr:2002
+
+hcl:#18171d cid:341 ecl:amb byr:1941 eyr:2021 iyr:1990 pid:865132177 hgt:153cm
+
+byr:2008 pid:861480549
+cid:97 eyr:2028 hcl:#efcc98
+iyr:2015
+hgt:191cm ecl:#232b23
+
+hcl:#cfa07d
+eyr:2030 iyr:2013 cid:304
+ecl:gry pid:199056608 hgt:192cm
+byr:1926
+
+pid:355135528 hgt:153cm byr:1998 iyr:2019 eyr:2027
+ecl:amb hcl:#18171d
+
+eyr:2028 hcl:8eed9c ecl:grn
+iyr:2010 byr:2005 hgt:107
+pid:64892698
+
+pid:601671623 hgt:153cm iyr:2011 hcl:#b6652a byr:1975 ecl:grn eyr:2029
+
+ecl:grn hcl:#18171d hgt:157cm
+eyr:2023 pid:507932715 byr:1920 iyr:2020
+
+eyr:2022 byr:1933 hcl:#fffffd iyr:2016 hgt:181cm pid:826522507 ecl:blu
+
+byr:2002 hcl:#866857 hgt:177cm pid:240202426
+ecl:gry cid:127
+eyr:2022
+iyr:2014
+
+byr:1971
+iyr:2017
+pid:733985576 hcl:#c58c6c hgt:178cm
+ecl:blu
+eyr:2023
+
+ecl:blu iyr:2017 pid:558732458 hcl:#1b3ab5 eyr:2025 byr:1967 hgt:176cm
+
+eyr:2025 ecl:gry iyr:2020 byr:1988
+hcl:#733820
+hgt:189cm cid:151 pid:934827751
+
+ecl:gry eyr:1951
+iyr:1932
+pid:309366394 byr:1945 hcl:#623a2f hgt:179cm
+
+pid:462345884 ecl:hzl
+cid:206 eyr:2021 hcl:#733820
+byr:1982 hgt:180cm iyr:2010
+
+iyr:2020 hgt:155cm hcl:#341e13 pid:110467532 cid:92 ecl:hzl byr:1975 eyr:2028
+
+hcl:#18171d iyr:2010
+hgt:182cm byr:1930
+eyr:2024
+cid:226
+
+byr:1956 hcl:fb0c6f pid:181cm eyr:2012 iyr:2020
+ecl:#d38822
+hgt:69cm
+
+ecl:gry iyr:2018
+hgt:169cm byr:1981
+pid:534824014 cid:287 eyr:2021 hcl:#c0946f
+
+eyr:2039 hcl:#328e90 iyr:2015
+hgt:170cm pid:#9fa2a4 byr:1999
+ecl:#cd1fd7
+
+hgt:190cm hcl:#733820
+pid:302244363
+ecl:brn
+byr:1965 iyr:2013
+
+iyr:2012
+eyr:2021
+pid:579705743
+ecl:brn hgt:190in
+byr:1954 hcl:#888785
+
+eyr:2036 hgt:154cm
+pid:800720865 byr:2023 ecl:oth iyr:2010 hcl:z
+
+pid:#92f6a9 iyr:2028 eyr:1943
+hgt:191cm ecl:hzl hcl:z byr:2018
+
+hcl:#c0946f
+pid:419930442 hgt:167cm
+byr:1969
+eyr:2020 ecl:brn
+
+pid:137802946
+eyr:2020 byr:1947 ecl:grn hgt:192cm iyr:2016 hcl:#888785
+
+ecl:#f66cce eyr:1958 iyr:1954
+pid:833131572
+hcl:z
+cid:212
+hgt:109 byr:1924
+
+hgt:179cm ecl:gry pid:065881341 byr:1985
+hcl:#fffffd cid:204 eyr:2026
+
+hgt:167cm
+iyr:2017 pid:898571403 byr:1929
+ecl:blu hcl:#d506d0 eyr:2028 cid:100
+
+byr:1991 pid:2795214253 iyr:2011
+cid:152 eyr:2028
+hgt:170cm hcl:#a45065 ecl:lzr
+
+hgt:188cm eyr:2030 iyr:2010
+pid:297292695 byr:1955 hcl:#fffffd
+ecl:blu
+
+hgt:170cm eyr:2029 pid:913242036 byr:1993 cid:89 hcl:#888785
+iyr:2010
+ecl:blu
+
+iyr:2028 eyr:2025 hgt:150in ecl:grn
+byr:1995
+pid:974802728
+hcl:#cfa07d
+
+eyr:2021 byr:1989
+hcl:#18171d ecl:blu hgt:168cm
+pid:626530259
+iyr:2020
+
+hcl:#6b5442 hgt:158cm pid:798732187 byr:1922 eyr:2020 iyr:2011 ecl:gry
+
+hcl:#341e13 pid:092679330 byr:1997 ecl:oth hgt:159cm iyr:2010 eyr:2026
+
+hgt:185cm
+iyr:2020 byr:1947
+pid:105846744 ecl:gry cid:134 eyr:2027
+
+pid:252016128 hcl:9016ff cid:158 hgt:161 ecl:gry
+byr:1952 eyr:1955 iyr:2018
+
+iyr:2020 hgt:154in byr:1958
+eyr:2029 ecl:#2feb89 pid:99780178
+
+hcl:z
+eyr:2001 ecl:gmt
+byr:2022 hgt:73in iyr:2029
+pid:388744230
+
+hgt:186cm
+byr:1939 pid:622948608 ecl:oth eyr:2030
+hcl:#c0946f
+
+cid:272
+eyr:2025 byr:1979 ecl:brn hgt:180cm pid:456545466
+hcl:#fffffd iyr:2012
+
+pid:946657041 byr:1999
+iyr:2014 hcl:#ceb3a1 hgt:150cm
+ecl:grn
+
+byr:1957 pid:177cm ecl:blu eyr:2020 hcl:#cfa07d
+iyr:2010 hgt:183cm
+
+pid:161cm eyr:2025 hcl:#b6652a
+cid:213
+ecl:xry
+hgt:150cm
+iyr:2024 byr:2012
+
+hcl:ea1960
+ecl:grn
+pid:#7127b2 iyr:2012 eyr:2011 hgt:150
+
+pid:178699291
+hgt:66in eyr:2027
+byr:1985 iyr:2014 ecl:amb
+
+iyr:2017 ecl:blu
+eyr:2027 hgt:191cm byr:1990 hcl:#b6652a pid:074411798
+
+pid:528782860
+hgt:181cm hcl:#c0946f byr:1965 iyr:2012 ecl:grn eyr:2020
+
+pid:#ba10da hgt:176in byr:2006
+ecl:grt
+iyr:2030 eyr:1949 hcl:d3ca76
+
+hgt:66cm ecl:#898478 hcl:#e9f7a5 eyr:2030 iyr:2022
+byr:2025
+pid:159cm
+
+byr:1994 hcl:#ceb3a1
+pid:028071950 eyr:2022 ecl:gmt hgt:151in iyr:2016
+
+byr:2001 iyr:2011
+ecl:brn
+pid:487702556 hcl:#602927
+hgt:167cm eyr:2026
+
+# The above line MUST be blank
diff --git a/2020/04/puzzle-1.awk b/2020/04/puzzle-1.awk
new file mode 100755
index 0000000..4c0c474
--- /dev/null
+++ b/2020/04/puzzle-1.awk
@@ -0,0 +1,30 @@
+#!/usr/bin/env -S awk -f
+
+length == 0 {
+ valid = 1
+ for (i in fields) {
+ if (fields[i] == "")
+ valid = 0
+ }
+
+ if (valid)
+ count++
+
+ fields["byr"] = ""
+ fields["iyr"] = ""
+ fields["eyr"] = ""
+ fields["hgt"] = ""
+ fields["hcl"] = ""
+ fields["ecl"] = ""
+ fields["pid"] = ""
+}
+
+{
+ for (i = 1; i <= NF; i++) {
+ split($i, data, ":")
+ fields[data[1]] = data[2]
+ }
+}
+
+# Why do I need to subtract one? This code is so old I can't remember
+END { print count - 1 }
diff --git a/2020/04/puzzle-2.awk b/2020/04/puzzle-2.awk
new file mode 100755
index 0000000..bb88145
--- /dev/null
+++ b/2020/04/puzzle-2.awk
@@ -0,0 +1,67 @@
+#!/usr/bin/env -S awk -f
+
+function between(x, l, h)
+{
+ return (x >= l) && (x <= h)
+}
+
+BEGIN {
+ eyecolor[1] = "amb"
+ eyecolor[2] = "blu"
+ eyecolor[3] = "brn"
+ eyecolor[4] = "gry"
+ eyecolor[5] = "grn"
+ eyecolor[6] = "hzl"
+ eyecolor[7] = "oth"
+}
+
+length == 0 {
+ valid = 1
+
+ if (!(between(fields["byr"], 1920, 2002) && between(fields["iyr"], 2010, 2020) &&
+ between(fields["eyr"], 2020, 2030) && length(fields["pid"]) == 9))
+ valid = 0
+ else {
+ # Test eyecolor
+ valid = 0
+ for (i in eyecolor) {
+ if (fields["ecl"] == eyecolor[i]) {
+ valid = 1
+ break
+ }
+ }
+
+ # Test height
+ split(fields["hgt"], height, "[^0-9]")
+ if ((fields["hgt"] ~ "cm" && !between(height[1], 150, 193)) ||
+ (fields["hgt"] ~ "in" && !between(height[1], 59, 76)) ||
+ (fields["hgt"] !~ "cm|in"))
+ valid = 0
+
+ # Test haircolor
+ if (fields["hcl"] !~ "^#[0-9a-f]{6}")
+ valid = 0
+ }
+
+ if (valid == 1)
+ count++
+
+ fields["byr"] = ""
+ fields["iyr"] = ""
+ fields["eyr"] = ""
+ fields["hgt"] = ""
+ fields["hcl"] = ""
+ fields["ecl"] = ""
+ fields["pid"] = ""
+ next
+}
+
+# Non-blank lines
+{
+ for (i = 1; i <= NF; i++) {
+ split($i, data, ":")
+ fields[data[1]] = data[2]
+ }
+}
+
+END { print count }
diff --git a/2020/05/.gitignore b/2020/05/.gitignore
new file mode 100644
index 0000000..e2451f9
--- /dev/null
+++ b/2020/05/.gitignore
@@ -0,0 +1 @@
+seatids
diff --git a/2020/05/Makefile b/2020/05/Makefile
new file mode 100644
index 0000000..48f7dd4
--- /dev/null
+++ b/2020/05/Makefile
@@ -0,0 +1,6 @@
+all:
+ ${CC} ${CFLAGS} -o seatids seatids.c
+
+.PHONY: clean
+clean:
+ rm -f seatids
diff --git a/2020/05/input b/2020/05/input
new file mode 100644
index 0000000..e3bc909
--- /dev/null
+++ b/2020/05/input
@@ -0,0 +1,908 @@
+FBBFBBBRLL
+FBBFFBFLLL
+BFFFFFFLRL
+FBFBFFFLRR
+BBBFBFBRLL
+BFBBFFBRLL
+BBFFFFBRLL
+BFBFBBBLRR
+FFBBFBFLLR
+FBBBBFBRRR
+FFBFBBFRLR
+FBBFFFFRRR
+BFBFFBFRRL
+FFFBBFFLLL
+FFFFBBFLLL
+FFBFFBBRLL
+FBBBBBFLRR
+FFFBFFFLRR
+FBBBBBFRLR
+BFFBFFBLRL
+FBBFBFBRRL
+FBFBFBFRRR
+FBBBFBFLRR
+FFBBFBFRRL
+FFBFFBFLRL
+BFBFBFBLRR
+BBFBBBFRRL
+BFBFBBFRLL
+FBBFBFBLLR
+BFFFBFFLRR
+FBBBFFFRLR
+FBBFFFFLLL
+BFFFBBBLRL
+BFBBBFBRLR
+BFBBFFFLRL
+FFFBFFFRRR
+BBFFBFFRLL
+FFBFBBFRRR
+BBBFFBBLLL
+FFBBBFFRRR
+BFFBFBBRLR
+BBFBBFFRLR
+FFBFBBFLRL
+BFBBFBBLLL
+FBBFBFBLLL
+FBBFBBFLRL
+BFBFBBBRLR
+FFBFFFFLRL
+FBBFFFFRLR
+BFBBBFBRLL
+FFFBBBBLLR
+BFFFBFFLLL
+BFFBFFFRRR
+FBFFFFBRLL
+BFBFFFBRLR
+FFBBFFFLRL
+FFBFBFBLLL
+FBFBBFBRLR
+BBBFFFFLLR
+BBFFBBBRLR
+FFBFBFBLRR
+BFBBFBFLLL
+FFBFFBBLLR
+FBBFFBBLLL
+BFBFBFFRRR
+BBFBBBFRLL
+BFBFFBFLRR
+BBBFFFFRLR
+BFFBFBFLRR
+FFFBFFFRLR
+FFBBFFBLRL
+FFBFFBBLRL
+FFBBBBFLLL
+FBBBFBBLRR
+FFBFBFFRRR
+BFFBFBFRRL
+FFBBBFFLLL
+BFFBBFFLLL
+BFBFFFBLRR
+FFBBBBFRRR
+BBFFBBFRLR
+FFFBBFFLRL
+BFFBBFFRRL
+FFFBBBFLLL
+FBBFFBBLRR
+BFFFBFFLLR
+BBFBFBFLRL
+BBFFFFFLRL
+FBBBFFBLLR
+FBFFFFFLLL
+BBFFBBFLRL
+FBBBBBFLLR
+BBBFBFFLLL
+FBBBBBFRRL
+BFBBFFBRLR
+FFBBBBBLLR
+FFBFBFFLRL
+BBFBBBBLRR
+BBFFBBBRRR
+FBFBFBFRLL
+FBBBFFFRLL
+BFFBBBBLLR
+BFFFFFBLLR
+FFBBBBFRLL
+BFFFFBBLRR
+FBBFBBBRLR
+BBBFFFBLRL
+BFFBBFBRRR
+BBFBBFBRRR
+BFFBBBBRRR
+BBFFBBFLLR
+FBFFBBBLLR
+BFBBBBFRLL
+BBFBFBFLLL
+BFBBFFBRRR
+FBFBFBFRLR
+FFFBFFBLRL
+FBFBBFFRLR
+BFBFFBBRLL
+BBFBFFFRLL
+FFFBBBFRLR
+FFBBBFBRRR
+BBFBFBBRLR
+FBFBFBFLRR
+BBFFFBBRLL
+BBFFBFBLLL
+FFFFBFBRRR
+BBFFBBBLRL
+BBBFFFFLLL
+FFBBBFBRLR
+FBFFFBFRLR
+BFBFBBBLLR
+FFFBBFBRLL
+BFFFFBBLLR
+BFBBBFBLLL
+BBFFBFFLRR
+FBFFFBFRLL
+BBFFFBFLRR
+FFBBFFBLRR
+FBFFBFFLRL
+FFFBBFFRRL
+BFFBFFFLRL
+FFFFBFBLRL
+FBFBBBBRLR
+FFBBFBBRLL
+FFFBBBFLRL
+FFBFBBFLRR
+BFBBBBFLRL
+FBFBBFBLRL
+FBBFFBBRRL
+FBFFBBFRRL
+BFFBBFFRRR
+FBFBFFFRRR
+FFBBFBFLLL
+FBBFFFBLRL
+BFBBBBFLRR
+FBFBBFFLRL
+BBFBBFBLLL
+BBBFFBFRLR
+FBBBFFFLRR
+BBFFFBFRLR
+BBBFFBFLLL
+FBBFFFBRRR
+FFFBBBFLRR
+FFBFBBBRLL
+FBFBBFFRRL
+BFBBFBFRLL
+FBFFBBBLLL
+FFFFBBBLLL
+FFBBBBBRRL
+BBBFBFFLRL
+FBBBBFBLRL
+BBFFBBBLLL
+BFFBFFFLLR
+FBBBBBBLLL
+FFFBFBBRLL
+FFBFBBFLLL
+FFBFBBBRLR
+BFBBBFBLRR
+FBBBBBBLRL
+BFBBFBBRRL
+BBFBBBFLLR
+FBFFBFBRLR
+FFBFBBBLRL
+FFBBFFFRRR
+FBBBBFFLLL
+FFBFFBFRLL
+FFBFFBBLRR
+BFBFFBFRLL
+FFFFBFBRLL
+FBFFBFBLLR
+FFFBFBBLLL
+FBBBBBFRRR
+FFFBBBBRLL
+FBFFBFBLRL
+BBFBFBFRRL
+FFFBFFBLRR
+BFFBFFBRRR
+FBFFFFFLRL
+FBBFBFFLRR
+FBFFBFBLRR
+FBFFFBBLLL
+FFBBFBBLLL
+BFFFFBFLLL
+FBBBFBFLRL
+BBFBFFBLLR
+BBBFFBBRRL
+FBFBFFFRLR
+FBFFBFBRRR
+FBBBFFFRRL
+BFBFFBBRLR
+FBBFFFFRRL
+BBFFFFFRLR
+FFFBFBFRLR
+FBBFFFFLRL
+BBFFBBBLLR
+BFFFBFBLLL
+FFFBFFFLLR
+FBFBBFBRRL
+BFBBBFFLLR
+BFBFBBFLLR
+BFBFBFFLRL
+FBFFBBFLLR
+FFFBFFFRLL
+FBFBFBFLLL
+FBFFFBFLLR
+FFFBFBBRRR
+BFFFBBBRRR
+FBBFBFFLLL
+BBFFFBBRRL
+FBBBFBBLLR
+FBFBBFBRRR
+BFFFBBFLRR
+BBFBFFFRRR
+FBBBBBBLRR
+BFBFBBFRRR
+BBFBBBBRLR
+FFBBFFBLLR
+FFBFBFFRLL
+BBFFBFFRRL
+BBFFBFBLRR
+FBBBFFBLLL
+FBFBFFFLLL
+BBBFBFFRRR
+BBFFFFBLLR
+BBBFBFBLLR
+BFBFBFFLLL
+BFBFFFBLLL
+BBFBFFFRLR
+FBFBBBFRLR
+FBFBBBFLRR
+FBFBBBBLLR
+FBBBFBFLLL
+FFBBFFBRRR
+FBBFBBFLLL
+FBFBFFBRRL
+BFBFBBBRRR
+BFFBBBBLRL
+FFFBBBBLLL
+BFBBBFFLLL
+FBBFFBFRLR
+FFFBFFFLRL
+BBFFFBBLLR
+BBBFFBFRRR
+BBFBBBBRRL
+FFBFFFFRLR
+FFBBBFBLLL
+FFBFFFFLLL
+BFFFFBFLRR
+BFFFBFFRRL
+BFBBFBBLRL
+FBFBBBFLLR
+FFFBFBBLRR
+FFBFFBBRRL
+FFBBFBBLRR
+FFBFFFBRRL
+BBBFFFBLRR
+BBFBFBBRLL
+BFBBBBBLLL
+FFBBBBBRLL
+FBFBFBBLLR
+BFBFFFFLRR
+FBBBBBBRLL
+FBFFFBBRLL
+FBBBBFBLLL
+BFFBFFFLLL
+BBFBFBFRLR
+BFBBBFFLRR
+BBFBFFFLRR
+BFFBBBFLRL
+BFBFFBFLRL
+FFFBFBBRRL
+BBBFFBBLLR
+FBFBBBBLLL
+FBBFBBFLLR
+FBFFBFBRRL
+BFBBFFFLRR
+FBFBBBBRRL
+FBBBBFBLLR
+FBFFFFFLRR
+FFBBBFFRLR
+BFBBBBBRRL
+BBBFFFBLLR
+BFFBBBFLRR
+FFBBBBBLRR
+FBBFFBFRLL
+BFBFBFFRRL
+FFFBFBFRLL
+FFBFFFBRRR
+FFFFBBFRLR
+BBFFFBFLLL
+FFFFBFFRLL
+FBBBFBFRRL
+FBBBFFFRRR
+FFFFBBFRRR
+FFBFFFBLRL
+BBFBBBFRRR
+BFFBFFFRLR
+FFFBFBFRRR
+FFFFBBBRLL
+FBFBFFBLRR
+BBFFBFFLLL
+BBBFFBBLRL
+BBFFBFBLRL
+FFBBFBBRRR
+BFFBFBBRLL
+BFBBBBBRLL
+BBFFBBBLRR
+FFBBBFBLRR
+FBBFBBBLLR
+BFBBBBBRRR
+BBFBBFFLRR
+BBFFFBBLLL
+BFBBFFFRRR
+BFBBFFBLLL
+BFBFBBBLRL
+BFBFFBBLRR
+BBFFFBBLRL
+FBBFFBBRLL
+FBFFBFFRLR
+FBFFBFFLLR
+BFFFBBFLRL
+FFBFFBFRRR
+BFBFFBFRRR
+BFFFFBBRLR
+FBBFFBFRRL
+FFFBFBBLRL
+BFFFBBBRLL
+FBFFBFFRRL
+BBBFBBFLLL
+BBBFFBFLRL
+FBFFBBFLLL
+FFFFBBFLRR
+BFFFFBFRLR
+BFBBBFBRRR
+BBFBBFFLRL
+BFBBFBFRRL
+BFFBFBFRLL
+FBFFBFFLLL
+BFFFBBFRLR
+FFBBFBFLRR
+BFBBFBBRLL
+FFFBBBBLRL
+BFBBBFBRRL
+FBFFFFFRLR
+FFBFBFBLLR
+BFBBFBBLLR
+BBBFFBFLRR
+BFFBBBBRRL
+FBBBBFFRLR
+FBFFFBFRRL
+FFBFFFFRLL
+FFBBFBBLLR
+BBFBBBBLLR
+BFBFBFFRLR
+BBBFFFBRLR
+BFFBFBBLLL
+BFBFBBFRRL
+FFFBFFBRRR
+FFFBFBBLLR
+FFBBFFBRLR
+FFFBBBBRLR
+FBBFFBFLRR
+BFFBFFBLLL
+FBFBBBBRRR
+FBFFFBBLRL
+BBBFBFFRRL
+FBFFBBBLRR
+BFBBFFFRLL
+BFBFFFFRRL
+FBFBFFFRLL
+BFFFBFBLLR
+FBBFBBBLRL
+FBBFFFBLLL
+FBFBBBFRRR
+FFBFFBFLRR
+BBFBFBBRRL
+BBFBBBFLRL
+BBFFFFFRLL
+FFBFFBBRLR
+BBFBBBBLLL
+BBFBFFFLRL
+FBFBBFBRLL
+FBFFBBBRRR
+FBFBFBFRRL
+BFFFFFBRRR
+FFBFBBBLLL
+FFBBFBFLRL
+BFFBBBFRLL
+FBBBFFBRRR
+BFFBFBFLRL
+BBFFFBBLRR
+BBFFBFBRRL
+FBFBFBFLLR
+FFBFBFBRRL
+BFFFFBBRLL
+BBFFFFBRRL
+FFBBFFBRLL
+BFFBBFBRLL
+FBBBFFBRLL
+BFBFFFBLLR
+FFFBFBFRRL
+BBFFBFBRRR
+BFFFFFFLLR
+FBBFBFFRRL
+BFFBBBBLLL
+FFBBFFFLLL
+FBBFFBBLLR
+FFFFBBFRLL
+FBFBFFFRRL
+BFFFBBFRRR
+BBFBFFBRRL
+BFFBFBBRRR
+BFBFFBFRLR
+BBFBFFBLRR
+BFBBFBBRRR
+BFBFFFFRLL
+BBFFBBBRLL
+FFBFFFFLRR
+BBBFBFFLLR
+FFFBBFBRLR
+BFBBFFFLLL
+FBBBFBBRLR
+FFBFFBFRLR
+FBFBBFBLLL
+FBBBFBFRRR
+FBFFFBBRRR
+BFFBFBFRRR
+FFBBBBFRRL
+BBFBFBBLLL
+BBFFBFBLLR
+BBBFFFFRRL
+FFBFFFFRRR
+BBFFBBFRRR
+FFBBBFBLRL
+FBBFBFBLRL
+FBBBFBFRLR
+BFFBFBFRLR
+BFFFBFBRRR
+FFBBFFFRLL
+FBFFBFBRLL
+FFBBBFFLRR
+FBBBFBBRRL
+BBFBBBBLRL
+BFFFBBBLLR
+BFBBBBBLRL
+BFFFFBFLRL
+BFFFFFFRLL
+FFFFBBBRRL
+FFBFBBFRRL
+BBBFFBFRRL
+FBBFBFFLRL
+BBBFBFBLRL
+FBBFBBFRRL
+FBFBFFBLLL
+FBBBBBBLLR
+BBBFFFBRRL
+FFBFBBFLLR
+BFBFFBBRRL
+FFBFFFBLRR
+BBFBFBFRRR
+FBBBBFBLRR
+FFBBFBFRRR
+BFBBFBFLRL
+BBFFBFFLLR
+FFFFBBBLLR
+FFFBBFBLLL
+FFBBFFFRRL
+BFFBBBFRRL
+BFBBBBBLLR
+BBBFFFFRRR
+FBFFBBBRLR
+FBFFBFFRRR
+FFFBFBFLRL
+FBFFBFFRLL
+FBBBFFFLLL
+BFFFFFBLRR
+BFBBFBFRLR
+FBFBBBBRLL
+FBFBBBFLRL
+FFFBBFBLRR
+BBFBBBFRLR
+FBFFFFBLLR
+BBBFFBFRLL
+FBBFBFFRLR
+BFFFBBFRRL
+BFFFFBBRRR
+FBFFBFBLLL
+BFBFFFBRRR
+BFBFBBFLRR
+FBFFBBBLRL
+FFBFBBFRLL
+FBBBFBFRLL
+FFBFFBBRRR
+FBBFFBBRLR
+BFFBFBBLRL
+FFBFBFFRRL
+FBBFFFFLRR
+BBFBBFFRRR
+BFBBFFFRRL
+FBBFFFBRLL
+FFBBBBFRLR
+BBFFBBFRRL
+BFBBFBFRRR
+BFFBBFFLLR
+BBFFBBFLRR
+BBFBBFFLLR
+BFFFBBFLLL
+FBBBFFBRRL
+BBFFFFFLRR
+BFFFBBBRLR
+BFBFBBFLRL
+BBFBBFBLRR
+FFBFFFFRRL
+BFFBBBFLLL
+FBFBFBBRLR
+FFBBFFFLLR
+FFFBFFFRRL
+BBFBBFBRRL
+BBFFFFFLLR
+FFFFBFBRLR
+BFFFFBFRLL
+BBBFBFFRLR
+BFFFFBBLRL
+BFFBBFFLRR
+FBFFFBBLRR
+BFFFBBBLLL
+BFFBBBFLLR
+BFFBBFBRRL
+FBBFBFBRRR
+FBFBFFFLLR
+FFFBBFFRLR
+FFBFBFFLLR
+FBBFFBFRRR
+FBFFBBFRLR
+FBBFFFBRLR
+BFBFFFBRRL
+BFFFFBFLLR
+BBBFFFFLRR
+BFBFBFFRLL
+FBFBFBBRRL
+FFBFBFFLLL
+BBFFFFBRRR
+FBFBBFFRLL
+BBFFFFFLLL
+FFFFBBBLRL
+BFFFFBBLLL
+FFFBFBFLLL
+FFFFBFBLLR
+FFFBBFBLLR
+FFFBBFBLRL
+FFFFBFFRRR
+BBFFFFBLRL
+BFBBBBFLLR
+BBFBFBBLLR
+BFFFFFFRLR
+FBBFFFFRLL
+FFFBFFBLLL
+BBBFFBBRRR
+BBFBFBBLRR
+FBBBBFFLRL
+FFBBBFFLLR
+FBBBBFFRLL
+BBFBFBFLRR
+BFFBFBBLLR
+BBBFFFFRLL
+FBFBFFBRRR
+FBFBFFBLLR
+FFFBBFBRRL
+FBBBBBBRLR
+FBFFFFBRRL
+FFBBFBBRRL
+BBBFFFBRLL
+FFFBFFBLLR
+BFBFBBFLLL
+BFFBFBFLLR
+BBFFBBFRLL
+BFFFBBFLLR
+BFBBFBFLRR
+FBBFFBFLLR
+BBFBBFFRLL
+FFBBBBBRRR
+FFFBBFFLLR
+BBBFFBFLLR
+BBFBFFBLLL
+FFBBFBBRLR
+FBBBBBFRLL
+BBFBFFBRLR
+BBFFBFBRLL
+BFFBFFBLLR
+FBFFBFFLRR
+FBFFFBFLRL
+BFBBFFFLLR
+FBBFBFFRRR
+FBFBFBBLRR
+BFBBBBFRRR
+BFBFFFFLRL
+FFFBFFFLLL
+FFFBBBFRLL
+FFFBBBFRRR
+FBBBBBFLRL
+BBFFFFBLRR
+BFFBBBFRLR
+BFFBFFBRLR
+FBBBBFBRLR
+FFBFBBBLRR
+BBFBFFFRRL
+BFFBFBBLRR
+BFFBBFFLRL
+BFBFFFFRRR
+FBBBFBBLRL
+BFBBBFFRRL
+FBFBBBFLLL
+BFFBBBBRLL
+FBBFFFBLLR
+BBBFBFFLRR
+FBFFBBFLRR
+BFBBFFBLLR
+BFFBBFFRLR
+BBFFBBBRRL
+BFFBBFBLLR
+FBBBBBFLLL
+BBFFFBFLLR
+BFBBBFFLRL
+FFBBFBBLRL
+BBFBFBFLLR
+BBFFFBFRLL
+BFFFFFBRRL
+BBBFBFBRLR
+FFFBBBBRRR
+FBFBBFFRRR
+BFFBFFFRRL
+BFFFBFFRLR
+BFFFBFBLRR
+BBFBBBFLLL
+BFBFFFFLLL
+BBFBBFBLLR
+BFFFBBFRLL
+FFFBFFBRLL
+FBFFFFBLLL
+BFBFFFFLLR
+BFBFFBBLLR
+FBFFBBFRRR
+FBFBBBFRRL
+BFFBBFBRLR
+BBFFFFBLLL
+BFBBBFFRLL
+BBBFFBBRLL
+FBFFFFBRLR
+BFBFFBBLLL
+FBFBFBBRLL
+FFBFFFBRLL
+FFFBFFBRLR
+FBFFFBFLLL
+FFFFBFFRLR
+BBFBBFFLLL
+FFFFBFBLRR
+BFBFFFBLRL
+FBBBBFFRRR
+BBBFFFBRRR
+FBBFBFFRLL
+FFBFFBFRRL
+BBFBBFBRLR
+FFBFBFFRLR
+BFBFBFBRRL
+FFFBFBBRLR
+BFBBBFFRRR
+FBFFFFBLRR
+FFBBBFBLLR
+FBBBFFBLRL
+FFFBBFFRLL
+FBBFFBBLRL
+BFFBBFBLRL
+FBBBBFFLRR
+BFFFFFFLRR
+FBFBBBBLRL
+FFBBFFFRLR
+BFFFFBFRRL
+BBBFBFBRRR
+FFFBBFBRRR
+FFFFBBBRLR
+FFFFBBFLRL
+FBBFBBFRLL
+BBBFBFFRLL
+BFBFFFFRLR
+BFBFBFBRRR
+FBFFFFFLLR
+BFFBFFFLRR
+FFBFBFBRLR
+BFBBBFBLLR
+BBFBFBFRLL
+BFFFFFFRRR
+BBBFBFBRRL
+FBFBBFFLRR
+BFBBFFBRRL
+BFBFFFBRLL
+BFBFFBFLLL
+BBBFBFBLRR
+BBFBBBBRLL
+FFBFFBBLLL
+BBFBBFBLRL
+FBFBBFFLLL
+FBBFFBFLRL
+BBFFFBBRRR
+FFBBFBFRLL
+BFFFFFBRLR
+FFBFFBFLLL
+BBFFBBFLLL
+BFFBFFBLRR
+FFBBFFBLLL
+FFFBFBFLLR
+FBFFBBBRRL
+FBFFFBFLRR
+BBFFFFFRRR
+FFBFBFBRRR
+FBBBFBBRRR
+FBFBFFBRLL
+FBBBBFBRRL
+BBFFFFBRLR
+FFBFBFFLRR
+FFBFFFBLLR
+BBBFFBBLRR
+BFFFFFBRLL
+BFFFFBFRRR
+FFBBBBBLRL
+FFFFBBBLRR
+FBBFBFBLRR
+FFBFFBFLLR
+FBBFBFBRLL
+BFBBFBBLRR
+BFBBBFBLRL
+BBFBBFFRRL
+BFBFBFBLRL
+FBFFFFBLRL
+FBFBBFBLLR
+FFFFBFFRRL
+FFFBBFFRRR
+FBFFFFFRLL
+FBFBBFBLRR
+FFBFFFBLLL
+BFFFFFFRRL
+FBBFBBBRRL
+BFFFFFBLLL
+FFBBFFBRRL
+FBFFFBBRLR
+BFBFBFFLRR
+FBBBBFFRRL
+FBBFFFBLRR
+FBFFFBFRRR
+FBBBFBFLLR
+FFFBBBBRRL
+FBBBBFFLLR
+BFBFFBBLRL
+FBFBFBBRRR
+BBFBFFFLLL
+FFBBFFFLRR
+BFFFFBBRRL
+FBBBBBBRRL
+BFBFBBFRLR
+BFBFBFBLLR
+FBBFBFFLLR
+BFFFFFFLLL
+BBBFBFBLLL
+BFBBFFFRLR
+FBFFBBBRLL
+BFFBFFBRLL
+BFFBBFFRLL
+FFBBBFFLRL
+FBBFBBBLLL
+FFFFBFBRRL
+BFBFBBBRRL
+BFFBBBBLRR
+BBFBFBBLRL
+FFBBBBFLRL
+BFBBBBFRRL
+BFFFBFBRLR
+FFFBBBFLLR
+FBFBFFBLRL
+FFBBBFFRRL
+FBBBFFBRLR
+FFBFFFFLLR
+FFBFBFBLRL
+BBBFFBBRLR
+FBFBBBBLRR
+BFBFBFBRLL
+FFBBBBBLLL
+FBFBFFFLRL
+FFFBFFBRRL
+FBFFFFFRRR
+BFBBBFFRLR
+FBFBFBFLRL
+BFBFBFFLLR
+FBFBBBFRLL
+BFBBBBBLRR
+FBBFBBFRRR
+BFFFBFFRLL
+FFFBFBFLRR
+FFFBBFFLRR
+BFBFBFBRLR
+FBBBFFFLLR
+FBFFFFBRRR
+FBBFFFFLLR
+BFFBFFFRLL
+FBBBFBBRLL
+FBFBFBBLLL
+BFFBFBFLLL
+FFFBBBFRRL
+FFFFBBFRRL
+FBFBBFFLLR
+BBFBFFBRRR
+BFBBFFBLRL
+FFFFBFBLLL
+BFBFFBFLLR
+BFFBBFBLLL
+FBBBBBBRRR
+FBBFFFBRRL
+BFFFBBBRRL
+BBFBBBBRRR
+BBFFFBFRRL
+BBFBFFFLLR
+BFFFBFFRRR
+BFBFBBBLLL
+BBFFFBFRRR
+BBFFBFBRLR
+FBFBFBBLRL
+BFBBFFBLRR
+BBFBFFBRLL
+BFFBBBBRLR
+FBBFBBFRLR
+FFBFBBBLLR
+BFBFFBBRRR
+FBBBFFFLRL
+BBBFFFFLRL
+BFBBBBFRLR
+BFFFBFBRRL
+FBFFFFFRRL
+BBFFFFFRRL
+FBFFBBFLRL
+FBBFBBBRRR
+BFBBBBBRLR
+BBFFBFFRLR
+FBBFFBBRRR
+BBBFFFBLLL
+FFBBBFFRLL
+BBFFFBBRLR
+FFBBBBFLLR
+FFBBBFBRLL
+BFFFBBBLRR
+FFFBBBBLRR
+FFBFBBBRRR
+FFBFBBBRRL
+BBFBBBFLRR
+FBBFBBBLRR
+FBFBFFBRLR
+FBFFBBFRLL
+BBFFFBFLRL
+FBBFBFBRLR
+BFBBBBFLLL
+FBBFBBFLRR
+FBFFFBBRRL
+BBFFBFFLRL
+BFFBBBFRRR
+BFFBBFBLRR
+FBFFFBBLLR
+BFFFBFBRLL
+FFBFBFBRLL
+BBFBBFBRLL
+BFFBFFBRRL
+FFFFBBFLLR
+BFBFBBBRLL
+FFFFBBBRRR
+FFBBBFBRRL
+BFFBFBBRRL
+BFBFBFBLLL
+FFBFFFBRLR
+FFBBFBFRLR
+FBBBFFBLRR
+BBFFBFFRRR
+BFFFBFFLRL
+BFBBFBFLLR
+BBFBFFBLRL
+FBBBFBBLLL
+FFBBBBBRLR
+BFBBFBBRLR
+FBBBBFBRLL
+FFBBBBFLRR
+BFFFFFBLRL
+BBFBFBBRRR \ No newline at end of file
diff --git a/2020/05/puzzle-1.awk b/2020/05/puzzle-1.awk
new file mode 100644
index 0000000..831c127
--- /dev/null
+++ b/2020/05/puzzle-1.awk
@@ -0,0 +1,2 @@
+$0 > max { max = $0 }
+END { print max }
diff --git a/2020/05/puzzle-2.awk b/2020/05/puzzle-2.awk
new file mode 100644
index 0000000..8b9b823
--- /dev/null
+++ b/2020/05/puzzle-2.awk
@@ -0,0 +1,11 @@
+{ ids[NR] = $0 }
+
+END {
+ n = asort(ids)
+ for (i = 1; i <= n; i++) {
+ if ((i + 35) != ids[i]) {
+ print i + 35
+ exit
+ }
+ }
+}
diff --git a/2020/05/puzzles.sh b/2020/05/puzzles.sh
new file mode 100755
index 0000000..2066d76
--- /dev/null
+++ b/2020/05/puzzles.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+
+./seatids | awk -f puzzle-1.awk
+./seatids | gawk -f puzzle-2.awk
diff --git a/2020/05/seatids.c b/2020/05/seatids.c
new file mode 100644
index 0000000..9c3b797
--- /dev/null
+++ b/2020/05/seatids.c
@@ -0,0 +1,37 @@
+#include <math.h>
+#include <stdio.h>
+
+/* Parse the input file `input` and print out all of the seat IDs which can be piped into both awk
+ * scripts
+ */
+int
+main(void)
+{
+ FILE *fpt = fopen("input", "r");
+ /* +2 for \n and \0 */
+ char bpass[12];
+ while (fgets(bpass, 12, fpt) != NULL) {
+ int lower_r = 0;
+ int upper_r = 127;
+ for (int i = 0; i < 7; i++) {
+ if (bpass[i] == 'F')
+ upper_r = (upper_r + lower_r) / 2;
+ else
+ lower_r = round((upper_r + lower_r) / 2);
+ }
+
+ int lower_c = 0;
+ int upper_c = 7;
+ for (int i = 7; i < 10; i++) {
+ if (bpass[i] == 'L')
+ upper_c = (upper_c + lower_c) / 2;
+ else
+ lower_c = round((upper_c + lower_c) / 2);
+ }
+
+ int seat_id = upper_r * 8 + upper_c;
+ printf("%d\n", seat_id);
+ }
+
+ return 0;
+}
diff --git a/2020/06/input b/2020/06/input
new file mode 100644
index 0000000..7153597
--- /dev/null
+++ b/2020/06/input
@@ -0,0 +1,2167 @@
+adgvrhblps
+pghsdrbmalv
+hrlbpdasgv
+bgvsdplahr
+
+lgnpfhrm
+hwmng
+gunhmo
+
+txkeafsbgjuizd
+etmcgdbfajuz
+
+xdtzjioqavmchsbfrkp
+bzjkriqmvxedotpcf
+azjckxmqovtidbprf
+fcxmevrkojzpdibqt
+roifztvxmbpwcndkjq
+
+ylcixrdoejn
+dyoejlrcxin
+dnorleijxyc
+
+u
+u
+
+nfjrt
+hvgqxculeszok
+pmwryfdiab
+
+gh
+ebzkr
+byqusikr
+
+b
+b
+alyr
+t
+
+jzbafspmynwgqdeuklxc
+anbkgduyexjlzmpcfwq
+zxdkiujqeglcfynwpamb
+qwcubamjpxyngkdlzfe
+upadgfkywmnxeqbhjzcl
+
+g
+l
+g
+g
+pg
+
+mazi
+mnzdai
+zmia
+izma
+
+pqzl
+pzql
+zvciplq
+szpqrl
+plczqi
+
+mquiosghkwtjz
+tgnewskmjuozqi
+gjwzmqcntosuik
+ybtjoqzuwmfgisk
+
+nvwocedxyqiahgt
+zbjvipyfeacuwrt
+
+ojkhxmwqs
+kqxhmrzjwo
+mqkjxhwo
+
+t
+t
+t
+t
+
+dhrxaqejfng
+fhdlbxejqra
+fqaeldhjrx
+seaqjxzdfthr
+adjhrqlxef
+
+t
+bczrx
+ueit
+nu
+
+idtmkhnlpbsqfxcevjry
+pricynubfvdhjqesmktlx
+
+wt
+nw
+w
+
+mhqe
+ey
+e
+
+kwclmuovtihabd
+aqheucldfwno
+adwnhoclqugez
+
+lbwnohgs
+osnbghw
+swogbhfn
+hnbosgw
+gsowhnb
+
+jsxyihpaotdlvckgeznqfbmwr
+xkhfnwitojasqyrgcelpmbvd
+synvibmdpfxwqltgcjohkare
+grxicqelsovtdfhujwkanypmb
+
+druazhicbm
+spqizhucrdabmv
+imucbayhgzdr
+
+fnx
+unqx
+
+zjm
+qfwrycva
+
+uktvygcmf
+yfktcxmv
+ctlkvqysfmb
+
+j
+jng
+j
+j
+
+t
+tw
+t
+t
+
+vogs
+ogsv
+
+tzgqxfauw
+wgfxqkuaz
+dkzawuftgq
+gbuwaqzfjo
+
+iphexunlbs
+tayqgzmkjfdcrvow
+
+fcdplxkhjbngwzqmiry
+khuyrlgvxnpfbdmosqizjc
+djzyxikqnmbrlgfhcp
+jxycgeidnhlkzqpbmrf
+xckrhgbzfnjlpdmiyq
+
+lezco
+ezloc
+zolec
+ocelz
+oeczl
+
+emgluf
+flebmhg
+
+knafibd
+kbrnfd
+
+xktmidfrz
+fajlidmrtzy
+wftzdm
+omeqbfgdzpnut
+
+tndpxaveifhcmzyjrsqlub
+oyanuslpqdcevfih
+
+hblawudzknspf
+gxnstrmiyqpejo
+
+lesyaikhnvoguwftzrmqdcpx
+pxuqoayiwjzvglstrhfkmcend
+uvyfepmxokdrhzlcsniagtwq
+ynfmkwxqalpdrezhoguvstic
+
+grscfn
+azlgdcn
+ovcgzn
+lwxgctan
+mgkbiyjhpnc
+
+ji
+ji
+iaj
+
+ivtkp
+ikwp
+ipko
+pkiw
+
+p
+p
+
+yushxnqa
+uokzcaxni
+xalvuyn
+
+elw
+wle
+wlre
+wleq
+uwel
+
+bvfxe
+ebvfx
+
+roaygfv
+udazcljhy
+pbaryv
+aptxy
+
+zdpkslmvnhyfua
+czhfkylumrvgoqaspb
+twenpsyzkjmihavuflx
+
+zsv
+bnzjfcamkw
+rvdzq
+ltypirz
+
+q
+w
+q
+q
+q
+
+uic
+uic
+uic
+iufc
+
+rdve
+cvzre
+fqls
+
+gxmnabhd
+xdbwjngmra
+gmxebadny
+bgahdxomn
+
+gnoyc
+olgy
+poyfjg
+wsdouiyghqe
+jyog
+
+q
+e
+
+adszvgclfomph
+qavsicdlghozpfm
+
+czfhs
+hzfo
+zhf
+
+luzrpeivwagyfktjhnob
+tlwynevkojgpbfuihr
+gklbpjvyoituefrwhn
+vhypwujfrbktonedigl
+byknejlowfrptghivu
+
+xbu
+xbu
+xub
+bux
+xub
+
+vcqtxyf
+tqcvfy
+
+vumkixjhaozgfbneydpr
+yxeazjmvbnhukpigodfr
+pjnomhaxuvdkbiryzfge
+oezrxngvpajfkdmuyibh
+
+mkgdruoiawfh
+dsumegkpjoq
+
+oucrtxbqienfvsmlzjkdwgpa
+akrqisvxbudelwgpmnozcj
+xreauzqglpcvmoidbskwjn
+mwgpljcusakrbozxvndeqyi
+jdrlvcimoewkpxgqasnuzb
+
+dshfqywgbc
+eiqflapjh
+vrmjfhnq
+
+kojresxi
+ubclnpghf
+
+kuitbfh
+ofdkqt
+fztk
+
+lsawunycojgvi
+ornsyijx
+yojpdsnbxri
+tjysrinoe
+
+ezuqslamgi
+alimgeuqz
+amgfqzluiew
+nmalugivwqze
+
+lrm
+mr
+vmrgt
+mr
+mlr
+
+ybcnizhwt
+ycbmztih
+octgiqsyhxz
+hktzcfyilew
+
+mqigxepzwudokytanf
+ayztcxbigunordqlmhk
+
+wnfy
+wzfp
+fjlewksb
+pcfwyn
+
+o
+c
+na
+qku
+
+zg
+gtl
+
+syr
+pbnmqc
+j
+sk
+
+abenmqvsyotzrcjwglfdx
+cnmqrxatjvowbylfgdezs
+
+kfzlgphuwqv
+levuhkwqcpfg
+
+iazxrty
+xryz
+
+ikxcpebaruwhlm
+iqtxadbeyckuvsh
+
+wkfsrvgbyjxpq
+rqbyxwfpkjgsv
+fgwsyjqkxovrbp
+frpyqxbjvwsgk
+
+po
+o
+
+arbnupkvxqodcg
+znpobhraxugvdckqt
+mkaupgobdvscnqrjx
+cbqknjavpgwxuord
+
+ftpka
+vtifcl
+dfwusmbyrhto
+
+y
+q
+
+drsleaqghypbtinmfuo
+gzinmrwudjbpyloefqahs
+fiomngyurlpheqdabs
+
+v
+bx
+c
+v
+
+kh
+zk
+
+qkzicvjbgawfdpxmtsloye
+ylofxwpvkqemsaigzjtcdb
+
+qf
+fq
+raf
+
+cbvxjytmsa
+tbmxcvyjsa
+ybmstxjacv
+
+aekpuyliz
+eqpyxls
+rwyepchjflomg
+oedybpl
+evnyclxqp
+
+yxtfnavdhopmcw
+qlugbvjcz
+xvcnymkrh
+
+yksamve
+yksmvxea
+mskavye
+yamdswevk
+eksayvmx
+
+p
+k
+
+psrgzxmaif
+ifraxgzo
+
+aehoplsvfqr
+jfqvkpoas
+vsjfxpqcoma
+asmfoqpv
+uvospqaxf
+
+ercgdyism
+msrvebzc
+mgrescq
+desfrmico
+
+dborguxznkyqciavtfs
+kzoymfndrsaihqtcbvgxu
+anbcwfrdgjxktlyivouzsq
+bgifuzsrekocxydqtnva
+dtpsikyavoucxqgbhfznr
+
+jvyhfbpxtkizmlesw
+fvmjhkesbpzywixtl
+btlezmshjwpxiyfvk
+
+jawdspkghblyvornxmicuq
+nrujdhxokcwgylimvqpba
+lcrnhktgvipyubwqdomjax
+
+vhiatyrwksodemcxn
+hdsamtvuikjqecnwryox
+
+ixthorcaevkp
+xiyhrknlboczwjfm
+
+ck
+kc
+czkmyet
+kc
+
+wxjqkpgnshue
+qojwkefphzcrgaxn
+ektphqjxgnwu
+
+raksq
+mdu
+a
+asb
+
+putzomyciwaqkvbfsldng
+absdvyntgikruqpzoflcmw
+dkscznaiwulvogqfybmjpt
+
+sxbqjv
+jqvxbs
+vlqsxjbo
+xsbqjv
+jvqxbsy
+
+ynbakgvc
+yvtnlbsjg
+vrqxephwfby
+
+xhdjkrpltfoe
+qjplehkotdbfrx
+kxfdaotsperlhj
+
+ewgsmi
+jafkti
+yqkf
+copzldurbx
+
+xc
+ex
+r
+rtwce
+slk
+
+zimewg
+nmzrj
+
+qylbm
+byqml
+lqmyb
+mxyqlbr
+
+egsktr
+erskdgt
+rkesgt
+
+zkgqireysupwjthdb
+swkoyzdcqibpvnr
+kyvmwzpirdqsfbclx
+
+jvytcgmkeqalzonhx
+kvcjnwztxdmlyoaqg
+lznqaxcvjytogkm
+vabgfulyxkjoimqztcn
+
+q
+q
+q
+fh
+q
+
+xykitfhn
+xnhytzilf
+tiznfhx
+tfxihnre
+xhilzytfn
+
+zmxyoakgt
+yawiomrgsd
+oafgmyqr
+
+lpgqshiyuxjvabz
+lzbuhyiqsjagepx
+urisxlzjabpyqgh
+xsuiqljypzgabh
+gkylpamihsotqfdxzcbjwu
+
+jhf
+htdejm
+jtabh
+cjeigmzh
+suljqyorxh
+
+hcjkbvmlaoen
+faojknvxmehblyc
+nhmovlejcbka
+vonhckilembja
+kojnmvebtclha
+
+clamzrewgonksuqvpb
+zusorlkmqpnvwaecgb
+
+uka
+ea
+aw
+a
+lxa
+
+lg
+lwtg
+tgl
+glw
+rlg
+
+vfsxidctgah
+dvhcftsxgia
+vdhxgimfsant
+
+tschpyqa
+
+ckn
+xckznb
+mnsvlfqaitjpdk
+cwkzn
+kzoyenb
+
+ro
+ro
+or
+or
+oer
+
+icumvltoqafdy
+tfsxarpnh
+atsfgw
+
+btfenmovgusqzijxpcrhdakl
+diapqfxrnevlzutsycjgbkom
+
+utvbhgw
+vbhgtwu
+
+nkfgajmvbpyowthxr
+cwxrtknpmgfazjoy
+rwxmfatgouckjypnd
+
+kdlubgiap
+podcivgyueafkhm
+purgnkixazd
+sukdgixap
+udkpglia
+
+ajnumbsgr
+ibmjsrkagc
+bsgozmra
+
+vkbso
+ykglhto
+gmodikp
+
+sxupqv
+xvuqps
+
+x
+r
+c
+x
+
+fjoyuhztseqrawpciglx
+igfeplsxtrhaqyzojwuc
+rpwgucisoyhflaxtzejq
+yqzjphegfuxltawicsor
+wzahifloypuxegjscqtr
+
+xeironzdugvqc
+quevgsfronxzc
+
+wdjrsknlbihcqzxuv
+bzlxjnukvhrsdicwq
+cuqiwsxkzvjbrndhl
+ubclivhszjdwqrnxk
+jldqkihxrzuvsnbwc
+
+dzklrogfvmn
+xuwpaqcetij
+
+d
+o
+m
+d
+
+xhgzbj
+jvbhg
+
+snbcamefqhuovxkjpz
+htckmpybdgvrsaoeuj
+pkcbewsgvojmhauidl
+
+i
+k
+tqj
+
+koyawh
+auo
+qaoer
+zrapo
+ioa
+
+broqhaylgsmxzkjtuvf
+hatgluorzvkyxsmfjb
+whytbkrvsumgzxoalfij
+tzabxgfrqnusomvhjykl
+
+hoplnck
+ayqxdjofr
+
+dmjspac
+dhoazjp
+idxfrwepyjo
+qlpjgtvndub
+
+riabvstyxphgoez
+projxgyhietsavz
+
+jhfqikpmz
+kfpiyjvmzsqh
+vphkqizjmsf
+wpqfmlzkjheid
+
+diap
+zkhacy
+waog
+fojgas
+roa
+
+rujzxoygliqnmvkpc
+vlonrgpjqzyxmfkic
+zgxqkjocirpvlynm
+
+lzgja
+jlza
+kjazrcl
+
+vteiqrpkjybsmndhfl
+lsndjpqertkvhbimyf
+lpjmnbyqshvtdfirek
+vpibqrehmsnflykjdt
+
+iwqlhotpjsa
+slhjyuiotrdk
+szjhlocimt
+tiajhwsofl
+
+poz
+dp
+
+yeqdmto
+zgtqyvoli
+
+ahkfsocmdgnwp
+cpwhjsmgodakf
+clhudwakftvogsepi
+dkargcowsphf
+
+p
+p
+p
+
+eqbcr
+jceq
+xeocqmi
+fqwcve
+mjebocq
+
+xkei
+ivuaexqk
+kxie
+ikxe
+kxei
+
+jsmzk
+cmdpyf
+xshm
+
+hdwlcgzyuvke
+gjlaqpry
+rlgomxy
+
+comszwhfrqlpnvytei
+iqpvwolsmnfhray
+oulphgswymvfrqnix
+
+lcisfxnzwy
+csixywfbnlz
+zelcfyiwsxn
+
+lmrsia
+gowals
+
+lyknfogpu
+zoiw
+tesjova
+moes
+odi
+
+ktfajxloz
+ojaxzflk
+akzlfoxj
+fxkolazj
+
+iwxzmukbhoy
+xlzkymbiuwo
+bkuzomwxtiqyd
+wmokbizxyul
+
+kr
+kr
+skr
+kr
+rk
+
+bdpfgnwxtk
+gwtkdflnjpzx
+kngxpfwdt
+
+xkhmzvylowsgucrfepjai
+xriqvhjlozpdkuemcfa
+
+avxoebdgzmqphfytcn
+cvfrmneolxtyzdgpqh
+
+wjvslhmufgqxcnodz
+fswclgdvxnumo
+
+t
+uqi
+
+xopmekybt
+pkrxytebm
+mtpxbyek
+
+vkxcrizwuhtad
+wairuvhdmzcxkt
+
+vrlpifawedksqzhcgnybtjxo
+qoplwufekztbhdnvxgarjsciy
+svzmteygfbkrlxohjqcpaidwn
+rakocwstbpidlhxjgeqzfnuvy
+
+o
+o
+o
+o
+
+ihzarybenqmtpg
+zqbiyhanpgetrm
+hqizynrpbagetm
+yhbgrzeqnipatm
+gteahmprbyqinz
+
+jv
+uxkasvt
+jrgv
+qv
+ivbpld
+
+sxigewcouvbj
+xjwobcsugive
+cbjvxsuowneig
+uxobwigsjcev
+ejogiwbxvcus
+
+enmvubp
+pvubm
+
+qrjythvlzubgeikafo
+necadbmrtzulvwypx
+
+rbuslgk
+lgsbuzkr
+lbkugrs
+sgkbulr
+rublgks
+
+whb
+wbh
+whb
+bwh
+whb
+
+khtcw
+wkcth
+wtkch
+ckwth
+kwhtc
+
+mkzdbo
+dkjz
+kbnzlmd
+duytksvzgq
+
+brkxvtjpdhqw
+ntjqizashkpvwd
+dqfrptwkshmvzj
+phegdjolwvkqtu
+dkhnwqacjpmtvf
+
+bdrioxsqahp
+adishrbqoxp
+oiqpsbdtyrha
+dapobrxsqih
+
+oqsgiptmzlwcxkhvrfedu
+rpwhtlgkcuidvqfosazxjem
+rmgkeisxzhqwopltcfvud
+vfcxiruwlhgoszmekqdpt
+hmprfdvoxetulgizsqwkc
+
+luzam
+mwuplz
+mlurjz
+
+xlpmhzudwriytscobnkfq
+uinamwhrtpobfvqceyd
+ibflutdsohnqrpcymw
+nqprtwuyfdcmiohb
+ufhwmrinodkcbtpjyq
+
+ns
+ns
+sn
+sn
+
+dufzbegpjrsaiqcthv
+pfzqdjhatbuvescrkig
+tbehcpfsvagdqirjuk
+tebiravqjpfushwgcdx
+
+gpjafzel
+mzgftlead
+bleynhgvfcs
+egdqfalmz
+
+zbarcdwiukgoqhmtnyjps
+sujqytgrbnwzdmhalicok
+
+fyvgdcbqx
+fqcgdyin
+etfmoqgdsjyc
+gqfcdy
+fyqcngd
+
+am
+bjm
+sdm
+
+frvkaupe
+qzipevkya
+vzabpkesd
+bevpymka
+pkxeva
+
+t
+t
+
+dcveyjgtfkbuo
+ebogjfydkvcut
+gkoyfeudtcvjb
+mvygqckjftuodbe
+tujbkeocdgvyf
+
+bkthnlgp
+tnghb
+gthnb
+gnhbt
+
+hpkybmeowacsrgnijfl
+jzrsgyuwickpfbmolneh
+hcflvrgqpwmdoknsjeyib
+
+qxincam
+zdjrlksqhgt
+cbafqwo
+vqyei
+
+izdkxrpuqgjte
+asyngkxrudpvmie
+bdkwpgmexruci
+opdiknuxger
+gecixdrpluok
+
+jymuwvfrixclhga
+invyhuglxmcjw
+imwghculxvjny
+gjmlhiwvyctux
+yvjhixugwolnmc
+
+xbcwhv
+chdwgxbv
+
+ujycfnsvgqkpwheal
+erugwaykpqcnhomlf
+
+gyk
+glhrk
+gwk
+qowygk
+
+vcnju
+vuoijbczt
+dvcujg
+
+rlsy
+ryls
+ylsr
+
+tjn
+t
+n
+rixz
+t
+
+i
+i
+i
+
+elq
+qle
+
+ksahwvdjbtfle
+lfksaebjhtwdv
+
+qfacst
+qfaskg
+fqasoktb
+vmfuilqzprasd
+
+apuxh
+uxpah
+onahmwupxb
+hxpqau
+huqapsx
+
+hjbnwua
+huwbranj
+
+dj
+z
+h
+hz
+
+hzqo
+oqz
+uwsozq
+zyqxo
+
+ckotpfx
+lhrcnpmgfviwobd
+
+wecahmszdjnoix
+hmxaijswzydtcgn
+njcqtmzixsadlh
+cudmxzeasjnh
+mxzahjckbnpdvrs
+
+lsqahvixforkw
+fxiqskaohw
+afjhnxqowsik
+xstiqkhmoafpbw
+
+htdcbm
+ex
+sxq
+
+pfgkrjhub
+nptjfixgraubykhld
+pmufkbrhjvg
+jhrfbgpvuk
+
+sptnugvdfmckehw
+wknfhmsucertpvg
+
+zolicbnrvtdwhy
+oqdunzywp
+zodykuwxgspn
+wsanojdzxqy
+
+druisbhpckvwofna
+wvcboafsnhipukd
+bpsadlcvnkhfziuo
+bqfujsvmhcoakitdpne
+visaodpfuchkngb
+
+ewniqoulvgstzchkxdmpyajrbf
+cbyihmnuradvlktxpjwsogzfeq
+
+zgsdqwj
+qdzsg
+
+ombl
+yeulqbnimw
+hljodbmk
+
+wtzkorqhupxby
+yzxhtkwpord
+skwzpjtgyrxho
+
+mstgrlwo
+rpyowgdts
+
+pidn
+ipesrfv
+owpdim
+pibt
+
+tu
+tu
+
+pcdatkohjgbelmqvfxwnu
+ukevynsprjtclaxhgmdqfwb
+twqungiobxflhckapedjvm
+pgqvtowflujnmadbeckxh
+damfntwkjlcvhbqepxgu
+
+ilksfovqamrhngcdjyexbt
+htkvnbrqaefsloxgciymjd
+qfgvrxmbaoeldnkyiswjhtc
+ftxpoyhbjkcevdasmigrlqn
+
+oq
+qdo
+sdlqoa
+eopbizq
+sndqo
+
+iblpgzoekrnmwhjstay
+tsropbkwgyaexilujn
+salrwjgbtikpeyon
+bsyirktpjonxualewg
+teaqljpowyrigbknsd
+
+d
+d
+d
+d
+
+zgqmhnlvekcyutxsbifw
+zmkqgwvyjrcdfbu
+ckoawvyzgumrfbqd
+fdqbypumcgwvzk
+
+krqlncwuxvgbdpsmyjfa
+lmuybxdqsvkrjfcpwnga
+zkbqnhjspdcumrxgaelyfwv
+
+vafsedqzyrtnjpwug
+gvcustypjedaw
+owpydujgtaivsmke
+tvadlgweiypsju
+jebvtoysphugadw
+
+pyixcohfrvtenaugsdmjq
+catjqrivdfseogunymx
+tvquyscedoxrgifjman
+qagtfiocrjmuvdsenyx
+gmeufoqaxcrnjdvstyi
+
+p
+p
+p
+
+jagycukemiqdxw
+cmuyadqgkewixjl
+fqawimgzjkyuxbdec
+
+mahdekwibs
+admswkhei
+debamswk
+maovdyeskw
+mbsdkweaf
+
+wfqimrc
+rtqhcwlgdxnkvpo
+arwysquc
+
+kroumefnixa
+lcn
+
+hvaugnsf
+nfxqkugas
+
+wheyqtmdvljucnsbia
+hvmyteblnuqacw
+ehnultwbyacmqv
+mlybuhqtcewvna
+
+pxhafcvymglkzoq
+xhwkctlgabz
+
+or
+jodr
+or
+gro
+forha
+
+fzmohqld
+szqf
+iqawckfrp
+
+hkxuwmsbdrpt
+ptysjhxkwbmru
+tpmbsrkgwh
+kphmtrusvwbq
+krmhpftsbwzn
+
+r
+r
+otr
+r
+r
+
+sxtlkvjacpbngoziewq
+jiskzqanlowbxpvtge
+
+r
+r
+r
+r
+r
+
+bqwsz
+wsfb
+
+zwvyqaichxjre
+whvayjrzicxqe
+arxcivhewqyzj
+
+mpzasbnregjdwlxuqoft
+dnxlrwubzkaosypq
+
+gfaizbqlchy
+zibatqykfu
+bsufzjqxyiam
+
+fsy
+sf
+efs
+fs
+fs
+
+asmugcxhbekl
+dkhcluwsmegaxb
+kubhcmalegsx
+cgluxmbhekas
+bajrhelscgumknx
+
+qdpwfec
+wjdqfecy
+cwdefqj
+wqvdclsfe
+dcqpfew
+
+r
+jcowmyplv
+itdru
+shbfr
+
+soublfhe
+lksfzjdymaw
+ywfnrskcl
+
+zsybelirjfwm
+sfxiznhmablgtj
+jbcifusqlopmdz
+znhjerlkfmybis
+
+knvmejaydo
+mjoaevkw
+jkmhcoave
+agomevkyj
+elqftajmoskvi
+
+ziajfk
+zakifj
+kazfij
+zfajki
+fziajk
+
+ujzyfat
+tyuafjz
+
+xihdrjyzvl
+axujhtldyr
+xdohklyjr
+xrlejhyd
+bxolyrfkjdh
+
+i
+i
+i
+i
+
+ocnxzlprutqmhsij
+xgmloizutqj
+xmtlgioujqz
+guoxlamzitjq
+
+jhoepxcuwvn
+xeuvnfaodjwpc
+upjoxwcevn
+xncelrvojupwg
+qeusjvwynkpotxc
+
+etdilxy
+lytdiex
+hdeltgryiw
+lyixvedt
+
+rge
+gr
+grp
+gr
+grp
+
+iquzsnh
+qsfunwh
+qtsgprvhcn
+
+lipmbftsh
+myho
+uqzngarkvw
+
+ybrtackvdgqsmonlezuw
+ywlzmsgbtocakedrqnv
+rbceqauytzgmowkldvns
+tyncgkldqserbjoavwmzh
+oydsvatnmwzgceqkrlbx
+
+qjb
+irgfqjope
+jkq
+jqb
+
+ncjlbpzedywkshfmqvagxi
+jfipaqbmevkgdxnschztl
+gbvxnclahmsiqjdekzfp
+kedsxbzcvijglphmqfna
+szcadkbnpeghjvqifxml
+
+nfteow
+ytewforn
+estonfuw
+erwtnfo
+
+vhawcorfpxydzieqmbg
+opyqhzdabfwcegrximv
+vbpfqzcierhdgawoxmy
+dvprwqzfioagxbycehm
+yhdvpxzimqeorcabgwf
+
+bfnrkixsut
+jhywbrncziaxkp
+iodknxrb
+xbrknli
+xkfironbu
+
+xwpqbhyakf
+rxayi
+ogaxy
+
+tnwl
+wbnl
+lhwn
+
+wjuroesafgizkmvplxc
+nxvgfoeucjmprikwlsy
+glwrfcumhejisvkpox
+kjmuvrwclifaxepogs
+
+kjxygrvsodimabecwuzh
+ihmxrogvjsaudbkwcezy
+ykwovzjimbgashrudxec
+jsewruvymigxdzkohabc
+icmleouvhyzxdabjsgkwr
+
+wm
+wm
+miwkg
+
+slcdjyhbnpi
+bxqvejnzwtfag
+
+a
+a
+a
+a
+a
+
+jxwonlf
+jox
+
+wxhytgp
+tpgywx
+pgwyuxt
+pgxyfwta
+dpyzwxrg
+
+uygwfkxvane
+hsdicwzkrenfgalqx
+jaknwfxge
+
+mxs
+msk
+smx
+msoqz
+ms
+
+bxfwc
+wcbxf
+cxfbw
+wkcbxf
+cfwxbl
+
+om
+om
+a
+n
+
+ikp
+wi
+iu
+biej
+i
+
+aokgqimrnlfbdxzjs
+tmqxrbislngykoajd
+lsgvboxnkjdqrima
+orijsalbqnmdkgx
+
+zfpd
+biok
+bxcqnk
+yikx
+
+sulwztbnqkvioafxchemr
+qhmcvlexkazuinfrwbsto
+mnfutiblxecdqwvkoszhar
+bmxzpqrlkafheouvcsntwi
+zmchneutwlqoakxbsifrv
+
+equacsmywgpkixfdv
+anxwlcuypskjgfivbqr
+iyaksgxmvoufehwpqc
+
+twfzqxsnr
+aqdsp
+
+yj
+dyoje
+yj
+yhqj
+jy
+
+bhwsczaxunjr
+xgcswaflpznruqb
+ubzwjxkcsyrnmahd
+
+xyvgkjo
+kgjvoyx
+vxyokjg
+govjkxy
+jgyxokv
+
+hneolzrtywq
+atbs
+mtipgd
+vts
+
+flu
+lfu
+ufcl
+
+ad
+da
+da
+ad
+tgqad
+
+xfw
+bufw
+
+simdubgowtap
+wgbsdomaiutp
+bsmodwauigtp
+
+qi
+o
+
+n
+dthokli
+nveq
+
+nvdt
+cdglvi
+
+sdxfaveuwlqzgircnhyobtkjp
+uiqjrdenyagwkzhvpxscobtfl
+otiungzxecdbyksrfwqjhvlap
+dtbcyojehfwvsnrpkliuzgaxq
+
+zgovqbryphxmjcasuktfl
+bwcpqoutvfjykmashrzlgx
+iecjhpmxsqytzorflungvabk
+vacztqslhmkgoxyrpufdbj
+amgfxjqsptdrhovclkzuby
+
+s
+s
+fs
+s
+
+b
+b
+bm
+b
+
+uzc
+zbc
+cz
+
+clmeswqpuahi
+spahequmlwci
+
+hrclmu
+nhlcdurfxzi
+orshcluv
+uheclr
+
+r
+k
+r
+
+da
+ad
+ad
+
+hlfmnga
+amhgn
+hgamn
+geahwnm
+malgnuh
+
+bhpgndjwecroq
+iwxklmtyzsopf
+
+uqosfv
+lmbihrxtedk
+
+gyrtdosqjnkalicmwvh
+rmlygiwktqcoshdavnj
+wimjknqvaglhdsocrty
+wkosyadhtqgnmcrvijl
+
+tcpsjerzykogwmqbxinlad
+iyzxcgrtqosnbkjaleudmw
+
+dyzsmnkvuegbwlt
+iwrcgs
+fpswgqc
+
+nawtjrgmpyxlibcshfudvkzq
+jiblrgwyhtmxvucqz
+
+vcruatwneqxi
+myhgldscjnfb
+
+qakljbptgwryiuxnmoh
+mtquwoagbjknxyrlpih
+aktuhpgmqxbwjyonril
+wqriogjmubxpknvyltha
+mpkuhlxgjtanwoiyrqb
+
+ptjrmc
+ucfjpm
+pjcsm
+
+jofrkgdves
+gsdkrivfe
+dgsevqkxrf
+
+fvs
+vclsd
+s
+rehtuyi
+vfk
+
+eafupodb
+eyrdpgbujfoa
+ukadqobefiwxp
+pfgudeobay
+
+i
+p
+i
+i
+i
+
+udlqpozmayew
+dsyalxmupwe
+lipydaumwe
+delyumpwsa
+
+zthwnjiuyosakfpxbclm
+lcpyfmisbztuknaxo
+xsnlcyfzbpokmatui
+zblkpsficaxmyoutn
+
+n
+nt
+r
+
+meskuctxrwaflovdpzhj
+koxzmhvrcydlbwpsjuae
+
+l
+pqd
+lh
+f
+h
+
+otzqusgdeyvc
+aetugnycqrxz
+fhzwtgjqmkyulip
+
+o
+o
+o
+o
+o
+
+frejdvqokushlxtcgwani
+dmfesnxhwgluorjiayt
+zdtispaxeobgjhunwfrl
+
+retxhvnmzsjqpbodif
+txnphyomczqfisedrjb
+
+nmwra
+rmvawn
+arnwm
+mnrwa
+wnmra
+
+yatwdlfbuc
+flydbtwacuo
+upaybixdlfvtcrw
+tncdbalyswfu
+
+lenfcbjv
+jfecnvlb
+jlvefcnbr
+lvcgqfnaetbji
+
+bkuycegrnpimoxvfzl
+xpmklivbuyrcega
+lbktipremguxcyv
+pbmirkvglyceux
+ykibxregmlupcv
+
+rwjeyxizhgt
+ywxetqgajzriol
+wrigyezjtx
+werygtjizx
+
+az
+ja
+
+sumxgwqydjhe
+whtdyeqguxsp
+
+pncwmq
+ansluwbycmxoe
+cwdnmj
+wqhkmcn
+
+flucitkw
+ilucwjktf
+lwukticf
+lcwifktu
+flcubitwk
+
+qlhnvft
+hnvtfl
+
+bwsegp
+bmpgsew
+gpsewb
+bgwqesp
+pgwbse
+
+ib
+mgjsb
+bzk
+bpmsgj
+xb
+
+bjerpdfuo
+wjrbf
+
+dkmxn
+nkmdx
+ndxmk
+ndmxk
+
+rnouk
+j
+
+m
+m
+t
+
+mrzq
+zpqj
+qiz
+vzq
+zhqi
+
+tkn
+nrkt
+
+yj
+jsyqp
+awyj
+yj
+jy
+
+xl
+dlx
+olx
+
+kqdluj
+jlkvdqu
+qdukjl
+qdklpju
+ukqldj
+
+wzy
+zy
+zy
+zy
+yz
+
+vea
+aewk
+berga
+waek
+lyaen
+
+miaoyj
+yjvmoiza
+yimajo
+jymaoi
+yjoiam
+
+azcrbo
+bzero
+
+fig
+jbsagif
+gfi
+
+ed
+de
+ed
+de
+
+naezbtk
+ubat
+batku
+baqvtglmo
+treba
+
+gozafjiuerdpyscb
+lxuhqvmktwn
+
+ysqdjnvwhagmzitpf
+vszdapqhijcyln
+pcazqibvhsdjyn
+rjuaqhspydikznv
+
+qhgazndtiwb
+wtbqdahviou
+zbqjhwgtai
+qiabwntckh
+siawbyfpmxtrheql
+
+ej
+je
+
+vtqgbimyo
+dpwihgamzovlbtf
+tmgvboi
+emntbvgcio
+btgimvoy
+
+kisynhablrjwempcouxqgdftz
+xnzrkiufjpmghsqcadotwebyl
+rdqezcmgajpwoylnbusxfhkti
+shejiunzgdpwxylqmatrbfkoc
+
+lcqenihaktdgurpvmysjfxzow
+sldaifypqrkhcumextwvjongz
+piyslcrajgfenhmdwuovtkzqx
+esxwujvtarpzkoldmyfncihgq
+xqfvgosbyruephwjdaztklincm
+
+gyofwzc
+jyluxh
+dpimyv
+rtsbyqa
+myluej
+
+iwcedhs
+etdich
+cwihaeb
+ecihby
+licvfeh
+
+nwlfiydcst
+wnldtsfy
+lsnwdtyf
+fdwytsln
+tfsywdnl
+
+diphkr
+ihf
+
+osagihfnuptwcyxqevz
+ynzjfrpqoicklmuvbw
+nckfilwvquozjpmy
+qzwoivcfpyjun
+
+tbjh
+noyjvqt
+ejzuligpxm
+hnj
+jysha
+
+fycqbrk
+kcndb
+czblkq
+blfcky
+
+wpgk
+putk
+lqamxiv
+rd
+dcw
+
+wmludkgnozfe
+aoezwflgkmdun
+uzekmdgflnwo
+kgflnuzowedm
+goezkndmwufl
+
+zmbsxkiwqrh
+grjcyiwptzseqxofd
+iubrwqlkxzsvn
+zaqswibmxr
+
+soealywdutckrfnbigpxz
+dntrgfaopclubeykzwsix
+gnswdzialxrckybtfuope
+fwodizuepagysxnktlbcr
+sbdiefgptynkuwzocxalr
+
+tkbry
+fyxr
+ory
+
+sio
+oi
+oi
+oi
+
+fipqkjmorwcluenvzx
+mvowrcjxsuqpfgikenl
+cxrmwvkeulpfqnoij
+
+jhqfvlnetysazio
+osjqykft
+otqyjfuxs
+
+opfrbnw
+dbqnhoftpruz
+bgeyxrpnfol
+royngfpbw
+
+rvmxfogsbcjkpqltyhandi
+xafqvhinsodltpkcwy
+
+pqrkslwfijgdo
+pymoxvzsg
+vpszyog
+sehgop
+
+qnmxjglwavzirceu
+advwiomgshuqnclzjer
+zjqumrcgaiwlevn
+kvugjnewclizasqmr
+jilzanmtbgfrequvcw
+
+szkftpg
+stkpgzf
+ptzkgsf
+
+mefgopznxlusjych
+iocqfmjlzgyxkpunhe
+
+zemltjrnbso
+stbxojkrzgmneqv
+zpsjernombt
+stjobrmzne
+
+yblxcozivekmqa
+epsrvyigmc
+
+xs
+s
+s
+
+bnmz
+fhqg
+dxsin
+zsm
+
+brpge
+tpm
+ptm
+p
+sp
+
+utpsykci
+ituxbykcwr
+
+zvxityphsdnuagbmcjwoqrfl
+qiuwkplbtczmnvyrsoxhafjgd
+qynizxpujhfmbvdcgwleasrot
+
+y
+tx
+y
+h
+y
+
+fsqatkdlmpux
+yxinuvasdpfml
+tsdpxafblzomu
+axtfpulsmdg
+lxwfqpsajudmk
+
+joanzmhfldbsgwcipkxuqrey
+oclnpxwkyqszdjreagiumfhb
+ufvoiyxzbrpwdgkcmjsqlanhe
+
+ciqxenmrlh
+ctrfhxiqpnl
+
+uoxfbrglpwjkhzstidmcyq
+hzslfyjxbdgecairompwkqut
+ygolzckfbxdmqtpivjshrwu
+kpoxzdlhurgimcsftbqywj
+
+xhgfmplcvwrqneztju
+vqbwxtiprfhl
+wxaoytfrvhbsldpq
+
+iop
+qvxihy
+io
+
+ftlgqpix
+bpigfl
+ufbgiplr
+
+ek
+ekb
+kclifmge
+key
+ersk
+
+ytqglpedjriu
+jidgqytrulpe
+tgjyudrqplei
+jeiytpurgdlq
+
+anuqyij
+auczniy
+yanklsxivou
+byacinu
+inazyue
+
+tmryzavsnfdoq
+ngmjxatvosz
+
+yurzemitvfqnksxpbdlhgjwa
+juwvmadgcpytrkfqnbezishlx
+wzudtksjrpevnxagfihlbyqm
+
+a
+xa
+ya
+a
+
+gnukiszbvj
+nyzbvpksjgmu
+sgujnbzeivk
+uzgbnksjv
+
+xoq
+qox
+
+xlberjukaztfnoycqsgwip
+tscfaexqwgkrpouzbylijn
+owaruypenjqtbslizcgxkf
+jzcuswiqgkrbnpyoxletfa
+
+pxzmb
+rzmxpb
+bpxznmrc
+umbgpzkyox
+tzbmxp
+
+grspmxbyhojdizwlevqfkctu
+fixgbtedqomczrjhswupkyl
+tlsgyobzpmcqkhrdxewfuij
+
+xrhelazymwntkv
+lhvamxeyrznw
+vrmwalyhnezx
+
+mdbjcizwxh
+jpcbzdmxiwh
+
+xakdgjtimlvzcshw
+iskdxfjnlhwrmvtcz
+
+yrli
+lriz
+rli
+irol
+ilr
+
+lfamcngvojeqyzrkdspwi
+slqcznmwdivkrfjopebayg
+cwgodjahrqzyfivepknmsl
+kyeuvpjmlnftsizrdogqcaw
+kjvrcgypqzinwadmoefls
+
+hfmuzdvyibakcwnsor
+cezounhbsydwakmif
+
+vsajkf
+jvf
+vofj
+
+q
+v
+
+h
+h
+i
+
+frgo
+ogfr
+grfo
+rofg
+gfro
+
+saomp
+mpdosa
+posam
+mspao
+ompsa
+
+qbxi
+xbiq
+bixoq
+axbqi
+
+oix
+xoi
+ixo
+
+zqkved
+ztvydqe
+vdekzq
+
+ubg
+vgcub
+
+wdotn
+akp
+hv
+ipj
+
+xfcprnv
+dfpcrvu
+jpvfirc
+frphqvwboc
+pcvfxr
+
+prx
+rlxp
+rxp
+ixpr
+pxr
+
+uaozgkwlbfxyvmi
+zbkgoxalfwuvymi
+yimugvxbkfolwaz
+
+hwvlbzcauseydgpxrkq
+lamwdrzhsbqefkvytxoicu
+zktxwlnhysevqbraducj
+
+vjuprhcl
+vjfrlpm
+jbplvr
+pnvljrbfe
+
+cwygrulzbe
+elyzgwbu
+uygezlwb
+yebuglzw
+ygzwuble
+
+wbzecjtdrgiyqls
+wlsycjgeizdr
+zslyderwigcj
+dwzcyjgerisl
+
+qkvegzmnobpuc
+pogzvqmkbn
+
+cnepixbwhklmqzodvyautjgrfs
+oepszjgmlcxkdiartnybwhfvqu
+gvcxaintlrweupbzfsmykdjqho
+xalwvjenruhpkmgfqtoysbdizc
+
+omrc
+tcer
+bguaf
+vhtk
+
+rtednpkyxgcs
+kxlsredupynt
+bartsexnypfmqk
+
+lqrabmznuhgjfi
+chligsdnbjrazum
+jpghuibarnzlkom
+bamhwrngzjfliuye
+yuignrzsamhlxbjt
+
+aoslfqnjcghb
+cnbflgjqaohs
+oqshfljbncaxg
+
+av
+av
+va
+dvqa
+
+lghqidarnczwfxyu
+ylfnhqwczaiuxdg
+wfdglzixauchnqy
+
+pfgknomr
+nfegr
+vihnlcfdqgy
+fgrns
+awogfn
+
+kfdntirsmqap
+thjdknbugmr
+nxfetkrmd
+
+ydabnisroqeghk
+gryenohbaiqsk
+sqbingvyoakehr
+ngbkyfaicsrhqeo
+
+ghxtulq
+ntgqxlsz
+lgzqtxsi
+
+qvr
+mqljsu
+wlqu
+gpoqytkbzf
+evqw
+
+khybpm
+rhboj
+
+rmcqdblnto
+qlcnmor
+rhmzalcsoq
+lgxcrmnqovd
+
+wdfkpmalijbncuvr
+qhnmikpzaygxwsovej \ No newline at end of file
diff --git a/2020/06/puzzle-1.awk b/2020/06/puzzle-1.awk
new file mode 100755
index 0000000..71d55a8
--- /dev/null
+++ b/2020/06/puzzle-1.awk
@@ -0,0 +1,14 @@
+#!/usr/bin/env -S awk -f
+
+BEGIN { RS = "" }
+{
+ split($0, chars, "")
+ for (i = 1; i <= length; i++) {
+ if (chars[i] != "\n")
+ answers[chars[i]] = 1
+ }
+
+ sum += length(answers)
+ delete answers
+}
+END { print sum }
diff --git a/2020/06/puzzle-2.awk b/2020/06/puzzle-2.awk
new file mode 100755
index 0000000..98224ac
--- /dev/null
+++ b/2020/06/puzzle-2.awk
@@ -0,0 +1,23 @@
+#!/usr/bin/env -S awk -f
+
+BEGIN {
+ RS = ""
+ FS = "\n"
+}
+
+{
+ for (i = 1; i <= NF; i++) {
+ len = split($i, answers, "")
+ for (j = 1; j <= len; j++)
+ count[answers[j]]++
+ }
+
+ for (i in count) {
+ if (count[i] == NF)
+ sum++
+ }
+
+ delete count
+}
+
+END { print sum }
diff --git a/2020/07/input b/2020/07/input
new file mode 100644
index 0000000..4e9e60a
--- /dev/null
+++ b/2020/07/input
@@ -0,0 +1,594 @@
+dotted salmon bags contain 2 dark lavender bags, 1 muted red bag, 1 vibrant magenta bag.
+vibrant purple bags contain 1 pale cyan bag, 1 dotted lavender bag, 3 striped blue bags, 5 clear magenta bags.
+vibrant fuchsia bags contain 4 posh violet bags, 3 bright aqua bags, 1 light silver bag.
+mirrored purple bags contain 2 dim yellow bags, 4 dim green bags, 3 vibrant beige bags.
+faded coral bags contain 1 vibrant plum bag, 3 pale gold bags, 5 dim purple bags, 1 drab teal bag.
+wavy cyan bags contain 4 dark teal bags, 1 dotted magenta bag.
+dotted gold bags contain 3 dotted gray bags.
+shiny maroon bags contain 2 light white bags, 5 bright salmon bags.
+vibrant cyan bags contain 2 dull beige bags.
+clear fuchsia bags contain 5 bright bronze bags.
+clear violet bags contain 4 clear white bags, 2 drab fuchsia bags, 4 plaid lavender bags, 4 drab beige bags.
+wavy tomato bags contain 3 wavy yellow bags, 4 plaid maroon bags, 1 dark beige bag.
+shiny indigo bags contain 4 posh aqua bags, 2 dim salmon bags, 3 dotted olive bags, 1 dull gray bag.
+dotted indigo bags contain 3 muted bronze bags, 1 striped salmon bag, 5 vibrant violet bags, 3 drab crimson bags.
+mirrored magenta bags contain 1 shiny aqua bag.
+pale green bags contain 4 striped orange bags, 3 plaid red bags, 3 clear olive bags.
+dim crimson bags contain 5 posh violet bags, 3 mirrored crimson bags, 2 striped white bags, 1 dark indigo bag.
+light white bags contain 1 dark indigo bag, 1 wavy orange bag.
+striped green bags contain 2 clear beige bags, 4 dim coral bags.
+dotted lavender bags contain 1 striped white bag, 5 dotted coral bags, 3 striped orange bags, 1 dotted gray bag.
+light purple bags contain 5 dim tomato bags, 4 dull plum bags, 1 dim green bag, 3 dotted magenta bags.
+shiny violet bags contain 1 shiny white bag.
+dark lime bags contain 4 mirrored crimson bags, 2 wavy crimson bags, 4 dim green bags.
+dark teal bags contain 3 mirrored orange bags.
+muted maroon bags contain 5 dim fuchsia bags.
+posh tomato bags contain 3 bright violet bags, 3 dim crimson bags, 4 mirrored beige bags, 3 drab lime bags.
+plaid violet bags contain 1 shiny tomato bag, 5 dotted gray bags, 1 muted magenta bag, 5 mirrored crimson bags.
+shiny bronze bags contain 3 dim red bags, 2 drab plum bags, 3 striped yellow bags, 1 mirrored yellow bag.
+muted tomato bags contain 2 vibrant maroon bags, 3 vibrant beige bags, 5 light coral bags.
+muted fuchsia bags contain 2 clear violet bags, 4 shiny gray bags, 1 shiny gold bag, 3 wavy crimson bags.
+pale teal bags contain 2 bright beige bags, 3 vibrant cyan bags, 4 bright salmon bags, 3 plaid red bags.
+posh salmon bags contain 2 dull beige bags, 1 faded maroon bag.
+dim white bags contain 2 dull tan bags, 3 dotted coral bags, 1 light silver bag, 1 dim gold bag.
+posh tan bags contain 4 clear blue bags, 4 dim olive bags, 4 striped green bags.
+dim lime bags contain 2 drab chartreuse bags, 5 striped magenta bags, 4 striped purple bags.
+mirrored white bags contain 2 dotted white bags, 3 striped salmon bags, 3 dull green bags, 3 plaid orange bags.
+shiny fuchsia bags contain 3 striped bronze bags, 1 plaid violet bag.
+dull indigo bags contain 5 wavy tomato bags.
+posh maroon bags contain 2 dark green bags, 4 posh red bags, 3 drab tomato bags.
+clear coral bags contain 5 pale yellow bags, 2 muted green bags, 3 faded black bags, 1 striped teal bag.
+posh gold bags contain 3 wavy yellow bags, 5 mirrored crimson bags, 1 dotted lavender bag, 2 plaid purple bags.
+muted yellow bags contain 3 wavy tan bags, 1 dark beige bag, 3 drab lavender bags.
+pale cyan bags contain 5 clear black bags, 3 dull lime bags, 3 wavy olive bags, 5 plaid indigo bags.
+drab white bags contain 2 dull green bags, 3 wavy aqua bags, 4 dark indigo bags.
+drab lime bags contain 2 drab aqua bags, 5 light turquoise bags.
+dotted tan bags contain 1 dotted beige bag, 5 faded maroon bags, 5 light indigo bags, 3 light bronze bags.
+muted crimson bags contain 5 faded gold bags.
+striped turquoise bags contain 1 shiny silver bag, 4 vibrant salmon bags, 5 dotted yellow bags.
+plaid yellow bags contain 2 dim crimson bags, 5 bright tan bags, 3 wavy yellow bags, 1 clear silver bag.
+shiny salmon bags contain 2 vibrant yellow bags.
+pale maroon bags contain 5 faded silver bags, 3 dull lavender bags, 4 dotted magenta bags.
+dotted orange bags contain 4 mirrored brown bags, 2 clear fuchsia bags.
+muted gray bags contain 5 dim purple bags, 3 wavy yellow bags.
+vibrant gold bags contain 2 wavy maroon bags, 5 faded chartreuse bags, 3 light indigo bags, 4 dark brown bags.
+bright fuchsia bags contain 4 pale crimson bags, 3 striped orange bags, 1 shiny tomato bag, 5 bright tan bags.
+light cyan bags contain 1 dim teal bag, 3 wavy indigo bags.
+pale olive bags contain 3 light fuchsia bags.
+dim brown bags contain 2 dotted indigo bags.
+mirrored silver bags contain 3 plaid violet bags.
+posh cyan bags contain 5 wavy maroon bags, 4 dim gold bags.
+bright turquoise bags contain 5 posh bronze bags, 4 shiny aqua bags.
+faded fuchsia bags contain 3 dotted gray bags.
+dull beige bags contain 3 posh bronze bags.
+dark purple bags contain 4 dim salmon bags, 4 faded maroon bags, 2 drab red bags, 1 clear bronze bag.
+drab tan bags contain 5 striped maroon bags.
+faded green bags contain 3 dark lavender bags, 4 posh lime bags, 2 light purple bags, 2 dark plum bags.
+posh indigo bags contain 4 dark tan bags, 2 dark lavender bags, 1 shiny cyan bag.
+drab maroon bags contain 3 wavy red bags, 1 dim fuchsia bag, 5 mirrored indigo bags, 2 drab lavender bags.
+dim magenta bags contain 4 striped orange bags.
+striped teal bags contain 2 dark lime bags.
+plaid green bags contain 5 mirrored salmon bags, 4 mirrored brown bags, 2 dark lavender bags, 4 faded indigo bags.
+dull blue bags contain 3 faded lime bags, 2 faded violet bags, 4 dull tan bags, 1 shiny tan bag.
+muted turquoise bags contain 5 dim silver bags, 4 wavy crimson bags.
+dull teal bags contain 1 faded blue bag, 3 light violet bags, 3 faded black bags.
+mirrored salmon bags contain 4 muted magenta bags, 3 dotted tomato bags, 2 light cyan bags, 2 vibrant lavender bags.
+shiny coral bags contain 1 striped teal bag, 1 drab lime bag, 5 mirrored red bags.
+muted chartreuse bags contain 2 striped white bags, 3 bright turquoise bags, 2 faded silver bags.
+mirrored green bags contain 2 bright maroon bags.
+light brown bags contain 2 clear bronze bags, 4 dark lime bags, 3 muted teal bags, 5 wavy yellow bags.
+vibrant indigo bags contain 3 dotted bronze bags.
+light coral bags contain 2 dotted bronze bags.
+dotted turquoise bags contain 3 plaid red bags, 3 shiny fuchsia bags, 4 faded lime bags.
+dark white bags contain 1 dull blue bag, 5 shiny cyan bags, 3 dark beige bags, 2 mirrored brown bags.
+pale purple bags contain 5 faded gold bags, 2 drab maroon bags.
+wavy beige bags contain 3 faded violet bags, 4 mirrored silver bags, 4 clear gray bags, 2 dotted tomato bags.
+light teal bags contain 4 bright magenta bags, 2 drab coral bags.
+bright tomato bags contain 3 mirrored crimson bags, 1 muted blue bag, 4 dim brown bags.
+plaid turquoise bags contain 4 vibrant blue bags, 1 wavy chartreuse bag, 2 pale magenta bags.
+faded tomato bags contain 3 light salmon bags, 2 wavy chartreuse bags.
+faded salmon bags contain 5 dark aqua bags, 4 faded bronze bags, 5 bright crimson bags.
+light salmon bags contain 2 mirrored silver bags, 3 dotted coral bags, 3 wavy crimson bags.
+mirrored lavender bags contain 4 shiny silver bags, 1 wavy crimson bag.
+vibrant plum bags contain 5 light orange bags, 4 dull lime bags, 2 dim aqua bags, 5 shiny violet bags.
+vibrant tan bags contain 1 drab salmon bag, 2 dull beige bags, 3 dotted bronze bags.
+faded red bags contain 3 light indigo bags, 2 dotted tomato bags.
+bright purple bags contain 3 light tomato bags, 3 clear gold bags.
+plaid magenta bags contain 5 muted orange bags, 3 pale plum bags, 5 faded plum bags.
+wavy tan bags contain 1 dull lavender bag.
+faded olive bags contain 5 mirrored silver bags.
+plaid white bags contain 4 bright bronze bags, 2 dotted cyan bags, 2 dark lavender bags, 5 shiny lavender bags.
+striped aqua bags contain 5 light salmon bags.
+drab tomato bags contain 1 dark lime bag, 2 muted magenta bags, 5 clear gray bags, 3 dotted gray bags.
+clear tomato bags contain 5 plaid bronze bags.
+posh teal bags contain 1 plaid maroon bag, 3 light tan bags, 1 clear crimson bag, 5 vibrant aqua bags.
+dim tan bags contain 2 drab fuchsia bags, 3 dark beige bags, 3 plaid green bags.
+dotted lime bags contain 4 dim red bags.
+mirrored beige bags contain 1 bright orange bag, 3 light purple bags.
+plaid silver bags contain 2 bright gold bags.
+faded orange bags contain 5 faded plum bags.
+dim indigo bags contain 4 muted orange bags, 5 vibrant tomato bags.
+shiny blue bags contain 3 drab crimson bags, 2 dim green bags, 1 clear violet bag.
+dull olive bags contain 2 plaid lime bags, 5 muted maroon bags, 4 shiny crimson bags, 3 dim plum bags.
+striped maroon bags contain 1 dim tomato bag, 2 dotted tomato bags, 1 muted magenta bag, 5 faded maroon bags.
+dull green bags contain 4 light salmon bags, 1 dim green bag.
+vibrant crimson bags contain 4 clear plum bags, 2 faded white bags, 4 wavy crimson bags.
+striped chartreuse bags contain 2 plaid lavender bags.
+bright chartreuse bags contain 2 vibrant orange bags.
+drab lavender bags contain 4 dotted coral bags.
+dull crimson bags contain 2 faded silver bags, 2 bright magenta bags.
+striped magenta bags contain 4 dull crimson bags, 4 faded maroon bags.
+clear bronze bags contain 1 bright bronze bag, 2 shiny red bags.
+plaid tan bags contain 5 pale silver bags, 5 muted teal bags, 3 faded beige bags, 2 faded chartreuse bags.
+dim black bags contain 2 faded indigo bags.
+shiny black bags contain 3 dotted bronze bags, 5 clear olive bags, 3 dark orange bags, 4 pale coral bags.
+striped gold bags contain 3 dotted coral bags, 4 faded orange bags, 2 striped purple bags, 4 light cyan bags.
+drab chartreuse bags contain 4 dull crimson bags.
+bright yellow bags contain 3 wavy crimson bags, 4 bright turquoise bags, 3 plaid red bags.
+dark orange bags contain 3 wavy yellow bags.
+clear salmon bags contain 5 wavy turquoise bags, 4 shiny aqua bags, 1 shiny brown bag, 1 vibrant tomato bag.
+plaid fuchsia bags contain 1 posh olive bag.
+wavy magenta bags contain 5 vibrant beige bags, 5 faded chartreuse bags, 5 light purple bags, 4 wavy indigo bags.
+dull gold bags contain 2 shiny bronze bags, 4 plaid beige bags, 4 mirrored silver bags, 2 bright lavender bags.
+drab magenta bags contain 1 posh red bag.
+shiny silver bags contain 4 dark lavender bags, 2 dull tan bags.
+shiny crimson bags contain 3 plaid violet bags, 4 muted purple bags.
+posh black bags contain 2 dotted magenta bags, 4 dotted gray bags.
+vibrant salmon bags contain 1 clear silver bag.
+dotted tomato bags contain 4 wavy crimson bags, 3 faded plum bags, 4 muted magenta bags.
+dark turquoise bags contain 1 dim beige bag, 3 dotted coral bags.
+pale orange bags contain 2 striped silver bags, 1 dotted salmon bag, 3 dim black bags, 4 posh turquoise bags.
+mirrored indigo bags contain 5 posh yellow bags.
+muted lavender bags contain 5 striped olive bags, 1 muted indigo bag.
+light yellow bags contain 5 dark chartreuse bags.
+drab bronze bags contain 3 clear beige bags, 3 bright purple bags, 3 bright brown bags.
+mirrored blue bags contain 5 dotted bronze bags, 1 dark green bag, 5 clear silver bags, 5 dim maroon bags.
+wavy violet bags contain 4 light tan bags, 1 vibrant lavender bag.
+clear red bags contain 4 faded orange bags, 1 drab gold bag, 4 dim teal bags, 4 dotted indigo bags.
+striped indigo bags contain 5 dim indigo bags.
+striped olive bags contain 3 dotted green bags, 4 mirrored cyan bags.
+dim fuchsia bags contain 3 vibrant gray bags, 5 wavy brown bags, 2 muted beige bags.
+plaid plum bags contain 3 shiny tomato bags, 4 striped orange bags.
+striped white bags contain 1 plaid red bag.
+mirrored coral bags contain 5 drab teal bags, 4 dotted coral bags, 4 striped chartreuse bags, 5 dotted gold bags.
+dull bronze bags contain 4 dim olive bags, 5 posh turquoise bags, 2 clear gold bags.
+pale white bags contain 3 vibrant gray bags, 4 wavy coral bags, 5 drab purple bags.
+drab green bags contain 1 dim teal bag, 1 faded bronze bag, 3 clear silver bags.
+dotted black bags contain 3 drab tan bags, 2 vibrant orange bags, 3 striped maroon bags.
+light gold bags contain 5 posh olive bags, 3 striped orange bags, 3 dull orange bags.
+pale tan bags contain 1 mirrored fuchsia bag, 4 light silver bags, 5 dim plum bags.
+plaid lavender bags contain 1 dim teal bag, 5 shiny aqua bags, 5 wavy crimson bags.
+wavy lime bags contain 1 pale chartreuse bag, 5 mirrored white bags, 4 faded olive bags.
+bright crimson bags contain 1 plaid green bag.
+pale fuchsia bags contain 4 light aqua bags.
+striped crimson bags contain 4 shiny plum bags, 3 dull violet bags, 5 clear tan bags.
+mirrored fuchsia bags contain 3 posh red bags, 3 plaid violet bags, 5 shiny brown bags, 5 striped chartreuse bags.
+faded cyan bags contain 3 striped yellow bags, 3 clear indigo bags.
+mirrored plum bags contain 2 vibrant silver bags.
+dull turquoise bags contain 2 plaid white bags, 5 striped salmon bags, 5 clear purple bags.
+dim orange bags contain 5 dim black bags.
+dull orange bags contain 3 dotted magenta bags, 2 mirrored crimson bags, 3 striped bronze bags.
+dark gray bags contain 4 dotted crimson bags, 2 vibrant salmon bags.
+drab orange bags contain 5 dotted gray bags, 5 muted maroon bags, 5 faded aqua bags, 2 pale maroon bags.
+striped bronze bags contain 3 striped white bags, 5 striped orange bags.
+light bronze bags contain 2 plaid red bags, 2 faded olive bags.
+drab olive bags contain 2 striped salmon bags, 3 drab white bags, 4 pale silver bags.
+bright cyan bags contain 5 muted blue bags.
+drab black bags contain 1 shiny blue bag, 1 drab yellow bag, 5 muted tan bags, 2 drab violet bags.
+shiny green bags contain 5 dim purple bags, 1 dotted crimson bag.
+wavy blue bags contain 3 shiny white bags.
+pale lime bags contain 1 dotted maroon bag.
+dotted red bags contain 1 dotted bronze bag, 1 vibrant lime bag, 4 clear plum bags.
+faded bronze bags contain 4 pale magenta bags, 1 faded black bag, 1 faded orange bag, 3 dark crimson bags.
+dark green bags contain 1 striped magenta bag.
+faded blue bags contain 2 dim maroon bags.
+dim violet bags contain 4 posh yellow bags, 5 dim lime bags, 5 faded olive bags.
+dark tan bags contain 2 mirrored green bags.
+dim teal bags contain 5 mirrored yellow bags, 2 dull tan bags, 2 vibrant lavender bags, 4 clear lime bags.
+plaid crimson bags contain 3 striped black bags, 1 faded plum bag, 3 muted red bags.
+clear white bags contain 1 shiny gold bag.
+dim silver bags contain 5 dull tan bags.
+dark cyan bags contain 2 clear black bags, 5 plaid yellow bags, 2 posh coral bags.
+dull violet bags contain 5 wavy teal bags, 5 shiny white bags.
+muted coral bags contain 5 faded violet bags, 2 drab red bags, 3 muted olive bags, 4 mirrored tomato bags.
+vibrant white bags contain 3 muted brown bags, 4 mirrored red bags, 4 dull orange bags, 4 dark crimson bags.
+posh red bags contain 2 clear gray bags, 2 bright turquoise bags.
+wavy chartreuse bags contain 5 light tomato bags, 5 posh black bags.
+striped black bags contain 1 faded green bag, 1 wavy green bag, 4 wavy orange bags.
+drab indigo bags contain 4 clear cyan bags, 4 mirrored crimson bags, 4 clear silver bags.
+pale gold bags contain 1 dim lime bag.
+dark olive bags contain 5 bright white bags, 5 clear lavender bags, 2 vibrant coral bags.
+muted salmon bags contain 4 drab beige bags, 3 plaid violet bags, 4 mirrored brown bags, 3 dark lime bags.
+posh gray bags contain 1 clear beige bag, 4 vibrant blue bags, 1 shiny aqua bag, 5 dim tan bags.
+bright white bags contain 5 muted bronze bags, 5 clear cyan bags.
+dull white bags contain 1 vibrant tomato bag.
+striped tan bags contain 4 mirrored brown bags, 5 faded chartreuse bags.
+wavy teal bags contain 3 plaid red bags.
+faded purple bags contain 4 muted orange bags, 3 clear salmon bags, 5 drab cyan bags.
+dotted yellow bags contain 4 light indigo bags, 5 drab violet bags, 3 dull tan bags, 3 bright lime bags.
+wavy plum bags contain 2 dim aqua bags, 5 dark brown bags, 1 bright gold bag, 2 dull orange bags.
+muted blue bags contain 5 plaid tan bags, 4 dim salmon bags, 5 striped tomato bags.
+dim green bags contain no other bags.
+light lime bags contain 3 mirrored orange bags, 2 muted red bags, 1 dim black bag, 4 posh maroon bags.
+mirrored brown bags contain 4 dotted gray bags, 3 clear lime bags, 2 dim green bags.
+drab fuchsia bags contain 5 mirrored yellow bags, 5 plaid plum bags.
+drab gray bags contain 2 dim violet bags, 4 posh purple bags.
+vibrant teal bags contain 4 pale tomato bags, 2 posh lime bags, 2 mirrored silver bags, 1 wavy crimson bag.
+dotted plum bags contain 5 bright gold bags.
+shiny gold bags contain 4 shiny tomato bags, 5 wavy indigo bags.
+bright bronze bags contain 2 faded maroon bags, 2 dim white bags, 5 drab violet bags.
+drab yellow bags contain 4 mirrored green bags, 5 faded fuchsia bags, 1 drab turquoise bag.
+dark bronze bags contain 5 muted salmon bags, 3 posh cyan bags, 2 shiny tan bags.
+light magenta bags contain 3 dark silver bags, 2 striped tan bags.
+pale yellow bags contain 5 drab tomato bags, 3 striped orange bags, 4 striped maroon bags.
+shiny cyan bags contain 2 light tomato bags, 3 clear purple bags, 2 shiny tan bags, 3 dull tan bags.
+pale gray bags contain 2 drab purple bags, 5 dotted turquoise bags, 3 pale salmon bags.
+mirrored cyan bags contain 4 faded chartreuse bags.
+dotted bronze bags contain 2 faded silver bags.
+faded beige bags contain 1 bright red bag, 3 dotted red bags, 2 striped lime bags.
+dotted beige bags contain 4 muted turquoise bags, 1 dull beige bag, 3 bright gold bags.
+drab plum bags contain 4 clear chartreuse bags.
+pale blue bags contain 1 dim chartreuse bag, 1 dark lavender bag, 1 drab tan bag.
+faded teal bags contain 1 vibrant tan bag, 1 dim tan bag, 3 dull gray bags, 4 plaid red bags.
+plaid beige bags contain 3 plaid tomato bags.
+dotted chartreuse bags contain 1 pale maroon bag.
+bright gray bags contain 2 bright coral bags, 3 bright turquoise bags, 4 posh tan bags.
+bright olive bags contain 1 dotted bronze bag, 4 mirrored yellow bags, 4 light bronze bags.
+dotted olive bags contain 5 clear purple bags, 5 muted bronze bags, 5 vibrant tomato bags.
+pale tomato bags contain 4 clear gold bags, 4 clear tomato bags.
+clear gold bags contain 1 striped lime bag, 1 striped chartreuse bag, 2 muted fuchsia bags, 5 clear salmon bags.
+dotted gray bags contain no other bags.
+striped brown bags contain 3 pale maroon bags, 5 faded gold bags, 4 wavy yellow bags, 3 bright turquoise bags.
+shiny lime bags contain 4 pale violet bags, 4 clear violet bags.
+mirrored tan bags contain 1 vibrant magenta bag, 3 mirrored violet bags, 5 faded plum bags.
+dull maroon bags contain 5 posh salmon bags, 5 dull coral bags, 2 plaid plum bags, 3 striped teal bags.
+dim purple bags contain 1 light tomato bag, 3 shiny violet bags.
+bright brown bags contain 1 shiny aqua bag, 1 shiny lavender bag, 1 drab fuchsia bag, 3 faded olive bags.
+light maroon bags contain 4 mirrored brown bags.
+pale violet bags contain 4 wavy turquoise bags, 5 dull orange bags, 4 dotted black bags, 5 muted fuchsia bags.
+mirrored black bags contain 3 dotted silver bags, 2 bright crimson bags.
+drab aqua bags contain 3 plaid red bags, 1 plaid violet bag, 5 dim tomato bags.
+clear green bags contain 4 dark coral bags.
+mirrored aqua bags contain 4 shiny crimson bags, 4 wavy bronze bags.
+pale coral bags contain 2 wavy olive bags, 2 muted silver bags, 4 dim tan bags.
+mirrored gray bags contain 5 clear plum bags, 5 dark yellow bags.
+light blue bags contain 3 dull bronze bags, 3 dotted plum bags.
+dark silver bags contain 2 plaid chartreuse bags, 5 plaid lavender bags, 1 wavy indigo bag, 4 dark brown bags.
+posh silver bags contain 4 shiny lavender bags.
+shiny orange bags contain 4 light magenta bags.
+dark blue bags contain 5 pale purple bags.
+wavy white bags contain 1 posh olive bag, 1 dotted fuchsia bag, 4 muted maroon bags.
+striped orange bags contain 2 faded plum bags.
+dull lime bags contain 1 pale yellow bag, 1 clear turquoise bag, 5 faded silver bags, 4 dim beige bags.
+dull red bags contain 1 bright aqua bag, 3 light maroon bags, 5 light tomato bags.
+light tomato bags contain 3 dull crimson bags, 1 dim beige bag.
+bright blue bags contain 3 plaid olive bags.
+bright red bags contain 4 muted teal bags, 5 dotted magenta bags.
+striped gray bags contain 2 dotted purple bags, 4 dull green bags, 4 dull salmon bags, 4 muted silver bags.
+drab salmon bags contain 4 mirrored indigo bags, 5 mirrored silver bags, 5 shiny cyan bags, 1 plaid brown bag.
+posh olive bags contain 3 faded silver bags, 5 plaid violet bags, 2 striped bronze bags.
+dim salmon bags contain 5 vibrant lavender bags.
+mirrored orange bags contain 2 bright white bags, 5 plaid orange bags.
+posh fuchsia bags contain 5 vibrant coral bags, 2 shiny plum bags, 5 pale silver bags.
+wavy fuchsia bags contain 5 posh cyan bags, 2 bright silver bags, 1 wavy tomato bag, 1 wavy plum bag.
+clear olive bags contain 4 pale maroon bags, 2 muted bronze bags, 4 mirrored crimson bags, 2 dull blue bags.
+clear blue bags contain 5 shiny white bags, 5 plaid lime bags.
+dotted coral bags contain no other bags.
+clear black bags contain 4 dull beige bags, 2 mirrored crimson bags, 2 dim beige bags.
+mirrored turquoise bags contain 2 light green bags, 4 dull lime bags, 2 drab olive bags, 3 drab purple bags.
+muted teal bags contain 2 dim gold bags, 1 light salmon bag, 3 dark crimson bags, 3 muted olive bags.
+clear gray bags contain 2 dotted coral bags, 5 shiny tomato bags.
+vibrant black bags contain 2 dull blue bags, 1 light magenta bag.
+clear yellow bags contain 3 vibrant yellow bags, 2 plaid red bags, 1 dull plum bag, 4 faded violet bags.
+dull fuchsia bags contain 4 dim maroon bags, 4 wavy plum bags, 5 dim teal bags.
+mirrored gold bags contain 4 mirrored brown bags, 3 dotted coral bags, 4 faded plum bags, 1 mirrored indigo bag.
+faded lime bags contain 3 plaid violet bags, 2 drab tan bags.
+wavy olive bags contain 3 muted silver bags, 1 pale maroon bag, 5 posh silver bags.
+pale bronze bags contain 2 striped purple bags, 5 bright magenta bags, 4 pale crimson bags.
+posh crimson bags contain 4 mirrored purple bags, 2 shiny silver bags, 4 bright tan bags.
+clear plum bags contain 1 mirrored indigo bag, 4 clear purple bags, 2 dull blue bags, 5 striped bronze bags.
+vibrant chartreuse bags contain 5 vibrant yellow bags, 1 faded red bag.
+plaid red bags contain no other bags.
+dim maroon bags contain 2 pale yellow bags, 4 dotted cyan bags.
+pale silver bags contain 2 dark crimson bags.
+bright magenta bags contain 5 plaid red bags, 4 faded maroon bags.
+dark crimson bags contain 2 bright magenta bags, 1 mirrored silver bag, 2 mirrored brown bags, 1 shiny lavender bag.
+dull yellow bags contain 1 dull salmon bag.
+dark maroon bags contain 5 muted turquoise bags.
+clear indigo bags contain 5 posh purple bags, 3 striped magenta bags.
+shiny olive bags contain 3 drab yellow bags.
+vibrant bronze bags contain 4 plaid indigo bags.
+light plum bags contain 5 faded aqua bags.
+dim lavender bags contain 3 drab purple bags, 2 clear salmon bags, 1 wavy bronze bag, 1 plaid tan bag.
+mirrored chartreuse bags contain 3 wavy plum bags, 2 muted tan bags.
+bright teal bags contain 2 bright lavender bags, 5 plaid plum bags, 3 clear bronze bags.
+dull tan bags contain 4 clear gray bags.
+shiny magenta bags contain 2 plaid gold bags, 2 dotted turquoise bags, 4 muted teal bags, 3 shiny gold bags.
+clear aqua bags contain 4 dim cyan bags, 3 dim plum bags, 5 dim violet bags, 1 plaid yellow bag.
+clear tan bags contain 1 shiny brown bag.
+faded lavender bags contain 3 faded white bags, 1 faded purple bag.
+plaid maroon bags contain 5 plaid orange bags, 4 striped green bags, 2 striped gold bags, 5 bright bronze bags.
+wavy lavender bags contain 5 dim black bags, 5 clear fuchsia bags.
+plaid olive bags contain 3 dotted crimson bags, 2 pale plum bags, 3 bright orange bags, 1 clear coral bag.
+shiny lavender bags contain 3 faded plum bags, 2 mirrored crimson bags, 5 striped orange bags, 5 bright magenta bags.
+plaid chartreuse bags contain 5 clear silver bags, 5 pale crimson bags.
+bright coral bags contain 4 vibrant orange bags.
+wavy yellow bags contain 3 dull plum bags, 4 bright yellow bags, 5 mirrored violet bags, 3 plaid red bags.
+dark chartreuse bags contain 4 striped bronze bags, 2 bright tan bags.
+mirrored tomato bags contain 1 clear yellow bag, 1 dark lime bag, 2 mirrored silver bags.
+plaid gray bags contain 4 muted cyan bags, 4 dark silver bags, 1 wavy orange bag, 4 muted tomato bags.
+mirrored red bags contain 5 pale crimson bags, 5 light cyan bags, 1 posh yellow bag.
+vibrant silver bags contain 2 dull brown bags, 1 vibrant orange bag, 5 striped red bags.
+plaid purple bags contain 2 striped maroon bags, 1 faded olive bag.
+dull silver bags contain 4 shiny lavender bags, 5 plaid fuchsia bags, 1 plaid plum bag, 2 light cyan bags.
+dark plum bags contain 2 vibrant gold bags, 4 plaid brown bags, 1 drab teal bag, 4 dotted yellow bags.
+mirrored teal bags contain 3 drab orange bags, 4 shiny fuchsia bags, 4 mirrored lavender bags, 1 clear brown bag.
+light red bags contain 5 striped violet bags.
+shiny aqua bags contain 4 wavy indigo bags, 3 posh olive bags, 2 clear gray bags, 2 dim tomato bags.
+dull magenta bags contain 1 bright crimson bag, 1 bright bronze bag, 2 drab gold bags, 2 clear lavender bags.
+muted gold bags contain 1 striped chartreuse bag, 3 posh olive bags.
+dark brown bags contain 1 bright yellow bag.
+dull brown bags contain 5 dark brown bags, 1 dim gold bag.
+shiny chartreuse bags contain 1 shiny aqua bag, 5 faded chartreuse bags, 4 wavy beige bags.
+vibrant maroon bags contain 1 dotted yellow bag, 2 striped green bags, 2 muted olive bags, 2 muted turquoise bags.
+faded maroon bags contain 1 striped bronze bag, 5 dotted coral bags, 4 dim green bags, 1 faded plum bag.
+wavy salmon bags contain 1 dim white bag, 4 clear purple bags, 5 dark fuchsia bags, 5 vibrant cyan bags.
+light beige bags contain 3 dull lime bags, 1 plaid lavender bag.
+plaid teal bags contain 2 muted black bags, 2 dull salmon bags, 5 faded red bags, 2 muted turquoise bags.
+plaid cyan bags contain 5 faded maroon bags, 2 posh chartreuse bags.
+dim chartreuse bags contain 5 muted red bags, 4 dark lime bags.
+clear magenta bags contain 1 clear tomato bag, 1 striped orange bag, 3 striped chartreuse bags.
+dotted blue bags contain 5 plaid green bags, 3 mirrored crimson bags, 4 dotted magenta bags, 3 clear bronze bags.
+clear silver bags contain 4 vibrant lavender bags, 1 wavy turquoise bag, 2 posh purple bags, 5 dull blue bags.
+posh beige bags contain 4 muted aqua bags, 3 wavy orange bags, 1 muted coral bag.
+dim coral bags contain 1 clear purple bag, 2 plaid purple bags, 5 light gold bags.
+faded white bags contain 2 striped orange bags, 3 posh silver bags, 4 shiny tan bags, 5 faded green bags.
+pale aqua bags contain 5 shiny tan bags, 5 drab violet bags.
+clear brown bags contain 5 shiny tomato bags.
+faded tan bags contain 1 pale gray bag, 2 dull beige bags, 3 wavy teal bags, 1 bright maroon bag.
+striped silver bags contain 3 shiny green bags.
+vibrant brown bags contain 5 shiny aqua bags, 2 pale violet bags, 5 drab indigo bags.
+dark yellow bags contain 1 wavy white bag, 3 posh violet bags, 4 bright magenta bags.
+dull gray bags contain 3 dark silver bags, 3 mirrored green bags.
+dark violet bags contain 2 dark maroon bags, 5 dull aqua bags.
+muted brown bags contain 5 dim aqua bags, 3 dim teal bags, 4 faded olive bags, 1 plaid purple bag.
+posh chartreuse bags contain 3 dark tan bags, 1 striped salmon bag, 2 dark lime bags, 5 vibrant beige bags.
+mirrored maroon bags contain 1 dark red bag.
+faded yellow bags contain 5 mirrored beige bags, 1 drab chartreuse bag, 3 vibrant lavender bags.
+dotted aqua bags contain 4 vibrant lavender bags, 4 shiny fuchsia bags.
+bright maroon bags contain 5 faded maroon bags, 2 dark lime bags, 4 dim beige bags.
+dark salmon bags contain 5 clear tan bags.
+wavy bronze bags contain 3 dark beige bags.
+wavy crimson bags contain no other bags.
+drab gold bags contain 2 faded violet bags, 4 faded silver bags.
+dark black bags contain 3 wavy bronze bags, 2 dark aqua bags, 4 dotted beige bags.
+striped lavender bags contain 2 wavy aqua bags.
+vibrant red bags contain 1 plaid aqua bag.
+shiny yellow bags contain 5 clear silver bags, 2 dull magenta bags, 5 clear turquoise bags.
+dull chartreuse bags contain 5 light tan bags.
+bright beige bags contain 2 dim tomato bags.
+mirrored yellow bags contain 5 drab aqua bags, 5 mirrored silver bags, 3 dark lime bags.
+striped beige bags contain 4 dim white bags.
+muted orange bags contain 3 drab beige bags, 5 faded olive bags.
+drab turquoise bags contain 1 light green bag, 1 drab tomato bag, 4 clear purple bags.
+plaid salmon bags contain 3 posh gray bags, 1 dim beige bag, 1 plaid brown bag.
+faded gray bags contain 3 plaid fuchsia bags, 5 plaid magenta bags, 5 plaid white bags, 1 dull beige bag.
+posh aqua bags contain 2 mirrored turquoise bags.
+mirrored crimson bags contain no other bags.
+vibrant magenta bags contain 1 dull purple bag, 4 shiny red bags, 5 drab chartreuse bags, 4 bright red bags.
+striped yellow bags contain 1 shiny tan bag.
+vibrant orange bags contain 4 plaid silver bags, 5 dim teal bags, 1 striped maroon bag, 3 plaid red bags.
+dark indigo bags contain 3 drab purple bags.
+shiny gray bags contain 1 wavy yellow bag.
+faded plum bags contain no other bags.
+dim blue bags contain 2 dotted crimson bags, 5 muted chartreuse bags, 3 dark silver bags, 4 vibrant lime bags.
+muted white bags contain 4 muted teal bags, 3 posh purple bags, 1 dull lavender bag, 5 pale crimson bags.
+muted lime bags contain 1 shiny turquoise bag, 2 faded indigo bags, 2 vibrant silver bags, 1 pale turquoise bag.
+posh coral bags contain 5 faded violet bags.
+dotted fuchsia bags contain 1 clear tan bag, 1 striped lavender bag.
+wavy brown bags contain 2 dim aqua bags.
+posh brown bags contain 1 shiny cyan bag, 5 plaid orange bags, 3 light coral bags.
+drab purple bags contain 5 faded orange bags.
+muted tan bags contain 2 wavy teal bags, 3 dim salmon bags, 1 bright gold bag, 3 clear gray bags.
+dim yellow bags contain 1 vibrant gray bag, 4 vibrant lavender bags, 1 muted magenta bag.
+pale salmon bags contain 2 vibrant beige bags, 3 bright maroon bags.
+faded turquoise bags contain 4 plaid purple bags, 2 light tomato bags, 3 light salmon bags.
+clear teal bags contain 4 muted yellow bags, 3 dim beige bags, 5 faded tomato bags, 1 dim red bag.
+vibrant olive bags contain 3 muted lime bags, 5 shiny blue bags, 3 light gold bags, 3 dark olive bags.
+dim beige bags contain 1 light cyan bag, 3 faded plum bags.
+dull black bags contain 2 striped black bags, 5 wavy brown bags, 1 bright red bag, 1 drab teal bag.
+pale turquoise bags contain 5 vibrant violet bags, 3 dotted fuchsia bags, 2 striped blue bags, 4 posh purple bags.
+wavy red bags contain 3 drab teal bags.
+faded gold bags contain 5 dull lavender bags.
+faded black bags contain 5 wavy turquoise bags, 5 mirrored crimson bags.
+bright orange bags contain 2 striped maroon bags, 4 light cyan bags, 5 light silver bags, 5 wavy indigo bags.
+drab teal bags contain 4 wavy aqua bags, 5 light bronze bags, 1 drab red bag.
+dull salmon bags contain 4 dull orange bags.
+bright lavender bags contain 2 plaid silver bags, 3 bright crimson bags.
+drab cyan bags contain 2 bright bronze bags, 5 bright crimson bags, 2 wavy yellow bags.
+dull plum bags contain 3 shiny lavender bags, 2 bright magenta bags, 2 mirrored crimson bags, 4 mirrored silver bags.
+dotted teal bags contain 3 muted yellow bags, 3 dotted turquoise bags, 5 mirrored white bags.
+vibrant turquoise bags contain 5 clear magenta bags, 5 dark beige bags, 2 vibrant tan bags, 3 plaid blue bags.
+pale crimson bags contain 2 bright turquoise bags, 4 dark lime bags.
+pale plum bags contain 1 shiny chartreuse bag, 3 vibrant gold bags, 5 plaid violet bags, 5 dim salmon bags.
+mirrored lime bags contain 2 plaid green bags.
+pale lavender bags contain 5 dotted gold bags, 1 striped maroon bag, 3 shiny tan bags, 5 drab white bags.
+muted olive bags contain 3 drab crimson bags, 2 dotted gray bags, 5 dotted tomato bags, 3 posh bronze bags.
+drab brown bags contain 3 dull orange bags, 4 posh gold bags, 2 pale crimson bags, 1 plaid white bag.
+bright tan bags contain 1 dark white bag, 5 bright turquoise bags.
+faded indigo bags contain 3 pale yellow bags, 2 mirrored brown bags, 1 shiny gray bag, 5 bright turquoise bags.
+dark aqua bags contain 1 posh gray bag, 4 striped coral bags, 2 posh olive bags, 2 bright white bags.
+light tan bags contain 2 faded purple bags, 5 muted fuchsia bags.
+dark magenta bags contain 4 posh silver bags, 5 pale plum bags, 5 muted violet bags, 2 faded green bags.
+clear maroon bags contain 3 muted maroon bags, 1 clear olive bag, 2 faded black bags.
+posh purple bags contain 4 faded orange bags, 4 shiny salmon bags.
+bright gold bags contain 1 dull crimson bag, 1 shiny lavender bag.
+dull purple bags contain 3 clear silver bags, 1 drab aqua bag, 3 wavy beige bags.
+muted cyan bags contain 1 plaid green bag.
+vibrant yellow bags contain 3 faded plum bags, 4 vibrant lavender bags, 2 muted magenta bags.
+vibrant green bags contain 5 dim chartreuse bags, 2 posh lavender bags.
+plaid bronze bags contain 4 dim tomato bags, 3 shiny silver bags.
+striped blue bags contain 5 vibrant gold bags.
+plaid coral bags contain 4 faded purple bags, 3 drab turquoise bags, 1 light teal bag, 2 posh indigo bags.
+posh turquoise bags contain 5 posh cyan bags, 5 mirrored violet bags.
+faded crimson bags contain 2 plaid salmon bags, 1 striped magenta bag, 1 striped maroon bag.
+striped purple bags contain 1 drab violet bag, 2 pale maroon bags, 2 drab beige bags, 4 faded maroon bags.
+clear orange bags contain 5 dotted red bags, 4 mirrored red bags.
+striped fuchsia bags contain 2 bright tomato bags, 4 dull magenta bags.
+wavy purple bags contain 5 wavy olive bags, 3 shiny silver bags.
+dotted crimson bags contain 1 striped teal bag, 5 shiny tomato bags.
+dull lavender bags contain 1 dotted tomato bag, 3 wavy indigo bags, 1 faded silver bag.
+dotted magenta bags contain 3 dotted coral bags.
+drab silver bags contain 5 dark indigo bags, 4 bright bronze bags, 1 dim lime bag, 3 bright aqua bags.
+clear cyan bags contain 1 bright maroon bag.
+shiny beige bags contain 2 plaid beige bags, 2 striped magenta bags, 4 drab yellow bags, 4 muted yellow bags.
+dim turquoise bags contain 2 dull tan bags.
+drab coral bags contain 4 striped bronze bags, 3 dull orange bags, 5 plaid silver bags.
+light lavender bags contain 1 wavy plum bag, 4 posh purple bags.
+posh yellow bags contain 3 dark lime bags, 3 light cyan bags, 4 dull crimson bags.
+posh violet bags contain 2 faded chartreuse bags.
+shiny teal bags contain 5 mirrored salmon bags, 1 wavy plum bag, 3 posh purple bags, 2 posh cyan bags.
+vibrant lime bags contain 1 dotted tomato bag, 1 drab fuchsia bag, 1 mirrored brown bag.
+dark fuchsia bags contain 1 vibrant blue bag.
+bright green bags contain 4 dark purple bags, 4 bright tan bags, 5 drab turquoise bags.
+dull coral bags contain 2 dotted tomato bags.
+posh white bags contain 3 dull bronze bags, 1 faded salmon bag, 3 pale tomato bags, 3 vibrant salmon bags.
+plaid black bags contain 4 vibrant aqua bags, 2 shiny teal bags.
+posh lavender bags contain 4 wavy beige bags, 1 dim silver bag, 2 faded white bags.
+posh orange bags contain 4 dim orange bags, 3 faded chartreuse bags.
+plaid brown bags contain 5 shiny fuchsia bags, 5 striped magenta bags, 2 wavy coral bags, 1 vibrant beige bag.
+shiny plum bags contain 3 light green bags, 4 bright orange bags.
+dim aqua bags contain 4 faded gold bags, 1 dotted lavender bag, 3 light gold bags, 4 shiny aqua bags.
+wavy gold bags contain 4 clear violet bags, 5 dim red bags, 5 drab crimson bags, 2 dull coral bags.
+vibrant tomato bags contain 3 faded olive bags.
+bright silver bags contain 2 dull lavender bags, 4 faded aqua bags, 4 dim coral bags.
+wavy turquoise bags contain 4 dull lavender bags, 1 drab aqua bag.
+wavy aqua bags contain 3 wavy yellow bags.
+light indigo bags contain 5 dim beige bags, 3 drab fuchsia bags, 1 plaid violet bag, 5 bright yellow bags.
+striped red bags contain 3 bright violet bags, 5 dark indigo bags, 5 dim silver bags.
+posh lime bags contain 5 striped teal bags, 3 dark brown bags, 4 bright crimson bags, 2 posh violet bags.
+faded magenta bags contain 5 light gold bags, 1 posh indigo bag, 3 plaid lime bags.
+vibrant lavender bags contain 5 faded maroon bags, 3 striped orange bags, 3 dull crimson bags.
+clear purple bags contain 5 dark green bags, 3 light cyan bags, 3 clear white bags, 4 pale silver bags.
+muted purple bags contain 5 drab fuchsia bags, 1 vibrant salmon bag, 5 bright yellow bags.
+bright lime bags contain 5 vibrant violet bags, 5 wavy maroon bags.
+bright black bags contain 5 dark silver bags, 2 vibrant green bags.
+muted magenta bags contain no other bags.
+striped tomato bags contain 4 shiny gold bags.
+pale black bags contain 3 dull brown bags, 2 wavy coral bags, 2 posh purple bags, 4 faded beige bags.
+dim red bags contain 1 dotted tomato bag, 2 wavy beige bags.
+light black bags contain 4 dull maroon bags, 3 dotted aqua bags, 3 drab purple bags.
+shiny turquoise bags contain 3 dull blue bags, 4 posh bronze bags.
+pale indigo bags contain 4 dotted tomato bags.
+shiny white bags contain 5 vibrant tomato bags, 4 dotted magenta bags, 3 dull aqua bags.
+dark lavender bags contain 4 faded orange bags.
+shiny brown bags contain 3 bright orange bags, 2 dotted crimson bags, 2 wavy aqua bags.
+light chartreuse bags contain 1 muted lavender bag.
+faded aqua bags contain 4 dull green bags, 4 faded violet bags, 4 clear gray bags.
+light olive bags contain 4 shiny purple bags, 3 shiny plum bags.
+wavy indigo bags contain 3 dim green bags, 5 shiny lavender bags, 3 posh olive bags, 1 dull crimson bag.
+dull tomato bags contain 3 light coral bags, 2 light cyan bags, 3 plaid silver bags.
+clear turquoise bags contain 1 wavy crimson bag, 4 dim tomato bags.
+dim tomato bags contain 5 shiny lavender bags, 2 dim gold bags.
+wavy black bags contain 4 wavy chartreuse bags, 4 dull coral bags.
+dotted maroon bags contain 5 pale violet bags, 5 vibrant aqua bags, 5 plaid cyan bags.
+clear lavender bags contain 2 dotted turquoise bags, 4 light purple bags, 1 plaid plum bag.
+dotted cyan bags contain 2 dotted turquoise bags, 4 plaid gold bags, 5 drab red bags, 5 faded orange bags.
+muted violet bags contain 3 light teal bags, 2 striped gold bags.
+wavy silver bags contain 2 dim coral bags, 1 shiny chartreuse bag, 4 shiny turquoise bags.
+drab crimson bags contain 2 drab beige bags.
+dull aqua bags contain 4 striped maroon bags, 5 vibrant beige bags, 3 faded gold bags, 3 dark lime bags.
+vibrant coral bags contain 4 faded gold bags, 2 dotted black bags, 5 drab tomato bags.
+pale beige bags contain 1 dotted coral bag.
+dim olive bags contain 5 clear gray bags, 2 muted violet bags, 3 clear gold bags, 4 shiny red bags.
+dim cyan bags contain 4 plaid silver bags.
+muted bronze bags contain 4 wavy yellow bags, 1 vibrant yellow bag, 5 dim tomato bags, 2 mirrored silver bags.
+dim gold bags contain 2 dim green bags, 4 shiny tomato bags, 4 striped white bags, 4 mirrored crimson bags.
+vibrant gray bags contain 4 dotted turquoise bags, 4 posh violet bags.
+plaid orange bags contain 2 dotted turquoise bags.
+posh magenta bags contain 4 dotted lime bags.
+light silver bags contain 5 shiny gold bags, 3 dull tan bags.
+bright plum bags contain 5 pale magenta bags, 5 dull aqua bags.
+drab red bags contain 1 dim gold bag.
+striped salmon bags contain 1 vibrant lavender bag, 3 wavy crimson bags, 5 posh olive bags.
+dotted purple bags contain 3 dull lavender bags.
+bright violet bags contain 2 dotted indigo bags, 4 shiny violet bags.
+muted red bags contain 2 mirrored silver bags.
+dotted green bags contain 5 muted plum bags.
+clear lime bags contain no other bags.
+wavy gray bags contain 1 posh cyan bag, 5 dim bronze bags, 5 posh lime bags, 4 drab silver bags.
+dotted brown bags contain 4 striped tomato bags.
+plaid indigo bags contain 1 plaid purple bag, 3 dark turquoise bags, 3 light purple bags, 5 dotted cyan bags.
+mirrored olive bags contain 5 bright gold bags, 3 dotted gold bags, 4 drab gray bags, 4 drab tomato bags.
+wavy green bags contain 3 mirrored indigo bags, 4 wavy chartreuse bags, 2 clear cyan bags, 5 bright violet bags.
+light gray bags contain 4 vibrant yellow bags, 2 dull blue bags.
+posh plum bags contain 3 wavy yellow bags, 5 dim yellow bags, 2 clear chartreuse bags.
+posh bronze bags contain 2 clear lime bags.
+bright indigo bags contain 4 muted salmon bags, 2 posh violet bags.
+mirrored violet bags contain 1 faded plum bag, 3 dull orange bags.
+muted silver bags contain 3 mirrored indigo bags, 4 shiny fuchsia bags.
+striped coral bags contain 2 posh turquoise bags.
+plaid tomato bags contain 1 wavy beige bag, 5 muted green bags.
+dark gold bags contain 1 clear gold bag, 2 light maroon bags, 3 pale teal bags.
+light green bags contain 1 dull aqua bag, 4 dotted magenta bags, 4 dull purple bags.
+plaid lime bags contain 1 faded fuchsia bag.
+muted beige bags contain 1 dotted coral bag, 1 plaid fuchsia bag, 2 posh bronze bags.
+pale red bags contain 2 wavy gold bags, 1 striped lavender bag.
+striped lime bags contain 1 wavy turquoise bag, 4 dim aqua bags.
+muted black bags contain 3 dotted black bags.
+faded brown bags contain 1 dim turquoise bag, 2 plaid brown bags.
+plaid blue bags contain 2 muted salmon bags.
+muted indigo bags contain 2 dull fuchsia bags, 2 dull lime bags.
+dark coral bags contain 2 faded indigo bags, 3 shiny tomato bags, 2 mirrored salmon bags.
+vibrant beige bags contain 4 vibrant lavender bags.
+mirrored bronze bags contain 1 mirrored orange bag, 5 plaid red bags, 1 mirrored cyan bag.
+shiny red bags contain 1 bright yellow bag.
+light crimson bags contain 5 plaid crimson bags, 3 pale white bags, 3 drab fuchsia bags, 3 muted olive bags.
+drab blue bags contain 1 mirrored black bag, 3 striped fuchsia bags, 3 drab tan bags.
+striped violet bags contain 2 muted gray bags, 5 faded white bags, 5 striped black bags, 3 mirrored tomato bags.
+wavy maroon bags contain 2 light cyan bags, 3 muted teal bags, 2 vibrant lavender bags.
+pale brown bags contain 2 wavy black bags.
+bright aqua bags contain 3 plaid tan bags.
+muted plum bags contain 5 light bronze bags, 1 dotted beige bag, 3 vibrant cyan bags.
+posh green bags contain 4 faded lime bags, 1 dull coral bag, 4 mirrored silver bags.
+dark beige bags contain 3 wavy yellow bags, 5 dim salmon bags.
+light fuchsia bags contain 4 plaid coral bags.
+shiny tan bags contain 2 drab tan bags, 4 clear gray bags, 2 mirrored crimson bags, 1 vibrant beige bag.
+clear crimson bags contain 3 vibrant aqua bags, 4 dotted indigo bags.
+clear beige bags contain 4 posh olive bags, 4 bright lime bags, 3 dark green bags.
+dim gray bags contain 1 drab beige bag, 3 clear tomato bags, 2 mirrored fuchsia bags.
+light violet bags contain 3 plaid purple bags.
+faded silver bags contain 5 striped bronze bags, 4 dotted lavender bags.
+dotted white bags contain 5 drab green bags.
+shiny purple bags contain 3 posh turquoise bags, 2 dark brown bags.
+posh blue bags contain 2 vibrant chartreuse bags, 2 muted olive bags, 4 dull brown bags, 5 wavy magenta bags.
+striped cyan bags contain 1 pale plum bag, 3 dim maroon bags, 5 light salmon bags, 3 dim crimson bags.
+shiny tomato bags contain no other bags.
+plaid aqua bags contain 4 clear maroon bags, 4 plaid white bags, 2 posh chartreuse bags.
+pale magenta bags contain 5 muted teal bags, 1 vibrant lavender bag.
+dim plum bags contain 4 drab coral bags.
+drab beige bags contain 4 wavy crimson bags, 1 dull tan bag, 3 dotted tomato bags.
+wavy coral bags contain 1 mirrored yellow bag, 1 dull tan bag, 5 drab gold bags, 2 muted bronze bags.
+drab violet bags contain 4 faded maroon bags, 2 posh gold bags, 3 wavy maroon bags, 3 bright lime bags.
+light aqua bags contain 5 light bronze bags, 1 light tan bag, 1 dull beige bag.
+light orange bags contain 1 dark tan bag, 3 dim white bags, 3 plaid plum bags.
+pale chartreuse bags contain 3 pale violet bags, 1 drab fuchsia bag, 1 shiny indigo bag, 2 dull turquoise bags.
+faded chartreuse bags contain 4 vibrant lime bags, 3 drab tomato bags, 1 vibrant violet bag, 1 vibrant tomato bag.
+clear chartreuse bags contain 2 dotted plum bags, 1 muted brown bag, 2 wavy chartreuse bags, 4 faded green bags.
+dotted silver bags contain 3 mirrored yellow bags.
+dotted violet bags contain 4 muted turquoise bags, 4 light black bags.
+wavy orange bags contain 3 shiny fuchsia bags, 4 clear beige bags.
+dark red bags contain 1 faded salmon bag, 3 muted purple bags.
+dim bronze bags contain 2 clear turquoise bags.
+light turquoise bags contain 5 dark red bags.
+muted green bags contain 5 bright turquoise bags, 2 wavy coral bags, 3 faded chartreuse bags.
+vibrant violet bags contain 3 wavy indigo bags, 1 dotted gray bag, 4 vibrant beige bags.
+dull cyan bags contain 3 light maroon bags, 2 posh plum bags.
+muted aqua bags contain 2 dotted beige bags, 2 faded yellow bags, 3 plaid gray bags, 3 bright chartreuse bags.
+dark tomato bags contain 2 striped purple bags, 2 dark maroon bags, 2 dim silver bags.
+vibrant blue bags contain 4 dull orange bags.
+faded violet bags contain 2 vibrant lavender bags, 5 plaid plum bags, 4 bright magenta bags, 4 faded silver bags.
+bright salmon bags contain 1 dull crimson bag, 2 light maroon bags.
+vibrant aqua bags contain 4 dotted aqua bags, 3 vibrant gray bags, 3 dotted lavender bags.
+striped plum bags contain 2 mirrored lime bags, 2 dark salmon bags.
+plaid gold bags contain 4 dark lime bags, 3 drab aqua bags, 3 dim white bags, 2 mirrored brown bags. \ No newline at end of file
diff --git a/2020/07/puzzle-1.py b/2020/07/puzzle-1.py
new file mode 100755
index 0000000..da054b8
--- /dev/null
+++ b/2020/07/puzzle-1.py
@@ -0,0 +1,38 @@
+#!/usr/bin/env python3
+
+
+bdict: dict[str, list[str]] = {}
+
+# Recursively check if a bag can hold a shiny gold bag
+def holds_bag(innerbags: list[str]) -> bool:
+ if "no other" in innerbags:
+ return False
+ elif "shiny gold" in innerbags:
+ return True
+
+ for subbag in innerbags:
+ if holds_bag(bdict[subbag]):
+ return True
+
+
+def main() -> None:
+ global bdict
+ with open("input", "r") as f:
+ lines = f.readlines()
+
+ for baginfo in lines:
+ data = baginfo.split(" bags contain")
+
+ # { bag_name: [contained_bag_1, containted_bag_2, ...] }
+ bdict[data[0]] = [" ".join(b.split(" ")[-3:][:2]) for b in data[1].split(",")]
+
+ count = 0
+ for bag in bdict:
+ if holds_bag(bdict[bag]):
+ count += 1
+
+ print(count)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/2020/07/puzzle-2.py b/2020/07/puzzle-2.py
new file mode 100755
index 0000000..c87ea13
--- /dev/null
+++ b/2020/07/puzzle-2.py
@@ -0,0 +1,35 @@
+#!/usr/bin/env python3
+
+
+bdict: dict[str, list[str]] = {}
+
+# Recursively find the number of sub-bags in a bag
+def total_bags(innerbags: list[dict[int, str]]) -> int:
+ if innerbags[0]["name"] == "no other":
+ return 0
+
+ return sum([bag["count"] + bag["count"] * total_bags(bdict[bag["name"]]) for bag in innerbags])
+
+
+def main() -> None:
+ with open("input", "r") as f:
+ lines = f.readlines()
+
+ for baginfo in lines:
+ data = baginfo.split(" bags contain")
+
+ # { bag_name: [{ count: n, name: bag_name_ }, ...] }
+ bdict[data[0]] = []
+ for b in data[1].split(","):
+ bdict[data[0]].append(
+ {
+ "count": int(b.replace("no", "0").split(" ")[1]),
+ "name": " ".join(b.split(" ")[-3:][:2]),
+ }
+ )
+
+ print(total_bags(bdict["shiny gold"]))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/2020/08/.gitignore b/2020/08/.gitignore
new file mode 100644
index 0000000..60d075d
--- /dev/null
+++ b/2020/08/.gitignore
@@ -0,0 +1 @@
+puzzle-[12]
diff --git a/2020/08/Makefile b/2020/08/Makefile
new file mode 100644
index 0000000..c32dafa
--- /dev/null
+++ b/2020/08/Makefile
@@ -0,0 +1,7 @@
+all:
+ ${CC} ${CFLAGS} -o puzzle-1 puzzles.c
+ ${CC} ${CFLAGS} -DPART2 -o puzzle-2 puzzles.c
+
+.PHONY: clean
+clean:
+ rm -f puzzle-[12]
diff --git a/2020/08/input b/2020/08/input
new file mode 100644
index 0000000..49eb92d
--- /dev/null
+++ b/2020/08/input
@@ -0,0 +1,653 @@
+acc +9
+acc -2
+acc -12
+acc +33
+jmp +301
+nop +508
+jmp +216
+acc +27
+acc +35
+acc +43
+acc +31
+jmp +309
+acc +18
+acc -19
+acc +7
+jmp +44
+acc -13
+acc -17
+acc +31
+jmp +311
+nop +612
+jmp +143
+acc +22
+nop +85
+jmp +458
+acc -3
+jmp +13
+acc -19
+acc +27
+acc +12
+jmp +483
+acc +40
+acc +6
+jmp +128
+jmp +10
+acc +0
+acc -3
+acc -2
+jmp -11
+acc +43
+acc -12
+jmp +158
+acc +0
+jmp +240
+jmp +1
+acc +5
+acc +15
+jmp +187
+nop +563
+jmp +51
+acc -16
+jmp +158
+jmp +322
+acc +47
+nop -1
+jmp +299
+acc +26
+acc +25
+jmp +232
+jmp -9
+acc +15
+jmp +54
+jmp +558
+acc +7
+acc -7
+jmp +399
+nop +447
+jmp +71
+acc +26
+acc +46
+jmp +145
+acc +38
+acc +30
+acc +21
+jmp +263
+acc +10
+jmp +168
+acc +22
+nop +561
+jmp -26
+jmp +1
+acc -7
+jmp -5
+acc +28
+acc -6
+jmp +370
+jmp +94
+acc +50
+acc +42
+acc -9
+acc +30
+jmp +70
+acc +29
+jmp +166
+acc -5
+acc -18
+nop +84
+acc +2
+jmp +366
+jmp -40
+acc -4
+acc -15
+acc -1
+jmp +169
+jmp +1
+acc -4
+acc +0
+jmp -45
+nop -21
+nop +241
+acc -18
+acc +19
+jmp +26
+nop -51
+jmp +260
+acc +17
+jmp +428
+acc +6
+jmp +405
+acc +22
+acc +10
+nop +471
+jmp +352
+acc -6
+acc +48
+acc +7
+acc +3
+jmp +57
+acc -10
+acc +16
+acc +16
+acc +43
+jmp +432
+acc -5
+acc +0
+nop +339
+acc +49
+jmp +17
+acc +33
+nop +166
+acc -5
+jmp +392
+nop +246
+acc -7
+acc +21
+acc +30
+jmp +398
+acc +36
+acc +24
+acc -15
+acc -9
+jmp +114
+acc +19
+jmp +11
+acc +43
+nop +182
+jmp -129
+nop -29
+acc -6
+acc +2
+jmp +398
+jmp +78
+acc +36
+jmp +393
+acc +15
+nop -11
+acc -7
+acc -9
+jmp +76
+acc +0
+acc +27
+jmp +25
+acc +27
+nop -54
+jmp +458
+acc +3
+acc +29
+acc -4
+acc +43
+jmp +413
+acc +33
+acc +13
+jmp +382
+jmp -83
+acc +42
+acc +24
+jmp +64
+acc +23
+acc -13
+nop +110
+acc -5
+jmp +114
+jmp +113
+nop +112
+acc +26
+jmp -133
+jmp -12
+jmp +1
+jmp +330
+acc +25
+acc -1
+acc +30
+acc +42
+jmp -187
+jmp +1
+acc +20
+acc +35
+acc +36
+jmp -125
+jmp +165
+acc +28
+acc -17
+acc -12
+jmp +1
+jmp -120
+nop +1
+acc +2
+acc +26
+jmp +398
+acc +20
+acc -1
+jmp -127
+acc +36
+acc +14
+jmp +1
+jmp +331
+acc +50
+acc +1
+acc -10
+nop +159
+jmp -83
+jmp +374
+acc +17
+jmp +372
+acc +44
+nop -39
+jmp +228
+acc +17
+jmp +74
+acc +16
+acc +33
+acc -2
+jmp +152
+jmp +29
+acc +8
+acc +27
+nop +59
+jmp -32
+acc +28
+jmp -227
+nop -35
+jmp -168
+acc +13
+nop +390
+jmp -204
+acc +16
+acc +44
+jmp -230
+jmp +25
+acc +30
+jmp +383
+acc -11
+acc +38
+acc +11
+jmp +341
+acc +35
+acc +46
+acc -1
+jmp +94
+acc -4
+acc +12
+jmp +111
+jmp +133
+nop +283
+acc +13
+acc +37
+jmp +74
+nop -218
+jmp -178
+acc +46
+acc +25
+acc -5
+jmp -174
+acc +28
+acc +39
+acc +36
+acc +22
+jmp -172
+acc +19
+jmp -250
+nop +62
+acc +44
+nop +347
+acc +40
+jmp +345
+acc -3
+acc -13
+acc -11
+jmp +56
+jmp -180
+acc +17
+acc -4
+acc +46
+nop -165
+jmp +321
+acc -4
+jmp +1
+acc +9
+acc -12
+jmp -155
+acc +5
+jmp -96
+acc +0
+acc -2
+acc +38
+jmp +67
+acc -4
+nop -283
+acc +28
+jmp +324
+acc -9
+acc +43
+acc -1
+acc +9
+jmp -290
+acc +3
+acc +22
+nop +84
+acc -17
+jmp -210
+acc +7
+jmp -260
+nop -232
+nop +87
+acc +43
+acc +36
+jmp +96
+jmp +238
+acc +13
+acc -14
+acc +32
+acc +11
+jmp -146
+acc +13
+acc +37
+acc -10
+jmp +187
+acc +49
+acc +15
+jmp -234
+jmp -328
+jmp -136
+jmp +143
+jmp +1
+acc +27
+acc +22
+jmp +1
+jmp -5
+acc +30
+nop -7
+acc -6
+jmp -71
+acc -17
+acc +15
+jmp -52
+jmp -126
+acc -4
+jmp +151
+jmp +52
+nop -86
+acc +25
+jmp +187
+nop -22
+jmp -219
+acc +33
+nop -120
+acc +0
+jmp +215
+acc +46
+acc +38
+jmp +1
+jmp -262
+jmp +157
+acc -15
+acc +48
+acc +39
+acc +10
+jmp -137
+acc +47
+acc +50
+jmp -324
+nop +214
+acc +39
+jmp -178
+acc +49
+acc -10
+jmp -268
+jmp +50
+acc -14
+nop -100
+jmp +20
+acc +45
+acc -12
+acc -4
+jmp -208
+acc -19
+jmp -340
+acc +36
+nop -358
+acc +5
+jmp -348
+acc +47
+nop -18
+acc -12
+jmp -131
+acc +19
+acc +10
+acc +19
+acc +31
+jmp -164
+nop +162
+nop -260
+jmp +146
+acc +32
+acc -1
+nop -14
+jmp -192
+acc +3
+acc +31
+nop -185
+jmp -208
+jmp -69
+acc +43
+acc +43
+jmp -68
+acc -16
+acc +5
+acc -9
+jmp +126
+acc +33
+acc +2
+acc +34
+acc -9
+jmp -16
+acc +34
+acc -19
+jmp -266
+nop +135
+nop -389
+acc +33
+jmp -195
+acc +48
+jmp +1
+acc -12
+jmp +143
+nop -317
+acc -14
+nop -127
+acc +32
+jmp -372
+acc +24
+nop -41
+nop -42
+jmp -344
+acc +23
+nop +117
+nop +92
+acc +42
+jmp +143
+acc +48
+acc -6
+nop -272
+acc -13
+jmp -379
+acc -2
+acc +44
+acc +9
+jmp -369
+acc +6
+acc +25
+acc +34
+jmp -301
+nop -227
+acc +43
+jmp -141
+acc +12
+acc +41
+acc +17
+acc -11
+jmp +29
+jmp -121
+acc +6
+acc +7
+acc +7
+jmp +131
+nop +144
+nop -142
+acc -13
+acc -18
+jmp +149
+acc +14
+acc +49
+acc +25
+acc -17
+jmp -9
+acc +26
+acc -4
+jmp -230
+acc -18
+acc +36
+acc +27
+nop -142
+jmp +21
+acc +34
+nop +54
+jmp -476
+acc +10
+jmp -174
+nop -354
+acc +1
+jmp -324
+acc +40
+jmp +94
+acc -12
+jmp -136
+nop -454
+acc -14
+jmp +116
+acc +12
+acc -1
+nop -453
+jmp -241
+jmp -479
+acc -19
+jmp -87
+acc +27
+acc +48
+acc +0
+jmp -476
+acc +16
+acc +46
+jmp -534
+acc +0
+jmp -344
+acc +0
+acc +28
+jmp +10
+jmp -248
+nop -186
+jmp +1
+acc +26
+jmp -153
+acc +14
+acc -8
+nop -416
+jmp -91
+jmp -409
+jmp -326
+acc +2
+acc +8
+acc -18
+acc +33
+jmp -468
+jmp -175
+acc -7
+acc +45
+jmp -18
+jmp -375
+acc -8
+jmp +28
+acc -16
+nop -38
+acc +37
+acc +48
+jmp -343
+acc +10
+acc +26
+acc -9
+acc -16
+jmp -348
+acc +37
+jmp -453
+acc -2
+acc +27
+acc +17
+acc +28
+jmp -406
+acc +25
+acc +24
+acc +44
+acc +44
+jmp -532
+acc +10
+jmp -531
+acc +39
+acc +40
+jmp -284
+acc +19
+acc +3
+nop -533
+acc -3
+jmp -162
+nop -438
+acc -5
+jmp -114
+acc +45
+acc +1
+acc +28
+acc +9
+jmp -550
+jmp -222
+jmp -106
+acc -7
+nop -263
+nop -375
+jmp -381
+acc -4
+nop -223
+jmp -171
+jmp -465
+acc -2
+nop -562
+jmp -190
+acc +40
+jmp -4
+acc +30
+acc +21
+jmp -435
+acc +1
+acc +10
+jmp +1
+jmp -157
+acc -7
+acc +18
+acc -3
+acc +24
+jmp -113
+acc +21
+jmp -339
+acc +34
+jmp -563
+acc +27
+jmp -589
+jmp -61
+acc +35
+acc +50
+acc +8
+jmp -553
+acc +48
+acc -15
+acc +29
+acc +24
+jmp +1 \ No newline at end of file
diff --git a/2020/08/puzzles.c b/2020/08/puzzles.c
new file mode 100644
index 0000000..cfa9389
--- /dev/null
+++ b/2020/08/puzzles.c
@@ -0,0 +1,112 @@
+#include <err.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define LINECOUNT 653
+
+struct Inst {
+ char opp;
+ int val;
+};
+
+/* Check if the given instruction has been executed already */
+static bool
+repeati(int const * const lines, int const rip)
+{
+ for (int i = 0; i < LINECOUNT; i++) {
+ if (lines[i] == rip)
+ return true;
+ }
+ return false;
+}
+
+static int
+run_circuit(struct Inst *circuit)
+{
+ int i, acc, rip;
+ int lines[LINECOUNT] = {0};
+
+ i = acc = rip = 0;
+
+ /* Execute the circuit */
+ do {
+ lines[i++] = rip;
+ switch (circuit[rip].opp) {
+ case 'j':
+ rip += circuit[rip].val;
+ if (rip >= LINECOUNT)
+ return acc;
+ break;
+ case 'a':
+ acc += circuit[rip].val;
+ /* FALLTHROUGH */
+ case 'n':
+ rip++;
+ break;
+ }
+ } while (!repeati(lines, rip));
+
+#ifdef PART2
+ return -1;
+#else
+ return acc;
+#endif
+}
+
+int
+main(void)
+{
+ int i = 0;
+ char cl[10];
+ FILE *fp;
+ struct Inst circuit[LINECOUNT];
+
+ if (!(fp = fopen("input", "r")))
+ err(EXIT_FAILURE, "fopen");
+
+ /* Load the entire circuit */
+ while (fgets(cl, sizeof(cl), fp)) {
+ char *val;
+ /* struct Inst operation; */
+
+ val = strtok(cl, " ");
+ circuit[i++] = (struct Inst) {
+ .opp = cl[0],
+ .val = atoi(strtok(NULL, " "))
+ };
+ }
+ fclose(fp);
+
+ int result = -1;
+#ifdef PART2
+ int count, prev_count;
+ count = prev_count = 1;
+
+ /* Run circuit until it completes successfully */
+ while (result == -1 && count < LINECOUNT) {
+ for (i = 0; i < LINECOUNT; i++) {
+ if (circuit[i].opp == 'j' || circuit[i].opp == 'n')
+ count--;
+
+ /* Swap jmp and nop */
+ if (!count) {
+ circuit[i].opp = (circuit[i].opp == 'j') ? 'n' : 'j';
+ break;
+ }
+ }
+
+ count = ++prev_count;
+ result = run_circuit(circuit);
+
+ /* Return to original array */
+ circuit[i].opp = (circuit[i].opp == 'j') ? 'n' : 'j';
+ }
+#else
+ result = run_circuit(circuit);
+#endif
+
+ printf("%d\n", result);
+ return EXIT_SUCCESS;
+}
diff --git a/2020/09/input b/2020/09/input
new file mode 100644
index 0000000..b6fbe43
--- /dev/null
+++ b/2020/09/input
@@ -0,0 +1,1000 @@
+42
+27
+23
+19
+4
+26
+31
+29
+11
+49
+38
+9
+45
+1
+40
+46
+39
+28
+44
+16
+13
+5
+32
+17
+50
+12
+20
+6
+7
+10
+22
+14
+18
+60
+59
+8
+19
+9
+11
+15
+21
+23
+39
+24
+25
+16
+26
+13
+29
+17
+27
+28
+20
+35
+30
+31
+22
+32
+44
+33
+38
+47
+34
+36
+37
+41
+55
+64
+40
+42
+43
+46
+39
+45
+61
+48
+50
+52
+65
+62
+53
+67
+72
+69
+70
+74
+73
+98
+86
+76
+79
+81
+108
+84
+82
+91
+160
+153
+93
+253
+100
+102
+105
+115
+175
+166
+151
+149
+142
+218
+147
+152
+162
+155
+161
+163
+165
+173
+255
+184
+191
+193
+293
+195
+357
+252
+295
+220
+257
+404
+289
+291
+322
+294
+314
+415
+343
+316
+318
+324
+328
+512
+364
+517
+379
+384
+511
+636
+615
+574
+472
+477
+509
+644
+1021
+605
+585
+608
+610
+800
+634
+640
+1122
+642
+1255
+692
+841
+893
+981
+763
+1313
+1586
+1046
+949
+986
+1057
+1062
+1094
+1444
+1300
+2393
+1193
+1250
+1244
+1274
+1475
+1282
+1405
+1334
+1533
+1585
+1604
+1744
+2467
+1712
+2986
+2043
+2193
+2255
+2048
+3250
+2338
+2287
+2437
+3711
+2443
+2526
+2494
+2518
+2556
+3382
+2938
+2990
+3527
+4149
+5876
+4660
+4993
+4050
+4724
+4091
+4236
+4241
+4303
+4781
+4625
+4730
+4805
+4880
+4937
+5432
+7280
+9717
+5074
+5494
+9027
+5928
+9505
+7577
+8966
+8141
+8286
+8291
+13021
+12377
+10162
+9535
+8544
+13907
+14235
+14459
+9610
+9685
+19222
+17294
+10506
+18637
+18683
+14040
+33262
+22526
+21882
+15718
+17751
+16427
+16432
+16835
+35110
+28293
+18079
+19050
+28322
+34586
+30339
+40277
+19295
+26520
+20191
+24546
+26224
+26933
+29758
+33090
+47837
+34506
+34914
+32553
+64269
+34178
+52868
+62471
+35885
+37374
+37129
+38270
+38345
+96649
+39486
+43841
+57636
+70898
+44737
+46415
+68387
+66887
+74155
+71307
+85211
+66731
+67059
+67467
+68438
+110684
+82300
+73014
+80622
+74230
+76615
+75399
+106217
+77831
+152678
+126074
+116044
+91152
+111624
+113474
+141117
+133618
+133790
+138366
+134198
+173276
+142668
+157699
+135905
+158453
+206696
+212520
+147244
+157237
+365198
+152014
+239548
+168983
+191305
+224942
+202776
+254591
+276458
+272564
+247092
+267408
+267816
+402014
+301121
+292651
+278573
+506956
+283149
+293142
+304481
+309251
+494139
+565215
+320997
+343319
+441547
+371759
+785529
+449868
+692756
+457367
+537740
+592400
+514500
+761848
+546389
+711265
+561722
+1157615
+585793
+571715
+846991
+1100293
+597623
+874466
+715078
+778364
+881059
+784866
+793187
+813306
+821627
+907235
+1452774
+971867
+995107
+1157508
+1060889
+1076222
+1118104
+1108111
+1340086
+1370659
+1169338
+1183416
+1375987
+1634933
+1508265
+1419250
+1493442
+1499944
+2407179
+1665925
+1578053
+1889528
+1720541
+1728862
+1879102
+1966974
+2400975
+3213983
+2230227
+2137111
+3457155
+2448197
+3379046
+2352754
+2539997
+3306915
+2993386
+5013979
+2912692
+2919194
+3085175
+3071495
+3165869
+3243978
+3545027
+3298594
+5846912
+3449403
+3607964
+3846076
+4104085
+4940972
+4367338
+4489865
+6764070
+4800951
+4892751
+5265446
+5271948
+6362095
+5831886
+6291980
+6237364
+5984187
+6615272
+6156670
+6315473
+6409847
+6542572
+7144670
+11945621
+8593950
+9606073
+7454040
+7950161
+8471423
+9382616
+17777507
+9290816
+11103834
+10537394
+10158197
+17211067
+12654075
+11816073
+18200023
+17719106
+12140857
+12299660
+14106831
+12472143
+16148645
+12952419
+13687242
+15094831
+15404201
+15925463
+16744856
+23009537
+17240977
+26306842
+20695591
+19828210
+20394650
+21641228
+21974270
+39754393
+23956930
+36543295
+24115733
+24440517
+24771803
+37045429
+25252079
+25424562
+29216999
+33515452
+41177542
+28782073
+30499032
+42169418
+54455962
+33985833
+37069187
+37936568
+44600013
+40523801
+40222860
+42035878
+59019699
+53988802
+57631185
+54206635
+48556250
+54034152
+50196365
+50023882
+50676641
+54469078
+58940014
+57999072
+104652327
+69305874
+59281105
+64484865
+71055020
+105132603
+82536581
+80746661
+78159428
+155328968
+82258738
+88779110
+104665443
+159121405
+98580132
+130814988
+98752615
+99232891
+100220247
+123424879
+100700523
+169617468
+112468150
+213328040
+117280177
+135539885
+217798623
+123765970
+142644293
+149214448
+163283242
+158906089
+160418166
+166938538
+171037848
+255112443
+138879426
+197332747
+197813023
+197985506
+231035235
+241046147
+388836471
+340655316
+213168673
+277698343
+282085618
+236234120
+252820062
+278184178
+266410263
+262645396
+272980418
+288093874
+364271285
+297785515
+299297592
+305817964
+550739270
+503150711
+336212173
+700483458
+395145770
+570179492
+411154179
+444203908
+449402793
+465988735
+822999554
+524327994
+637251703
+489054182
+498879516
+515465458
+551164596
+585879389
+535625814
+700963734
+587391466
+597083107
+785614966
+635509765
+893209430
+1004519640
+900208361
+959669366
+806299949
+1137043985
+1229818874
+1897729070
+893606701
+1059953808
+955042917
+987933698
+1013382176
+1014344974
+1024679996
+1034505330
+1121505203
+1336473499
+1621763103
+1810294962
+1601602747
+1497291468
+1953163238
+2428063052
+1441809714
+1959562557
+1706508310
+1699906650
+2922409066
+1819682125
+1881540399
+1907951675
+1848649618
+1906988877
+1942976615
+1968425093
+2001315874
+3927987650
+2048850304
+2734411980
+2156010533
+2618796671
+2778283213
+2939101182
+3043412461
+3148318024
+4436392650
+3141716364
+7069704014
+3555157928
+3406414960
+3519588775
+3817074711
+4098987148
+5821695674
+3730190017
+3755638495
+7572713206
+6878508041
+3911401708
+6548131324
+4779599087
+5353208651
+4204860837
+4774807204
+5095111715
+7317816668
+5919999577
+7578109014
+6191730485
+10966537689
+6958791075
+6661305139
+6926003735
+6961572888
+9299972552
+7249778792
+7485828512
+10459533032
+13150521560
+10396591322
+8979668041
+9558069488
+8116262545
+8686208912
+10128015855
+13461016116
+11130864572
+11286842200
+9869918919
+11015111292
+12111730062
+16465496553
+20419807191
+20573180780
+13920363963
+15077835433
+13587308874
+14211351680
+25537368465
+28059009292
+14735607304
+15602091057
+19973051112
+17674332033
+16802471457
+17095930586
+17986181464
+18244278400
+18556127831
+19997934774
+23126841354
+20885030211
+24605526223
+21981648981
+38975935022
+28577226615
+27507672837
+27798660554
+28131715643
+28322916178
+54053770455
+35340208986
+29813442737
+30337698361
+31831537890
+41979583755
+32404562514
+36230459864
+33898402043
+41113022818
+37980960797
+39441158042
+45108490335
+79093983615
+42866679192
+44011871565
+45490556434
+46587175204
+53813186871
+56084899452
+69435938996
+55306333391
+63138869540
+69238611029
+58660614539
+70385523311
+60151141098
+62742260875
+62169236251
+65729939933
+66302964557
+68635022378
+70128861907
+73339560085
+86603579252
+77422118839
+164025698091
+86878550757
+88357235626
+100400362075
+89502427999
+233461637087
+101893508595
+109119520262
+129587080094
+113966947930
+115457474489
+118811755637
+120829850790
+121402875414
+199715942001
+122320377349
+127899176184
+128472200808
+175422484819
+134937986935
+141974582463
+143468421992
+164300669596
+165779354465
+166924546838
+187278912832
+216465630851
+214367310005
+235369823344
+191395936594
+211013028857
+246710931821
+223086468192
+232778703567
+326333923529
+236860349903
+287182229879
+242232726204
+366640488839
+306275252059
+257258364284
+522740882910
+357835731997
+276912569398
+278406408927
+332703901303
+739206513761
+355696606190
+380146664470
+354203459670
+642878836069
+402408965451
+405763246599
+414482404786
+760244697448
+599419192406
+919791405467
+459946818095
+632609175588
+479093076107
+660478711729
+499491090488
+690539633300
+534170933682
+535664773211
+679321534849
+555318978325
+609616470701
+756612425121
+812577342609
+932123093709
+734350124140
+1140391361918
+1150486451395
+1851914499176
+1096302879899
+808172212050
+820245651385
+874429222881
+939039894202
+959437908583
+1632822993994
+1089489912007
+1394828835869
+978584166595
+2611407160589
+1033662024170
+1069835706893
+1695710340243
+1687006565490
+1164935449026
+1289669102465
+1343966594841
+1490962549261
+2524624573431
+1972701918372
+1542522336190
+1628417863435
+1682601434931
+1694674874266
+1897662124057
+1747212106252
+2717907775442
+1813469117083
+2103975343228
+2661185601526
+2012246190765
+2048419873488
+2103497731063
+2859610323292
+2729372364413
+2198597473196
+2234771155919
+3338088975953
+2454604551491
+2508902043867
+3091178701093
+3868591168272
+4466850742256
+3170940199625
+3237197210456
+3225123771121
+3311019298366
+3377276309197
+3441886980518
+3560681223335
+3759458297017
+6921455293747
+4048240273002
+5490306854006
+4060666064253
+4871856514057
+4689375707410
+5536686449149
+4927969837609
+4433368629115
+4707499517063
+5325949857012
+4963506595358
+10092395493372
+7502553044771
+7878439716688
+6396063970746
+6536143069487
+6408137410081
+7820124361270
+10727676815892
+7070477595383
+8249132823254
+8268180740398
+7621347287588
+11115636927144
+8481608902117
+8108906337255
+8494034693368
+8750041771663
+9122744336525
+9140868146178
+9361338466724
+9396875224473
+11103563487809
+9671006112421
+10289456452370
+11359570566104
+12804201380827
+14414582786175
+14890098664114
+12932207040233
+12944280479568
+13478615005464
+15179383932638
+14691824882971
+20226307824334
+16115381980956
+15730253624843
+16102956189705
+16590515239372
+17231650673780
+16602941030623
+26282816386291
+18502206612902
+24030966810292
+18537743370651
+18758213691197
+19067881336894
+19960462564791
+29535148070856
+21649027018474
+24163771946931
+27983585313465
+25876487519801
+27834379143682
+26410822045697
+26422895485032
+28170439888435
+41102646928668
+30422078507814
+32705897220328
+42141075670540
+31833209814548
+35733857286682
+37192113238571
+33834591704403
+35105147643525
+37039949983553
+37295957061848
+37605624707545
+37826095028091
+38718676255988
+39028343901685
+41609489583265
+45812798965405
+65266418875599
+50040259466732
+66702261569453
+52287309565498
+56004819032117
+52833717530729
+54593335373467
+58592518396249
+66155935794496
+62255288322362
+64539107034876
+65667801518951
+84666927345277 \ No newline at end of file
diff --git a/2020/09/puzzle-1.py b/2020/09/puzzle-1.py
new file mode 100755
index 0000000..f68fc21
--- /dev/null
+++ b/2020/09/puzzle-1.py
@@ -0,0 +1,28 @@
+#!/usr/bin/env python3
+from typing import List
+
+
+def is_valid(nums: List[int], lp: int, up: int) -> bool:
+ for i in range(lp, up):
+ x = nums[up] - nums[i]
+ if x in nums[lp:up] and x != nums[i]:
+ return True
+ return False
+
+
+def main() -> None:
+ with open("input", "r") as f:
+ nums = list(map(int, f.readlines()))
+
+ lp = 0
+ up = 25
+
+ while is_valid(nums, lp, up):
+ lp += 1
+ up += 1
+
+ print(nums[up])
+
+
+if __name__ == "__main__":
+ main()
diff --git a/2020/09/puzzle-2.py b/2020/09/puzzle-2.py
new file mode 100755
index 0000000..8833f50
--- /dev/null
+++ b/2020/09/puzzle-2.py
@@ -0,0 +1,25 @@
+#!/usr/bin/env python3
+import numpy as np
+
+
+def main() -> None:
+ goal = 138879426
+ with open("input", "r") as f:
+ nums = np.array(list(map(int, f.readlines())), dtype=int)
+
+ lp = 0
+ up = 1
+
+ while (x := sum(nums[lp : up + 1])) != goal:
+ if x > goal:
+ up -= 1
+ lp += 1
+ elif x < goal:
+ up += 1
+
+ sorted = np.sort(nums[lp : up + 1])
+ print(sorted[0] + sorted[-1])
+
+
+if __name__ == "__main__":
+ main()
diff --git a/2020/10/input b/2020/10/input
new file mode 100644
index 0000000..379b145
--- /dev/null
+++ b/2020/10/input
@@ -0,0 +1,108 @@
+147
+174
+118
+103
+67
+33
+96
+28
+43
+22
+16
+138
+75
+148
+35
+6
+10
+169
+129
+115
+21
+52
+58
+79
+46
+7
+139
+104
+91
+51
+172
+57
+49
+126
+95
+149
+125
+123
+112
+30
+78
+44
+37
+167
+157
+29
+173
+98
+36
+63
+111
+160
+18
+8
+9
+159
+179
+72
+110
+2
+53
+150
+17
+81
+97
+108
+102
+56
+135
+166
+168
+163
+1
+25
+3
+158
+101
+132
+144
+45
+140
+34
+156
+178
+105
+68
+153
+80
+82
+59
+50
+122
+69
+85
+109
+40
+124
+119
+94
+88
+13
+180
+177
+133
+66
+134
+60
+141
diff --git a/2020/10/puzzle-1.sh b/2020/10/puzzle-1.sh
new file mode 100755
index 0000000..f31af02
--- /dev/null
+++ b/2020/10/puzzle-1.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env sh
+
+sort -n input | awk '
+BEGIN { o = t = 1 }
+NR > 1 { if ($0 - prev == 1) o++; else if ($0 - prev == 3) t++; }
+ { prev = $0 }
+END { print o * t }'
diff --git a/2020/10/puzzle-2.py b/2020/10/puzzle-2.py
new file mode 100755
index 0000000..bdf7bbf
--- /dev/null
+++ b/2020/10/puzzle-2.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python3
+
+from typing import List
+
+adaptors: list[str]
+
+
+def combos(i: int, counts: dict[int, dict[int, int]] = {}) -> int:
+ if i == len(adaptors) - 1:
+ return 1
+ if i in counts:
+ return counts[i]
+
+ ans = 0
+ for j in range(i + 1, len(adaptors)):
+ if adaptors[j] - adaptors[i] <= 3:
+ ans += combos(j, counts)
+
+ counts[i] = ans
+ return ans
+
+
+def main() -> None:
+ global adaptors
+ with open("input", "r") as f:
+ adaptors = list(map(int, f.readlines()))
+
+ adaptors.append(0)
+ adaptors.sort()
+ adaptors.append(max(adaptors) + 3)
+
+ print(combos(0))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/2020/11/.gitignore b/2020/11/.gitignore
new file mode 100644
index 0000000..60d075d
--- /dev/null
+++ b/2020/11/.gitignore
@@ -0,0 +1 @@
+puzzle-[12]
diff --git a/2020/11/Makefile b/2020/11/Makefile
new file mode 100644
index 0000000..c32dafa
--- /dev/null
+++ b/2020/11/Makefile
@@ -0,0 +1,7 @@
+all:
+ ${CC} ${CFLAGS} -o puzzle-1 puzzles.c
+ ${CC} ${CFLAGS} -DPART2 -o puzzle-2 puzzles.c
+
+.PHONY: clean
+clean:
+ rm -f puzzle-[12]
diff --git a/2020/11/input b/2020/11/input
new file mode 100644
index 0000000..a586f62
--- /dev/null
+++ b/2020/11/input
@@ -0,0 +1,98 @@
+LLLLLL.LLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLLL.LLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LL
+LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.L.LLLLLL.LL.LLLLLL
+LLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLL.LLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLL..LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLLLL.LLLLL.LL.LLLLLLLLLLLLLL.LL.LLLLLLLLL
+LLLLLL.LLLLL..LLLLL.LLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.L.LLLLL.L
+LLLLLL.LLLLLL.LLL.L.LLLLLLL.LLLLL.LLLLL.LLLLLLLL.LLLL.LLLLLL..LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLL.LLL
+.LLLLLLLLLLLL.LLL.L.LLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLL.LLLLLL.L.L.LLLLLLLLLLLLL.L.LLLLLLLLL
+LLLLLL.LLLLLL.LLLLL.LLLLLLL..LLLLLLLLLL..LLLLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLL.LLLL..LLLLLLLL
+..........LL....L..LL..L.....L...L....L............L.LL...L.......L.L.LL...L.L...L....L.L....LLL..
+LLLLLL.LLLLLL.LLLLL.LLLLLLL.LLL.L.LLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LL..LLLLLLL.LLLLLLLLLL
+LLLLLLLLLLLLL.LLLLL.LLLLLLL.LLL.L.LLLLLLLLLLLLLL.LLLL.LLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLL.LLL
+.LLLLL..LL.LL..LLL.LLLLLLLL.LLLLL.LLLLL.LLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL
+L.LLLL.LLL.LLLLLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL.LLL.LLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLL
+LLLLLL.LLLLLLLLLLLLLLLLLLLL.L.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLL.L.LLLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLL.LLLLLLL.LLLLLL.L.LLLLLLLL.LLLLLLLL.LLLLLLLLL
+...LLLLL.......L.LL..L..LL...LL..L.....L...L...LLL.L.L.....L.L....L.L......LL..L.L.L..LL.L.....LL.
+LLLLLLLLLLL.L.LLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLLLLL.LLLLLL.L.LL.LLLLLLLLLLLLLLL
+LLLLLL.LLLLLL.LLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLLLLLLL.LLL.LLL.LLLLLLLL.LLLLLLLL..LLLLLLLLLLLLLL.LL
+LLLLLL.LLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.L.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLL..LL.L.LLLLLLL.LLLLLLL.LLLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLL.LLLLLLLLL
+LLLLLL.LLLLLL.LLLLL.LLLLLLL.LLLLLL.LLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLLL
+L.LLLL.LLLLLL.LLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLL.LLLL.LLLL.LL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL
+.LLLLL.LLLLLL.LLLLL.LLLLLLL.LLLLL.L.LLL.LLLLLLLL.LLL..LLLLLLL.LL.LLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL
+LLLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLL.L.LLLLLL.LLLLLLLLLLLLLLLLL.
+L.LL..LLL.L.........L.L....L...LL.L......L..LL.......L.....L.LL.....L..L.L.....L.....L.L...L.L....
+LLLLLL.LLLLLLLLLLLL.LLLLLLL.LLLLL..LLLL..LLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL
+LLL.L..LLLL.L.LLLLLLLLLLLLL.LLLLL.LLLLL.L.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL..LLLLLLLL
+LLLLLL.LLLLLL.LLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLL..LLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL
+LL.LLLLLLLLLLLLLLL..LLLLLLLLLLLL..LLLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLLL
+LLLLLL..LLLLLLLLLLLLLLLLL.L.LLLLLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL
+..L...L...L..L..LL...L..........L.....L......L....L.L..L.L.L..L.LL....L..L...L...L......L.....L..L
+LLLLLLLLLLLL..LLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL.LL.LLLLLLLLLLLLL.L.LLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLL.LLLL.L.LLLLL.LLLLLLLLLLLLLLLLL..LLLLLLL.LLLLLLLLL
+LLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLLLL.LLLLLLLLL
+LLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLLL.LLLLLLLL.LLLLL.LLLLLLLLLL.L
+LLLLLLLLLLLLL.L.LLL.LLLLLLL.LLLLL.LLLLL.LLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLL.LLLLLLLL.LLLLLLLLL
+LLLLLL.LLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLL..LLLLLLLLL
+LLL..L..LLLL.LLL.L......L...LL.L..L.L...L...LL....L.L.L.L................L....L..L...L......LLL.L.
+LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLL..LLLLL.LLLLLLLL.LLLL.LLLLLLL.LLLLLLLL..LLLLLLL.LLLLLLLLLLLLLLLLLL
+LLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL.LL.LLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLLLLL
+.LLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLL.LLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLL
+LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLL..LLLLLLLL.LLLLLLLL.LLLLLLLL.L.LLLLLLL
+LLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLL.LLLLL.LL.LLLLLLLLLLLLLLLLLL
+LLLLLL.LLLLLL.LLLLL.LLLL.LL.LLLLL.LLLLL.LLLLLLLL..LLL.LLLLL.L.LLLLLLLLLLLLLLLLL.LLL.LLLL.LLLLLLLLL
+LL.LLL.LLLLLL.LLLLL.LLLLLLLLLLLLL.LL.LLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLL.LLL.L.LL.LLLLLLLLLLL.LLLLLL
+LLLLLLLLLLLLL.LLLLL..LLLLLLLLLLLLLLLLLL.L.LLLLLL.LLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLL
+.LLLLL..L.L.L...L...L..LL.L.L.LL.L...L.L.L...................LL..L...L......L..L.........L.....LL.
+LLLL.LLLLLLLL.LLLLL.LLLLLLL.LLLLLL.LLLLLLLLLLLLL.LLLL.L.LLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLLL.LLLLLL.LLLLLL.L.LLLL.LLLLL.LLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLL.LL..LLLL.
+.LLLLL.LLLLLLLLLLLL.LLLL.LLLLLLLL.LLLLLLLLLLLLLL.L.LLLL.LLLLLLLLLLLLLL.LLLLLLL..LLLLLLLL.LLLLLLLLL
+LLLLLL.LLLLLL.LLLLL.LLLLLLL.LLLL...LLLLL.LLLLLLL.LLLL.LLLLLL..LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
+LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLL.LLLLLLLLL.LLLLLLL.LLLLLLLL..L.LLLLL.LLLLLLLL.LLLLLLLLL
+LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLL.LL.LLLLLLLLLLLLLL.
+LLL.LL.LLLLLL.LLLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL
+LLLLLL.LLLLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LL.LLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL
+LLLLLL.LLL..L.LLLLL.LLLLLLLLLLLLLLLLL.L.LLLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL
+L.LL.L.L...L.LL.L.LLL...L.......LLL.L.LL..LLLL.L.L...L..LL.L..LL..L.L..LLLL.L.L..L.L....L....L...L
+LLLLLL.LLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLL.LLLL.LLLLLLL.LLLLLLLLLLLLLLLLL.LLL.LLLL.L.LLLLLLL
+LLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLL.LL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL
+LLLLLL.L.LLLL.LLLLL.LLL.LLL.LLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLL..LLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLL.LLLLLLLL.LLLLL..LLLLLLLLLLLL.LL.LL.LLLLLLLLLLLLL.LLLLLLL.LLLLLLLL.L.LLLLLL.LLLLLLLLLLLLLLLLLL
+LLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLL..LLLLLLL.LL.LLLLLL
+LLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLL.LLLL..LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLL.LLLLL
+L.L..L................L..LL.....LL...L............L....LL..LL.LLL.L.............L..L...L.....LLL..
+LLLLLLLLLLLLLLLL.LL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLLL.LLLLL.LLLLLL.LLLLLLL.LLLLL.LLL.LLLLLLLLLL.LLLL.LLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLL.
+LLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLL.LL.LL.LLLLLLLL.LLLL.LLLLLLL.LL.LLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL
+LLLL.LL.LLLLL.LLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLL.LLLL.LLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLLL.LLLLL..LLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLL.LLL.LLLL.LLLLLL.L.LLLLLLLL.LLLLLLLLL
+L.L..L...LL.L.....LL..LL.L.....L.L..L....L..L.L...L.LLLL....L...LL......L..L....LL..L..L........LL
+LLLLLLLLLLLLLLLLLLL.LLLL.LL.LLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLL.LLLL.LLLLLLLL.LLLLL.LLL
+LLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLLLLLL.LL.LLLLLL.LLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL
+LLLLLL.LLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLL..LLLLLLL.L.LL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL..LLLLLLLLL
+LLLLLL.LLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLL.LLLL.LLLLLLLL.LLLLLLLLL
+LLLLLL.LLLLLLLLLLLLLLLLL.LL.LLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLLL.LLLL.L.LLLLLLLLLLLLL.LLLLLLLLL.L.LLLLLLLL.LLLL.LLLLLLL.LLLLLLLL.LLLLLLL..LLLLLLLL.LLLLLLLLL
+LLLLL..LLLL.L.LLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLL..LLLLLLLL.LLLLLLLLL
+L.LLLLLLLLLLLLLLLLL.LLLLLLL.LL.LL.LLLLL.LLLLLLLLLLLLL.LL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL
+LL.L......L......L...L..LLL.....L.L..L.L...L......L..L..L.....L...LL.L.LL.L.LLL....L.LLL....L..L..
+LLLLLLLLLL.LLLLLLLLLL.LL.LL.LLLLLLLLLLL.L..LLLLL.LLLL.LLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLLL.LLLLLL.LLLLL.LLLLLLL.LLLLL.LLLLL.LLLLL.LL..LLL.LLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLLL..LL.LL.LLLLL.LLLLLLL.L.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLL.LLL.LLLL.LLLLLLLLLLLLLLLL..LLLLLLLLL
+LLLLLLLLLLL.LLLLLLL.LLL.LLLLLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLLLLLLLL.L.LLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLL.L.LLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLLL.LLLLLL..LLLL.LLLLLLLLLLLLLLLL.LL.LLLL.LLL.LLLL.LLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.L.L.LLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLLL.LLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LL.LLLLLLLLL.LLLLLLL.LLLLLL
+L..L.LL......LLL....LLLL.......L.L..L..L....LLLLL..LLLLL..L..L.L.L........LLL...LL.L......LLL.....
+LLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLL..LLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LL.LLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLLL.LLLLLL.LLLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLL.LLLL.LLLLLLLL..LLLLLL.LLLLL.LLLL...LLLLL.L.LLLL.LLLLLLL..LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLL
+LLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLL.LLL
+LLLLLLLLLLLLL.LLLLL.L.LLLLL.LLLLLLLLLLL.LLLLLLLLLL.LL.LLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLL
+LLLLL.LLLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLL.LLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL
+LLLLLL.LLLLLL.LLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLL.LLLL.LLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLLL.LLLLLL.LLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL.L.LLLLLL.LLLLLLLLLLLLLLLLL.
+LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL \ No newline at end of file
diff --git a/2020/11/puzzles.c b/2020/11/puzzles.c
new file mode 100644
index 0000000..7c579b9
--- /dev/null
+++ b/2020/11/puzzles.c
@@ -0,0 +1,158 @@
+#include <err.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#define ROWCNT 98
+#define ROWLEN 98
+
+#ifdef PART2
+ #define IS_SEAT(a, b) \
+ if (rows[a][b] == '.') \
+ continue
+ #define IS_OCC(a, b) \
+ if (rows[a][b] == '#') \
+ adjecent++
+#endif
+
+bool changed;
+char rows[ROWCNT][ROWLEN + 1];
+char temp[ROWCNT][ROWLEN + 1];
+
+/* Check and update a seat at the given index */
+static void
+check_seat(int const i, int const j)
+{
+ if (rows[i][j] == '.')
+ return;
+
+ int adjecent = 0;
+
+#ifdef PART2
+ /* Up */
+ for (int h = i - 1; h >= 0; h--) {
+ IS_SEAT(h, j);
+ IS_OCC(h, j);
+ break;
+ }
+ /* Down */
+ for (int h = i + 1; h < ROWCNT; h++) {
+ IS_SEAT(h, j);
+ IS_OCC(h, j);
+ break;
+ }
+ /* Left */
+ for (int h = j - 1; h >= 0; h--) {
+ IS_SEAT(i, h);
+ IS_OCC(i, h);
+ break;
+ }
+ /* Right */
+ for (int h = j + 1; h < ROWLEN; h++) {
+ IS_SEAT(i, h);
+ IS_OCC(i, h);
+ break;
+ }
+ /* Up-Left */
+ for (int h = i - 1, k = j - 1; h >= 0 && k >= 0; h--, k--) {
+ IS_SEAT(h, k);
+ IS_OCC(h, k);
+ break;
+ }
+ /* Up-Right */
+ for (int h = i - 1, k = j + 1; h >= 0 && k < ROWLEN; h--, k++) {
+ IS_SEAT(h, k);
+ IS_OCC(h, k);
+ break;
+ }
+ /* Down-Left */
+ for (int h = i + 1, k = j - 1; h < ROWCNT && k >= 0; h++, k--) {
+ IS_SEAT(h, k);
+ IS_OCC(h, k);
+ break;
+ }
+ /* Down-Right */
+ for (int h = i + 1, k = j + 1; h < ROWCNT && k < ROWLEN; h++, k++) {
+ IS_SEAT(h, k);
+ IS_OCC(h, k);
+ break;
+ }
+#else
+ for (int h = i - 1; h <= i + 1; h++) {
+ if (h < 0 || h > ROWCNT - 1)
+ continue;
+ for (int k = j - 1; k <= j + 1; k++) {
+ if (k < 0 || k > ROWCNT - 1 || (h == i && k == j))
+ continue;
+ if (rows[h][k] == '#')
+ adjecent++;
+ }
+ }
+#endif
+ /* Edit seats as needed */
+ if (rows[i][j] == 'L' && adjecent == 0) {
+ temp[i][j] = '#';
+ changed = true;
+#ifdef PART2
+ } else if (rows[i][j] == '#' && adjecent >= 5) {
+#else
+ } else if (rows[i][j] == '#' && adjecent >= 4) {
+#endif
+ temp[i][j] = 'L';
+ changed = true;
+ } else
+ temp[i][j] = rows[i][j];
+}
+
+int
+main(void)
+{
+ /* Initialize the temp array to be all floor */
+ int i, j;
+ for (i = 0; i < ROWCNT; i++) {
+ for (j = 0; j < ROWLEN; j++)
+ temp[i][j] = '.';
+ }
+
+ FILE *fp;
+ if (!(fp = fopen("input", "r")))
+ err(EXIT_FAILURE, "fopen");
+
+ /* Read in seats */
+ i = j = 0;
+ char c;
+ while ((c = fgetc(fp)) != EOF) {
+ if (c == '\n') {
+ i = 0;
+ j++;
+ } else
+ rows[j][i++] = c;
+ }
+ fclose(fp);
+
+ /* Update the seats until they don't change anymore */
+ do {
+ changed = false;
+ for (i = 0; i < ROWCNT; i++) {
+ for (j = 0; j < ROWLEN; j++)
+ check_seat(i, j);
+ }
+
+ for (i = 0; i < ROWCNT; i++) {
+ for (j = 0; j < ROWLEN; j++)
+ rows[i][j] = temp[i][j];
+ }
+ } while (changed);
+
+ /* Calculate filled seats */
+ int count = 0;
+ for (i = 0; i < ROWCNT; i++) {
+ for (j = 0; j < ROWLEN; j++) {
+ if (rows[i][j] == '#')
+ count++;
+ }
+ }
+
+ printf("%d\n", count);
+ return EXIT_SUCCESS;
+}
diff --git a/2020/12/.gitignore b/2020/12/.gitignore
new file mode 100644
index 0000000..60d075d
--- /dev/null
+++ b/2020/12/.gitignore
@@ -0,0 +1 @@
+puzzle-[12]
diff --git a/2020/12/Makefile b/2020/12/Makefile
new file mode 100644
index 0000000..cf466dc
--- /dev/null
+++ b/2020/12/Makefile
@@ -0,0 +1,7 @@
+all:
+ ${CC} ${CFLAGS} -o puzzle-1 puzzle-1.c
+ ${CC} ${CFLAGS} -o puzzle-2 puzzle-2.c
+
+.PHONY: clean
+clean:
+ rm -f puzzle-[12]
diff --git a/2020/12/input b/2020/12/input
new file mode 100644
index 0000000..5e5e7be
--- /dev/null
+++ b/2020/12/input
@@ -0,0 +1,778 @@
+R90
+N2
+N2
+F94
+R90
+E3
+F2
+L90
+L90
+F66
+S5
+L90
+W3
+R90
+N3
+W2
+N2
+W1
+R90
+E3
+F100
+S4
+F66
+R180
+F96
+R90
+N2
+R90
+E2
+S3
+E1
+F65
+W4
+F6
+L180
+W2
+L90
+F95
+L90
+F97
+E2
+F36
+E2
+R90
+E4
+F98
+N4
+F70
+S1
+R270
+E1
+F13
+R90
+W1
+L90
+F82
+S2
+R90
+N2
+F80
+N1
+R90
+F26
+W4
+F23
+S5
+F72
+N5
+W2
+N5
+F47
+L270
+F18
+W1
+L90
+F91
+R90
+W5
+N2
+F60
+E5
+S3
+R90
+R180
+S3
+L90
+W4
+F80
+S2
+L90
+F31
+W1
+L90
+F45
+S3
+F64
+N1
+W4
+N2
+R180
+W3
+R90
+S1
+F7
+W1
+R180
+W1
+S4
+E4
+W4
+F87
+R90
+N5
+F65
+W4
+F15
+E5
+N5
+L90
+F36
+E1
+F70
+E1
+L180
+F42
+L90
+F9
+L90
+E4
+F2
+F35
+N4
+E4
+N2
+L90
+N4
+R90
+F100
+S3
+F13
+E1
+S4
+F66
+L90
+F75
+E5
+R180
+E2
+L90
+W4
+F89
+S5
+R90
+E4
+F5
+R270
+E3
+S5
+R90
+F65
+S5
+R180
+S3
+W4
+F68
+W1
+F62
+W1
+F99
+F96
+R90
+E1
+R90
+L180
+F96
+W4
+N2
+W2
+R90
+F32
+N1
+E1
+L90
+E1
+S3
+F6
+S4
+E1
+N2
+W5
+S5
+E4
+F3
+F58
+N1
+F96
+E5
+F31
+R90
+F74
+R180
+N2
+W1
+F65
+L90
+F45
+F73
+R90
+S1
+R270
+N5
+L90
+W1
+N3
+L90
+F36
+R90
+N4
+L180
+W4
+N5
+R180
+N1
+R90
+N1
+R270
+F80
+R90
+S5
+E3
+F49
+W5
+F27
+E1
+N2
+W4
+S3
+L90
+F100
+N1
+F28
+E2
+F88
+S1
+R90
+F14
+S4
+L180
+F93
+E1
+L90
+F64
+L90
+L90
+F84
+E4
+F69
+W1
+R90
+E5
+N2
+W1
+N3
+F10
+S2
+F64
+F10
+R180
+W3
+N1
+F82
+S2
+W1
+R90
+W1
+L90
+W2
+N3
+F95
+E4
+N3
+N2
+E3
+E1
+N1
+W5
+R90
+W3
+S3
+E3
+L90
+W3
+N5
+F61
+S3
+F50
+F71
+E1
+E1
+F63
+L90
+W5
+S1
+R90
+F29
+L90
+S1
+R90
+S1
+L90
+W4
+N4
+R270
+S1
+F87
+R90
+F82
+W1
+L90
+S4
+L90
+W2
+N4
+R90
+F61
+R90
+N5
+F38
+W3
+L90
+F56
+N1
+R90
+W1
+S2
+F97
+S5
+R90
+E1
+F97
+R270
+N2
+L180
+F14
+E1
+R90
+F70
+L180
+S4
+E3
+L90
+N3
+F87
+E3
+N3
+R90
+F59
+F18
+W5
+F71
+E3
+S5
+W3
+R180
+F71
+S3
+W5
+F47
+N5
+L90
+F79
+N3
+F40
+W5
+S2
+F59
+W3
+F2
+W1
+F63
+R90
+S4
+L90
+S1
+E5
+F33
+L180
+F83
+E5
+S3
+W1
+F66
+R270
+N4
+F29
+W5
+F83
+W1
+R90
+N5
+W3
+F58
+S4
+R90
+F36
+S1
+F67
+W1
+S4
+F56
+E2
+F88
+N4
+L90
+F71
+W3
+F88
+R180
+F50
+R90
+E4
+R90
+S1
+W2
+L90
+N1
+R90
+E5
+N1
+F39
+L180
+E5
+R90
+W4
+L180
+W3
+R90
+W3
+L90
+S5
+W5
+S2
+L90
+N3
+W5
+R180
+F74
+E1
+N1
+N4
+R90
+N2
+W4
+F34
+L90
+E4
+L90
+S4
+L90
+W3
+F83
+N1
+L90
+F58
+W5
+F38
+L180
+N1
+L90
+S4
+F45
+E4
+S3
+L90
+E1
+S2
+F30
+E2
+L90
+F84
+W4
+F53
+R90
+S5
+F31
+L180
+N1
+L90
+E2
+L180
+W3
+F98
+R270
+S2
+E5
+F84
+S4
+L90
+F26
+E2
+F66
+L270
+E1
+L180
+F11
+E5
+L90
+W1
+F11
+E3
+F70
+E5
+N3
+F78
+W5
+L270
+W5
+N1
+L90
+S4
+F8
+L90
+F95
+L90
+F99
+S3
+F61
+N2
+F84
+S5
+F3
+E5
+R90
+F33
+W5
+S1
+L90
+F52
+E4
+L90
+E1
+N1
+L270
+S3
+W4
+R180
+F89
+R270
+F10
+R90
+N1
+R180
+W5
+N2
+F78
+S5
+F25
+S4
+F25
+N3
+F29
+W1
+F24
+S4
+L90
+S5
+F17
+L90
+S4
+E2
+N3
+F38
+S4
+L90
+F1
+L90
+E2
+F92
+L90
+E4
+S1
+E1
+F28
+N1
+F46
+R90
+N1
+W4
+N3
+E3
+F90
+N5
+L180
+S1
+E3
+F96
+L90
+E1
+R90
+N5
+E1
+F74
+L180
+N2
+L90
+N1
+E4
+R90
+E1
+S2
+F91
+R90
+N5
+E4
+F9
+N2
+E1
+F13
+E2
+S4
+W1
+R90
+S1
+R90
+F18
+L90
+F12
+S2
+F65
+N2
+E3
+F65
+E1
+L180
+E2
+S4
+W4
+F89
+N4
+E5
+L180
+N4
+W1
+F22
+L90
+W2
+S2
+F6
+E4
+F74
+N2
+E2
+S1
+R90
+F87
+W5
+R90
+W4
+R90
+E4
+L90
+N3
+F68
+L180
+N1
+W1
+F81
+R90
+F95
+R90
+R180
+E5
+F51
+F23
+F74
+N3
+F16
+F64
+L90
+W4
+R90
+R90
+W4
+F97
+R180
+N3
+F79
+E3
+L90
+N2
+F14
+S4
+F41
+W2
+L90
+F54
+N3
+E4
+R90
+W2
+R90
+S4
+L90
+L90
+S4
+R90
+E4
+S3
+L90
+F5
+R90
+L90
+W2
+R90
+W3
+N4
+E5
+F14
+E5
+S4
+F96
+S4
+L90
+W2
+F96
+L90
+E3
+L90
+F4
+R90
+F61
+E2
+F56
+E1
+F100
+E5
+R90
+F54
+R90
+E4
+F2
+R180
+S3
+F8
+L90
+W1
+R90
+F19
+W5
+L90
+S1
+L90
+W5
+S2
+F30
+R90
+W5
+F31
+S5
+E1
+N2
+F100
+N1
+F3
+W3
+F46
+R90
+E2
+F62
+L180
+F90
+L180
+S3
+L90
+S5
+F40
+N4
+F95 \ No newline at end of file
diff --git a/2020/12/puzzle-1.c b/2020/12/puzzle-1.c
new file mode 100644
index 0000000..1a4c7ab
--- /dev/null
+++ b/2020/12/puzzle-1.c
@@ -0,0 +1,73 @@
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int
+main(void)
+{
+ FILE *fp;
+ char cl[5];
+ int north, east;
+ int direction = 0;
+
+ if (!(fp = fopen("input", "r")))
+ err(EXIT_FAILURE, "fopen");
+
+ north = east = 0;
+ while (fgets(cl, sizeof(cl), fp) != NULL) {
+ switch (cl[0]) {
+ case 'N':
+ north += atoi(&cl[1]);
+ break;
+ case 'E':
+ east += atoi(&cl[1]);
+ break;
+ case 'S':
+ north -= atoi(&cl[1]);
+ break;
+ case 'W':
+ east -= atoi(&cl[1]);
+ break;
+ case 'L':
+ direction -= atoi(&cl[1]);
+ goto wrap;
+ case 'R':
+ direction += atoi(&cl[1]);
+
+wrap:
+ /* 0 <= direction < 360 */
+ if (direction >= 360)
+ direction -= 360;
+ else if (direction < 0)
+ direction += 360;
+ break;
+ case 'F':
+ switch (direction) {
+ case 0:
+ east += atoi(&cl[1]);
+ break;
+ case 90:
+ north -= atoi(&cl[1]);
+ break;
+ case 180:
+ east -= atoi(&cl[1]);
+ break;
+ case 270:
+ north += atoi(&cl[1]);
+ break;
+ }
+ break;
+ }
+ }
+ fclose(fp);
+
+ /* Absolute value */
+ if (north < 0)
+ north = -north;
+ if (east < 0)
+ east = -east;
+
+ printf("%d\n", north + east);
+ return EXIT_SUCCESS;
+}
diff --git a/2020/12/puzzle-2.c b/2020/12/puzzle-2.c
new file mode 100644
index 0000000..8ac34b4
--- /dev/null
+++ b/2020/12/puzzle-2.c
@@ -0,0 +1,79 @@
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+struct coords {
+ int north;
+ int east;
+};
+
+int
+main(void)
+{
+ FILE *fp;
+ char cl[6];
+ struct coords waypoint = {1, 10};
+ struct coords ship = {0, 0};
+
+ if (!(fp = fopen("input", "r")))
+ err(EXIT_FAILURE, "fopen");
+
+ while (fgets(cl, sizeof(cl), fp) != NULL) {
+ switch (cl[0]) {
+ case 'N':
+ waypoint.north += atoi(&cl[1]);
+ break;
+ case 'E':
+ waypoint.east += atoi(&cl[1]);
+ break;
+ case 'S':
+ waypoint.north -= atoi(&cl[1]);
+ break;
+ case 'W':
+ waypoint.east -= atoi(&cl[1]);
+ break;
+ case 'F':;
+ unsigned int const val = atoi(&cl[1]);
+ ship.north += val * waypoint.north;
+ ship.east += val * waypoint.east;
+ break;
+ /* Left and right */
+ default:;
+ int direction = atoi(&cl[1]);
+
+ /* (x, y) -> (-x, -y) */
+ if (direction == 180) {
+ waypoint.north = -waypoint.north;
+ waypoint.east = -waypoint.east;
+ break;
+ }
+
+ /* 0 <= direction < 360 */
+ if (cl[0] == 'R')
+ direction = -direction + 360;
+
+ int const temp = waypoint.east;
+ if (direction == 90) {
+ /* (x, y) -> (-y, x) */
+ waypoint.east = -waypoint.north;
+ waypoint.north = temp;
+ } else {
+ /* (x, y) -> (y, -x) */
+ waypoint.east = waypoint.north;
+ waypoint.north = -temp;
+ }
+ break;
+ }
+ }
+ fclose(fp);
+
+ /* Absolute value */
+ if (ship.north < 0)
+ ship.north = -ship.north;
+ if (ship.east < 0)
+ ship.east = -ship.east;
+
+ printf("%d\n", ship.north + ship.east);
+ return EXIT_SUCCESS;
+}
diff --git a/2020/13/input b/2020/13/input
new file mode 100644
index 0000000..59d4d66
--- /dev/null
+++ b/2020/13/input
@@ -0,0 +1,2 @@
+1006401
+17,x,x,x,x,x,x,x,x,x,x,37,x,x,x,x,x,449,x,x,x,x,x,x,x,23,x,x,x,x,13,x,x,x,x,x,19,x,x,x,x,x,x,x,x,x,x,x,607,x,x,x,x,x,x,x,x,x,41,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,29 \ No newline at end of file
diff --git a/2020/13/puzzle-1.py b/2020/13/puzzle-1.py
new file mode 100755
index 0000000..7b21f96
--- /dev/null
+++ b/2020/13/puzzle-1.py
@@ -0,0 +1,26 @@
+#!/usr/bin/env python3
+
+
+def main() -> None:
+ with open("input", "r") as f:
+ time = int(f.readline())
+ ids = list(map(int, f.readline().replace(",x", "").split(",")))
+
+ ids.sort()
+
+ min = -1
+ x = 0
+ for bus in ids:
+ res = (time + ids[0]) % bus
+ if min < res < ids[0]:
+ min = res
+ x = bus
+
+ for i in range(time, time + ids[0]):
+ if i % x == 0:
+ print((i - time) * x)
+ break
+
+
+if __name__ == "__main__":
+ main()
diff --git a/2020/13/puzzle-2.py b/2020/13/puzzle-2.py
new file mode 100755
index 0000000..3965488
--- /dev/null
+++ b/2020/13/puzzle-2.py
@@ -0,0 +1,40 @@
+#!/usr/bin/env python3
+
+from functools import reduce
+
+
+def chinese_remainder(n: tuple[int, ...], a: tuple[int, ...]) -> int:
+ sum = 0
+ prod = reduce(lambda a, b: a * b, n)
+ for n_i, a_i in zip(n, a):
+ p = prod // n_i
+ sum += a_i * mul_inv(p, n_i) * p
+ return sum % prod
+
+
+def mul_inv(a: int, b: int) -> int:
+ b0 = b
+ x0, x1 = 0, 1
+ if b == 1:
+ return 1
+ while a > 1:
+ q = a // b
+ a, b = b, a % b
+ x0, x1 = x1 - q * x0, x0
+ if x1 < 0:
+ x1 += b0
+ return x1
+
+
+def main() -> None:
+ with open("input", "r") as f:
+ ids = tuple(map(lambda x: int(x) if x.isdigit() else x, f.readlines()[1].split(",")))
+
+ buses = tuple(filter(lambda x: x != "x", ids))
+ modres = tuple(x if (x := bus - ids.index(bus)) != bus else 0 for bus in buses)
+
+ print(chinese_remainder(buses, modres))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/2020/14/input b/2020/14/input
new file mode 100644
index 0000000..11570c1
--- /dev/null
+++ b/2020/14/input
@@ -0,0 +1,578 @@
+mask = 00X10101X110010011XX0X011X100000X010
+mem[13197] = 47579321
+mem[37394] = 374943
+mem[48509] = 418284
+mem[29793] = 191792725
+mask = 00100X001010010111XX010X10X01100001X
+mem[378] = 9637
+mem[41083] = 1858241
+mem[36394] = 762
+mem[40101] = 15295
+mem[50670] = 9179863
+mem[30384] = 164245
+mem[11676] = 393669095
+mask = 0XX000X1111001010X10XX1101XX00X00100
+mem[17956] = 854
+mem[57595] = 179871
+mem[50596] = 207644327
+mask = X100XX0111X0X1X01101X0X0110010101011
+mem[26867] = 1012
+mem[3061] = 514891024
+mem[35973] = 512
+mask = 01X000111110010X1110X00110000X00000X
+mem[3707] = 123619
+mem[37107] = 7325808
+mem[31906] = 102168
+mask = XX00XX0101100X011100000XX00100000X00
+mem[38336] = 2917310
+mem[7166] = 313228
+mem[41771] = 2741721
+mem[52154] = 89454
+mask = 11001111X110X0XX10XX11101111000X0111
+mem[35611] = 58725
+mem[40227] = 8442431
+mem[10029] = 7334
+mem[13345] = 87327004
+mask = 0XX0X0001010011011010XX0X110XX01X001
+mem[4868] = 493430
+mem[40452] = 18191
+mem[4567] = 330532
+mem[13580] = 1662243
+mask = 001X00011000X1X0X1X0110X110111001011
+mem[2096] = 25174
+mem[15283] = 994663544
+mem[16002] = 1359
+mem[4240] = 704816
+mask = 01000011101001001010110X10011X11XX01
+mem[16210] = 279177
+mem[8996] = 6470256
+mem[31049] = 1371071
+mem[20425] = 9683526
+mem[24986] = 142094045
+mask = 0X001X01X1X0110X10XX0X01X00101111010
+mem[61471] = 23661
+mem[57520] = 246980
+mem[57446] = 4169790
+mask = 001000X11110010111X000X00X0011X01001
+mem[25460] = 1461
+mem[528] = 48572826
+mem[61442] = 1487
+mem[60708] = 1804
+mem[51588] = 36111
+mask = 0X000001111001010X1011100100001X0X0X
+mem[45713] = 3807909
+mem[26867] = 6236
+mem[39186] = 3023142
+mem[46212] = 5671589
+mem[28686] = 10375260
+mask = 00X0000XXX10X1011100X100001X0X100010
+mem[7272] = 1073
+mem[35482] = 1877478
+mask = 01X00XX11110X11X110X1000010XXX101110
+mem[28892] = 2154970
+mem[33403] = 34104
+mem[56124] = 11230
+mem[11265] = 484054168
+mem[36422] = 1080979
+mask = 00000001X11001X1110001X01000101XXXX0
+mem[8445] = 2387
+mem[55775] = 8215
+mask = 110001101110110X10010X00XX1X01010100
+mem[49202] = 4152007
+mem[49938] = 4676666
+mem[58184] = 43886544
+mem[35840] = 8484248
+mem[25642] = 1980350
+mem[37918] = 1692542
+mem[44918] = 43860354
+mask = 0X000X011110010X1100X10X100X1X111100
+mem[24669] = 15051033
+mem[43432] = 1054
+mem[64706] = 21834
+mem[27336] = 773822
+mem[24406] = 420
+mask = 00XX01111X1001001X0001101001111101XX
+mem[48221] = 256859
+mem[1361] = 145480785
+mem[8221] = 32962081
+mem[11649] = 327597066
+mem[6355] = 3866
+mem[33696] = 951794
+mask = X10XX0010110011010111100X010X000000X
+mem[51014] = 577
+mem[38304] = 7416
+mem[34256] = 3748
+mem[12926] = 306
+mem[39297] = 1823498
+mask = 0000X00XXX10011XX000000X10X010100001
+mem[18788] = 7298
+mem[39644] = 7675
+mem[33093] = 416832
+mem[5195] = 6722351
+mem[28000] = 53707945
+mem[5336] = 77314873
+mem[992] = 134079888
+mask = 0000X101110X010011X0000000X011X1X101
+mem[8536] = 401336
+mem[1632] = 1267
+mem[6456] = 581
+mem[31682] = 20542
+mem[27729] = 726
+mem[49447] = 37811
+mask = 0X0X00111XX001XX111X1011010X100X0111
+mem[38677] = 9808
+mem[54045] = 28545
+mem[30384] = 49811
+mem[62515] = 19422
+mem[14508] = 49363
+mask = X100X1X1011X1111011X01101000X11XX101
+mem[59468] = 387
+mem[37138] = 121701873
+mem[18728] = 2624430
+mem[28293] = 5039090
+mem[32321] = 839768
+mem[28535] = 647
+mask = XX100X0010100XX1110X11000110X100X00X
+mem[2147] = 1562
+mem[25832] = 275992750
+mask = 110XX0X10110X11X10X1110X10100X000000
+mem[22152] = 470276298
+mem[60732] = 716
+mem[52727] = 1427169
+mem[16196] = 9596060
+mem[3910] = 28432777
+mask = 01X0001111100X101110110X011XXX01X011
+mem[8221] = 60956
+mem[1223] = 293
+mem[24130] = 777493
+mem[62002] = 3900
+mem[20316] = 26105612
+mem[58295] = 528344031
+mem[12465] = 1159
+mask = 11000X011110010010011100100XX111100X
+mem[59580] = 3601634
+mem[31173] = 325319
+mem[28284] = 2285676
+mem[57595] = 8662764
+mem[32672] = 4111107
+mask = 01000001X1100101XX0X01101X1X00011X0X
+mem[33093] = 4612
+mem[61749] = 5692
+mem[28188] = 26420039
+mem[59026] = 1325
+mem[37032] = 149
+mask = 01000X11111001X11110011X111X01100X01
+mem[23793] = 131971
+mem[10420] = 848652
+mem[10469] = 33394600
+mem[23001] = 1875
+mask = 01001111011X1X1XXX1X001XX11100011X10
+mem[38294] = 371641
+mem[17261] = 72227824
+mem[41143] = 213405737
+mem[54246] = 1445548
+mem[41901] = 1849824
+mask = 0X00110X01101100XX101011001110XX1101
+mem[42925] = 176752065
+mem[17255] = 12010392
+mem[37437] = 64942
+mem[57253] = 827582
+mask = 11X10X101111XX0010X10101100100010110
+mem[14344] = 6638562
+mem[40266] = 89477554
+mem[9511] = 1133
+mem[53072] = 748643130
+mem[4567] = 372
+mem[26565] = 4739
+mask = 00010XX1X11X010X11X000100111001X1110
+mem[4247] = 17837
+mem[18674] = 2031700
+mem[47487] = 89684677
+mask = 110X1X11011X101110111101XX01001100X0
+mem[22046] = 3445
+mem[55657] = 29187
+mem[38510] = 159862
+mask = 0100000X11X00100110X01101X0011001100
+mem[12772] = 3394234
+mem[30255] = 47301946
+mem[55181] = 11825301
+mem[2096] = 239
+mem[6355] = 66264
+mem[62103] = 62751352
+mask = X100010XXX10X1001110001001X10X100X0X
+mem[18880] = 12756
+mem[52727] = 58449492
+mem[52620] = 106260805
+mask = 01000X011110010XX110X11001100X000XXX
+mem[5734] = 3770
+mem[46419] = 12806425
+mem[26866] = 6566928
+mask = X1001XX101101X1X10111X0X1111001101X0
+mem[54847] = 8045
+mem[61036] = 1672
+mem[32929] = 87423486
+mem[48539] = 13896
+mem[14353] = 7009065
+mem[16446] = 32987614
+mask = 00100000X111110X1110X101100000100X00
+mem[23863] = 4070
+mem[52234] = 498973
+mem[20235] = 1706949
+mask = 00X000011110X100110X11100X0X10X01010
+mem[44286] = 26378
+mem[30741] = 14368000
+mem[7396] = 88194752
+mask = 0X001X01X11011X0101X1010XX01X01000X0
+mem[6834] = 2670580
+mem[15903] = 6945101
+mem[10104] = 2517
+mem[65020] = 61602027
+mem[55142] = 1143278
+mem[38596] = 1333
+mem[17509] = 153504934
+mask = 00XX0X01111XX10111X00X10X0111011110X
+mem[568] = 1625
+mem[30255] = 248279
+mem[11912] = 538
+mem[12028] = 520033
+mask = 0010XX011X00X10011X001XX1100X1000001
+mem[15654] = 120
+mem[4292] = 57554
+mem[2096] = 346664
+mem[1248] = 10995
+mem[48539] = 656539
+mem[19181] = 147211
+mask = 1010010X110001001100X1X00X0011010X01
+mem[11344] = 4845730
+mem[60639] = 25030928
+mem[1005] = 12960528
+mem[47688] = 107547855
+mem[17509] = 728745
+mask = X00000011X10X10X11000101101000000100
+mem[46621] = 1608
+mem[5562] = 15064109
+mem[28385] = 1651
+mem[5734] = 288099689
+mem[49319] = 97558812
+mem[37739] = 1161
+mem[52727] = 1992490
+mask = 0001010XX110010X110000X01X10X011XX1X
+mem[37366] = 735085354
+mem[1739] = 409
+mem[12604] = 754989
+mask = 00000X011110010011000X001X0100XX0000
+mem[29851] = 8508
+mem[44133] = 1998890
+mem[24804] = 6068
+mem[59260] = 1198469
+mem[59580] = 10413954
+mask = 00110111X01X010010X00000X10X00110110
+mem[55579] = 418284890
+mem[7573] = 1800
+mem[26096] = 1469134
+mem[44133] = 25531796
+mem[39628] = 7076590
+mask = 0000000111X0010111X001011XX0000X1X00
+mem[24778] = 24875864
+mem[10420] = 3072761
+mem[2096] = 2762
+mem[30148] = 6696
+mem[17770] = 13204967
+mask = 0011010101X00X0X1100X000110011100101
+mem[57742] = 21044093
+mem[33266] = 56667
+mem[61442] = 1636
+mem[51870] = 1018197644
+mem[40469] = 77760
+mask = X0X001XX11000X0011X00100010011X00X01
+mem[11504] = 438885
+mem[53777] = 6130
+mem[17770] = 808014
+mask = 000X001111100101XX100010X010X1100100
+mem[35611] = 1215
+mem[10397] = 301
+mem[10866] = 8375216
+mem[2499] = 10472
+mem[63504] = 270966
+mem[7719] = 2064
+mem[41088] = 343764913
+mask = 010X1X00X1X0X1101X0X00111101001X0101
+mem[20597] = 773
+mem[14657] = 294987038
+mask = 00XX0001X110010111100000X01010100111
+mem[43170] = 365
+mem[55657] = 4882105
+mem[44170] = 628956
+mem[10429] = 947957
+mem[272] = 36059
+mask = 0X000011X0X0010X1X1011110100101XXXX1
+mem[3910] = 2312
+mem[47735] = 89421
+mem[2197] = 32972549
+mem[49938] = 7005
+mask = 00000100X100X100111X0101011X11010101
+mem[54400] = 830
+mem[43977] = 2412350
+mem[18229] = 19157634
+mem[19181] = 879884567
+mask = 000101X11X100100X100011X000100110001
+mem[37237] = 104037633
+mem[29167] = 1094
+mem[6308] = 6007
+mem[21610] = 80462437
+mem[2261] = 345450311
+mask = 0X0000X1111001011110X01X1XX01010X0XX
+mem[10892] = 85035
+mem[38510] = 42597708
+mem[30752] = 2960
+mem[30416] = 123661909
+mem[49045] = 913
+mem[4292] = 75
+mem[17509] = 1382
+mask = 1X00X00111X001X0100101001X110X0001X0
+mem[56241] = 8276
+mem[40782] = 243373
+mem[42397] = 43237586
+mem[13015] = 399
+mem[23129] = 735838
+mem[1385] = 4448
+mask = 0000X011000XX100X110111101X110X010X1
+mem[13015] = 247
+mem[42378] = 546670
+mem[8214] = 63809
+mem[22410] = 155149
+mem[55264] = 454543598
+mem[28778] = 69088880
+mem[48061] = 12489909
+mask = 0XX0X000XX1001X01101001000000100X1X1
+mem[7551] = 11717790
+mem[6107] = 50467
+mem[30752] = 4249755
+mem[17228] = 33884
+mem[59957] = 32163540
+mask = 1X0X0X10111X01001X0101011X0X0X0101X0
+mem[45349] = 1879078
+mem[31733] = 88189
+mem[12577] = 546676501
+mem[53419] = 16199
+mem[59921] = 2546
+mask = 0010001X110001X1X110100101X111000000
+mem[19998] = 179736
+mem[22061] = 30001652
+mem[41371] = 16212851
+mem[64355] = 622251640
+mem[23129] = 98852
+mem[56429] = 266
+mask = 00000X0X11X00XX1100001X0100010X0X100
+mem[37241] = 450
+mem[64833] = 219911344
+mem[16713] = 626602448
+mask = X1X01011X11010111011XX000001X01XX100
+mem[47336] = 15388
+mem[56124] = 582872
+mem[28686] = 27406190
+mem[34623] = 13146
+mem[30384] = 229541309
+mask = X00X011X11100100110X00110001XXX00000
+mem[18660] = 3353
+mem[30741] = 10036798
+mem[47487] = 4090
+mask = 00X0000X11100X011X0001101001X10X10X0
+mem[52567] = 730515
+mem[16156] = 10615261
+mem[29580] = 957414770
+mem[26765] = 19
+mem[24655] = 510031974
+mem[24669] = 30
+mem[46781] = 5769
+mask = 0X0010011110111010X000X0X11X101001X0
+mem[63285] = 8050
+mem[46893] = 981797
+mem[46022] = 984778
+mem[31931] = 67780
+mem[23543] = 3153
+mask = 1100X001X11001X01001X100111X01X0X100
+mem[53172] = 13616323
+mem[31500] = 117639
+mem[59037] = 106552607
+mem[54562] = 3408946
+mem[57159] = 411910
+mem[2824] = 61677145
+mem[47313] = 520051559
+mask = X100010111100100XX0XX110100001010101
+mem[37739] = 3912032
+mem[12772] = 884026
+mem[2217] = 4238
+mem[57159] = 28391
+mem[17146] = 3998
+mask = 00000001111001X11X000110101X1X11X100
+mem[11649] = 516652
+mem[21190] = 526
+mem[6364] = 274816
+mem[25567] = 190071
+mask = XXX00000X111010111001001111000X00000
+mem[25786] = 934
+mem[22026] = 215203
+mask = 0010000110X0110X11X001001101110X0011
+mem[59392] = 400
+mem[59580] = 927
+mem[15208] = 18515970
+mem[59444] = 245687
+mem[36248] = 893
+mem[59134] = 20240
+mask = 0X0XX1X11110X1011010000110000010000X
+mem[11344] = 223586488
+mem[41434] = 519191086
+mem[15028] = 1492592
+mem[25631] = 247281
+mask = 11X0XX1011101000X0011X00X101X1111000
+mem[21825] = 1675
+mem[2371] = 663473
+mem[37724] = 4339
+mem[54246] = 855
+mem[9392] = 56579
+mem[35552] = 14454
+mask = 0100010111100100111X110X00X01000X1X0
+mem[44516] = 482691
+mem[26528] = 1559
+mem[53886] = 89643332
+mem[3478] = 12699372
+mask = 0011010111X00100XXX0XX1X10XX10100001
+mem[27239] = 413074512
+mem[15589] = 3001
+mem[10011] = 1136
+mem[59026] = 852921
+mem[5283] = 213015528
+mask = 00X0000XX11XX10111X0000001X000101000
+mem[17298] = 4088539
+mem[54369] = 505389469
+mem[8221] = 132829
+mem[55115] = 5055
+mem[56330] = 1932140
+mask = 01X00001111001010110111001X00010X0XX
+mem[37467] = 127273625
+mem[38432] = 3166735
+mem[52727] = 998
+mem[42925] = 1733202
+mask = 11010011011011X01X01010XX10110110000
+mem[26085] = 233531
+mem[57079] = 1526
+mem[53172] = 385838419
+mem[29614] = 254712697
+mem[25466] = 735
+mem[27081] = 7719
+mask = 01000000111X0XXX1101X11X001101X01100
+mem[55941] = 72432190
+mem[16199] = 10097889
+mem[45349] = 10650
+mem[62515] = 8214
+mem[59468] = 965897
+mem[16653] = 386447843
+mem[49447] = 413274
+mask = 01000X011110X1XX1XX10X001111000X1000
+mem[59209] = 14316
+mem[50790] = 705222705
+mem[45621] = 232211796
+mask = 010X111101111XX1101000X1011000111011
+mem[48891] = 3231894
+mem[37241] = 49993
+mem[47016] = 3806
+mem[10469] = 12758
+mem[43871] = 17980
+mask = 0XX00XX11110010011X0010X1X011100X000
+mem[28733] = 801341049
+mem[12772] = 20002640
+mem[30741] = 2248
+mask = 0101X01110100X0111XX11110011000XXX01
+mem[17803] = 65414
+mem[45439] = 13886371
+mem[16184] = 130293
+mem[29313] = 1782
+mask = 01000111111001101X0110000001XX1X1111
+mem[34404] = 202755
+mem[43413] = 1045
+mem[48841] = 381434549
+mem[37238] = 230052
+mem[10175] = 421554
+mem[11939] = 15850
+mask = X0XX0011X110010X011000010111110X1XX0
+mem[54847] = 160031
+mem[53915] = 5111
+mem[6036] = 17132
+mem[36183] = 1360055
+mem[47658] = 127563
+mask = 00100X1111X0010101101X11X11111001X10
+mem[25937] = 8673
+mem[12926] = 834
+mem[43356] = 732346
+mem[5734] = 393
+mem[3822] = 30383
+mask = 110001101110XX00100100XX0X11X1XX010X
+mem[821] = 185158312
+mem[64509] = 264189683
+mem[15199] = 1037709
+mem[635] = 437556
+mem[31141] = 14726605
+mem[40468] = 47196
+mask = 00000001XX1001001X0000X01001X0001100
+mem[46740] = 8071
+mem[43144] = 14187193
+mem[51555] = 382
+mem[30741] = 4087
+mem[45411] = 1430
+mem[14377] = 7364
+mask = 11X00110111001001001100X10X1XX00X100
+mem[62803] = 979004797
+mem[4838] = 343
+mem[23241] = 4426
+mask = 001X0101X1100100X1X0X110110XX01001X0
+mem[10799] = 5745
+mem[14789] = 34632
+mem[27068] = 8863
+mask = 001001011XX0010011000111010X10XX0100
+mem[31173] = 109895
+mem[25936] = 4493
+mask = 00000011111X0101X1X01100X00000100000
+mem[32612] = 14472
+mem[22702] = 713
+mem[22779] = 126887839
+mem[43168] = 251908
+mem[11504] = 47004
+mem[7399] = 2215129
+mem[63129] = 4367
+mask = 010001010X10010X111XX1X0111100101X0X
+mem[3663] = 187207677
+mem[52928] = 200
+mem[38852] = 8397
+mem[31461] = 223838656
+mem[64706] = 4205924
+mem[26237] = 218385741
+mem[57402] = 258615472
+mask = 11X0X0X1011001XX1001111X011100XX0000
+mem[55334] = 323423
+mem[5833] = 33097
+mem[26924] = 272
+mem[42957] = 47976862
+mem[18798] = 61419
+mem[19947] = 1287
+mask = 1100X101011X10111X11X000111100111XX0
+mem[64472] = 224734
+mem[18079] = 526
+mem[60870] = 3322170
+mem[4013] = 578
+mem[2606] = 83684765
+mem[17048] = 2503
+mask = 0010000XX0000100110000011X0001X0X00X
+mem[37789] = 94286
+mem[2499] = 13318890
+mem[29793] = 78507
+mem[45621] = 3626886
+mem[34770] = 2407
+mem[54400] = 38740
+mask = 0010X10111000100110001X0X1000100X101
+mem[11265] = 1297549
+mem[16410] = 948310
+mem[33093] = 893977
+mem[17298] = 53047
+mem[45439] = 14869
+mem[21212] = 870451788
diff --git a/2020/14/puzzle-1.py b/2020/14/puzzle-1.py
new file mode 100755
index 0000000..f102316
--- /dev/null
+++ b/2020/14/puzzle-1.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python3
+
+
+def bitmask(mask: str, num: int) -> int:
+ binary = bin(num)[2:]
+ binary = "0" * (36 - len(binary)) + binary
+ res = ""
+
+ for i in range(len(binary)):
+ if binary[i] == "1" and mask[i] == "0":
+ res += "0"
+ elif binary[i] == "0" and mask[i] == "1":
+ res += "1"
+ else:
+ res += binary[i]
+
+ return int(res, 2)
+
+
+def main() -> None:
+ with open("input", "r") as f:
+ lines = f.read().splitlines()
+
+ mem: dict[str, int] = {}
+ mask = ""
+ for line in lines:
+ line = line.split(" ")
+ if line[0] == "mask":
+ mask = line[2]
+ else:
+ mem[line[0][4:-1]] = bitmask(mask, int(line[2]))
+
+ print(sum(mem[val] for val in mem))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/2020/14/puzzle-2.py b/2020/14/puzzle-2.py
new file mode 100755
index 0000000..45fb6ad
--- /dev/null
+++ b/2020/14/puzzle-2.py
@@ -0,0 +1,48 @@
+#!/usr/bin/env python3
+
+
+def bitmask(mask: str, num: int) -> tuple[int, ...]:
+ binary = bin(num)[2:]
+ binary = binary.zfill(36)
+ res = ""
+
+ for i in range(len(binary)):
+ if mask[i] == "0":
+ res += binary[i]
+ else:
+ res += mask[i]
+
+ n = res.count("X")
+ combos = tuple(bin(i)[2:].zfill(n) for i in range(2 << n - 1))
+
+ acc: list[str] = []
+ for combo in combos:
+ temp = res
+ for i in range(n):
+ temp = temp.replace("X", combo[i], 1)
+ acc.append(temp)
+
+ return tuple(int(x, 2) for x in acc)
+
+
+def main() -> None:
+ with open("input", "r") as f:
+ lines = f.read().splitlines()
+
+ mem: dict[str, int] = {}
+ mask = ""
+ for line in lines:
+ line = line.split(" ")
+ if line[0] == "mask":
+ mask = line[2]
+ else:
+ address = line[0][4:-1]
+ addresses = bitmask(mask, int(address))
+ for a in addresses:
+ mem[a] = int(line[2])
+
+ print(sum(mem[val] for val in mem))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/2020/15/.gitignore b/2020/15/.gitignore
new file mode 100644
index 0000000..60d075d
--- /dev/null
+++ b/2020/15/.gitignore
@@ -0,0 +1 @@
+puzzle-[12]
diff --git a/2020/15/Makefile b/2020/15/Makefile
new file mode 100644
index 0000000..c32dafa
--- /dev/null
+++ b/2020/15/Makefile
@@ -0,0 +1,7 @@
+all:
+ ${CC} ${CFLAGS} -o puzzle-1 puzzles.c
+ ${CC} ${CFLAGS} -DPART2 -o puzzle-2 puzzles.c
+
+.PHONY: clean
+clean:
+ rm -f puzzle-[12]
diff --git a/2020/15/puzzles.c b/2020/15/puzzles.c
new file mode 100644
index 0000000..64d89bb
--- /dev/null
+++ b/2020/15/puzzles.c
@@ -0,0 +1,31 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifndef PART2
+ #define BUFFER 2020
+#else
+ #define BUFFER 30000000
+#endif
+
+int
+main(void)
+{
+ /* Given starting numbers */
+ static unsigned int nums[BUFFER] = {0};
+ nums[6] = 1;
+ nums[19] = 2;
+ nums[0] = 3;
+ nums[5] = 4;
+ nums[7] = 5;
+ nums[13] = 6;
+
+ unsigned int temp, lnum = 1;
+ for (int i = 8; i <= BUFFER; i++) {
+ temp = lnum;
+ lnum = nums[lnum] ? i - 1 - nums[lnum] : 0;
+ nums[temp] = i - 1;
+ }
+
+ printf("%u\n", lnum);
+ return EXIT_SUCCESS;
+}
diff --git a/2020/16/input b/2020/16/input
new file mode 100644
index 0000000..2895e57
--- /dev/null
+++ b/2020/16/input
@@ -0,0 +1,269 @@
+departure location: 30-260 or 284-950
+departure station: 29-856 or 863-974
+departure platform: 32-600 or 611-967
+departure track: 44-452 or 473-965
+departure date: 36-115 or 129-950
+departure time: 50-766 or 776-972
+arrival location: 40-90 or 104-961
+arrival station: 40-864 or 887-971
+arrival platform: 32-920 or 932-964
+arrival track: 45-416 or 427-959
+class: 47-536 or 557-964
+duration: 33-229 or 246-969
+price: 25-147 or 172-969
+route: 32-328 or 349-970
+row: 50-692 or 709-964
+seat: 49-292 or 307-964
+train: 28-726 or 748-954
+type: 37-430 or 438-950
+wagon: 46-628 or 638-973
+zone: 39-786 or 807-969
+
+your ticket:
+89,193,59,179,191,173,61,73,181,67,71,109,53,79,83,113,107,139,131,137
+
+nearby tickets:
+499,362,657,143,723,763,935,454,473,586,372,489,214,753,765,65,307,56,853,934
+228,664,709,361,856,645,363,171,901,199,62,513,667,808,350,890,715,687,257,721
+531,490,628,88,947,252,832,917,686,571,362,874,837,588,849,140,655,407,90,611
+777,194,111,386,90,598,153,363,373,566,191,945,559,819,289,487,480,590,691,756
+186,366,196,844,655,659,845,109,355,330,71,176,397,380,822,776,369,447,658,949
+783,763,570,184,260,448,856,717,913,646,774,657,841,917,910,193,941,408,110,577
+378,832,670,59,155,911,209,74,57,947,144,514,411,89,690,856,854,286,597,132
+319,684,204,909,342,206,204,943,620,52,516,115,430,319,84,618,593,211,596,581
+66,146,910,225,107,112,918,679,255,757,125,946,863,892,78,525,373,913,87,838
+674,653,588,220,448,941,112,924,474,358,513,649,766,500,847,197,639,836,373,573
+76,115,776,726,598,361,480,772,356,129,506,380,202,810,932,756,408,81,786,889
+311,620,848,357,483,754,181,300,284,60,259,674,596,289,397,113,894,82,291,754
+84,600,751,223,595,478,198,2,402,428,355,517,947,933,624,59,598,711,752,513
+286,664,786,775,510,363,666,229,914,938,196,509,410,528,681,943,477,850,640,595
+365,17,624,375,640,483,208,258,189,222,889,655,852,326,109,428,758,616,889,288
+566,195,201,949,205,517,672,762,180,886,679,63,596,664,678,596,894,384,321,212
+576,316,480,579,925,328,498,194,191,132,106,863,210,416,351,663,643,218,366,942
+776,60,256,400,368,664,469,53,949,689,569,253,319,717,387,591,845,66,499,566
+620,831,379,712,614,176,682,666,83,197,438,916,535,504,218,377,627,155,429,855
+853,525,865,487,190,940,810,251,786,618,895,580,908,86,578,136,781,562,498,759
+671,625,256,592,177,500,523,50,443,692,650,128,441,832,626,491,252,405,661,756
+597,722,922,721,319,388,653,484,83,142,781,451,106,499,515,672,113,374,911,311
+211,716,176,715,627,286,327,531,566,587,916,431,57,371,894,677,778,193,710,447
+559,508,196,178,844,78,114,662,142,558,514,378,375,694,718,314,384,89,816,562
+290,578,105,478,229,260,752,496,187,937,137,898,69,399,980,638,441,84,589,574
+413,592,841,498,793,214,947,582,827,940,446,572,259,623,213,355,853,360,60,195
+481,764,308,384,131,247,595,756,221,361,175,256,407,255,155,752,781,524,403,640
+74,765,914,319,715,86,316,612,197,640,827,760,926,106,520,818,229,824,623,404
+576,504,694,379,75,528,638,257,482,852,837,563,575,389,686,217,852,684,314,184
+481,679,312,796,358,71,376,830,209,946,69,591,939,357,59,284,522,626,218,825
+355,812,691,377,833,938,139,233,643,764,663,692,722,576,495,843,450,536,359,174
+367,749,373,379,69,753,711,81,445,265,405,624,759,814,311,623,228,290,682,195
+475,841,833,415,13,809,478,70,191,228,934,760,765,508,398,655,907,850,487,54
+198,841,184,84,492,945,429,72,753,572,510,408,827,289,177,559,890,837,987,291
+427,198,192,666,319,369,565,861,512,216,81,899,388,761,683,933,529,515,673,674
+355,188,827,614,178,600,641,181,915,728,934,526,904,136,74,649,187,77,381,498
+751,317,780,190,897,781,65,852,933,69,657,811,517,564,842,877,382,84,56,576
+946,839,941,322,409,318,751,850,215,750,394,578,95,284,902,396,409,51,309,938
+54,400,54,307,290,665,125,507,220,600,214,405,864,217,763,284,382,820,129,910
+722,68,841,521,597,286,722,481,451,145,448,389,61,844,650,487,250,781,149,70
+175,323,322,831,857,137,616,686,408,175,709,903,214,917,414,108,367,827,684,593
+321,820,388,220,368,137,403,523,914,839,64,724,482,307,284,448,585,208,764,988
+86,926,414,213,825,682,473,67,318,144,51,311,814,709,520,687,623,396,949,387
+522,369,139,593,122,210,716,906,406,488,681,753,852,189,71,203,51,145,639,412
+322,368,18,663,903,574,203,363,391,643,205,474,182,517,855,486,890,315,725,82
+60,582,819,529,180,140,570,402,191,594,863,146,614,631,51,593,828,583,184,78
+856,622,291,412,503,532,563,217,404,352,349,406,675,277,292,765,748,493,691,626
+647,849,636,64,479,715,623,132,322,408,524,385,212,328,289,104,82,689,908,650
+197,444,249,763,892,86,775,441,172,664,379,596,910,584,574,376,665,899,174,847
+375,906,894,75,895,82,250,367,350,581,912,927,370,888,938,413,109,909,570,481
+104,831,565,413,849,533,861,394,361,511,292,573,567,218,832,135,717,851,134,223
+847,59,369,147,509,80,184,527,199,430,614,687,621,823,132,787,569,109,665,112
+109,983,680,682,191,65,139,643,687,228,828,317,211,784,851,757,672,64,616,173
+403,640,763,704,504,381,201,933,144,597,825,79,496,246,783,113,84,650,720,81
+356,82,615,375,222,361,182,255,112,845,612,298,891,887,382,839,380,691,405,660
+251,535,590,228,181,710,663,485,856,929,389,892,573,247,856,313,679,397,50,850
+895,673,675,513,838,181,135,696,599,327,583,720,486,104,691,777,115,536,724,920
+519,3,55,711,820,572,614,401,751,664,856,779,726,687,672,415,680,536,481,684
+692,781,22,72,586,906,845,356,852,590,777,372,593,579,369,663,619,317,134,138
+623,484,723,936,810,940,824,676,362,172,494,864,360,133,402,911,307,634,828,428
+899,308,410,558,557,452,69,84,65,5,187,849,493,223,441,349,499,677,67,915
+222,758,668,351,782,373,825,839,369,615,904,186,815,379,897,380,863,911,60,981
+576,710,508,63,506,888,638,476,626,616,863,494,434,898,715,759,946,208,932,84
+495,255,259,810,586,387,804,69,564,73,140,628,890,205,213,363,709,683,401,78
+79,582,688,536,114,106,622,289,395,417,786,384,175,55,850,855,327,189,135,254
+379,895,255,498,766,523,291,782,944,839,615,687,892,824,479,77,619,359,702,680
+250,144,611,936,220,851,509,379,260,821,532,859,79,673,906,624,211,780,349,448
+75,643,392,826,139,579,479,618,372,563,823,913,106,286,639,594,455,895,388,776
+370,785,939,918,661,841,582,655,678,109,850,673,423,864,290,677,762,834,383,686
+19,906,528,475,779,174,519,389,715,816,247,500,350,250,54,897,57,942,369,443
+114,684,251,944,56,944,228,217,666,778,650,605,488,284,643,516,754,561,659,938
+292,429,906,605,935,88,140,197,721,438,257,590,324,900,325,785,290,522,491,619
+249,52,649,558,605,914,494,286,373,132,892,766,709,355,655,321,218,473,906,562
+612,908,180,854,475,825,61,516,363,945,896,176,563,763,361,221,847,205,631,112
+936,57,379,279,534,211,889,254,198,381,645,764,318,377,619,850,78,750,181,83
+413,130,497,366,65,307,255,686,181,368,997,560,781,205,69,863,401,809,829,683
+137,227,53,486,826,676,221,896,219,358,981,370,638,528,649,404,482,942,809,676
+918,172,942,948,821,911,291,906,393,438,757,702,215,383,178,219,350,894,757,403
+526,913,180,376,653,617,837,935,896,373,343,184,257,660,784,406,901,904,377,689
+189,388,628,55,723,82,51,369,808,365,137,668,664,596,325,672,360,316,797,939
+88,905,90,284,619,394,326,415,836,891,618,207,754,226,766,572,444,567,177,991
+685,531,67,314,673,136,325,283,659,374,403,60,914,492,478,648,190,320,592,692
+137,146,504,678,691,247,673,438,999,315,639,536,917,416,212,187,896,198,785,452
+855,205,111,600,562,785,489,226,209,941,518,384,700,579,315,657,74,654,591,558
+444,360,672,367,819,108,757,136,621,838,323,785,478,809,492,376,161,508,901,586
+205,500,513,902,408,909,573,663,891,290,326,389,477,376,810,392,596,382,846,989
+141,366,489,481,716,350,589,63,655,558,451,143,289,594,866,933,711,63,213,380
+320,144,949,726,314,576,639,80,287,143,616,713,945,623,228,927,374,385,856,499
+215,135,351,409,69,619,658,639,567,716,227,888,768,66,115,320,77,718,748,369
+614,894,572,515,842,371,253,570,479,574,292,394,463,659,840,227,763,757,777,83
+401,887,116,854,751,683,137,898,104,649,596,779,935,65,570,220,147,850,781,379
+353,808,187,909,895,710,192,903,784,779,755,788,896,292,719,428,843,681,407,313
+83,722,826,829,392,616,655,484,520,720,53,243,145,360,63,594,512,443,850,200
+588,889,187,889,581,215,290,319,821,440,601,220,482,307,217,690,758,512,942,372
+722,183,134,843,807,783,509,657,411,859,561,401,763,719,756,380,756,375,443,207
+289,853,562,190,181,652,988,942,315,225,813,355,404,107,429,442,311,377,259,855
+527,780,526,323,449,218,721,714,84,200,806,717,619,587,821,399,570,518,778,893
+836,309,893,780,943,779,657,256,528,296,512,476,131,641,828,223,807,683,562,313
+855,192,440,557,427,710,776,755,653,920,191,763,631,664,897,580,845,916,659,66
+179,559,920,399,906,720,822,942,852,408,617,690,599,937,949,356,195,982,251,318
+942,990,386,328,473,669,52,324,531,889,854,322,594,762,536,135,672,501,612,229
+627,500,725,255,136,370,403,58,77,838,674,620,858,307,438,189,392,674,568,446
+529,415,438,661,287,511,200,250,179,388,596,582,176,529,514,978,945,106,312,564
+587,392,947,762,110,387,495,115,452,572,416,676,189,751,208,985,478,828,442,638
+439,935,614,357,919,131,385,247,674,113,835,766,908,373,134,257,996,487,145,836
+855,619,843,711,577,427,392,661,485,257,293,504,315,450,190,389,581,197,823,711
+617,816,838,636,257,58,935,668,501,386,226,838,919,660,755,643,438,216,526,753
+685,288,86,781,908,140,310,144,258,52,132,560,803,622,591,134,218,248,566,518
+782,290,896,384,324,452,671,562,508,653,475,996,683,624,494,597,145,682,67,910
+567,532,719,399,50,616,922,914,310,612,353,653,400,384,562,684,492,568,135,689
+170,749,486,901,108,825,887,210,519,226,762,188,590,903,452,617,615,834,363,517
+308,497,496,400,530,512,939,647,514,359,435,625,186,580,66,206,718,491,657,50
+558,698,326,195,809,89,135,378,518,846,692,204,716,573,176,369,583,752,227,651
+399,982,611,404,619,317,86,486,524,673,51,489,751,318,766,486,826,249,381,815
+597,856,16,375,61,137,906,888,439,669,782,893,902,398,785,900,671,319,710,136
+311,653,224,823,442,220,902,603,367,54,945,195,897,67,60,360,814,450,246,665
+358,579,849,813,315,308,825,681,827,114,857,352,481,440,212,944,836,312,501,439
+55,129,66,942,133,137,208,50,478,205,200,916,851,487,889,824,989,691,490,364
+308,381,688,440,135,516,816,504,287,625,750,355,663,714,176,391,229,989,904,284
+213,780,407,912,573,535,585,825,897,842,588,469,893,321,567,831,90,138,613,863
+853,119,581,373,84,761,217,640,752,383,226,650,357,322,438,503,292,559,291,492
+684,874,935,786,89,852,940,397,643,51,722,647,79,50,817,86,585,822,611,575
+777,890,911,915,114,452,635,204,79,289,310,449,628,247,358,948,894,307,350,893
+724,685,936,485,887,82,835,870,481,615,616,751,131,505,111,82,912,438,50,405
+520,826,224,592,411,284,834,668,902,657,661,897,758,369,933,809,704,501,222,777
+624,628,105,260,663,502,447,436,310,851,836,208,911,591,718,755,844,647,854,497
+762,175,201,4,644,111,427,490,713,409,531,143,577,75,287,663,172,411,911,57
+285,225,187,359,57,911,315,56,892,398,216,533,784,916,10,690,912,133,939,328
+754,649,519,319,315,807,640,749,668,404,594,514,175,587,637,582,188,90,219,427
+906,146,274,173,229,562,480,518,897,821,53,913,319,63,189,571,485,613,509,353
+502,646,58,352,505,660,575,133,671,811,586,350,850,802,474,360,911,136,564,753
+106,62,354,247,935,626,978,371,834,214,586,76,659,532,938,444,388,443,668,574
+132,473,368,718,80,754,751,947,903,772,284,256,650,258,251,682,197,619,758,501
+77,892,401,675,270,935,183,658,578,497,373,209,807,187,209,85,205,251,367,57
+750,209,834,811,665,898,361,64,114,685,258,943,644,532,129,614,924,76,377,405
+195,428,488,67,935,19,375,392,484,450,892,416,260,650,256,194,397,483,113,557
+474,852,196,427,375,977,639,643,536,785,66,452,326,623,828,309,909,373,138,113
+219,225,818,84,639,380,856,676,372,82,76,577,517,758,942,182,604,194,400,357
+908,622,568,81,183,901,868,354,818,835,894,430,482,824,856,839,190,77,88,840
+641,572,228,286,936,889,818,777,778,846,643,113,150,138,754,934,582,581,627,685
+898,891,841,0,62,908,110,888,74,831,286,653,407,138,653,932,514,853,357,598
+622,413,899,828,185,194,173,571,481,670,315,515,562,207,836,708,766,683,488,372
+248,457,934,372,564,414,662,665,949,642,202,144,189,842,214,592,374,888,211,247
+668,139,115,132,522,683,205,849,784,481,713,776,689,63,563,658,361,982,196,897
+289,407,60,434,323,561,196,319,517,846,686,855,173,864,611,814,717,618,313,687
+474,892,536,259,888,86,81,328,687,402,375,891,291,666,805,909,386,193,511,898
+131,210,638,840,392,765,565,841,394,781,813,562,316,145,526,528,826,803,87,197
+841,557,935,116,837,478,174,839,623,752,71,484,709,685,495,360,327,143,440,908
+452,86,411,358,847,632,853,716,410,491,934,86,196,598,600,486,402,212,493,714
+766,663,131,474,888,85,569,710,251,225,846,194,692,925,398,783,226,291,189,488
+657,560,388,477,509,87,139,911,258,671,947,753,865,913,324,638,366,526,584,429
+658,181,83,611,259,561,752,121,758,561,612,478,518,763,896,596,68,328,173,446
+625,810,62,508,458,355,847,896,220,838,933,536,376,112,427,190,511,403,479,675
+367,495,523,441,694,656,286,309,203,839,481,848,646,830,383,221,848,185,615,208
+311,526,497,750,473,916,393,396,564,191,479,723,627,182,444,484,173,754,661,8
+759,848,112,516,668,189,217,617,598,117,831,251,906,905,560,86,573,938,63,908
+188,889,534,86,999,187,441,186,762,61,827,106,222,756,814,113,716,54,200,808
+809,259,908,290,905,316,761,593,846,408,509,780,516,447,311,201,773,217,948,932
+210,253,621,481,900,557,318,379,909,511,985,904,681,716,115,70,214,385,825,427
+533,130,571,599,621,141,612,786,838,402,662,186,297,820,759,381,208,592,576,318
+320,253,349,831,394,557,105,752,522,191,181,891,200,13,409,762,833,317,683,55
+401,416,920,309,583,665,570,369,199,54,455,185,513,80,527,912,442,783,615,85
+365,190,504,219,595,618,593,350,782,809,66,919,427,474,406,137,81,14,189,442
+135,187,428,506,662,209,850,905,184,855,935,584,606,944,819,371,825,720,598,912
+622,620,408,224,530,792,894,855,372,667,653,820,514,180,479,685,190,196,107,560
+205,848,375,252,628,479,670,147,413,156,759,949,489,719,681,493,70,508,807,835
+776,676,62,512,658,477,215,748,911,186,500,557,213,862,905,373,677,250,410,250
+58,88,684,855,626,498,574,631,503,749,75,59,641,207,440,404,139,887,751,363
+113,186,66,204,104,726,115,137,617,832,90,755,664,517,452,635,594,749,892,363
+356,863,658,575,896,903,373,645,192,907,277,816,844,532,519,520,402,390,623,507
+83,514,383,674,628,832,584,723,639,307,144,569,191,199,990,718,76,415,193,756
+308,267,503,448,842,228,55,371,63,724,590,894,566,621,477,448,566,752,530,675
+569,327,379,64,84,51,273,863,721,501,592,688,406,814,498,292,505,487,901,398
+830,855,66,534,710,441,623,816,324,368,318,450,232,407,619,639,50,530,413,428
+477,579,480,721,16,713,673,53,687,256,624,444,534,725,653,227,76,750,411,104
+720,405,915,676,80,623,757,141,901,847,493,485,123,379,444,349,832,711,77,73
+528,50,913,528,50,61,354,489,838,600,193,387,382,621,191,822,119,82,211,836
+516,565,76,906,586,638,755,716,588,822,502,15,492,896,391,503,685,382,188,940
+318,583,260,677,873,822,364,255,624,624,147,721,63,218,215,567,136,493,87,511
+58,446,210,582,133,814,719,476,412,863,492,901,580,845,87,179,629,177,915,322
+112,712,386,667,624,369,650,317,177,230,532,56,360,482,479,818,893,835,258,495
+51,492,763,777,287,508,827,138,620,635,915,311,808,510,82,360,564,251,446,138
+198,678,855,410,568,899,712,442,173,438,18,86,777,83,752,144,207,721,587,590
+79,352,414,777,786,384,671,346,600,591,829,316,374,939,229,199,216,219,109,210
+508,154,508,677,510,212,529,903,758,410,199,131,88,476,481,508,825,393,784,287
+55,652,686,521,620,388,785,907,535,683,631,363,186,487,289,406,481,572,360,574
+133,507,413,366,838,939,131,589,678,440,520,912,142,533,909,17,588,753,833,657
+111,356,638,172,491,684,110,846,384,433,679,647,289,846,916,946,352,196,786,479
+567,224,907,310,488,763,195,139,595,512,687,680,493,401,130,749,273,353,498,679
+814,988,813,443,662,948,136,503,517,392,815,317,723,416,400,318,627,780,836,890
+328,196,856,288,623,257,525,285,679,512,564,170,723,534,916,179,67,651,557,834
+450,484,381,441,774,570,664,815,147,319,173,316,137,532,327,657,749,510,200,199
+902,650,327,258,647,667,250,77,579,598,723,473,510,364,923,369,493,357,318,359
+314,824,689,488,809,892,530,384,809,399,497,413,935,133,641,360,996,643,615,215
+365,756,249,585,913,613,821,353,646,851,411,54,710,153,289,199,617,200,383,528
+824,257,831,938,481,841,576,179,321,938,919,81,479,766,705,257,513,112,353,200
+71,748,208,75,250,319,498,179,997,394,409,764,377,678,534,320,113,512,669,115
+260,587,57,671,366,248,175,727,814,596,309,664,757,781,940,62,187,809,642,816
+406,205,569,108,817,414,366,474,86,311,901,682,589,256,283,814,393,596,856,321
+920,613,190,616,616,614,897,384,213,222,158,359,80,837,140,709,854,356,838,820
+496,508,512,509,675,180,89,182,838,208,392,771,177,934,88,513,61,943,903,666
+311,509,478,439,890,692,682,361,914,802,720,600,675,576,664,224,522,252,898,650
+384,587,250,396,715,840,595,679,900,135,141,438,844,122,310,566,850,291,205,676
+414,810,370,856,785,628,172,781,88,450,675,339,308,210,832,660,595,77,475,438
+648,77,650,473,817,977,819,524,846,751,323,823,104,67,112,451,394,627,725,578
+620,327,676,194,664,51,140,368,782,528,111,280,145,73,582,486,821,530,372,764
+370,364,79,252,718,204,370,835,825,904,698,312,137,586,387,360,713,229,725,318
+192,776,258,495,644,836,759,139,147,702,658,779,615,816,478,812,657,712,362,839
+386,530,409,863,110,290,938,75,406,457,190,513,368,133,203,753,514,825,644,687
+615,862,808,721,579,671,807,228,848,307,760,74,451,509,484,403,216,710,892,667
+494,763,935,569,778,396,362,723,113,495,897,486,735,495,288,715,937,590,575,687
+478,108,831,687,817,753,687,528,321,201,574,572,444,897,489,568,876,512,508,288
+829,312,350,843,478,252,584,361,625,307,929,570,514,72,219,825,686,570,655,667
+172,910,658,834,657,182,941,182,246,907,373,147,271,183,77,785,429,320,847,726
+855,523,364,690,564,979,145,892,354,525,326,510,723,856,560,445,620,813,525,618
+748,916,783,872,646,676,596,691,316,373,512,915,512,724,831,723,842,324,908,899
+88,766,253,446,940,533,398,506,751,912,18,130,134,477,855,59,516,395,384,76
+795,638,507,766,947,400,474,505,864,612,653,212,529,378,255,911,358,83,51,491
+765,827,584,196,941,390,402,713,901,82,659,623,345,177,309,191,198,223,863,937
+517,635,510,64,415,765,901,365,723,574,623,850,191,917,943,643,413,523,757,830
+218,854,225,812,523,170,593,357,761,291,621,914,584,60,64,198,65,501,848,939
+83,683,222,750,135,847,864,325,80,668,717,630,757,427,137,430,176,777,809,670
+285,570,846,471,759,572,627,721,753,68,414,920,521,677,517,713,901,475,569,67
+135,319,70,328,495,618,78,479,414,782,107,64,489,378,227,444,861,314,441,179
+766,557,983,577,443,573,225,74,259,680,659,932,916,452,560,763,374,214,446,644
+54,509,310,204,580,484,889,371,935,619,520,188,622,653,491,229,66,926,828,688
+560,311,146,911,907,864,696,386,328,776,393,387,947,364,212,688,677,446,361,64
+79,259,476,926,67,375,59,397,750,909,652,947,568,786,208,107,200,830,527,173
+88,836,587,134,901,176,896,287,68,574,903,562,82,877,75,651,561,813,569,209
+480,566,575,639,198,80,935,142,446,948,784,360,716,835,318,171,536,112,843,835
+519,711,796,581,590,382,317,514,389,488,410,663,840,578,450,906,947,841,507,663
+87,569,890,497,368,361,58,413,145,592,144,221,292,445,72,941,791,60,218,814
+389,810,597,156,190,186,507,725,638,349,86,405,644,947,254,201,391,573,758,826
+500,829,643,858,193,191,485,584,370,940,841,820,832,327,565,389,816,677,819,485
+81,499,388,812,201,848,823,288,715,650,868,307,322,53,780,360,650,491,711,896
+816,443,408,197,316,936,487,792,350,492,287,717,350,201,444,111,579,73,409,289
+509,369,890,671,529,444,428,783,170,139,889,649,905,511,508,410,380,399,203,310
+808,711,711,500,512,227,85,810,940,604,786,74,667,684,400,174,480,224,522,88
+105,897,172,780,432,722,287,529,824,524,52,250,136,219,223,249,384,938,559,856
+827,618,152,625,143,933,529,254,400,257,780,144,182,599,576,376,113,199,353,624
+515,253,651,450,659,382,814,254,522,535,906,180,350,358,725,441,135,591,921,54
+290,354,895,627,399,945,355,311,385,496,756,986,893,80,52,308,414,313,572,599
+211,363,501,189,635,891,131,623,493,109,854,572,190,246,206,562,808,365,889,250
+63,792,659,400,946,835,724,641,566,180,824,892,199,528,175,563,687,571,314,557 \ No newline at end of file
diff --git a/2020/16/puzzle-1.py b/2020/16/puzzle-1.py
new file mode 100755
index 0000000..f4343c8
--- /dev/null
+++ b/2020/16/puzzle-1.py
@@ -0,0 +1,30 @@
+#!/usr/bin/env python3
+
+
+def main() -> None:
+ with open("input", "r") as f:
+ data = f.readlines()
+
+ i = 0
+ valid: list[int] = []
+ while data[i] != "\n":
+ ranges = data[i].split(": ")[1].split(" or ")
+ for _range in ranges:
+ bounds = tuple(map(int, _range.split("-")))
+ for j in range(bounds[0], bounds[1] + 1):
+ valid.append(j)
+ i += 1
+
+ # Skip to nearby tickets
+ i += 5
+ acc = 0
+
+ for j in range(i, len(data)):
+ fields = tuple(map(int, data[j].split(",")))
+ acc += sum(field for field in fields if field not in valid)
+
+ print(acc)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/2020/16/puzzle-2.py b/2020/16/puzzle-2.py
new file mode 100755
index 0000000..1060049
--- /dev/null
+++ b/2020/16/puzzle-2.py
@@ -0,0 +1,81 @@
+#!/usr/bin/env python3
+
+from functools import reduce
+from operator import mul
+
+
+def not_reduced(label_dict: dict[int, str]) -> bool:
+ for i in label_dict:
+ if len(label_dict[i]) != 1:
+ return True
+ return False
+
+
+def main() -> None:
+ with open("input", "r") as f:
+ data = f.readlines()
+
+ i = 0
+ valid: list[int] = []
+ labels: list[str] = []
+ while data[i] != "\n":
+ labels.append(data[i].split(":")[0])
+ ranges = data[i].split(": ")[1].split(" or ")
+ for _range in ranges:
+ bounds = tuple(map(int, _range.split("-")))
+ for j in range(bounds[0], bounds[1] + 1):
+ valid.append(j)
+ i += 1
+
+ # Skip to nearby tickets
+ i += 5
+
+ vtickets: list[tuple[int, ...]] = []
+ for j in range(i, len(data)):
+ fields = tuple(map(int, data[j].split(",")))
+ check = True
+ for field in fields:
+ if field not in valid:
+ check = False
+ break
+ if check == True:
+ vtickets.append(tuple(map(int, data[j].split(","))))
+
+ label_dict: dict[int, list[str]] = {}
+ for i in range(len(labels)):
+ label_dict[i] = []
+
+ # Triple for loop, gross!
+ for label in labels:
+ valid: list[list[int]] = []
+ ranges = data[labels.index(label)].split(": ")[1].split(" or ")
+ for _range in ranges:
+ bounds = tuple(map(int, _range.split("-")))
+ for i in range(bounds[0], bounds[1] + 1):
+ valid.append(i)
+
+ # For each column
+ for i in range(len(labels)):
+ allvalid = True
+ for ticket in vtickets:
+ if ticket[i] not in valid:
+ allvalid = False
+ break
+
+ if allvalid == True:
+ label_dict[i].append(label)
+
+ # Reduce the label dictionary
+ while not_reduced(label_dict):
+ for i in label_dict:
+ if len((l := label_dict[i])) == 1:
+ for j in label_dict:
+ if l[0] in label_dict[j] and i != j:
+ label_dict[j].remove(l[0])
+
+ my_ticket = tuple(map(int, data[data.index("your ticket:\n") + 1].split(",")))
+ print(reduce(mul, [x for x in my_ticket if "departure" in label_dict[my_ticket.index(x)][0]],))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/2020/17/.gitignore b/2020/17/.gitignore
new file mode 100644
index 0000000..60d075d
--- /dev/null
+++ b/2020/17/.gitignore
@@ -0,0 +1 @@
+puzzle-[12]
diff --git a/2020/17/Makefile b/2020/17/Makefile
new file mode 100644
index 0000000..c32dafa
--- /dev/null
+++ b/2020/17/Makefile
@@ -0,0 +1,7 @@
+all:
+ ${CC} ${CFLAGS} -o puzzle-1 puzzles.c
+ ${CC} ${CFLAGS} -DPART2 -o puzzle-2 puzzles.c
+
+.PHONY: clean
+clean:
+ rm -f puzzle-[12]
diff --git a/2020/17/input b/2020/17/input
new file mode 100644
index 0000000..3b42c23
--- /dev/null
+++ b/2020/17/input
@@ -0,0 +1,8 @@
+...#..#.
+.....##.
+##..##.#
+#.#.##..
+#..#.###
+...##.#.
+#..##..#
+.#.#..#. \ No newline at end of file
diff --git a/2020/17/puzzles.c b/2020/17/puzzles.c
new file mode 100644
index 0000000..4e98982
--- /dev/null
+++ b/2020/17/puzzles.c
@@ -0,0 +1,104 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* PART2 is defined for part 2, but not for part 1 */
+#ifdef PART2
+ #define MAXTIME 50
+#else
+ #define MAXTIME 1
+#endif
+#define MAXDEPTH 50
+#define MAXHEIGHT 50
+#define MAXWIDTH 50
+
+char space[MAXTIME][MAXDEPTH][MAXHEIGHT][MAXWIDTH];
+char temp[MAXTIME][MAXDEPTH][MAXHEIGHT][MAXWIDTH];
+
+/* Check the cubes around the given coordinates and update the temp array accordingly */
+static void
+update_cube(unsigned int const t, unsigned int const i, unsigned int const j, unsigned int const k)
+{
+ unsigned int active = 0;
+
+ for (int tme = t - 1; tme <= (int) t + 1; tme++) {
+ if (tme < 0 || tme > MAXTIME - 1)
+ continue;
+ for (int dep = i - 1; dep <= (int) i + 1; dep++) {
+ if (dep < 0 || dep > MAXDEPTH - 1)
+ continue;
+ for (int hgt = j - 1; hgt <= (int) j + 1; hgt++) {
+ if (hgt < 0 || hgt > MAXHEIGHT - 1)
+ continue;
+ for (int wid = k - 1; wid <= (int) k + 1; wid++) {
+ if (wid < 0 || wid > MAXWIDTH - 1
+ || (tme == (int) t && dep == (int) i && hgt == (int) j
+ && wid == (int) k))
+ continue;
+
+ if (space[tme][dep][hgt][wid] == '#')
+ active++;
+ }
+ }
+ }
+ }
+
+ if (space[t][i][j][k] == '#' && (active == 2 || active == 3))
+ temp[t][i][j][k] = '#';
+ else if (space[t][i][j][k] == '.' && active == 3)
+ temp[t][i][j][k] = '#';
+ else
+ temp[t][i][j][k] = '.';
+}
+
+int
+main(void)
+{
+ /* Initialze space */
+ memset(space, '.', MAXTIME * MAXDEPTH * MAXHEIGHT * MAXWIDTH);
+
+ /* Read input */
+ FILE *fpt = fopen("input", "r");
+ char c;
+ unsigned int t, i, j, k;
+
+ j = k = 0;
+ while ((c = fgetc(fpt)) != EOF) {
+ if (c == '\n') {
+ j++;
+ k = 0;
+ }
+ else {
+ space[MAXTIME / 2][MAXDEPTH / 2][j + MAXHEIGHT / 2][k + MAXWIDTH / 2] = c;
+ k++;
+ }
+ }
+
+ /* Do the boot cycles */
+ for (int cycle = 0; cycle < 6; cycle++) {
+ for (t = 0; t < MAXTIME; t++)
+ for (i = 0; i < MAXDEPTH; i++)
+ for (j = 0; j < MAXHEIGHT; j++)
+ for (k = 0; k < MAXWIDTH; k++)
+ update_cube(t, i, j, k);
+
+ /* Copy temp to space */
+ for (t = 0; t < MAXTIME; t++)
+ for (i = 0; i < MAXDEPTH; i++)
+ for (j = 0; j < MAXHEIGHT; j++)
+ for (k = 0; k < MAXWIDTH; k++)
+ space[t][i][j][k] = temp[t][i][j][k];
+ }
+
+ /* Count the active cubes */
+ unsigned int count = 0;
+ for (t = 0; t < MAXTIME; t++)
+ for (i = 0; i < MAXDEPTH; i++)
+ for (j = 0; j < MAXHEIGHT; j++)
+ for (k = 0; k < MAXWIDTH; k++)
+ if (space[t][i][j][k] == '#')
+ count++;
+
+ printf("%u\n", count);
+ return EXIT_SUCCESS;
+}
diff --git a/2020/18/.gitignore b/2020/18/.gitignore
new file mode 100644
index 0000000..60d075d
--- /dev/null
+++ b/2020/18/.gitignore
@@ -0,0 +1 @@
+puzzle-[12]
diff --git a/2020/18/Makefile b/2020/18/Makefile
new file mode 100644
index 0000000..c32dafa
--- /dev/null
+++ b/2020/18/Makefile
@@ -0,0 +1,7 @@
+all:
+ ${CC} ${CFLAGS} -o puzzle-1 puzzles.c
+ ${CC} ${CFLAGS} -DPART2 -o puzzle-2 puzzles.c
+
+.PHONY: clean
+clean:
+ rm -f puzzle-[12]
diff --git a/2020/18/input b/2020/18/input
new file mode 100644
index 0000000..c39b341
--- /dev/null
+++ b/2020/18/input
@@ -0,0 +1,379 @@
+6 * 7 * 8 * 9 * ((8 * 3 * 9) * 7 + 2 + 4 * 8 + 2) + 5
+3 * 2 * (5 + (8 + 2 * 2 * 8 + 8) * 8)
+5 + 7 * 8 * 2
+(8 + 5 * 9 + (8 * 9 + 7 + 8)) * 4 * 3 * (8 * 9) * 3
+(7 + 2 + 2 + 5 * 6 * 3) * 8 + 5 * 9
+(9 + (2 * 9 + 6 + 5 + 2 + 7) + 4) + 5 + (9 + (7 + 8 * 6 + 3 * 8) * (5 + 3 * 2 * 9) + 7 * (4 * 5 + 6 + 9)) + 9 * 7 * 4
+5 * (8 + 2 + 9 * 6)
+(4 * 8 + 8 + 5 * (5 * 3 + 7 * 8 + 8 + 2) + 8) * 4 * 2 * 7 + 3 + 8
+6 + 9 * (6 + 7 + (3 + 9))
+(6 * 7) + 2
+9 + (4 * (4 * 2 + 6 + 9) + 2 + 4 * 5 + 9)
+2 * (8 + 6 * 2 * 6 + 2 * (6 + 5 + 9 + 6)) * 2 * 6
+(5 * 7 * 4) * 3 * (3 * 6)
+(2 + 4 + 5 + 2) + 2 * 4 * ((6 + 2 + 3 + 4 + 9 + 8) * 5 + 6) * ((3 + 3 + 5 + 2) * 8 * 5 + 8)
+9 + 8 * (9 + 5 * (2 + 4 * 3 * 2 * 9) * 9) * (5 + 2 + 6 + 3 * 4)
+(4 * 5 + 4) * 7 * (2 * 5 + 4)
+6 + 7 + (2 + (8 + 8) * 6 + 3)
+(8 * (9 * 6 + 2 * 2 * 3) * (2 + 2 * 9 * 6) + 9) * 6 + 2
+2 + ((2 * 6 + 7) + 3 + 3) * 5 + 9 + 2
+5 + 3 + (4 * 3 + 5 * 5 * (8 + 6) * 5) * 9 * 7
+6 * 7 + ((2 * 6 + 4 * 2 + 3) + 7 * 5 + 5)
+(9 + (2 + 7 + 2 * 2) + 5 * 9 * 6) * ((2 * 6 + 6) * 3 + 5 + (2 * 2)) * 4
+6 * ((3 * 4 * 9) * 9 * (4 + 8) + 9 + 3) + (3 * (7 * 9) * 9)
+6 * 4 * 4 * (5 * 2 + 4) * 2
+4 * 4 * 8 * 3 + 5 * (2 + (9 + 8 * 7 + 6 + 3) * 8 + (6 * 7 * 9) + 9)
+7 * ((5 + 2) + 5 * 6 * (4 * 8 * 3 * 9 * 3) * 2 * 6) * ((5 + 7 + 9 * 2 * 4 * 6) + 4 + 3) * (9 + 4 + 7 + 4 * 5 * 9)
+4 * 8 * 4 + 6 * (5 * 7) * (6 * 7 * 3 + 2 + (7 + 6 * 4))
+(4 + 8 + 4) + 7 * (9 + 8 + 8 * 9)
+2 * 7 + 3 * 6 + ((5 + 6 * 9) + (2 + 4 * 6 + 9 * 3 * 9) * 2 + 6 + 2 + 8)
+((3 + 4 * 3) + 4 * 9 + 9 * 7) + 7
+(4 * 7 + 3 * 9) * 3 + 4 * 6 + (9 + 6 * 9 * (6 + 6 + 5 * 4 * 5) + 2)
+2 * (3 + 9 + 9 * 7 * 2) * 2
+7 + 4 + ((8 + 2 + 9) + (9 + 4 * 7) + 2 + 8) + 7 * ((8 * 4 + 8 + 6) * (6 * 6 + 3 * 2 * 3 + 8))
+4 + ((8 * 6) + 5 + 9 + 9 * 4 * (3 * 9 * 7)) * 6 + 4
+8 + 6 + 7 * ((3 * 9 * 2 * 3 + 9 + 7) * (7 * 4 * 8 + 9 * 9))
+7 * ((2 + 3 * 7) + (2 + 6 * 9 + 6 + 7 + 4) * 9)
+(2 + 8 * 6 * 6) + 5 + 6 + 9 + 2
+(5 + (2 + 9 * 7 + 7) + 3 * 2) * 5 + (2 * 7 + 6)
+6 * 8 * 4 * 6 + (9 + 8 + 8 * 6 * (8 + 4 * 4 * 3) + 4) * 8
+7 + 3 + 4 * (6 * 4) * 6 * 8
+2 * 8 + 2 + 6 * (8 + (3 + 8 + 3 + 9 + 6) * 9) + 2
+((5 + 2) + 9 * 6 * (2 + 5) + 8 * 2) * 7 + 4 + 9 * 8
+(3 + 5 + 2) + 3 + 8 + 6 * 6 * 4
+(8 + 9 + 4 + (4 + 5 + 8) + 7 * 6) * 7 * 7 + 3 + 3 * 5
+(8 * 6 * 8 + 6 + 6) + ((5 + 8 + 5 + 6) + 8)
+3 * ((7 * 7) * 2 + 8 + 8) * (6 + 3 + (4 * 5 * 6 * 6)) * 8
+5 + 9 + 3 + 7 + 9 * (5 + 9 * 7 * (9 + 7 * 9 * 7) * 9 * 8)
+3 * (2 * 9 + (8 + 6 * 5) + 9)
+4 + 5 + 9 * 8 * (7 * (5 * 2) * (3 + 7 * 4 + 6 + 8) + 3)
+9 * ((6 * 8 * 3 * 8 * 6) + (3 + 5) + 4)
+(3 + (2 * 6 * 7 * 9 * 2 * 9) * (4 * 8 + 4 + 9) + (4 * 4 * 5)) * 9 * ((3 * 3 + 7 + 5) * 7 + 3 * (4 + 7 * 8 + 8)) * 9
+((4 * 9 * 6 * 4 * 9 + 6) * 7) + 4
+8 * 3 * 7 * ((8 + 3 + 9 * 7 + 3) + 5 * 9)
+(8 + 4 + 6 * (7 * 2) + 8 * 7) * 9 * 5
+2 * 8 + (8 + (4 * 8 + 6) + 7) * 4
+6 * 9 * 6 * 5 + 9 * (3 * 3 * 3 + (7 + 7 + 6 + 2 + 7) * 5)
+(3 * 4 * 5 + (9 * 7 * 3 * 2 * 9) * 4) + 6 + (4 + 9 + 2) * 8
+9 + 5 * 5 * (9 + 7 * 4 * (9 * 9 + 8)) * 6
+8 + ((4 + 5) * 2 + (5 + 5) * 7 + 8 * 5)
+(6 + 8) * (2 * (4 + 6 * 4 * 5 * 9)) * 4 + 5 * 4
+5 * 4 * (7 + 4 + 9 * (7 * 6 + 2 * 3 + 7 * 7) + (2 * 8 + 7 + 3 * 2) * 8) * 6 * 5
+7 * 2 * (9 * 4 * 4) + (5 * 6 * 2 + 6 + 9)
+(7 + 2 * 4 * 5 * 4 * 3) + 5 * (3 * 6 * 6 + 8)
+5 * (6 * 4) + 6 * 2 * 6 * ((6 * 3) * 3 + (7 * 8 * 5 * 5 * 7) * 7 * 9)
+9 * 7 * 9 + 4 * (2 * 3 + 2 + 8 + 2 + (3 + 8 * 9)) * 6
+(3 + 8 * 2 * (8 + 9 * 8 + 7) * 9 + 5) + ((5 * 5 * 3) * 9 + 9 * 3 * 6) + 4 + 8 + 2
+5 + 8 + 9 * 6
+9 * (7 + 5 + 9 * 8 + 5 + 9) + 5 + (3 + 9 * 3 + 6 + 6 + 9) * 8 * 8
+8 * (4 + (9 * 6 * 5 + 2 + 3) * (2 + 3 + 4 * 5 * 8) * 3) + 8 + (5 * (8 + 5 * 3 + 4 + 2 + 2) * 6 + 9 * (5 + 3 * 8 + 5) + 9) + 7
+3 * 6 + (3 * 2 + 3 * 4) + 3
+((5 * 6 + 9 * 6) + 8 * 9 * 8 + 8) + ((3 + 9) * 5 + 6 * 6 + 9) + (9 * 2 + (6 * 9 * 4 * 7 + 9 * 4) + 7 + 2) * 7
+((9 + 9 + 9) + 7 + 2) * 8 + 2 * 7 + 4 * 7
+3 * 4 + (7 + (7 * 7 * 2 + 2 * 2 + 2)) + 9
+(3 + (5 * 2 + 5 * 8) + (5 * 5 + 7) * 6) * 8 * (2 * 7 * 3 + 2 + 9)
+4 * (8 + (6 * 9 * 7) + 3 * 8 * 8 * 3) * (6 * 8 * 3) + 9 * 3
+6 + 5 + 3 * 3
+8 * 4 + (9 + 6 + 9 * (3 * 2 + 8 * 2 + 2) + 7)
+2 + 8 * ((4 * 8 * 8 * 4 * 8 * 7) + (3 + 3 + 6 + 2 + 6) * 8 * 9 * 2 * (8 * 3)) + 3 * 9
+((7 * 2 + 5 + 6 * 3 * 9) * 4) * 8 * 2 + (5 + (3 * 2 + 8)) * 2
+5 + (4 * (4 * 5 + 8 + 7) + 7 + 4) + (6 + 2 + (8 * 7 * 8)) * 4 * 5 * 6
+(6 + 4 + (3 * 6 * 9 + 3) * 5 * 2) + (5 * 3 * (9 + 3 * 3) + (5 + 3 + 6) + (2 + 8 + 5) * 2) + 4 * 7
+(6 * 2 * 7 * 7 + 4 * 2) + 4 + 2
+8 * 3 * 6 + 8 + ((3 + 4) * 3 * 2 * 2 + 8 * (2 * 7 + 2 * 7 + 7 + 6)) * (8 * 8 + 4 * 4 * 3)
+(5 + 5 + (9 * 9 * 5) * 4 + 4 + 4) * 7 * 3 * 2
+8 + (7 + 3 * 2 * 3) + 8 + 7
+3 + 7 * (4 + 5 + 9 + 4) + 5 * (8 + 8 + 5)
+((2 + 4 + 2 * 2) * 6 * 2 * 8 * 6 * 9) * 6
+2 * (2 * (6 + 8) + 5 * 7 * (4 * 2)) * 9
+4 + (4 + 3 * 8) * 3 + (3 * 4 * 3 * (4 * 5 + 7) + 7) * 2
+7 * ((7 + 5 + 9 + 9 * 4 + 3) * 9 * 7 + 5 * 8) + 9
+(4 + 3 * 6 + 2) * 4 * 4 + ((2 + 4 * 3 * 8 + 6 + 3) + 5 + 5) * 6 * 9
+5 * 6
+5 + 7 + 7 + ((3 * 3 * 3 * 2 + 3) * 3 + 2 + 4 * 3)
+2 * (4 * 4 * 8 * 3 + 2) + 2 * 3 + 2 * ((9 * 7 * 3 * 6 + 7) * 4)
+(8 + 9 * 8 * 8 * 7) * 9 + (2 + (9 + 9) * 2 * 9 + 7 * (4 * 9 + 9 + 6 * 8 + 2)) * 9
+7 + 3 + 3 * 9 + 8 * (5 + 7 * 3 * (7 + 8 * 3 + 6 + 3) * 2 + 5)
+(3 + (6 * 9) * 3) + 2 + 7 + 4
+(6 * 8 * 7) * (9 + 4 * 4) * 3 * 2 * ((3 + 3 * 6 + 7 * 6) * (3 + 9 + 5 * 9 * 8) + (7 + 7 * 9 + 2 * 4) + 2 + 4) + 9
+6 + (7 * 7 * 5 + 3 + (8 * 7 * 7) * 4) * 4
+4 + 7
+(7 * (6 * 3 * 5) * 4 * 5 * 7 + 3) + 5 + 6 * 8 * 4 + 5
+2 + 2 * 5 + (8 * 7 + 6 + 7 * 4 + 9)
+(3 + 6) * (2 * (6 * 8 + 6 * 3) * (3 + 9 * 2) * 3) + 8
+(7 * 8 * (5 + 4 + 2 * 8) + 4 * 5) + 5
+(2 * 7 * 4 + 6 * (8 * 9 * 2 * 8 + 7) + 5) * (9 * 7 * (4 + 5) * 3 * 2 + 4) * ((6 * 5) + 9 * 4)
+(6 + 6 * 9 + 6 * 7) * (5 + 9 * (8 + 7 * 4 + 8 * 4 + 2) + (7 + 2 + 8 * 5)) + 3 + (4 * 8 + (7 + 4)) * (2 * (6 + 2 * 4 * 2) * 5 * 5 + 9 + (6 + 8 * 6 * 4 + 9))
+9 + (3 + 8 + (7 + 7 * 3 * 4 * 5))
+9 + 9 * (4 + 9 + 9 * 5) * (8 * (4 + 9 + 3 * 3 + 6))
+8 * 3 + 7 * (7 * (4 + 5))
+2 + (4 + 5 + 2 * 4 * (3 * 6 + 3) * 7)
+(5 + (2 * 6 + 9 * 2 + 5) + 8 * 4) + (2 * 5 * 7 + 2 + (5 * 6 * 5 + 4) * 6) * ((4 + 4 + 7 + 9 * 9) * 6 + 6 * 6 * 8 * (7 + 2 * 6)) + 7 * 8
+3 * 5 * (7 * 4 + 8 * 4 * 6 * 6)
+(2 + 8 + (4 + 8 * 3 + 6) + 5 * 3) + 7 * 6
+7 + (9 * (8 * 4 + 2 * 8 + 9 + 4))
+(5 * 8 + (8 * 6 + 5 + 6 * 9)) * (5 * (3 * 6 + 5 * 6 + 7 + 8) + 5) + 2 * (6 + 6 * 6) + 5
+4 * 6
+((6 * 4 * 5 * 4) + (8 * 3 + 2 * 4 * 9 * 5) * 2 + 4 + 4 + 9) + 6 + 6
+8 * ((4 * 5) * 6 + 9) + (2 + 2 * 4 + 3) * 3 + 4
+2 + 5 * 4 * 6 * (3 * (2 * 9 * 9 + 2 + 2))
+(3 * 4 * 3 + 7 * 9) * 3 * (2 + 6 + 6 + 2)
+7 + (7 * 5 * 7 * (2 + 9 * 5 * 5 + 3))
+5 + 4 * 7 + ((6 + 7 * 9 + 8 + 2) + 5 * 3 * 8)
+5 + (2 + (9 * 8 * 6 + 4 + 6) * (4 * 5 * 6 * 4 + 6) * (9 * 9 + 9 + 5) + 3)
+((9 + 3 * 7 * 5) * 9 * 4 + 9) * 5
+(6 + (6 * 9 * 8 + 4 + 7) * (9 + 2 + 3) + 4 + 6) * 4 + 6 * 5
+6 * (2 * 4 + 7 * 3) * (7 + 3 + 7 + 6 * 7 + 2) + 2 + 6 * 3
+5 * (6 + 4 * 2 * 6 * (3 * 9 + 2) * 8) * 9 * 8
+7 + ((8 + 2 + 2 + 9) * 5) * 2 + 6 + 7 + 4
+(5 * 6 + (2 + 4 * 3 * 5) + 3 * (6 + 3 + 2 * 7 * 3 + 7) * 8) + 4 * 9 * 2 + 5 * 2
+5 * ((7 * 2 + 2 * 3 + 3) * 7 * 3 + 9 + 9)
+3 * 9 * ((7 + 3 * 5 + 9 + 5 * 2) + (3 * 4) * 9 * (7 * 7 + 7)) * 7 + 4
+3 * 4 + (8 * 6)
+(3 + 4 * 4 * 8 * 6) * (9 + (2 * 8 * 5 * 8 + 7 * 6) + (3 + 6 * 2 + 5) + 2 + 4 * 6) + 5 + (9 + (7 * 4) * 2 * (3 + 9 * 3 * 3 + 6) * 9 + 3)
+3 + 8 + 8 * 2 * 5
+(7 + 4) + 8 * 5 * 3 * 6 * 4
+3 * 3 * 9 + (6 * 7 + 3 + (5 + 7) + 5 + 9) + (9 + (8 + 2 * 9 + 9) * 9 + (5 * 9) + 2)
+3 + ((3 + 9 + 8 + 3 * 9) + 3 + (5 + 9 + 3 * 7) * 9) + 8 + 6
+9 + 2 + 3 * (8 * 6 * 8 + 9 * (9 + 7 + 2 + 9))
+(5 * (9 * 4 + 3 + 8 * 3) + (4 + 5 * 7 + 6 * 9) * 9 * 6) * 7
+((6 * 7 * 5 * 2) * 6 + (6 * 9 * 9 + 7 * 3) * (2 * 7) * (8 * 7 + 7 * 8 + 2) + 4) + 5 + ((8 + 5 + 7 * 2 * 2) + 9 + (4 + 5 * 4 * 6 + 4 * 7) * 4 * 5 * 3) * 7 + 9
+8 * 2
+5 * 2 * (8 * 5) * (6 * 6 * (8 + 6) + 7 + 5)
+9 * 9 * (2 + 4 * 6 * 2) + 3 + 7 * ((7 * 5 * 8 * 8 * 4) + 7 * (6 + 9 + 4 + 5) * 3)
+4 * 3 * (3 * 4 * 5 * 2) + 3 * (7 + 7 * 4 * 8 + 3 + (3 + 5 + 7 + 5 * 5)) + 5
+7 + 8 + 2 + 9 + (2 + 6) * (3 + 2)
+3 * (4 + 3) + 6
+8 * 4 * (9 + 7 * 2) * 3 + ((5 * 5 * 8 + 5) + 5)
+2 * 6 + 5 * 4 + 9 + (8 * (8 + 9 + 9) * 5 * (9 * 8 + 3))
+((9 + 9) + 4 + 2 + 9 + 8 * 7) + 4
+2 + (8 + (8 + 6) + (2 * 4 + 8 + 7) + 7 * (5 * 5)) + 7 * 3 + (2 + 8)
+9 + 6 * 3 + 7 + 4 + 3
+6 + 7 * 2
+9 * 3 * (2 + 6 * (7 + 3) + (9 + 9 * 2 * 9 * 2 + 3)) + 6
+(8 * 8 + (6 + 3 + 4 * 9 + 8 * 4) + 7 * (8 * 2 * 3) * 6) * 5 + 2 * 8
+(8 * 4) + 8 + 2
+8 + 2 * (8 * 6 * (4 * 6 + 9 * 7 + 8) * 6)
+(4 + (5 * 4 + 6 + 7 + 4 * 8) * 9 * 7) * 6 + (3 + 4 * 9 * 3) * 9
+8 + 9 * (5 * 2 + 7 + 7 * 2) * 8 + 8
+5 + 9 * 2 + 8 + 2 + (6 * 2 * 8 * 5)
+4 + 3 + ((9 * 6 * 6 * 5 * 7) + 7 + 4 + 9 + 9) + 2
+9 + 3 * 2 + 8 * 6
+4 * (3 * 3 + 4)
+4 + 4 * ((2 + 2) + 6 + 5)
+7 * 2 * 4 * 6 + 9
+(9 + 5) * (3 + 5 * 2) * 2 + 7
+(6 * 9 + 7 + 2) + 8 * 4 * 4 + (8 * (3 + 8 + 7 + 4 * 5) * (2 * 6) * 6) * 7
+3 + ((3 * 6 * 5 * 6 * 4 + 8) * 6 * (2 + 9 + 3) + (4 + 5 * 2 + 9 + 4 + 3) * (4 * 4 + 7 * 3) + 4)
+(8 * 4 * 5 * 5) + (5 + 8 * 6) * 7 + 8 + 5
+(6 * 7 * 6 + 8 * 9 * 8) * 4 * 8 * 8 * 3
+3 * 9 * (6 + 5 + 3 * (4 * 6))
+5 * 2 * 4 + (5 + 7 + 8 * 6) + (2 + 3)
+((9 * 9 * 4 + 7 * 8 + 7) + 9 + (9 + 3 * 9 + 2)) + 6 * 4 + (2 + 3 + (7 * 3)) + (3 + 6 + 9 + 4) * 2
+(3 + 2 * 3 * (5 * 9 + 2 * 7 * 9 * 7) + 7) * 7 + (2 * 8 + 2 * 2) * 3 + 5 * 3
+5 * 6 * 6 * (7 * 3 + 7 + 5 * 6 * 6) + (9 * 8 + 3 + 8 + 4 * 5)
+(9 + 7 * 8 * 4) * 6
+(6 * 5 + 5 * 4) + (4 * 4 * 5 * (7 * 2) * 6 + 8) + 6 * 7
+(8 + 7 + 9) * 3 + 2 * 6 * 7
+(3 * 6 + 4 + 9 + 5 + 9) + 4 + ((5 + 3) + 6 + 5 * 7 + 6)
+5 * 8 * 7 + 8 + ((8 * 9 * 9 * 6 * 2 * 7) + 8 + (2 + 7 * 8 + 6 + 7 * 2) * 8 + (5 + 2)) * 3
+((7 + 5 * 4 * 2 * 4 * 7) + 6 + 2 * 8 * 9) * (6 * 3 + 4 + 2 + 3) + 4 + 3 + 4 * 2
+9 + 5 * 6 + 8 * 6 * 3
+5 * 9 + (9 + (4 + 3 * 4 + 7) + (5 + 6) * 7) * 3 + (5 * 4 * 7)
+((5 + 7 * 7 + 2 * 9) * 2 + 8) * (4 * (7 * 5 * 7 + 2 * 8) * (3 * 9 * 9 + 8) * 2 * 9 * 7) * 9
+3 * 6 + 7 + 5 + ((7 * 2 + 7) * 9 * 7 * 2) + (3 * 4 + 6)
+((9 + 7 * 5 * 7 + 7) * 8 * (6 + 7 + 5 + 9 + 2)) + 9 * (9 + (8 + 4 + 2) + 8 * 7 + 7 * 6) * 7 * 5
+(8 + 7 + 6 * (6 * 4 + 2 * 4 * 6 + 6)) * 8 * 5 * (8 + 3)
+5 + 2 + 9 + (6 * 7 + 8) * 9 * 7
+6 * 3 + 9 * 4 + 3
+3 + 8 * 8 + (6 + 8 * 4 * 5 * 6) * 6
+7 * (9 * 9 * 5 * 4 * 7 * 9) * 8 * ((4 * 4) * 2 + 7 + 5 * 3 * 8) + 4
+5 + (2 * (9 + 4 * 3 + 6 * 4) * 5 + 7 + 2)
+9 * (5 * (3 * 3 + 6 + 7) * (2 + 4 + 8) + 8) + 5 * 8
+6 * 8 * (8 + 6) * 6 + 8
+5 + 6 + 9
+(2 * (7 * 9 + 7 + 3 + 9)) * 7 + (5 + 8 * 9 * 7 * (5 + 6)) + 5
+(9 + 3 + 4 + 4) + (7 + 5) * 3 + 5 + 4
+4 * 7 + 3
+4 * 4 + 3 + 6 + 7
+3 * 3 + 8 * (2 + 9 * 8 + 9) * 8 * 7
+(8 + 5 + 2 + 5 * 3 * 8) + 5
+2 * 7 * 4 * (4 + 8 + 5)
+(3 + 5 * 4 + 8 * (9 * 8) * 7) + ((9 + 3 * 2) + (3 + 6 * 5 + 8 * 2 + 9) + 6 * 6) + 8 + 5 * 8 + 5
+(6 * (5 * 6 * 3 + 8)) + 4 + 4 * 4 + 6 * (6 * 3 + 8 + 4)
+3 + 9 * 2 + 8 + (5 * (5 * 2)) * 9
+2 * (3 * 2 + (8 * 6 * 3 * 7 * 5 + 6) * 3 * 5)
+(8 + 9) * 2 * (3 + 9 * 5 * 9 + 7) * 9
+2 * 4 * (9 * 4 + 8 + 7 * 3)
+5 * (7 * 2 * 8 * 5 * 4 * 3) * 9
+(7 * 4 + 3 + 8) * (6 + 5 + (3 + 2 * 5 * 6) + (8 * 9 * 5 * 6) * 3) * 3
+(7 * (2 + 6 * 7)) + 8 * 9 + 5
+6 + (2 + 2 * 3 * 6 + 4) + 6 + 6 * (4 * 5 + (8 * 8 * 2 * 6 + 7 + 9) * (5 * 2 * 4 * 7 * 7 + 8) + 9)
+(2 + (5 * 8 + 8 + 9) * 3 * 2 + 9 * 8) * 5 * 3
+(6 * 2 * (8 * 6 * 4 * 3) + 7 + 7 + 6) * 5 + 6 + 9 + 2
+(2 * 8 + (9 * 4 * 5 + 6 * 7 + 8) * 2 + (3 * 7 * 4 + 4 + 9)) + 5 + 3 * 8 * (7 * 2 * (3 * 9)) * 4
+8 + (4 + 2 + 9 * 4 * (8 * 8 + 6 + 3 * 6 * 6))
+4 + (4 + (5 * 4 * 7) * (4 * 9) + 8 + (3 * 9 * 2 + 7 * 8) * 3) * 8 + (9 + 3) + 6 + (9 * 5 + 5 + 4)
+(2 + 6) + 5 * (9 * 5 + 7 + 2 + 7 + 8)
+7 + 5 * 3 + 7 + (8 * 5 + (5 * 7 * 4) * 5 * 8 + (6 + 2 + 5)) + 8
+5 + ((6 + 7 + 9 * 7 * 8) * (9 * 5 + 4) * 5 * 9 + (4 + 5 * 2 + 4 * 5 * 8))
+5 * (9 * 7 + 9) * 7 + 3 + 2
+8 * (2 * 5 + (2 * 9 + 8 + 6) + 3) * 4 + 7 + 6
+4 + 2 + (4 + 4) * ((2 * 6 * 2 * 2) * 8 * 3 + 9)
+((3 + 2 * 5 + 6 * 8) + 3 * 9 + 2 + 5) + 9 + 2 + 4 * (2 * 9 * (9 + 9 * 4 + 7 * 6) + 5 * 8 + (8 * 8 + 5)) + (3 * 3 + 6 + 5 + 4 + 6)
+2 * 6 * 4 + (4 * (8 * 3) * 8 + 8 + 8) + 4
+4 + (4 * (6 * 8 + 6))
+(5 * 8 * (5 + 8 * 7 + 5 * 7) * 5) + (6 + (4 * 7) * 7 * 7)
+4 * 5 * 9 + ((3 * 2 * 8 + 8 + 6 + 4) + (4 * 5 * 4)) * 3 * 5
+9 * 9 * (7 + 6 * 9) * (9 + (5 * 8 * 5 + 2) + 8 + 4)
+((9 * 2 * 7 * 6) + 6 + (5 * 5)) + 8 * 9 * ((5 + 4 + 8) * 5)
+7 * 4 * 7 + 9 * ((8 * 7 * 6 * 4 + 3) * 5 + (8 + 9) * 9 + 4 * 8)
+9 + 6 * 9 * ((3 + 5 * 9) * 5) * 6
+(7 + 5 + 2 + (4 + 5 + 7 * 7 * 4)) * 3 + (2 + 7 * (9 + 9 * 3 + 7 * 2) * 6 * 7 * (3 + 3)) * ((7 + 5) * 4 + 3 * (4 * 6 + 5 * 2 + 8 * 5) + 9 + 8)
+6 * 4 * 6 * (8 * 8 * 3 + 3) * 8
+(3 + (7 + 2 * 4 + 4 * 8) * (5 + 7 * 3) * 5 * 4 * (2 + 3 * 9)) + 8 + 8
+(7 + 5 * (3 + 5 * 5 + 5 * 4)) + 4 + 3
+9 + 9 + (9 * 7 + 3) + (7 * 8 * 6 + 5) + 8 * 4
+8 * 8 * 6 * 9 + 9 * 4
+4 * 3 + (6 * 7 * 7 * 3 * (3 + 6 * 5 * 5 * 6))
+2 + 5 + 2 * 4 * (2 + 9)
+(6 + 6) * 8 + (9 + 3 + 8 * 4)
+(9 + 4 * 3) + 5
+7 + 8 * (3 * 6 * 2 + 3 * 9) + 9 * (9 * 3 + 8 * 6 * 5 * 3) * 8
+((9 * 8 * 5 + 6 + 2 * 4) + 3 + 5 * 2) + 5 * 4 + 9 * 9 + 7
+3 + 6 + 3 + (9 + 7 + 7 * (9 * 2 + 7) * 6 + 2)
+(3 * 2 + 9 + 8 * 8) * 4 + 5 + 8 + (3 * 6 + 8 * 3 * (2 * 9)) * 5
+8 * ((2 + 9 + 3 + 4 * 7) * (2 + 3 * 9)) * 3
+9 * 6 * (3 * 7 * 5) * 5 + 4 * 7
+(5 + 8 + 3 + 2 * 9) + 4 * 9 * 6
+6 * (7 + 5) * (8 + (6 * 3 + 3)) * 4 * (5 * 2 * 7 + 9 + (2 * 9 + 2 + 6 + 5 * 7))
+((7 * 8) + (2 + 6 * 9 + 5 * 4) * (6 + 8 * 9 + 2 + 2) * (3 * 3)) + 3 + (7 + 6 * 4 + 4) * 6 + 4
+3 + 9 * (6 * (5 * 5 + 4 + 7 + 7 * 8) + 7 * 3) + 7
+5 + (4 + (4 + 4 * 7) + 5) + (7 * 4 * 6) * 8
+7 + (4 + 6 + (3 * 2 * 9 + 6 * 5) * 8 * 7 * 5) + 2
+5 * ((6 + 6) * 6 + 6 * 3 * 3) + (7 * 2) + (4 + (9 + 9) + (5 + 8 * 6 * 9) + 6) + 7 + 5
+(9 * 3 + 7) + 8 * 3 + 2
+3 + 9 * (4 + 5 + 4 + 4)
+(8 * 5 * 2 + 9 * 4 * (6 + 9 + 3 + 9 * 3 + 5)) + 5 * 3 * 2
+4 * (2 * 6 + 9) * 2 * (2 + 6 * (7 + 6 * 9 * 2 * 5) + (3 + 8 * 6)) * 3 * 7
+6 + 7
+7 + 6 * (2 * 8 + 5 * 3) * (3 * 2 + 2 * 7)
+5 + 5 * 5 + 9 * 9 * (2 * 9)
+7 * 5 + ((8 * 9 * 3 * 3 + 6) * 5) + 4
+6 + (6 + 4 + 3) * 4 + 8 + 8 + 8
+(5 * (8 + 2 + 9 * 7 + 6 + 6) + 7 * 4 + (2 * 6 * 3 + 5 * 6) + 7) + (2 * 3 + (5 * 3 * 5 * 5) + 9 * 6 + 7) * 7 + 8
+(3 * 3 + 9 + 2 * 5 * 6) + (9 + 3 + 2) * 7 * 6 + 3
+(2 + 4 + 8 * 7) + 2 + 5 * 6 * ((4 * 3 * 7 * 5 * 7 * 2) + 4)
+9 * (8 + 5)
+7 + 6 + (6 * 6 + (7 + 8 * 5) * 9) * 4 + ((3 + 4 + 6 * 7) + 4 + 7 * 3 * 5)
+2 * (8 + 7 + 4 + 3 * 8) * 7 + 4 * 5
+9 + 9 * (8 + 9 * (7 * 3 * 7) * 3 + 3) + 9
+8 + ((4 + 6 * 5 * 6 + 7) + 7 + 7 * 8) * 6
+(3 * (9 * 3 * 6 + 5) * 7 * 9 + 9) * 5 * 2
+(2 + 4 + 5 * 7 + 6) * (7 + 2 * 6) + 6 * 3 + 3 + 6
+(4 + 7 * 2 + 6 + 2) + 3 * 5 * 8 + 7
+2 * 7 * 2 + 6
+8 + (5 * 9 * (6 * 9 + 4) + 5 + 8) * ((8 * 9 + 4 + 8 + 4) + (6 * 2) + (7 * 9 + 2 * 3 + 4) + 7) + 8 + 8 * (9 + 2 * 5 + 9)
+4 * (7 + (9 * 2)) * 9 + 9 + (9 + 3 + 2 + 2 * 8 * 9) + (3 * 4 * (9 * 2 + 5 * 6))
+9 * (3 * 8 * 6 * 3 + 7 + 2) + 6 * (5 + 8) * 2 * 3
+9 * 2 + 6 * (7 + 3)
+4 + (8 * (8 + 2 + 8 * 6 * 9) + 2 + 4 * 2) + 8 * 5 * 4 * 8
+4 * 7 + ((7 * 4 + 7 * 9 + 5) + 3 * (6 * 7 * 6 * 4 + 9))
+((3 * 4 + 8) + 5 * 7 + 8) + 9 + (9 + 6 + (6 * 5 * 6) * (9 * 3 * 4 * 7 + 7 + 5) + 2 + 4) + 4 * 2 * 3
+4 + ((5 * 6 * 5 * 8 + 2) + (6 + 5 * 2 * 2 + 4 * 9) * 8 + (2 * 4 + 5 + 4) + 5)
+(2 * 9 + 9 * 2) + 4 * 5
+(2 + 9 * 8 + 2 + 6) + 4 + 9
+7 + (2 + 2 + 7 * (4 * 8 * 4 + 6 * 9 * 7)) * 3 + 6 * 9
+7 * 4 * (9 * 4 + 9) + 4
+9 * ((9 * 8 + 8 * 7 * 8) * 9) + ((5 + 4 * 6) + 2 + (3 * 7 * 3 * 7 + 4 * 4))
+6 * (9 * 6 * (3 * 3 + 8 * 3 * 6)) * (7 + 3 + 7 * 7 * 9 * (7 * 9)) * (3 + 3 * 5) * 9
+3 + (4 + 4 * 9) + 5
+((7 + 9 * 6 * 7 + 3 * 5) + 5 + (5 * 9 * 6) + (3 * 4 * 2) + 4) + 6
+5 + ((8 + 6 + 9 + 9 + 7) * 7) + 4 * 8 + 3
+(9 * 2) + 8 * 6 * 3 * 6
+(8 + 7) * 4 * (9 * (4 + 6 * 7 + 4 * 6 + 4)) + 2 * (4 * 3 + 9)
+((9 + 6) * 9 + 5 * 2) + 5 * 5 + 6 * 7 * 4
+5 * 9 + (5 + 9 * 5 * 7 + (2 * 6 * 4) * 3) * (8 * 4) * 7 * ((9 + 8 * 5 * 5) * 4 + 4 * 6 * (4 + 9 * 2 + 7) + 5)
+4 * 8 + 9 * (8 + 6 * (5 + 9 * 3 * 5) * 3)
+7 * 6 + ((8 * 3) + (3 * 7 * 7 + 6 * 6) + 8 * 9)
+4 + 9 * (6 + 2 + 6 + 5) + 6 + 6
+(2 * 8) + 9 * (2 + (5 * 6 * 7 * 8 * 7 + 8) * 4 + (2 * 7 * 3 + 4 + 6) * 7 + 4) * 6 + 2
+2 * 5 * 7 + 7 + 3 * ((2 + 4 + 3 + 7 + 3) + (3 + 4 + 6 * 9 * 7 * 8) * 6 + 2 + 2 + 8)
+3 + 3 * 5 * ((6 * 8 + 8 * 3) * 6) + (8 + (8 * 9 + 4 * 2 + 5) + 5 * (6 * 4) * 4 + (8 * 4))
+2 + (8 * 8 + 4 * (4 + 6 * 2) * 6 * 4) + ((3 + 8) + 8 * 8) * (3 * (7 * 7 + 9 * 7) * 5 + 3 + 5) + (2 + 4 * 4 * (6 + 9) + 8 + 6)
+7 * 5 * (5 * 4 * 8 + 3 * 2) + 8 * 5 + 8
+7 * 3 + (4 * 8 + 9)
+8 + 7 + 5 + 2
+((3 * 7 + 3 + 5 * 4 * 2) + 8 * (5 * 9 * 9) * 3 + 5) + (4 * 8 * 9) * 6 * 2 * (6 * (8 + 3 * 4 + 5 * 6 + 3))
+7 + (5 + 8 * 4 + 5 + 5 + 3) * 3 + 7
+3 * 4 + (8 + 3 * 7 * 3 + (2 + 2 * 9 * 6 * 9)) + 2 * 4 * (6 * 3 * 8 + 6)
+(9 * 8 + 2) + 8 * ((6 + 4 + 9) * 7) * 2 + (4 * 5 * 4 + 5)
+8 + 3 * 3 * 5 * ((6 * 5 * 7 + 5) + 5 * 2 * 2)
+8 + 5 * (5 * 6 * 5 + (8 + 9 + 6 * 3 * 6)) * 3 * 6 * 5
+8 + 8 + 6 + ((5 + 9 + 2 * 4 + 4 + 9) + 7) * 2 + (9 * (8 + 5 + 5 * 8) * 5 + 8)
+(7 + 5 * 8 * 3 * 8) * 9 + ((8 * 2 * 3 + 9 + 7 * 5) + (6 + 4 * 2 * 4 + 8 + 3) * (3 + 7 * 4 * 9) + 6 + 4) * (3 * 6 * 6 * (2 * 7 + 2) + 2) * 4
+(9 * 4 * 8 * 2 + 6 + 4) * (8 * 8) * 4 + 8
+4 * 3 * 9 * (6 + 3 + 5 + (6 * 9)) + (2 + 5)
+4 * 9 + 6 + (2 + 6 * 6) * (7 + 4 + 4 * 5 * (7 * 6 * 2 * 3 + 9 + 4)) + 9
+((8 * 5 + 5) + 2) + 4 * 9
+5 + 6 + 6 * 4 * 5 * (9 + (4 + 5 + 9 + 4 * 2) + 4)
+2 * 9 * (7 + 2 * 5) + 8 * (2 + 7 * 2)
+3 * 3 + 9 * (6 * 3 * (7 + 4 + 3 * 9 * 4) + 4 * 5)
+((5 + 5 * 8 + 9 + 9 + 6) + 9 * 8 * 3) + 5 + 7 + (5 + 2 * 8)
+2 + (9 * 4) + 6 + 6
+(5 + 6 + 9 * 3 * 2) + (8 + 2 + 3 + 5 + (8 + 6 * 2)) + 8 + 3 + 3
+(7 + (3 * 6 + 8 * 8 + 8) * (2 * 8) * 6) + (5 + 2 * (5 + 9) + 5 * 6)
+(5 + 9 * 9 + 5) * ((5 * 9) * (8 + 3 + 7 * 8 * 7 + 6) + 7 + 4)
+4 * (2 * 9) + 9 + 8 * 9 + 2
+9 + ((6 + 5 * 9 + 3 + 6) + (6 * 6)) + (2 + 9 + 9) + (3 + 8) + 6
+7 + (3 + 2 * 6) * 4 + 9
+3 + 7 * 6 + (7 + 6 * 6 * 3 * (3 + 7 + 9 + 8 + 8)) + 7 * (3 * 7 * 9 * 9)
+(9 * 5 + 3 * 2 + 2 + 7) * 4 * 5 + 7 * 6 + 6
+6 * 6 + 4
+6 + 9 + 5 * (2 * 3 * 7 + (7 + 4)) + 9 * 5
+6 * 5 + (6 * 4 + (6 * 9 * 9) + 8 * 5 + (8 + 6 + 5 * 2 + 9 * 5))
+(5 + (7 * 8 + 8 * 3 * 2 + 6) * 9 * 5) * (4 + (3 * 5 * 5 * 2 * 4) * 6 + 2) * 7
+3 * 7 * 8 + 2 + ((4 + 8 + 8 * 4) + 2 * (7 * 5 + 5 * 3 * 3 + 7))
+9 + (5 + (5 * 7) + 6 * 6) * 6 + 2 + (7 + 6)
+((9 + 7 * 8) + (5 * 4) + (2 + 2 + 6 * 3 + 5) + 3 * (9 + 6) + 2) * 8 * 3 * 9 * (6 + 9) + 8
+8 + 2 + 6 * ((9 * 5 + 6 + 2) * 4 * 5 * 9 * 4 + 9) + 5
+(5 * 2 * 9 + 8 * 8) * 7 * 8 * 8 + 9 * 9
+8 * (2 + (7 + 7)) + 8
+(3 + 7) * ((7 + 4) + 5 + 6 * 5 + 9) + 8
+3 * 2 * 2 * (3 + (4 + 3 + 2) * (2 * 9) + 3 * 9 * (8 * 3)) * 8
+7 + (8 + 4 + (5 + 2 + 3 + 5 * 6) * 2 + 6 + 9) + (6 + 4 * (3 + 2) + 9 * 4)
+5 * (5 + 4 * 3 * 7 * 2)
+7 + 5 * (3 + 7 + 2 + (8 * 8 + 8) + 8 + 4) + 2
+(7 + (9 + 2 * 9 + 2 + 3 * 9) * 6 * 8) + 6 + (3 + 3 * (7 + 6 * 3 * 5 * 6)) + 2
+(9 + 6 * 3) + 7 * 6
+3 * (9 + 6 + 3 + 5) + 6
+3 + 6 * 5 + (6 + (5 * 4) + 7 + 5 * 4 * 4) * 9
+(9 * 8 * 3) + ((8 + 2 + 8 + 8 * 8) + (3 + 2 * 7 * 5 + 3) + 5)
+2 + (3 + 2) * 5 * 9 * 4
+4 + 4 + 3 + 8 * 8 * 4
+(5 + 6 * 9) * 9 * 3 + (6 * 9 * 9 + 2 * 9) + 2
+7 * (9 + 4 * (8 * 4 * 7 * 8) + (5 * 3) * (8 * 2 + 2 + 8) + 4) + 4 + 7 * (6 * 2 * 9 + 7)
+2 + 5 * 6 * (4 + 2 * 8 * 7 * 2)
+6 * (4 + (3 * 4 + 5 + 8)) * 6 + 5 * 4 + 3
+(9 + 5) * 4 + 2 * (5 * (3 + 2 * 8 + 2) * 3) + 8 * 5
+2 * 2 + 7 + 5 + (6 * (7 + 4 * 5) + (8 * 5 * 5 * 2 + 7) + (5 + 2)) * 3
+9 + (3 * 9 + 8 * 7 * 8) * (4 * 8 + 7) * (3 * 2) + 7
+5 + (5 + (6 * 2) * 8 * 2 + (8 * 6 * 3 + 3 * 9) + (2 * 8 + 2 * 5)) * 4 * 8 * 7
+3 * (8 * 9) * (3 * 6 + 4) + 2
+7 * (4 * 5 + 5 * 3) + 9 * (9 * 4 + 2 * 4 + 6)
+8 + 5 + 7 + 7 * 3 * ((6 * 5 * 4) * 7 * 5 * 3 * 4 * 8)
+8 + ((4 + 2 * 4 * 6 * 4) * (3 * 8 * 8 * 4) + 4 + 6 * 6 * 3) * 6 * 8
+9 * 9 + (5 + 3 * (8 * 9 + 8 + 3 + 6) * 2 * 2) * 5
+8 + 7 + (9 * 3 + 9 * (2 + 4 + 8 + 2) + 4) * 3 + 5 * 5
+9 * (3 * 7 * (3 * 6 * 3 * 5) + 5 * 3 + 8) * 7 + 7 * 2
+9 + 2 * (7 * (8 * 7 * 4)) + 7 + 4
+(2 * 4 * (4 * 9 * 7 * 7 + 3) + 5) * 4 + 8 * 5 + 4 * 5
+(7 * 3 + 7 + 7 * 3 + (4 * 4 * 9 + 4 * 7)) * 6 * (4 + 5 * 3) * 4 + 2
+8 + (2 + 6 * 9 * (7 * 4 * 9) + (2 * 4 + 3)) + (5 + 9 * 2 * 9 + 7) + 2 * 5
+6 + 9 * 6 + 6 + (8 + 7) * 4
+8 + 8 * 7 + 6 * 2 + 8
+6 * 2 + 8
+5 + (7 * 9 + 6) * (8 + (3 + 9 + 8)) + (5 + 4 + 5 + 5 * 5) + (8 * 6)
+(9 * 9 * 8 + 7 * 2) + 7
+6 + 7 + 8 + (6 * (5 * 8 * 4 + 5 + 7) + 4 + 9 * (3 * 2)) + (7 + 6 + 6)
+(5 * 5 * 9 * 6 + (2 + 9 * 5 * 6) + 9) + 7 * 6 \ No newline at end of file
diff --git a/2020/18/puzzles.c b/2020/18/puzzles.c
new file mode 100644
index 0000000..5afbe00
--- /dev/null
+++ b/2020/18/puzzles.c
@@ -0,0 +1,126 @@
+#define _GNU_SOURCE
+#include <sys/types.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+static unsigned long long parse_number(void);
+static unsigned long long parse_digit(void);
+static unsigned long long parse_result(void);
+
+#ifdef PART2
+static unsigned long long parse_sum(void);
+static unsigned long long parse_product(void);
+#endif
+
+char *g_current;
+
+/* Convert the current number from a string to an int */
+unsigned long long
+parse_number(void)
+{
+ unsigned long long number = 0;
+ while (isdigit(*g_current))
+ number = number * 10 + *g_current++ - '0';
+
+ return number;
+}
+
+/* Parse the current digit pointed to by `g_current` */
+unsigned long long
+parse_digit(void)
+{
+ if (isdigit(*g_current))
+ return parse_number();
+
+ /* If not a digit, it's a parenthesis */
+ g_current++;
+ unsigned long long result = parse_result();
+ g_current++;
+ return result;
+}
+
+#ifdef PART2
+/* Parse and compute a sum */
+unsigned long long
+parse_sum(void)
+{
+ unsigned long long result = parse_digit();
+
+ while (*g_current == '+') {
+ g_current++;
+ result += parse_digit();
+ }
+
+ return result;
+}
+
+/* Parse and compute a product */
+unsigned long long
+parse_product(void)
+{
+ unsigned long long result = parse_sum();
+
+ while (*g_current == '*') {
+ g_current++;
+ result *= parse_sum();
+ }
+
+ return result;
+}
+#endif
+
+/* Parse and compute a sum */
+unsigned long long
+parse_result(void)
+{
+#ifdef PART2
+ return parse_product();
+#else
+ unsigned long long result = parse_digit();
+
+ while (*g_current == '+' || *g_current == '*') {
+ if (*g_current++ == '+')
+ result += parse_digit();
+ else
+ result *= parse_digit();
+ }
+
+ return result;
+#endif
+}
+
+/* Remove the spaces from user input */
+static void
+remove_spaces(char *str)
+{
+ char const *c = str;
+ do
+ while (*c == ' ')
+ c++;
+ while ((*str++ = *c++));
+}
+
+int
+main(void)
+{
+ FILE *fp;
+ char *line = NULL;
+ size_t len = 0;
+ ssize_t read;
+
+ if (!(fp = fopen("input", "r")))
+ err(EXIT_FAILURE, "fopen");
+
+ unsigned long long acc = 0;
+ while ((read = getline(&line, &len, fp)) != -1) {
+ remove_spaces(line);
+ g_current = line;
+ acc += parse_result();
+ }
+
+ printf("%llu\n", acc);
+ return EXIT_SUCCESS;
+}
diff --git a/2020/19/input b/2020/19/input
new file mode 100644
index 0000000..d45070d
--- /dev/null
+++ b/2020/19/input
@@ -0,0 +1,562 @@
+72: "b"
+45: 46 52 | 9 72
+85: 9 52 | 9 72
+82: 52 87 | 72 77
+133: 52 30 | 72 56
+118: 7 52 | 70 72
+18: 52 113 | 72 52
+119: 72 46 | 52 18
+25: 19 72 | 103 52
+32: 90 52 | 78 72
+50: 113 113
+71: 72 106 | 52 128
+3: 103 72 | 18 52
+41: 86 72 | 19 52
+96: 86 72 | 108 52
+33: 44 52 | 104 72
+127: 52 36 | 72 50
+51: 72 79 | 52 38
+43: 72 50 | 52 106
+14: 32 72 | 129 52
+6: 2 72 | 33 52
+108: 52 72 | 72 52
+129: 6 52 | 82 72
+34: 127 72 | 3 52
+74: 128 52 | 9 72
+80: 52 103 | 72 19
+2: 134 72 | 13 52
+54: 128 72 | 114 52
+19: 72 72 | 113 52
+0: 8 11
+30: 132 72 | 39 52
+60: 72 64 | 52 5
+4: 18 52 | 114 72
+57: 72 71 | 52 54
+111: 52 27 | 72 102
+76: 122 52 | 75 72
+134: 86 52 | 9 72
+49: 17 52 | 81 72
+124: 103 72 | 86 52
+123: 72 28 | 52 121
+117: 18 52 | 86 72
+26: 51 72 | 58 52
+62: 85 52 | 44 72
+55: 126 52 | 92 72
+115: 72 13 | 52 67
+109: 128 72 | 106 52
+52: "a"
+93: 60 52 | 133 72
+64: 67 72 | 84 52
+102: 52 128 | 72 48
+84: 86 52 | 46 72
+77: 41 72 | 21 52
+27: 52 9 | 72 108
+95: 89 72 | 105 52
+36: 52 72
+110: 72 50 | 52 9
+9: 72 72
+120: 72 19 | 52 18
+67: 52 48
+112: 65 72 | 119 52
+75: 62 52 | 123 72
+23: 15 72 | 119 52
+42: 131 52 | 61 72
+94: 52 91 | 72 18
+66: 52 128 | 72 103
+10: 113 108
+37: 52 18 | 72 50
+98: 72 69 | 52 94
+126: 115 52 | 29 72
+79: 59 52 | 94 72
+104: 19 72 | 36 52
+125: 96 72 | 4 52
+122: 52 73 | 72 112
+130: 52 20 | 72 45
+90: 72 40 | 52 88
+132: 103 52
+121: 91 52 | 46 72
+7: 52 114 | 72 128
+5: 52 66 | 72 41
+97: 52 18 | 72 91
+89: 72 109 | 52 116
+53: 52 108 | 72 128
+114: 52 113 | 72 72
+16: 1 52 | 110 72
+113: 72 | 52
+31: 52 14 | 72 12
+69: 52 103 | 72 48
+128: 72 52
+40: 72 3 | 52 83
+101: 63 52 | 127 72
+1: 72 91 | 52 114
+58: 52 111 | 72 99
+13: 19 72 | 9 52
+35: 22 72 | 125 52
+65: 72 114 | 52 91
+12: 52 24 | 72 93
+46: 72 72 | 52 52
+20: 9 72
+73: 72 37 | 52 43
+15: 52 50 | 72 108
+103: 52 52
+106: 72 52 | 72 72
+21: 36 72
+28: 72 50 | 52 46
+78: 72 16 | 52 23
+70: 36 72 | 19 52
+87: 72 107 | 52 47
+116: 19 52 | 106 72
+29: 72 68 | 52 65
+8: 42
+68: 9 52 | 128 72
+99: 110 72 | 25 52
+17: 52 118 | 72 130
+11: 42 31
+48: 52 52 | 72 52
+83: 48 113
+105: 52 100 | 72 80
+61: 55 52 | 26 72
+100: 48 52 | 108 72
+56: 52 53 | 72 74
+63: 52 106 | 72 9
+44: 72 114 | 52 128
+47: 52 50 | 72 36
+107: 52 36 | 72 91
+39: 114 72 | 86 52
+86: 52 72 | 52 52
+24: 52 95 | 72 35
+81: 98 72 | 34 52
+131: 49 52 | 76 72
+92: 52 101 | 72 57
+59: 52 114 | 72 50
+38: 52 74 | 72 124
+88: 97 72 | 10 52
+22: 117 72 | 120 52
+91: 72 72 | 52 72
+
+bbabbaabaabaaaababbbbabaabbaabab
+baaabaaabaaababbabababaabababaaa
+aaabbbabaabbbbbbbbabaaba
+aaababbbaaabaabbabbbbabbaaaabbbb
+ababaabbaabbbaabbbabbababbabbbbbbaaabbbbaaaabbbabbbaaabbaaaabbaa
+bbbbaabaababaaabbbaaaaabbbbabbabaaabaabaabbaaaba
+bbaababbbbbbaabbbbbaaaabbbbbabaaaabbbabaabbbaaaa
+aaaaaaaaaababaaaabaaababaabbbbaababaaaaaaaaabaaabbaabbbaaabaabababbbbaaabbbbbabb
+bbbbabbbbbbbbbbababbabbabbbabbbaaabbbbbaabbbbbaa
+bbabaaababbbaabababbabbbabaabbbbbaaabbaaaaabbbaaaaabaabbaabbabba
+babbbabaaabbaaaabaaaaabbbabaaaaa
+ababaabbaaabbabbbbbbbaaaaabaabaabaaaababbaaaaaaa
+baaaababaaaaaaababaaabba
+bbaabbbaaabababbbaaaaabbbbbbbaaaaabbaabaabaaabaabbbaabaaaaaababbababbbbb
+bbababbbaaabbabababbbabaaabbaababbbaaabaaabbbabbabababab
+babbabbabbbaabbbbaabaaabbabababbbbbbbbaa
+abbaaaaaabbabbaabbabbabababbaabaabbbaaaa
+ababaabbabbbbbabbabbbaaaabbbaabbabbbbabb
+aaabbbbaabbbababaabaaaaa
+babbbaaaabaaabaaabbabbabbabaabab
+aaabbaabaabbabaaaaaaaabb
+ababbbabaabbaabbabaababababbbbaa
+babbabaaabbbababbbababaaaaaabbaaababaaab
+bbaababbbabaaababbaaabab
+aabababbbbaabbbbabaabaababababaaabababab
+baaaaabbbbbaabbbbbababbbbbbabbab
+baaaabaaabaabaaabbabaaaababaaaab
+aabbbabababaaabababbaaaa
+ababbbaaabababbaaabaaababbaaaabaabbbbbab
+ababbbaaaabaaaababababba
+aaabbbabaabbaababbbbabbbbbabbabaababbabb
+aabbabaaaabbaababbabbabbaaabaabababaaabaaaaaabab
+abaaabbbabbaaababaaababa
+bbaaabbbbababbababaababb
+aaabbabababaaabaabbabaab
+bbabbaaaabbbaabbaaabbbbbbbbabaabbbbbabbbbabbaabaabbaababaaabaabb
+babbabbabbbbababaaaaabaababbbabbaabaabbbabaaaabb
+bbabbaababababbabaaababb
+babaaabaaabababbaabababbabbababaabbaaabbbababaaaababbbbbaaaabbbbabbbbaaa
+aaabaabaaabbbaabbbabbbbbbbababba
+aabaababbbaaaababbabaaaa
+aaaabaaabbabababbabbbaab
+baaabaabbaaaababbbaabaaaaabbabaaabaaabaabbbbbabbbabaabababaabbaaabbaaababbabbbbb
+aabaabbbababbbababaababaabbbaaaa
+aabaabbaaaabaabaabaaaaaabababbaababaaabbabbbbabbbaaaaaaabababbabbbbbabaa
+baaabbbaaaaaabbbbbaaaaabbabbaabaaaaabbba
+baaabaaaabbbbaaaaabbaababbabbababaaaabbbbabbaaabaabbbaabbaaaabbb
+baaabbbabaabbabaabbabaaabaaabbbaabbaaabbabaaabab
+abbaaabbaaabbabbabaaabba
+aaaaaaabbabbbabababbbaaaababaabbabbaaabaabbaabab
+aabababaaabbaabbbbaabbbababbaaaa
+aabbbabaaabaabbbbbbabaabababbbbb
+bbbababbbabbbbbbbabaaabaaaabbabaaabbbbabbabababaaabaaaaa
+abaabbaabbbabaabbabaaabbaaabbaaaaabbaaabbaaabbbbbabbaabb
+abbbbbabaabaabababababbaaabababbaabbbababbaabaaa
+aaabbaabaabaaaabbbbabbbbbabaababaaaaabab
+aabbbaabbbbbababaabbbbbbaababbbb
+bbababbbaabaaaabbaaaaabbbaababaabbaabaab
+aabaababaabbbbbbbabbbbab
+aaaaabaababbbabbabbbaabbbbabbaaa
+baaaabababbbabbbbaaababbbbbababaaaaaaabb
+baaaabaabaaabbaaabbbbbbaabaabbaabbbbbbabbbbbbbbbbabaabababbbbabbaababbbb
+bababbabaaabaaaaaaababbbbbabbbaabaaabbbb
+bbbbbbbabbabaaabaaaaaaabaabaaabaaaaaaaaababbaaabbaabbaaababaaabbabaaaaaa
+abbaaababbbabaabbaaabbab
+aabaabbbabaaaababaaabbbabaaaabbbbabbbababbbbabaaaaaababbaaabaabbbbbaabababbaabbb
+abaaabaabbabaabbaabbaabaababaaaa
+babbabaabaaaaababaaaabba
+bbabbbbaaabbbabaaaaabbbb
+abbabababbabbbbbaaabaaabaaaaabbaabbabbababbaabbaaabbbabbabbaabbbaabbabaaabaabbab
+baabaaabbbbbaabbbaaababa
+bbaaabbabbbbabbabbaabbaabaaaaabbabaabbba
+babbbabaaabbbaaababababb
+abaabbbbbbbbbababaaabbbabbababaaabaaaabababaaaab
+bbbbbabbbabbbbbababbabaaabbbaabbbbabbbbbabbabababababaabaaabaaabbaaabaaaaaabbaaa
+bababababbbbbbaaaabbbbaabbaaabaababbbbaaabbabbab
+ababbaabababaababbbbbabbbbabbababaaabbbabaaaabbbaaaaaaba
+abaabababbbbabbbbabbaaab
+bbaaaaaaabbababaabbbababbabbbabbbaabaaaabbabbaba
+abbbaabbabbabaabbbbbbbaabaaaaabbbbaaaabbbbbbabba
+aabbbbbbaaabbaabaababbbababbabaaaaabbaaa
+abaabbaaaabababbabbabbabbbaaaaab
+babbbababbbbbbbababaaaaa
+baabbbbbaabbbaabbabbababbbbbbbbb
+bbaaabbbbbbabaabaaaaabaa
+bbababaaabbabbabbabbbaaabbabbbab
+bbbbabbababbababaababbaa
+bbababaabbabaabaabbaabab
+aabbbaabbbbaababbabababa
+ababaaababbbbaaaabbbbaaaaaababbb
+baaaababbbaabaaabbabbbabaababbabbaaaaaaabbaaaaaa
+abbbababbaababbbbbaabbbbababbbaabaaababaabaababbbabbbbab
+bbabaaabbaabbaaabbbaaabaaaaabbabbaaaabaaabbbbabbbaabbbbbabbabaababaaaaab
+bbbbabbabbbbbbaaaaaabbbbabaabababbabbbbbbabaabbaaabbbbbbbbbbaaaa
+baababaaaaabbbaaabaabbba
+bbbbababbbabbaabbbabaaababbaaaababababaa
+aaaaaaaaaaaaaababaaababbabbbabaa
+aaabbabababbbaaabaabbbbbababbbbaaabbbabb
+aabaaaabbbbbaaaaababbaabaaabbbbabbaaaaaabbababbbaababaaabaabbaabbabaaaaa
+aaaabaaabbaabbaaaabbabba
+bbbbaaabbaababaaababbabb
+abbbbababbbbabbbbbbbababbaabbbbbaaabaabaabababbabaaabaaa
+baabbabaabbbaababbabbaba
+bbbbaabbbabbabaaaabaaaaababbaababaaabaabbbaaabaaaaababab
+abbbbbbababbabbbbaababababbabbabababbbbb
+aaabbbabbbbaaaaaabbbabaababababb
+aabbaaabaaabaaabbbaaabaaaabbaaaaaaabababbbaabaab
+babaababbaabaaaababaaaaa
+aaabbbaaaabaabbbaaabbbbb
+abaabaabbaabbabaaaabbbbaaabbbbabaabbbabb
+baaababbabaaababaaababbababbbbba
+aabbaaaabbabaabbbabaaabaaaaaaaabbbbaaaaa
+bbbabbbbaabbbbaabbbaaaabbbbaaabb
+abaaabababbabababbaabbbabaaabaaaaaaaaaabaabbbaaaaabbbbbbabbabbaaabaaaaaa
+bbbbbbbabbabbaabbabbbaaabaabbaaa
+bababbabbaabaabbaaabbbbabaabbbbaaabaaabb
+bbbbbababaaaaabbabbbbbbabaaaabab
+babbabaabbbbaaabaaabbbbaababaabbaabbaabb
+ababaabbbbbaaababaabbaaaabbabbbbaaabbaaa
+ababbaabbbbbbaaaaaabbbbb
+babbabaababbabbabaabbbab
+bbaabbaabbbbaabbabbbbbbaabbbaabaaaababbbbaaabbbbbaabbaaa
+aabaabbbbabbbbbbabbabbaaabaabababbbbbabbbbaabaaa
+abbbbbbaaabbbbaaabbabbbb
+aaaaaaaaababbbabaaabbaabababbbba
+baaabbaabaaaabaaabaabaaabbaabbbbaaaaaaababaababb
+ababbbaababbbbabbabaaaaabababbba
+aaaaabaaaaabbbababaaabbbabbbabba
+bbbabbbaaaaaaaaaaaabbbbb
+abbbbbbabbabbabbabababaa
+baaaaabaaaaabaaabbaabbba
+baaaabbbaababbbaaaaaaabb
+bbbabaabbabbabbbabaabbbbaabbaababaaabaaababaabbb
+bbbabbaabbbaabbbbbbabbbabbababababbabbbb
+baabaabbbbbaabbaaaababab
+bbabbaabbababbabbbabaabbbabbbbbaaaabbabaabbbbbbbababbaba
+babbabbaabbaaabbbbabbbbabaaaaaaabbbaaaaa
+abaabbaabbbabbbaabbabaaaaababaaaaaaaabbb
+aababbabbbabbaabbabaaabbabbabaabbbbaaababbabbaaabbaaaababbbaaabbbaabaabaabababaa
+abbabababbaaabbbbaababbaabaabbbbbbbbbbaa
+bbbabbbabbabbbbabaaabaaababaaababbbaababbbbabababbabbbabaaabaaaaaabaabbb
+baaaaaababbabaabbbabaabaabbbbbabaaababab
+baabaabababbbbbabbbbaabaaaaabbbb
+baabbabaababbbabbabbbbab
+bbbbaabbbbbaaaabbbbbaaaa
+bbbbaababaabaaababbbbbaa
+bbbbbabbaaabaababbbaaaababaaabba
+ababbbabbbbaaaababaaaabbbbaabbbaaaaaababababbbbababbbbbaababbbabaaaaaaababaabbababbbaaaa
+aabaababbbbbababbaabbbab
+baaaaababbbababbababaaab
+baabaabbaaabbaaaabaabbbabbabbbbababbbbab
+abbbbbbababbbabaaabababbbbaabbbabbbbababaabaaabb
+bbabbabbabbabababaaaabba
+abbabbbabbbbbababaaabaaa
+bbbbbaabbabbbbaaabaaaaaabbbabbabaabbbabbabbabaaaabaababbbbbaaabb
+baaabbbaaabaabaababaabab
+baabaababaaaaabaabaabbaababbbbbabaaabbababbaabab
+bbabbbbabaaaabaaaabababbabbabaab
+babbaababaaaaaabbbaabaab
+abaabbabaaabbbabaaaaabbbbbabababbbbaabbabbbabbbbabaaaaab
+ababbbabaababababaabaaaa
+abaaabaaababbbabbaababaabaabbaab
+aaabbbbabbbaabbabbabaabbbaabbbaa
+aaabbbaaaabaabaaabbbbbbb
+abbbbabbababaabbbbaababbaabaabbbabbbbabbababbbab
+baabaabbbbaaaababbabaabbbbabbaaaabbbaaaaaaababaaaabaabbbbbaaaaabbbbaaaaaaaaabbababbabbba
+abbaababbbaaaaabbaabbaaa
+babbbbabbbaababaaaaaaaaaabbbbaabbbababbbabbaaaaabababbaabaabbaaaaabaabbbaaaaaaaaababbbbbabbaabaa
+abbbabababbabaaaababaaaaababbbbaabaabbbababbaabb
+abbaaabaaabbabaaababbaab
+bbaabbbabaabbbbbabbabbbaaabbaaaabbaaabbbabbaabbababbbbababbaabab
+abaaabbbbbabaababbabaaaa
+bbababbbbbbababbaaaaaaabbabaaabb
+bbbaabbbaabbbbaaabbabbaabaabaabbbababaaa
+babbbaaaaabaabbbabbbbbaa
+abaabbaabaabbbbbabbbaabbaaabbaaa
+abbbaabaababbbabaaaaaaaabbbabbbabbbaabab
+aaaabbaabbabbaabbbaababaabbabbbbabaaabbaabbbbbbbaababbbbbbaabbabaabbbaaabbaabbba
+abababbabbabbabbbbabbbab
+bbbababbaaaabaaabaabbbba
+bbbbaababbbbbbabbbbbabbaababaabaaababaab
+bbaaaaaaaabbbaaabaaabaab
+babbbbbbbbbbbaaabbaaabbaaabbabbaaaabbaaa
+abaabbabaaabaababbbaaabb
+abaababaaaaaaabbbababaabaaaababaabbabaabababbbba
+aaabbabaabaababaababbbba
+bbaaaaaababaaababababaaa
+abbabaaabaabaaabbabbaaba
+abbabababbabaabbabbabababbbaaaaa
+aabaaabaababbbaaababaaab
+bbabbbbaabaaabbbabbaaaab
+bbbbababbbbaaababbbaaaba
+bbbbbbababbbbbbaaaaaabab
+bbababbbabaaabaabaabbaaaabbbabbabbbbbbaaabbabbbb
+baababbbaaabbbaaaabaabbbaabaaabb
+abaabbabbaaaabababbaabbb
+bbbabaababbbbbbabaabaaabbabbbbbbbbbaabaabbabbbaaabbababb
+babbabbbbbbbbabbbaaaababbbbbbbbababababa
+baabababaabbaabbaabbabba
+baabaababaaaaabbbabaabbbababbbaaabbaaaba
+bbbbabbbbaabbbababbbaabaabaabaaaaaaaabaaabbaaaaa
+bbabababbaabbabaabbabbaabaababaabaaaabba
+abbbbbbaaaaabbaabbbbbaabaabbabbbaabababaaaababbbbabbbbbabaaabbab
+bbbbaaabaaaabaaaaabbbaab
+aabbaabbaaaaaaaaabbbbababaabababbabbabbbbbbbababaaabaabb
+bbabababbabbabbbbaaaabaaaabbaababbbaaaaaabbbaaaa
+bbabbabbaaabababbabbbbababaabbabbbbabbbababbaaab
+abaaaaaabbbaabaaaabbbbabbababaab
+aabababbbabbabbabbaabaaa
+ababbbaaaaabbabaaaabbabbaaaaaabb
+baaaababbbaaaababbbbbabbbbbaaabaabbabaaabbbbbabaaaaaaaababbbababaabbbbbbaabbbbaa
+baabbbbbbbbbaabaabbababb
+bababbababaabbbbababaaab
+baababbbbabbaabbabbabbaabababbabaaaabbbaabaabaaa
+aabaabababaaaabaabababbbbaaabaaaabaaabab
+abbaaaaababbabbabaaaabbbbaaaabba
+babbbaaabaaaaabbbabbbbab
+ababbbabbaabbabaabbbabba
+abaabbabaaaabaabbaaabbbbbbbabbaaaaabaabb
+bbbaabbaaabbbaabbaabaabaababbaab
+ababbbaabbbbbbbabaababaaabbabbabaababaaabbbaaababaabbaab
+bbbbbbbabbaaaaaaaaabbbababbbbbbb
+aabaaababbabbabaaaaabaaabbabbaabaabbbbbbababaaaa
+baabaaabaaabbbabbababbabababbaba
+abbbabbbababbabbbbbbaaaababbabbbaaaaaaaaabbaabbabbaaaaabbbabaaaabababbbaaabbabbb
+baabaaabbabbababbbbaabbaaaabbaabbbbbabbbabbbaaabbbbabaaa
+abaaabbbabaabaaaabbbbbabaaabbbbabababbbbbabbbbabaabaaaaa
+aaaaaaaaabaaaababbbaaabababababa
+bbbbaabbbababaaaaaaaaaab
+aaabaaaabaaaababbabbbbbbaaaabbababbbabaa
+babaaababbbbbbbaabbbbabb
+baaabbaaaabbbbaabbbababa
+baababbbaababbbabbbaabbbbbbbabaaaabbaaab
+baaaabaabaabaabbbababbababbbaabbaaabbaabbaaaabba
+baabaababbbaabbbabbabababaaaaaaa
+bbbababbaabbababaaaaabbb
+bbbabaaaaaaaaaaabbbaabbbbabaabbaabaaabbbabbaabbbbabbbbab
+aaaaaaabbaababaaaaabaaaababbbaab
+abababbaababbbabaabbbbaaaaaabaaaabbaaaba
+baababbaaabaabbbbbbaabbabbbbaabbaabbabaabbabbbabaabbabba
+abaaabbbbabbbaaabbbbaabaabaabababbaaabbbaabbbbabbababbbabaabbaaabaaabaaa
+aabaaabaababbaabbbbbbbabbaaaaabbaaaabbba
+aabbabaaabbbbabababbbbbbbaaabbbabaabbaaababbbbabbbbabaaa
+abaabbbbbbbbabbbabbaaaaabbaaaaaaabbabbbbabababaa
+ababaabbbbbbabaaabbaabba
+bbbbababaababaaaaaaabbaabaabaaaa
+abbbababbbbbaaababaaaabb
+aabbbbbbaababbbaababbbabbaabbabaabaababaaaabaaab
+aabaababaaabbbaabbaababababbbaaaabababaa
+abaabaabbabbbababbaaaabaabaaabaabaabaabbabbababbaaabaaababaaabba
+baaaaabbbbbaaaabbbbbbabb
+abbbababbbbbbbbaabbaaaaababbbabbabababbaabaababb
+aabbaababbabbaabbbbbaabaaaabbabbababbaba
+ababbbaababbbbbabbbabaaa
+abaaabbbabababbaabaaabbb
+abababbabbabbababbbaabbaababbbaaaabbaaab
+abbbbabbbaabaabbbaaaabbbbaaabbbbbbbabbbaababbababbbabbab
+bbbbbaabbbaababbabbbaaaababbbabaaaababaaabaabbaa
+ababbbaababababaaabaabbbabaaabbbbaabababbabbbbbaababbaaa
+baababaabbbabbbbaaabaabb
+babaabbbbbaabbbbbbabbabaabbbaaaaabbaabbabbbbaabaabbabbbbbbabbbaa
+baabbabaaabbbababbaaaaba
+abbbbbabbaaabbbabbaabbaaaabbbbaaaabbabbabaabbbba
+aaaaaaabbaaabbbaaaaabbab
+baabbbbbbaaabbbbaabbabaaaababbabbbaababaaabbbbbaabaaaaaabaabaabababbbaaa
+aabbaaaaabbabaaaabbbbbaa
+bbbabaabbbaaaaaaaabbbabaababaaab
+babbabaaaaabbbababaaaaaa
+baabbabaabaaabbbaabaaaaa
+aabbaababbababbbbababaabaabbbbba
+abbbbabaaabaaababbbbbaaaaaabaaab
+bbbabaabbbbbabbaaababaaa
+bbbbbabaabbaaabaaaabbbaaabbbbbbabaabbbaaabbbbbbbbaabbaaa
+bbbbaaaabaabaabbbbabbabbbbbbbabaaaaabaaabbabbbbbbaabbbabaaabaabb
+bbbbbaaabbbbabaabbabbbbbbaabaaabbabbbbbaabbbabbaabbbbbaa
+aaabbbabbabbabbbbabaaaaaabbbbbaaaaababaaaaaaabbaabbabababababaaabbbababaabbaaaabbaaabaaababbaabb
+abbaaaaaabbababaaababababaaaaabbaaabbaaa
+aaaabaaaaabbabaaaaaabbaa
+bbbbbbbabaababbbbbbbaaaabbbbbaab
+ababaaaababbabbabbbababaabbaaabbabbbbbbbaabbababbbabbaba
+bbbbbbbaaaaaababbaabbaaaaaababbbabaaabab
+baabbbaaaaabbbbabbababbaaaaababaabbababaaaabbbbbbbbaaaababbbbbaababaaabb
+bbbabbbaaabbbaabaaababbaaaabbaaa
+baabaababbbbbaaabbbbabaaaabbabbaaaabaabb
+abbbaabbabbabbabbbbaabbbbbabbbab
+babbabaaabbabbbabaababaabbabaaba
+baababbbbaaaabaaabbbaabbbbbaaaaa
+bbaababbaaabbbbabbbabaaa
+babababaaabbababbbbbabbbbbbababbabbbabbaaabbabbbabbaaaabbabbbabbaabbaaba
+bbbbaaaabaaaaaaabbaaabaabaaaababaabaababbbbabababbabbbbaabbaaaabbbbaaababbbabbababaababb
+babaaabbaabaaabbbabbbaabaaaabbbaaaaaabababababbabbababba
+aaaabaaabbabaaabaabbbaaabbbbabaa
+abbababaabaabbaabbbababbbbabbbbbaabbaaaaaaaabbabaaababbbbbabbbaa
+aababbbababbabaabbbbabbaaabaaababbbbabababaaabaaaababaaaaabbaaab
+ababbbaaaababbbaabbbbabaabaaabaabbbaabbaabbbbbaabbbaaaaabaabbabb
+bbbabbaabaabababaabbababaababaaa
+aaaaaaabbbbbbbabbabaabaa
+abaabaaaaabbaaaabbbbaabaaabaabaabbbaabaa
+aabbabaabaaabbaaaaaabbbb
+abbabbaabaabababaabbbaabbbbbaababbbbabbbabbbaaab
+abbaaabbabaaaabaaaaaabaaaababbbbbaabaaabaaabaabbbbabbabbbbbaaabababbabbabbbbbaaa
+abaaabbbbabaaaaaabbaaababaaaaabaababbaababaabaaaabaaaaabbbaaaaab
+aababababbbbbbbaabaabbabbbbbbaaaabbbaaaa
+aabbaabaaabbaaaaaabaababaabbbbab
+aabaaababbaaaaaabbababababaaaaabbababaab
+baababaababbabbbabbaabaababbaabbaabaabbabbbbbaab
+abaaabaaaaabbbaaabbababababbbabaaababaaa
+aabaaababbbbbabbbaabbabb
+aaabbabbaaabbbaabbbbbbababbababb
+aabaaaabaabbbbaaaaaabaaabbaabbbaabbbbbbb
+bbbbabaaaabbababbbabaaabbabaabba
+baabaabaaabababababbabbbbbababaaaaababab
+aabbbaaaaabbbbaaababbaaaababbbbaababaaaabbbabaab
+abbaaabbbaabbbbabababbbabaabbbbaaabbabaabbaaaaba
+aaaaaaabbbabaabbaabbbabaabbababaabbbbbbaabbbbaaaabababaaaaaabbbbaabbabba
+abbbbabaabaabaabbbabbbbaabbbbabaabababbbbbaabbabbaabaaaa
+abaabababbbbbabbbabaaaab
+bababbabbbbabaaabbaaaabb
+abbabaaabbbababbbbbaabbaaabbbbaababbaaba
+bbbbaabaaabbbbbbabaabaaaaabaababbabbabbbabaaabab
+babbabbbbbbabbaabbbabaabbbbbbbbb
+babaabaaababbbbaabaabbbaababaaabbbabbbaaaaaaaaaabaababbbbaabbaaa
+bbbbaabaabbabbaaabaabaaababababa
+abbaababbbbabbabaabbbbbaababaaabaaabbbaaabaababbbbbaabaa
+aabbaaaabbbbababaaaabbab
+aabaababbabbbabaaabababaabaaabbaabaaaabb
+bbabbabbbbaabbbbabaabaaaaaaaaaababaaabba
+aaababbaabababaabababaaababaabaaabaaaabb
+baaabbbabbaaaaabbaabbbab
+bababaabbabbbababaaaababbabbaabbbbbaababbabbabbb
+bbababaaabbbaabbaaabbbabaaabbbaabbbaaaaa
+aabbbbaaabbbbbabaabaaababbaabbaaaabbbbbaabaaababbbbaabab
+aaaaaaabaaaababbabababbaaababaabaabaaaaaabbaaaaaabaabbbaaaaabaaa
+abaabbbbbbbabbaaaababbab
+bbaaaaaaababaabbbaabaaabaababaaa
+aabbbababaabababbabbbaab
+abaabbbbbbaaaaaabbbbbbbabbbbabbbbabbaabb
+aabbbbaabbababaabababbba
+bababbabaaaabaaabaababaaaaaaaabb
+bbbbaababbbabbaabbaabbaaabbbaabbbbabbaabaaaaaabb
+bbbbabbabbbbaabaaaabaaaabaaaaabbaaabbbbaabaabbbaaabaaaaaabbaabbb
+abbabaaabbaababbaabaaabbbbabbaabbbaabbbb
+bbaaabbabbbbbababababaababaaaaaababaaaaaaabbbbab
+aababbbaabbbbabaabbabaab
+bbbaabbbaaaaabaabbaaaaab
+bbabbabbbbaaabbbbbaaaaaababaabbaababbabbabaabbbabbaaaabb
+aaabbabaaabaabbbbbaababbbaaaaaababbabaab
+abbabbabbbaabbaabbaaabaa
+abaabbabaaaabaaaaaaaabab
+abbbbaabaabbabbbaabaaabbbaaaaaaa
+abbabbaaaababbbabbabbababbaababaabbabaabbbbaaabb
+aabaaaaabbbababbbaaababbabbbbababababaaabbabbbba
+aaabbabababbbababbbaabbbbaabbbbaaababaaa
+aabababbaaabaaaabbababaaaaaababb
+abbaaaaaabababbaabaabaababbaaababaababbbaaaababbbabbaaabaabbabbaabbaabba
+bbaaaabaaaabbaabbbaaaabaababbbbb
+ababbbabbaababbbabaabaababbbababbbaabbaaabaababbabaaaaab
+aabaaabaababaabaababaaaa
+baabbbbbbaaaaabbbaabbbaa
+abbabbabbabbabbbabbbbabaabbbabbb
+ababbaabaabbababbbbababbbbbbabaabbabbbabbabbbbaa
+bbbabaabbababbabbbabbbaa
+aabaabbbaaabbababaabaaababababbbaabababbabaabbbabaaabaabbababbba
+abaabaabababaababaabbabb
+bbaabbbaaaabbbabaaababaa
+bbbbabbbaabbaaaaabaaabba
+baaaabbbbbbbaaabbaaaaabbabaabbabaabaabbbbaabbbabaababbaa
+bbabaabbbaababbabbaabbaaaaabbbababaabbbaaaaabbab
+babaaababbbabbbbabaabaaababaabbb
+baaabbaabaaaabaaaaabaabaaaaabaaaaaabababababaaab
+bbbbbabbbbaaaaaabaababbababbaaaaabbaabbb
+abaaabbbabbbaabbbaaabaab
+bbbabbaaaaabaabaaabababaaaabbbabbbbbabbbaababaab
+bbbbabbbbaabbabbaabbbbbbabaaababbbbaaabaaaaabaabaabbaaab
+baaaabbaaaaababbbbaaaaabbbbbbbaababbbabb
+bbaabbbaababbaabbabbabababbbaababaabaaaa
+bbbabbbbbaaaabbbabbbbbbaabaabbabbababaab
+baababbbaabaabaabbaababaabaaabbbbbbababbbaaaabba
+babbabababbbbbabababbbba
+aabbbaaabbaaabbaabaaabab
+bbbbbbbaabaaabaabbbbbabaabaababbabbabaab
+bbaabbbbaaabbaababaaabbabababbbaaaabababbababaaaaabaaaab
+babbbabaaabbabaaaabbbaabbabaabab
+bbaaaabaaaaaaabbababbaaaababbbbbabaabaaababbabbbabbaaaaaaaaaababaaabbabbbbbbabaa
+ababaabbaabbaaaabaaaaabbababbbba
+baaaababbbbbaabbbaaabaaa
+aababababbbaabbabbaabbbb
+baababbaaaabbabbababbaba
+babbabaabbbbbbbaaabbbabb
+bbbbbbabbbbbbbabbbbbbabbabaaaabb
+bbbaabbbbbbbbababababbbb
+aabbaaaabbabbabbbbbaabaa
+bbababababbbbaabaaabaababbbbaaabaaaabbab
+ababbaabaabbbaababbbaababbabbabbaaabbababaabbaabababaaaaaabaaaaa
+aabaababbabbbaaaabababbaaaaabbab
+abbaaabbaabbaababbbabbbaababaaaa
+aabaabaabbbbbabbaabbaabaaabaabaabaabaabbaaaabaaababbaabb
+aabaaaabbbbbaaaabaaabbbbbbbbaaabababaaabababbaabbbaabaabaababbaabaaaabab
+bbbabbabaaabaaaabababbaabaaabbbabbaabbba
+bbaaaabababbbbaabaaabbaababbabbaaabbbababaaaabaaabbbbbbb
+bbaabbaaaaaaabaaaaabbbbabbbbbabbbaabaabaaabbbabb
+bbaabbbaabbaaaaaaaabaabababababbaabaaaaa
+babbababbaabaababaababbabbbbbbabbbbbaabbbaabbbbbbabaabab
+ababaabbaabbbaabaaaabbba
+aaaabaaaabbabbbabbbbababbbaabbab
+aaabaaaaaaabbabaaaaaabbb
+bbbbabbaababbaabbbabbabbabaaaabbabaaabba
+ababbaabbbabbbbbaaaabbba
+abbbbabaaabbbaabbbbaaaabababaaaa
+aaabaabaaabbbbbbaaabaababbabbabbbbbabbab
+aaabaababaaaaaabbababbabbabaabbaabababbabaabaabaaaababbabbaabbaa
+baaabbbabbabbaababbbaaab
+aabbabababaabbabaaaaaaba
+aabbbabaabbaaaaaaababbaa
+bbbbbbabbaaaabaaabbabbabbaaaababbbababaa
+aababababaaaaabbaaaaabaabbabbabbabbbabba
+bbbbaaababbbbabaabbbaaaa
+babababbbabababaabaabbabbbbbbbbbaaaabbaaaababababbabaaab
+abaaabbbaabbbaabbbbaaaba
+aabbaabbbabaaabaabbabaaabbbbbaba
+bbbbaaabaaabaabaababbaabbbababbbabaaabbbabbaabaababaabababbbbabbbababbba
+abaaabbbaabbaabbabbabbbabbbaaaaabaaabaabbbbbaabbaaabbbbaabababab
+bbabbbbaaabbbabaababbbaaababaabb
+aabababbbaabbabaaaaaabab
+abaababaabbababaaabbaabbbbbaabbaaaaababa
+aaabbbabaababbbabbbaaaabbabbbbaabaaabaaa \ No newline at end of file
diff --git a/2020/19/puzzle-1.py b/2020/19/puzzle-1.py
new file mode 100755
index 0000000..8ca7eb2
--- /dev/null
+++ b/2020/19/puzzle-1.py
@@ -0,0 +1,59 @@
+#!/usr/bin/env python3
+
+from collections import OrderedDict
+
+
+def main() -> None:
+ with open("input", "r") as f:
+ data = f.readlines()
+
+ i = 0
+ rules: list[tuple[str]] = []
+ while data[i] != "\n":
+ rules.append(tuple(x for x in tuple(data[i].split(": "))))
+ i += 1
+
+ tests: list[str] = []
+ for line in data:
+ tests.append(line.strip())
+
+ patterns: dict[str, list[str]] = {}
+
+ # Get "a" and "b" out of the way to do less comparisons in the next loop. Also make use of
+ # this loop to strip newlines off of all the rules.
+ for rule in rules:
+ rules[rules.index(rule)] = (rule[0], rule[1].strip())
+ if len(rule[1]) == 4:
+ patterns[rule[0]] = [rule[1][1]]
+
+ while len(patterns) != len(rules):
+ for rule in rules:
+ if rule[0] in patterns:
+ continue
+
+ res = rule[1].split(" | ")
+ req_rules = list(OrderedDict.fromkeys(" ".join(res).split(" ")))
+ all_in = True
+ for req in req_rules:
+ if req not in patterns:
+ all_in = False
+ break
+ if all_in == True:
+ all_combos: list[str] = []
+ for re in res:
+ re = re.split(" ")
+ if len(re) == 1:
+ all_combos.extend(patterns[re[0]])
+ else:
+ for x in patterns[re[0]]:
+ for y in patterns[re[1]]:
+ all_combos.append(f"{x}{y}")
+ all_combos = list(OrderedDict.fromkeys(all_combos))
+
+ patterns[rule[0]] = all_combos
+
+ print(len([test for test in tests if test in patterns["0"]]))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/2020/19/puzzle-2.py b/2020/19/puzzle-2.py
new file mode 100755
index 0000000..b0efe15
--- /dev/null
+++ b/2020/19/puzzle-2.py
@@ -0,0 +1,84 @@
+#!/usr/bin/env python3
+
+from collections import OrderedDict
+from re import search
+
+
+def check(test: str, patterns: dict[str, list[str]]) -> bool:
+ chunks = string_divide(test, 8)
+ search_str = ""
+
+ for chunk in chunks:
+ if chunk in patterns["42"]:
+ search_str += "0"
+ elif chunk in patterns["31"]:
+ search_str += "1"
+ else:
+ return False
+
+ # 42 = 0, 31 = 1
+ res = search(r"^(0)+(1)+$", search_str)
+ return not (not res or search_str.count("0") <= search_str.count("1"))
+
+
+def string_divide(string: str, div: int) -> list[str]:
+ l: list[str] = []
+ for i in range(0, len(string), div):
+ l.append(string[i : i + div])
+ return l
+
+
+def main() -> None:
+ with open("input", "r") as f:
+ data = f.readlines()
+
+ i = 0
+ rules: list[tuple[str]] = []
+ while data[i] != "\n":
+ rules.append(tuple(x for x in tuple(data[i].split(": "))))
+ i += 1
+
+ tests: list[str] = []
+ for line in data:
+ tests.append(line.strip())
+
+ patterns: dict[str, list[str]] = {}
+
+ # Get "a" and "b" out of the way to do less comparisons in the next loop. Also make use of
+ # this loop to strip newlines off of all the rules.
+ for rule in rules:
+ rules[rules.index(rule)] = (rule[0], rule[1].strip())
+ if len(rule[1]) == 4:
+ patterns[rule[0]] = [rule[1][1]]
+
+ while len(patterns) != len(rules):
+ for rule in rules:
+ if rule[0] in patterns:
+ continue
+
+ res = rule[1].split(" | ")
+ req_rules = list(OrderedDict.fromkeys(" ".join(res).split(" ")))
+ all_in = True
+ for req in req_rules:
+ if req not in patterns:
+ all_in = False
+ break
+ if all_in == True:
+ all_combos: list[str] = []
+ for re in res:
+ re = re.split(" ")
+ if len(re) == 1:
+ all_combos.extend(patterns[re[0]])
+ else:
+ for x in patterns[re[0]]:
+ for y in patterns[re[1]]:
+ all_combos.append(f"{x}{y}")
+ all_combos = list(OrderedDict.fromkeys(all_combos))
+
+ patterns[rule[0]] = all_combos
+
+ print(len([test for test in tests if check(test, patterns)]))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..562eb47
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,14 @@
+BSD Zero Clause License
+
+Copyright (c) 2021 Thomas Voss
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.