Initial commit

This commit is contained in:
Dimitri Lozeve 2024-11-12 21:43:32 +01:00
commit f242d2b0df
420 changed files with 62521 additions and 0 deletions

4
2020/.gitignore vendored Normal file
View file

@ -0,0 +1,4 @@
*\~
compiled/
a.out
.gdb_history

34
2020/README.org Normal file
View file

@ -0,0 +1,34 @@
* Advent of Code 2020
My answers for [[https://adventofcode.com/2020][Advent of Code 2020]].
| Day | [[https://racket-lang.org/][Racket]] | C | [[https://www.dyalog.com/][APL]] |
|-------------+--------+-----+-----|
| Day 1 | 2 | 2 | 2 |
| Day 2 | 2 | 2 | 2 |
| Day 3 | 2 | 2 | 2 |
| Day 4 | 2 | | |
| Day 5 | 2 | 2 | 2 |
| Day 6 | 2 | 2 | 2 |
| Day 7 | 2 | | 2 |
| Day 8 | 2 | 2 | |
| Day 9 | 2 | 2 | 2 |
| Day 10 | 2 | 2 | 2 |
| Day 11 | 2 | | 1 |
| Day 12 | 2 | 2 | |
| Day 13 | 2 | 2 | 2 |
| Day 14 | 2 | 2 | |
| Day 15 | 2 | 2 | |
| Day 16 | 2 | | |
| Day 17 | 2 | 2 | |
| Day 18 | 2 | | 1 |
| Day 19 | 2 | | |
| Day 20 | 2 | | |
| Day 21 | 2 | | |
| Day 22 | 2 | | |
| Day 23 | 2 | 2 | |
| Day 24 | 2 | | |
| Day 25 | 2 | 2 | |
|-------------+--------+-----+-----|
| *Total (%)* | 100 | 60. | 40. |
#+TBLFM: @>$2..$4=50*vmean(@I..@II);ENn3

49
2020/day01/day01.c Normal file
View file

@ -0,0 +1,49 @@
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s <input file>\n", argv[0]);
return 0;
}
FILE *fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("Could not open file %s\n", argv[1]);
return 1;
}
int input[1024] = {0};
int d;
int n = 0;
while (fscanf(fp, "%d\n", &d) == 1) {
input[n] = d;
n++;
}
fclose(fp);
int res = -1;
for (int i = 0; i < n && res == -1; ++i) {
for (int j = 0; j < n && res == -1; ++j) {
if (input[i] + input[j] == 2020) {
res = input[i] * input[j];
break;
}
}
}
printf("%d\n", res);
res = -1;
for (int i = 0; i < n && res == -1; ++i) {
for (int j = 0; j < n && res == -1; ++j) {
for (int k = 0; k < n && res == -1; ++k) {
if (input[i] + input[j] + input[k] == 2020) {
res = input[i] * input[j] * input[k];
}
}
}
}
printf("%d\n", res);
return 0;
}

6
2020/day01/day01.dyalog Normal file
View file

@ -0,0 +1,6 @@
⎕io←0
x←⍎¨⊃⎕nget'input'1
⍝ Part 1
×/x[⊃⍸2020=x∘.+x]
⍝ Part 2
×/x[⊃⍸2020=⊃∘.+/3⊂x]

37
2020/day01/day01.rkt Normal file
View file

@ -0,0 +1,37 @@
#lang racket
(module+ test
(require rackunit))
(module+ main
(displayln "Day 1"))
(define (read-input filename)
(map string->number (file->lines filename)))
(define (part1 filename)
(define expenses (read-input filename))
(for*/last ([a (in-list expenses)]
[b (in-list expenses)]
#:final (= 2020 (+ a b)))
(* a b)))
(module+ test
(check-eq? (part1 "test") 514579))
(module+ main
(displayln (part1 "input")))
(define (part2 filename)
(define expenses (read-input filename))
(for*/last ([a (in-list expenses)]
[b (in-list expenses)]
[c (in-list expenses)]
#:final (= 2020 (+ a b c)))
(* a b c)))
(module+ test
(check-eq? (part2 "test") 241861950))
(module+ main
(displayln (part2 "input")))

200
2020/day01/input Normal file
View file

@ -0,0 +1,200 @@
1688
1463
1461
1842
1441
1838
1583
1891
1876
1551
1506
2005
1989
1417
1784
1975
1428
1485
1597
1871
105
788
1971
1892
1854
1466
1584
1565
1400
1640
1780
1774
360
1421
1368
1771
1666
1707
1627
1449
1677
1504
1721
1994
1959
1862
1768
1986
1904
1382
1969
1852
1917
1966
1742
1371
1405
1995
1906
1694
1735
1422
1719
1978
1641
1761
1567
1974
1495
1973
1958
1599
1770
1600
1465
1865
1479
1687
1390
1802
2008
645
1435
1589
1949
1909
1526
1667
1831
1864
1713
1718
1232
1868
1884
1825
1999
1590
1759
1391
1757
323
1612
1637
1727
1783
1643
1442
1452
675
1812
1604
1518
1894
1933
1801
1914
912
1576
1961
1970
1446
1985
1988
1563
1826
1409
1503
1539
1832
1698
1990
1689
1532
765
1546
1384
1519
1615
1556
1754
1983
1394
1763
1823
1788
1407
1946
1751
1837
1680
1929
1814
1948
1919
1953
55
1731
1516
1895
1795
1890
1881
1799
1536
1396
1942
1798
1767
1745
1883
2004
1550
1916
1650
1749
1991
1789
1740
1490
1873
1003
1699
1669
1781
2000
1728
1877
1733
1588
1168
1828
1848
1963
1928
1920
1493
1968
1564
1572

6
2020/day01/test Normal file
View file

@ -0,0 +1,6 @@
1721
979
366
299
675
1456

45
2020/day02/day02.c Normal file
View file

@ -0,0 +1,45 @@
#include <stdbool.h>
#include <stdio.h>
bool is_valid_part1(int lower, int upper, char key, char *pass) {
int count = 0;
for (char *c = pass; *c != 0; ++c) {
if (*c == key) {
count++;
}
}
return (count >= lower) && (count <= upper);
}
bool is_valid_part2(int pos1, int pos2, char key, char *pass) {
return (pass[pos1 - 1] == key) ^ (pass[pos2 - 1] == key);
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s <input file>\n", argv[0]);
return 0;
}
FILE *input = fopen(argv[1], "r");
int lower, upper;
char key;
char pass[256];
int count1 = 0;
int count2 = 0;
while (fscanf(input, "%d-%d %c: %s", &lower, &upper, &key, pass) == 4) {
if (is_valid_part1(lower, upper, key, pass)) {
count1++;
}
if (is_valid_part2(lower, upper, key, pass)) {
count2++;
}
}
printf("Part 1: %d\n", count1);
printf("Part 2: %d\n", count2);
return 0;
}

3
2020/day02/day02.dyalog Normal file
View file

@ -0,0 +1,3 @@
p←↑¨{⍵⊆⍨~⍵∊':- '}¨⊃⎕NGET'input'1
+/{((⍎1⌷⍵),1+⍎2⌷⍵)(1=⍸)+/(⊃3⌷⍵)⍷4⌷⍵}¨p ⍝ Part 1
+/{≠/(⊃3⌷⍵)=(4⌷⍵)[⍎¨↓(⊂1 2)⌷⍵]}¨p ⍝ Part 2

61
2020/day02/day02.rkt Normal file
View file

@ -0,0 +1,61 @@
#lang racket
(module+ test
(require rackunit))
(module+ main
(displayln "Day 2"))
(struct policy
(lower upper char)
#:transparent)
(define (parse-line str)
(define lst (string-split str #px"(\\s+|:\\s+|-)"))
(values (policy (string->number (first lst))
(string->number (second lst))
(car (string->list (third lst))))
(last lst)))
(define (read-input filename)
(with-input-from-file filename
(lambda ()
(for/lists (policies passwords)
([line (in-lines)])
(parse-line line)))))
(define (valid? pol pass)
(define cnt (count (λ (x) (equal? x (policy-char pol)))
(string->list pass)))
(and (<= (policy-lower pol) cnt)
(>= (policy-upper pol) cnt)))
(define (part1 filename)
(define-values (policies passwords) (read-input filename))
(for/sum ([pol policies]
[pass passwords]
#:when (valid? pol pass))
1))
(module+ test
(check-equal? (part1 "test") 2))
(module+ main
(displayln (part1 "input")))
(define (new-valid? pol pass)
(xor (equal? (string-ref pass (sub1 (policy-lower pol))) (policy-char pol))
(equal? (string-ref pass (sub1 (policy-upper pol))) (policy-char pol))))
(define (part2 filename)
(define-values (policies passwords) (read-input filename))
(for/sum ([pol policies]
[pass passwords]
#:when (new-valid? pol pass))
1))
(module+ test
(check-equal? (part2 "test") 1))
(module+ main
(displayln (part2 "input")))

1000
2020/day02/input Normal file

File diff suppressed because it is too large Load diff

3
2020/day02/test Normal file
View file

@ -0,0 +1,3 @@
1-3 a: abcde
1-3 b: cdefg
2-9 c: ccccccccc

79
2020/day03/day03.c Normal file
View file

@ -0,0 +1,79 @@
#include <stdbool.h>
#include <stdio.h>
int count_lines(FILE *fp) {
int count = 0;
for (char c = getc(fp); c != EOF; c = getc(fp)) {
if (c == '\n') {
count++;
}
}
return count;
}
int line_length(FILE *fp) {
int count = 0;
for (char c = getc(fp); c != '\n'; c = getc(fp)) {
count++;
}
return count;
}
int count_trees(int n, int m, int grid[n][m], int down_offset, int right_offset) {
int count = 0;
for (int i = 0; i < n / down_offset; ++i) {
count += grid[i * down_offset][i * right_offset % m];
}
return count;
}
int main(int argc, char *argv[])
{
if (argc < 2) {
printf("Usage: %s <input file>\n", argv[0]);
return 0;
}
FILE *fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("Could not open file %s\n", argv[1]);
return 1;
}
int n = count_lines(fp);
rewind(fp);
int m = line_length(fp);
rewind(fp);
printf("Grid size: %d×%d\n", n, m);
int grid[n][m];
char c;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
c = getc(fp);
if (c == '\n' || c == EOF) {
c = getc(fp);
}
grid[i][j] = (c == '#');
}
}
fclose(fp);
printf("%d\n", count_trees(n, m, grid, 1, 3));
int total = 1;
int down_offsets[] = {1, 1, 1, 1, 2};
int right_offsets[] = {1, 3, 5, 7, 1};
for (int i = 0; i < 5; ++i) {
total *= count_trees(n, m, grid, down_offsets[i], right_offsets[i]);
}
printf("%d\n", total);
return 0;
}

5
2020/day03/day03.dyalog Normal file
View file

@ -0,0 +1,5 @@
⎕io←0
p←'#'=↑⊃⎕NGET'input'1
f←{+/p[↓⍉↑(p)|⍵×2⌈(⊃p)÷⊃⍵]}
f 1 3 ⍝ Part 1
×/f¨(1 1)(1 3)(1 5)(1 7)(2 1) ⍝ Part 2

52
2020/day03/day03.rkt Normal file
View file

@ -0,0 +1,52 @@
#lang racket
(module+ test
(require rackunit))
(module+ main
(displayln "Day 3"))
(define (parse-line str)
(list->vector
(map (λ (c) (if (equal? c #\#) 1 0)) (string->list str))))
(define (read-input filename)
(with-input-from-file filename
(lambda ()
(for/vector ([line (in-lines)])
(parse-line line)))))
(define (traj grid down right)
(define height (vector-length grid))
(define width (vector-length (vector-ref grid 0)))
(for/list ([line (in-vector grid 0 #f down)]
[j (in-range 0 (* width height right) right)])
(vector-ref line (remainder j width))))
(define (part1 filename)
(define grid (read-input filename))
(apply + (traj grid 1 3)))
(module+ test
(check-equal? (part1 "test") 7))
(module+ main
(displayln (part1 "input")))
(define slopes
'((1 1)
(1 3)
(1 5)
(1 7)
(2 1)))
(define (part2 filename)
(define grid (read-input filename))
(for/product ([slope slopes])
(apply + (traj grid (car slope) (cadr slope)))))
(module+ test
(check-equal? (part2 "test") 336))
(module+ main
(displayln (part2 "input")))

323
2020/day03/input Normal file
View file

@ -0,0 +1,323 @@
...........#..............##...
...#....................#......
.....####...........#.#..#.#...
....##.#.......................
.......#.##......#.###.........
.#.....#.......##.......#.....#
...........##....##.#....#.....
......#.........#....#.........
..###....#.........#....#.#....
....#....#.#..#..#.........#.#.
..........................#...#
.##...........#...#.#.......#..
#....##...#.#....#.............
....#..##......##..#.#....#....
#..........#.............#..#.#
...#.####.....#..#.#.#..#...#..
..........#......#........#..#.
............#.....#..#..#....#.
.................#...#.........
..#...#...................#....
..............##...#...........
..........................#..#.
#...#...#............#...#.....
.................#..##.......#.
............#....#.............
.#......#.#...#....#...#.......
.....#.....##..##.....#.......#
.#..#..##...............#..#...
#...#...##............#........
.......#....#.......#..........
...............................
#................#...#.........
...#...#..#..#.............##.#
......#........#..............#
...#.....##.#...#...#..........
.........#..#........##.#...##.
#.........##..#.......#........
........##.#.#.................
.#....#............###....#....
...#.##....#.....##..#..#....#.
....#..#........##..#...#..##..
..........#............#.......
.........#........##....#..##..
#....#.........#.#.......#..#..
...#....#......##.#............
........#..#...............#...
..............#.....#........#.
......#..#.#........#..#..#.##.
..#........###....#.#..........
...#..#...#.#....##..#........#
........#..#..............#....
#.####.................#....##.
.#................#............
....#....#....#................
#......#........##....#...#....
......#..##..#..###...#.#.#....
.#..........##.................
...#...#....#...#.....#.....#..
............#......##.........#
..............##...............
##....#....#...#...#....#..###.
...................#.......##..
#.....##........#....#.........
...#.......#...........#.......
...............##..............
##.......#......#.....#........
#....#..#..##..#.......#..#..#.
.....#.............#.......#...
......#..#........#.......#.#..
..#...#...........#.##.........
..#................####.#..#...
......##....#.........#........
..#..#.......#...##....#......#
#.#..........#..............#.#
.#.#..............#.##...#.....
................#.....#.#......
##.........#.........#.....#...
....#.#.....................#..
..#..#..#........#.......#.....
.....#..#.#....#....#.....#....
..####....#.#.........#........
#..##...##..#.#............#..#
.#........#..##.#.....#......##
.##.##.....##....#.#...........
....#..#.#..##............#.#..
........#.#...#....#.........#.
.....#.#.#.....#....#.....##...
#...#..#....##..#..............
..#...#....#...##..#.......#...
.#....##.......................
.........#............##.#..#..
....#................#...#.#...
...................#..#...#....
#..#...................#.......
..##..............#..........##
...#.##......#.............#...
.........#.#.........#.........
...###......#.................#
..........#....##..............
.##..#....#.........#.#........
.........#.......#.......#.#...
#........#............#......#.
....................#..........
.......#...##..........#...#...
....#.#.......#.#...##..#.#....
...#..........#..............#.
........##..............#......
......#...##......#....##......
....#.....#.#.##..............#
...#...........#.#.............
...........#......#.#..........
...#.#......#......#...#...#...
..#.......................#....
...#...#..#..................#.
##.....#.....#..#..#.....#...#.
.#..#.......##.#.#.............
......##.......##............#.
.......#..#..#.......#....#.#..
......#.....##..##...#........#
.....#........#.##..........#..
#....##............#........#..
.....#..#...#............#...#.
##.#....#........#.............
.##...............##......#.#..
###..#..#.......#.#..........#.
.....#...........#...##........
..#.#.#.........#.....#....#...
.....#....##.......#..#.#......
......#.....#...#..#...##..#...
.....#....#................#...
......#....#.#...##......##.#.#
.....###.............#.........
.................#......#####..
.#.......#..........#.#....##..
..#..#.......#.....#..#......##
..........#.#.##.......##....#.
##...#...##.##......#..###.....
..#..#..#......#....#..........
..#...#....#......#....#....#.#
.#...#........#.....#......#..#
#.........#......#.##.##.......
#.##..#.............#.....#....
....#.......#..#..##...##......
...#.............#.#......#....
#.....#..........##...##.....#.
...............#........#....#.
#.....#...#..#.............##..
.#....##.#.......#.#..........#
....#....#.#.....#....#......#.
......#......#.................
.#.#..#.#.#...#...#..#.##.#..##
.............#.....#...........
............#...#..#..#.....#..
.#..........#.......#....#.....
......#..###.#...#.............
......#..........#.............
....#.................#..#.#.#.
...##.##.#....##.##............
####......#........###......#..
..#.......#.#..#.##............
.....#.....#.#.......#.....#...
.....#..........#.#............
#.....#.............#......##..
......##..........##....#......
.#..............#..........#...
......#..#...#........#..#....#
.#......#.......#..#...........
..#..#....#.#.......#....##..#.
........#.#................#...
#.......#.##.#......#...#.....#
..#...#.#.....##...............
..........#.....##.............
.......#............#........#.
...#............#......#......#
.#..#.......#...#...#..#..#....
#....#.#...#......#...#......#.
.#.......#..#.#...........#....
...##.#...#.......#..........#.
.....#..............#..#...#...
...........................#...
.............#.....#...........
....#.#..#..#...#..#...........
.....#.#.#..#.#....#.#.#.......
.......#..............#.....##.
........#..#..#.#..#...#.#.....
.....#.#...#.#.#.....#..#...#..
.....#....#.......#......#.#...
.#.#...........#........#......
.##..##......#......#......#.#.
.....#.###.#.......##.#..#.....
#.......##..#.........#....#...
.#.............#.........#.#.#.
..........#..#..#....#....#....
#....#...........##..#.....#..#
......#....#...###..#...#......
.....#....#........#....#..#...
...##..............#.##...#....
.#............#........##......
..##........#.#...........#...#
..#.#...##...#..#..........##..
.................#.......#.....
......#.....#............#.....
.#.....#.........#.#..#.#......
.............#.#.#..#.......#.#
#......#.....#..##...#.......#.
.......#.#..#...#.........#....
...#..##...#.........#.#....#..
........................#..#...
....##..##................#....
.......#..#.......#........##..
.....#....#.##....#............
.#....#............#.....#...#.
..##.....#......#......#.#....#
...#...........#...##....#.....
......#.##.#..##...##.#.#..##..
.......##....#......#....#.#...
.....####..#............#..##..
......##..##..##.........#...#.
.#.#...............#.........#.
......#......#...........#.....
.....#.......##.....#..#.......
.....##..#..#....#.#.......#...
...........###.###.##..#.#..#..
.#...............##.........#..
......##..........#..#.....##.#
.............#....#....#..##...
.#..............#........#.....
.#..#.........................#
.##..............#..........#..
..#..#.#.#.#......#............
....#...#.#.#....#........#..#.
.....#........#....#.....#.....
.#...#.#......#..#........#.##.
.......#.....#................#
.#.#........................#..
............#..#.......#.......
....##.#........#...#.#.#.#.#..
.....#.......##................
...##...#....#.....#.#.........
#...#..............#.......#...
...#.#.#.#..##....##...........
.....##...#....#.....#.........
#......#.....#....#............
....#..###....#.##.......#...#.
..................##.#......#..
.....##..............##.#....#.
.........#...#........#..#....#
.##..#.........#....#..##...#..
#.#.##................#.##.....
..#.#....#.#.......#....#......
..#.#.##.#.......#.............
..#....#.#..##.#..........#.#..
#.....#.....#.....#.........#..
#.......##.....#....##.....#...
..#...#.........##.#..##.......
..#.#.........#.......#........
#.....#.....##.#.#..#...#..#.##
.........................#.##..
..#.#..#..#..#........#......#.
..#..............#.............
.....#.......##.##.....#.......
....#...#...............#..#...
....#......#.#........##.#..#.#
....................#..#.......
.....#.......#......#.##.......
#.......##..........#.....#....
.#.......#....#.#......#.......
......#...#...............#.##.
....##.#.....#.............#.##
#..#................##...#.....
....###......#.#.........#..#..
...#...#......#...##....#...#.#
..#...#.#.##.#.................
.....##......#..#.#....#.......
##.......#......#.#..#.#.......
.#.#.#.........#...#.#..#......
#...#.#........#....#.#.....#..
....#.......##....#......##....
.....#..........#......#....#..
#...#....#...#.....#.#.........
...#..##.....##....#.....#.#...
..................#.....##.....
.....#............#............
...#.....#..#........#.#..##...
.......#.#.....................
......#...#.......#..#...#..#..
.#..#...#.....##.....#.#.#....#
....##...#.#............#..#..#
...........#............#..#...
.......#.....#................#
..#......#.#.......#.#.........
.....#..#.#.##.................
.....#..#......................
...#....#...#..#.#..#....#.....
.#............#.....#..........
#.##..#..#.......#......#.....#
.#.........#....#....#.........
...#.#.#........#.#....#...#...
#........#..#..#..........#..#.
.....#..#.....##......##..##.#.
..............#.......#..#..#..
....#........#.##.#...#........
..#.#..#....#........##.....##.
...##.....#...#.......#.#....#.
#.....#..##.##.#...##.......#..
.....#........#.#.#....#.......
.#................#####..#.#...
..........##..#..###....#......
.....#.......#..........#..#...
..#....#....................#..
#.....#..#.....#...##.#.....#.#
...#..##............#.....#....
##.#..#.......##...............
........##...#.#.....#......#..
........#...#..................
#......#................#.#....
...........#...#..#.........#..
...#.##..#.##..................
.....#......###......#..#......
..#.#.....#...#..#.##........#.
....#..........#.#.....#.......
..#..........#..........#.#....
..#.##.......#......#..........

11
2020/day03/test Normal file
View file

@ -0,0 +1,11 @@
..##.......
#...#...#..
.#....#..#.
..#.#...#.#
.#...##..#.
..#.##.....
.#.#.#....#
.#........#
#.##...#...
#...##....#
.#..#...#.#

99
2020/day04/day04.rkt Normal file
View file

@ -0,0 +1,99 @@
#lang racket
(module+ test
(require rackunit))
(module+ main
(displayln "Day 4"))
(define (parse-passport str)
(define fields (string-split str #px"\\s+"))
(for/hash ([f fields])
(apply values (string-split f ":"))))
(define (read-input filename)
(define passports-str (string-split (file->string filename) "\n\n"))
(map parse-passport passports-str))
(define (valid? passport)
(for/and ([key '("byr" "iyr" "eyr" "hgt" "hcl" "ecl" "pid")])
(hash-has-key? passport key)))
(define (part1 filename)
(define passports (read-input filename))
(length (filter valid? passports)))
(module+ test
(check-equal? (part1 "test") 2))
(module+ main
(displayln (part1 "input")))
(define (byr-valid? v)
(<= 1920 (string->number v) 2002))
(module+ test
(check-pred byr-valid? "2002")
(check-pred (negate byr-valid?) "2003"))
(define (iyr-valid? v)
(<= 2010 (string->number v) 2020))
(define (eyr-valid? v)
(<= 2020 (string->number v) 2030))
(define (hgt-valid? v)
(cond
[(string-suffix? v "cm") (<= 150 (string->number (string-trim v "cm")) 193)]
[(string-suffix? v "in") (<= 59 (string->number (string-trim v "in")) 76)]
[else #f]))
(module+ test
(check-pred hgt-valid? "60in")
(check-pred hgt-valid? "190cm")
(check-pred (negate hgt-valid?) "190in")
(check-pred (negate hgt-valid?) "190"))
(define (hcl-valid? v)
(regexp-match-exact? #px"#[0-9a-f]{6}" v))
(module+ test
(check-pred hcl-valid? "#123abc")
(check-pred (negate hcl-valid?) "#123abz")
(check-pred (negate hcl-valid?) "123abc"))
(define (ecl-valid? v)
(member v '("amb" "blu" "brn" "gry" "grn" "hzl" "oth")))
(module+ test
(check-pred ecl-valid? "brn")
(check-pred (negate ecl-valid?) "wat"))
(define (pid-valid? v)
(regexp-match-exact? #px"[0-9]{9}" v))
(module+ test
(check-pred pid-valid? "000000001")
(check-pred (negate pid-valid?) "0123456789"))
(define (strict-valid? passport)
(and (for/and ([key '("byr" "iyr" "eyr" "hgt" "hcl" "ecl" "pid")])
(hash-has-key? passport key))
(byr-valid? (hash-ref passport "byr"))
(iyr-valid? (hash-ref passport "iyr"))
(eyr-valid? (hash-ref passport "eyr"))
(hgt-valid? (hash-ref passport "hgt"))
(hcl-valid? (hash-ref passport "hcl"))
(ecl-valid? (hash-ref passport "ecl"))
(pid-valid? (hash-ref passport "pid"))))
(define (part2 filename)
(define passports (read-input filename))
(length (filter strict-valid? passports)))
(module+ test
(check-equal? (part2 "valid") 4)
(check-equal? (part2 "invalid") 0))
(module+ main
(displayln (part2 "input")))

1069
2020/day04/input Normal file

File diff suppressed because it is too large Load diff

13
2020/day04/invalid Normal file
View file

@ -0,0 +1,13 @@
eyr:1972 cid:100
hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926
iyr:2019
hcl:#602927 eyr:1967 hgt:170cm
ecl:grn pid:012533040 byr:1946
hcl:dab227 iyr:2012
ecl:brn hgt:182cm pid:021572410 eyr:2020 byr:1992 cid:277
hgt:59cm ecl:zzz
eyr:2038 hcl:74454a iyr:2023
pid:3556412378 byr:2007

13
2020/day04/test Normal file
View file

@ -0,0 +1,13 @@
ecl:gry pid:860033327 eyr:2020 hcl:#fffffd
byr:1937 iyr:2017 cid:147 hgt:183cm
iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884
hcl:#cfa07d byr:1929
hcl:#ae17e1 iyr:2013
eyr:2024
ecl:brn pid:760753108 byr:1931
hgt:179cm
hcl:#cfa07d eyr:2025 pid:166559648
iyr:2011 ecl:brn hgt:59in

12
2020/day04/valid Normal file
View file

@ -0,0 +1,12 @@
pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980
hcl:#623a2f
eyr:2029 ecl:blu cid:129 byr:1989
iyr:2014 pid:896056539 hcl:#a97842 hgt:165cm
hcl:#888785
hgt:164cm byr:2001 iyr:2015 cid:88
pid:545766238 ecl:hzl
eyr:2022
iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719

60
2020/day05/day05.c Normal file
View file

@ -0,0 +1,60 @@
#include <stdio.h>
#include <limits.h>
#include <stdbool.h>
unsigned int bin_to_int(char *buf, int size) {
unsigned int r = 0;
for (int i = 0; i < size; ++i) {
r = r << 1;
if (buf[i] == 'B' || buf[i] == 'R') {
r++;
}
}
return r;
}
int main(int argc, char *argv[])
{
if (argc < 2) {
printf("Usage: %s <input file>\n", argv[0]);
return 0;
}
FILE *fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("Could not open file %s\n", argv[1]);
return 1;
}
char buf[12];
size_t i = 0;
unsigned int ids[1024];
unsigned int min_id = UINT_MAX;
unsigned int max_id = 0;
while (fgets(buf, sizeof(buf), fp) != NULL) {
ids[i] = bin_to_int(buf, 10);
if (min_id > ids[i]) {
min_id = ids[i];
}
if (max_id < ids[i]) {
max_id = ids[i];
}
i++;
}
printf("%u\n", max_id);
fclose(fp);
for (int id = min_id; id < max_id; ++id) {
bool present = false;
for (int j = 0; j < i; ++j) {
present = present || (id == ids[j]);
}
if (!present) {
printf("%u\n", id);
break;
}
}
return 0;
}

4
2020/day05/day05.dyalog Normal file
View file

@ -0,0 +1,4 @@
⎕IO←0
p←{2⊥⍵∊'BR'}¨⊃⎕NGET'input'1
⌈/p ⍝ Part 1
⊢/(⍳⌈/p)~p ⍝ Part 2

38
2020/day05/day05.rkt Normal file
View file

@ -0,0 +1,38 @@
#lang racket
(module+ test
(require rackunit))
(module+ main
(displayln "Day 5"))
(define (seat-id str)
(define binary-str (list->string
(for/list ([c (in-string str)])
(if (or (equal? c #\B) (equal? c #\R))
#\1
#\0))))
(string->number binary-str 2))
(define (read-input filename)
(define seats (file->lines filename))
(map seat-id seats))
(module+ test
(for ([seat '("FBFBBFFRLR" "BFFFBBFRRR" "FFFBBBFRRR" "BBFFBBFRLL")]
[expected-id '(357 567 119 820)])
(check-equal? (seat-id seat) expected-id)))
(define (part1 filename)
(apply max (read-input filename)))
(module+ main
(displayln (part1 "input")))
(define (part2 filename)
(define ids (read-input filename))
(define id-range (range (apply min ids) (apply max ids)))
(set-first (set-subtract (list->set id-range) (list->set ids))))
(module+ main
(displayln (part2 "input")))

965
2020/day05/input Normal file
View file

@ -0,0 +1,965 @@
FBFBBBFRLR
FBBFBBBLLR
FFFFFBBRRL
BBBFFFBRRL
BFFBFBFLRL
FBFFBFFLLR
FBFBBBBRLR
FBFBFBFRLL
BFFBFFBRLR
FBBFFFBLRR
FBFBBBFRRR
BFFBBFBRLR
BFFBFBFRRL
FFFFBBBLRL
FBBFBFFRLL
BBFBBFBRLR
BFFFFBBLLR
FBFFFFFRRR
BFBFFBFLRR
BBFBFFBLLL
BFBFFFFLLR
FBBFBBBRLL
BBBBFFFRRL
FFBBBFFRLR
FFFBFFFRRL
FFFBBBBLRL
BFBBFBFRRL
BFFBBFBLLL
FBFBBFFLRL
BFFBBBBLRL
FFBBBFFLRL
FFBFBFFRRL
BBBFBFBRLR
FBFBBBBRLL
FBBBFBBRRR
FBFBFBFLLL
BBFFFFFLLR
FBFFFBBLRR
FFBFFFBLRR
BBBFBFFRLR
FFFFFFBRRL
BFBBFFFRRR
FBFFBFBRRR
BFFFBBFLRL
BBFBFFFRRR
BBFFFBBLRL
FFBBFFFLLL
FFFFFBBRLR
BFBFFFFRRL
FFBBFBBLRR
BFBBFBBLLR
FFBBBBFRRL
BBBFFFFLRL
BFBFFBFLRL
BFFFFBBLRL
BBBFBBBRLL
BFBBFBBLRR
BFBFFBBRRL
BBFBFFFLLL
FFFFBFFRRL
FFFFBBBRRR
FBBFBBFLRL
FBFFBFBRLR
FBFFBBBLLL
FBFBBBFLLR
FBBFBFBRLL
BBBFBFFLLL
BBFFFFFLRL
FFBFBFBRLL
FBBBFFBLRL
FBFBFFBLRL
FFFBBFBRLR
FBFBBFBLLR
FBFFBBBRLL
BBFBBFBLLL
FBBBBFFRLL
FBBBBBBLRR
FFFFFBFLRR
BFFBFBBLRR
FBFFBFFLRR
BBFFFFBLRL
BBFFBFFLLR
FFFBBBBLRR
FBFBBBFRRL
FBBFFFBLRL
BBFBBFFRRL
FFBBBFBRLR
BBBFBFBRRR
FBFFBFFRRR
FFBFFBFRLR
BFBBFFBLLL
FFBBBFFRRL
FFFBFFFRLL
BBFFFBFLLR
BFFFFFBRLL
FFBFBBBRLL
FFFBFBFLLL
FBBFBBBLRR
BFBFBFBRLL
FFBBBBBLLL
FFBFFFBRRR
BBFBBFFRLL
BFFFFFFLRL
FBFFBFFRLR
BFFBBBFLRR
FFFBBFFRLR
FBFFFFBLLL
BBFFBBBRRR
FFBFBFBLLR
FBBFFBBLLR
BBFBBFBLLR
BBFBBFBLRL
BBBFFBFRRL
FBFFBBBLRL
BFBFBFFLLR
BFFFFFBRLR
FBFBFFBLLR
BFFFBFBRLL
FBFFFFBRRR
BFBBFBBRRL
FBFFFBBLRL
BFBBBBFLRL
BBBBFFBLRL
FFBFFBBLRL
FFFBFFBRLR
FBFBFFBRLR
FBFBFBBRRR
BFFBFBBLRL
FBBBFBBRLR
BFBBBFFLLL
BFBFBBBLLR
BBBFBBBRRR
FFBFFFFRLR
BBFFFBBRRR
BBBFBBFRRL
FFBFFBBLLL
BBFFBFFLRR
BBFFBFBRRL
BBFBBBFLRR
FBFFBFBLRL
BFBFFFFLLL
FFBBBFBRRR
BBBFBBBLLL
FBFBBFBLRL
BBBFFFBRLL
BFFFBBFRRL
BBBBFFFLLR
BBBFBFFRLL
FFBBFBFLRR
FBBFBFBRRR
FBBFBBFLRR
BBFFFBFRRL
FBFFFBBRLL
BBFFFFFRLR
FBBFBBFRRL
FBFFFBBLLL
BFBFBBFLLL
BFFBFFBRLL
FFFFBBBRLR
BBFBBBBRLR
BFBFFFBLRR
BFBFFFBRLL
FBFBBBBLLR
BFFFBFFRRR
FFBBBFFLLR
BFBFFFBLLL
FFBBFFBRLR
FBBFBBBRRL
BBFBFFBLRR
FBBFBBBRRR
FFFBBFBRRL
BFBFBFBLLR
BBFBFFBLRL
BBBFBFBRRL
BFFBFBFLLR
BFBFBBBLRR
FBFFFBFRLL
BFFBFFFRRL
FBFBFFFRRR
BFFBFFFRLL
FFBBFFBLLL
BBBBFFFRLR
BBBFFBFLLR
BFBFBFBRRL
BBFBBBBLLR
BFFBBFFRLR
FFFFBBBRRL
BFFFBBFRLR
FFBBFBBLLL
BBBFFFBLLR
BBFBBBFLLL
FFFFFBFLLR
BBBFBBFLRL
FFFFFBFLLL
BBFBFFFLLR
BFBBFBFLRL
BFBFBBFRRL
BBBFBFFRRL
BFFFBBFRLL
FFFFBFBLRL
BFBBBBBLRR
FFFBFFBLRL
FFFBBBBRLL
BBBFBFBLLR
BBBBFFBLLR
BFFFBBBLLR
BBFFFBBLLR
BBFFBBBLRR
FBBFBFBLLR
BBBFFFFRLL
FBBFBFBRRL
FFBFBFFRLR
BFFFFBFLLL
BBFBBBBLLL
FBFBBBBLRR
BBBBFFFRLL
BFBBFBBRRR
FFFFBBBLLL
BBFFBFBRLL
FBBFFBFLRL
FFBBBFFRLL
FFFBBBFRLR
FFBBFBFLRL
BBFBFBFLLR
BFFFFFBLRR
FBFBBBFRLL
FBFFFFFLLR
FBFBFFBLLL
BFFBFBFRLR
FFBFBFFLLL
FFFFFBBLLR
BBBBFFBRRR
FBFBFBFLLR
BBFFFBFRLR
BBFFBFBLRR
BFFBBFFLRR
BFFFFBFLLR
FBBFBFBLRL
BFFFFBFLRL
BBFFFFFLRR
BBBFFFFRRR
FFBBBFFLRR
BFFFBFBLRL
BBFBFBBLRR
BBFBFFBRLR
FFFBFBFLRR
FBFFFFFRLL
BBFBBBFRLR
BBFFBBFRRL
BFBFFBBRLR
FFBFFFBLLR
BFBFFFBRLR
BBBBFFBRLR
BFBFFBFLLR
BBFFBBFLLR
FBFFFFBLLR
FFFBBFBLRR
FFBBFFBRRR
FBBBFBFLRL
FBFBFBFLRR
BFFFBFBRRL
FBFFFFBRRL
FBFFFBBRLR
FBBFFBBRRL
FBBFBFFLRL
BFBFBBFRLL
FBBBBFFRLR
FFBFFFFRRL
BFBFBBBRRR
BFFBBBFRRR
BBFFFFFLLL
BFBBBBFLRR
FBBBBBFRRL
BBFBFBFRRL
BFFBFFFRLR
FBFFFBFRRR
FFBBBBBLLR
FBFFFBFRLR
BFBFBFBRLR
FFFBBBFRRR
FBBBFFBRLL
BBFBFBBLRL
FFFBFBBLLL
BFBFBFFLLL
FFFBFFFLLL
FBBBFBBRRL
FBFFFBFLRL
FBFFBFBRLL
BBFFBBFRLL
BFFFBFFRLL
FFBBFBFRRR
BBBFFBBRRL
BBFBFBBRLR
FFBBFFFLRR
FFBBBBFLLR
FFBFFBFLLR
FBBFBBFRLL
FBFBBFFLRR
BBBFFFFRRL
FFFFFBBLRR
BFBFBFFRLR
FFBBBBFRRR
FFBBFFFLLR
FFBBBBBLRR
FBBBBFBRRR
FBFFFBBRRR
BFFBFFBRRR
BFBFBBFLRR
FBFBBBBRRL
FBBBBFBRLR
BFFBBFBLLR
FBBBFBBLLL
FFBBBBBRLL
FBBBBBBRLL
FFFBFBBLLR
BFFFFFBRRL
BFFBFBBRRL
FBBBFFBLRR
FFFBFFFLRR
FFBBBBFRLR
BFFBFFFLLL
FBFFBFFRLL
BFBFBFFRLL
FBBFBBBRLR
FBFFBBFRLL
FFBFFFBRLR
BFBBFBFLRR
BFBBBBFRRL
FBFBFBBRLL
BFBBBFBLRL
FFBBFFBLRR
BBFFBBBRLR
FBBBFBBLRL
BBBBFBFLRL
BBBFBBFRRR
FFFBBFBLRL
BFBFFBBLLR
BBBFFFBLRL
BBFFFFBLRR
FFBBBBFLLL
FBFFFBFLLL
FFBBFBBRRL
BFFBBBBLRR
FBBFFBBRLR
BFBBFBFRLL
FFBBBBBLRL
FBFBFFFRLR
BFBBBFBRRR
BFBBBFBRLL
BBFBBBFRRR
BFFBBFBRRR
BBFFBBBRLL
FFBFFBBRLR
FFFFBBBRLL
FFBBBFBLRL
FFFBFBFRLL
BFBFBBFRRR
FBBFFFFRLL
BBBBFBFLLL
FBFBFFBRRR
BFFFBBBRRR
FFFBBFBLLL
BBBFBBBRRL
FBFFBFBLLR
FBBBBBFRLL
FBBFBFFLLL
BFBFFFBRRR
FBFBFBBLRL
FBFBBBBLLL
FFBFFFBRLL
BFFFBFBRLR
BFBFBBBRLL
FFBFBBFLLL
BBBBFFFRRR
FFFBFBFRRR
FFBBFFFRLL
BFBBBBBLLR
FBBBBFFLRL
BFBFBBFLRL
BFFBBBFLRL
BBFFBFBRLR
BBBFFBFLLL
FBFFBFFRRL
FFFBBBBRLR
BBFBFFFLRR
FBBBBBBRLR
BBFFBBBLLL
BBFBBFFLLL
FBBFFBFRLR
FFFFBFBLRR
FFFBBFFRRR
FBFBFBFLRL
BBFFBBFRRR
FFFFBFBRRR
FFBFBBBLRR
FBFFFBBRRL
BFFBBFBRLL
FFBFBFFLRR
FFBBFBBLLR
FBBBBBBLLR
FFFBBBFLLL
FFBBFFBLRL
BBFFFBBRLR
FFFFBFFRLR
BBFBFFBLLR
FFFBFBBLRR
BBFFFFBRLR
FBFBFFFRRL
FBBBFBFLLL
FFFBBBFRLL
FFFBFBBRLL
FFBFFBBLLR
BFFFBBBLRR
FFFBBFBLLR
FFBFBBFLRL
BFFBFBFLLL
BFFFBBFLRR
FBFFFBBLLR
FBBFFBBLLL
FFBBFFFLRL
BBBFFBFLRL
FBBFFFFLLL
BFFBBFFLLR
BBBFFFFLLL
FBFFBBFRRR
BFBBBBBRRR
FBFFFFFLRL
FFBFFBBRRL
FBFBBFFRLL
FFBFBBFRLR
BBBFFBBLLL
FFFBBBFLRL
BBFFFBBRRL
BFFFFFBLLR
FBBBFFBLLR
BBFBBFFLRR
FBFBBFBLLL
BFBBFBFRLR
BFBBFFBRRL
BBFFFBBLRR
FBBFFBFLRR
FFFBFFBRRR
FBFBBBBLRL
BBFFBBBLLR
FFBFFFBLRL
FBBBFFFLRR
BBBBFFBRLL
BFFBBBFLLR
BFBBBBFRLL
BFFBFFBRRL
BFFFFBBRLR
FFBFFFBLLL
FBBFFBFRLL
BFFBBBBRLR
BFFBFBBLLL
BBBFFBFRLR
BBFBBFBRLL
FFFFBBFRRL
FFBFBFBLRR
BFFBBBBLLR
BFFFFBFRRL
FBBBBFBLRL
BBBFFBBLRR
FBBBBFBLLL
FFFBFBBLRL
FFBFBBFRRR
BFBBFFBRLR
BBFFBBFLRR
FBBBFBFRLR
FBBFBFBLLL
BFFFBBFRRR
BFFFFBFRLR
FFBFFBFRRR
FFFFBBFRLR
FBBFFFBLLL
FBFFBBFLRR
BFFFFFFRLL
BFBBBFFLRR
FBFFBFBLRR
FBFBBFFRRR
FFFBBBBRRL
BFFFBFFLLR
FBBBBFFLLR
BFFFFFFRRR
FFBFFFFLRR
FBBFFFFRRL
FBBFFFFRLR
BBFFBBBLRL
FBFFBBBRRR
BFFFBBBRRL
BFFFBBBLLL
BFFFFBBRLL
BFFFFFFLRR
FBFBFBFRLR
FFFBFFFRRR
FFFFBBFLLL
BBBFBFBLRR
BBBFBBFLRR
BBFBFBBLLL
FFFBBBFLRR
FBBFFFBRLL
BFFBFFFLRR
BFBFBBBRRL
BFFBBBBRRR
FBFFBBBLRR
BFFFBBFLLL
BBBFBFBLRL
BFFFBFBLLR
BBBFBFFLLR
FFBFFBBLRR
FBBFBFFLRR
BBBFFBFRRR
BFBBFFFLRL
FFBBBFBLLR
FBBBBFFRRR
BFBBBBBRLR
BBFFBFBLLR
BFFBFBBRLR
BFFBFFFLLR
BFFBBBBRRL
BBFBFBFLRL
BFFBBBFLLL
BBBFFBFLRR
FBFFFFFLRR
BFBFBFBRRR
BBBFFBFRLL
BFFFBBFLLR
BBBFBBFRLR
FFFFBBFLRR
FBBBFBFRRL
FFFBFFBRRL
FFBFFBBRRR
BFBBBBBLLL
FFBFFBFRLL
BFBFFFBLLR
BFFBBFBLRL
BBFBBFFLRL
FFFBFBFRRL
BFFBBBBRLL
FBFBFFBRRL
FFFFFBFRLR
FBBBBFBRLL
FFFFBFFLLL
FBFBFBBRLR
FBFFFFBRLR
BFBBFFBLRR
BFBBBFFRLL
BBFBBFFLLR
FBFBBBFLRR
FFFFBFFRLL
BFBBFFBRRR
BBBFFFFLLR
BBFFFBBLLL
BFFFFFFRRL
BFBBFFBRLL
FFBFFFBRRL
FBFBBFBRLL
BFBBBFBLRR
BBFBFBFLRR
BBBFBBFLLL
FBFBFFFLRR
BBBBFFBLRR
FFFBBFFLRR
BFFFBFBLLL
FFFFBFFLRL
FFBBFBBRLR
FFFBFBFRLR
BFFBFBFRLL
BBBFFFBLLL
BBFBBFBRRR
BFBFBBBLLL
BFFBFFBLLR
BFBBFBBLRL
BBFBFFBRLL
FBFBBFFLLR
BFFFFFBLLL
FBFFFFFRRL
FFFFFFBRRR
BBBFFFFRLR
FBFFFBFRRL
BFBFFBBRLL
BBFBFFBRRR
FFBFBBBLRL
FFFBFFBLRR
FFFBBBFRRL
BFFBBFBRRL
BFBFFFBLRL
FBBFFBBRLL
FFBBBBBRRL
FBBBBFBLRR
BBFBFBBRRL
FBBBFFBRLR
FFBBFBBRLL
FFFBBBFLLR
BFBBFFFLRR
FBBBFFFLRL
BFBFFFBRRL
FFFFBBBLRR
FFFBFFBRLL
BFBBFBBRLR
FFFFFBBLLL
BFBBBFFRLR
BFBFFFFLRR
BFBBFFFLLR
FFFFBFFLRR
FFBFBFBLLL
BFBFBBFRLR
FBFFFBFLLR
FFBBFFBLLR
FBFBBBBRRR
FBBBBBBLLL
FFBFBBBRRR
FBFFBBFRLR
BFFFBFFLRL
FFBFBFFRLL
FBFFFFBLRR
BFBFFFFRLR
FBBBBBBRRL
BFBFBFBLRR
FFBFBBFLLR
FFFBBFFLLL
FFFBBFFLLR
FBBBFBBLLR
BFBBBFBLLL
BFBFFBFRLL
BFBBFFFRRL
BFBBFFBLLR
FBBFFBFRRL
BBFBBBBRRR
FBBBFFBRRR
BFFBBBFRLR
BBFBBBBRRL
FBBBFBFLLR
BFBFFFFRLL
FBBFFFBLLR
BBBBFFFLRL
BFFBFBFLRR
FBFFBFBRRL
BFBBBFFLRL
BBFFBFFRLL
BFBFBBBLRL
BBFFFBFLRR
BBFBFFFRRL
BFFBFBBLLR
FFFFBFBRLR
FFBBBBFLRR
FBBBBBFLLL
BFBBFBFLLL
FBBBBFBLLR
FBFBFFFLLL
BBFFFBFLLL
BBFBBBBLRL
FFFFFBBLRL
FFBFBBBLLR
FFFBFFFLLR
BFBFBFBLRL
FFBFFBFLRL
FBFFBBFLRL
FFBFBBFRRL
BFFBFFBLRR
BFFBBFFRLL
FFBFBFBRRL
FBFBFBBLRR
FBFBFBBLLL
FFFFBBFRLL
FBBBFFFRLR
FBFBBFBRLR
FBFFBBFLLL
BBFBBBFRLL
FBBBBBFLLR
FBBFFBBRRR
BFFBBBFRRL
BBFFBFFRRR
FFBFBBBLLL
FBBBBFFLLL
BBBBFBFLLR
FBBFBFFRRL
BBFBFBFRLR
FFFFBFFRRR
BFBFBFBLLL
BBFBBBBLRR
BBFFBFBLLL
BFBFBFFLRL
FFBFFFFLLR
FFFBBFFRLL
BBBBFFBRRL
BBFBBFBRRL
BBBFBFFLRL
BFFFBBBRLR
FBFBBBFLRL
FFBBBFBLRR
BFBFFFFRRR
BBBFFFBLRR
FFBFFFFRLL
BFBFFBFRRR
BFBBBFFRRL
FFFFFBFRLL
BBBFFBBLLR
BBBFFFFLRR
BFFBBFFRRL
FFBFBFFLLR
FBBBBFBRRL
FBFBFBBRRL
BBFFFFBRLL
FFBFBBBRLR
FBFBBFFLLL
FFBBBBBRLR
BFBBBBBRRL
BBBFBFFRRR
FFFBBFBRLL
BFBBFFFLLL
FFFFBFBRLL
BBFFBBFLRL
FFFBFBBRRL
BBFBFBBRLL
BFBFBBBRLR
FFFFBBBLLR
BFBBBBBRLL
FBBFBFFRRR
FBFFFBFLRR
FBBBFFFLLL
FFBFBFBRLR
FFFBFFBLLL
FFBBFBFLLL
BFBBBFBLLR
FFFFBFBRRL
FFFBFFBLLR
BBFFBBFRLR
BFFFFFBRRR
BFBBFFFRLR
FFFFFBBRLL
BBBFFBBRLL
BFFBFBBRRR
BFBFBFFRRL
FBBFFFBRRL
FFFBBFFLRL
FBBFFBFLLL
FBBFFFFLLR
BBFBBFBLRR
BBBFBBBRLR
FFFFBFFLLR
BFFBBFFLRL
BBFBBBFRRL
BBFFFFFRRL
BFBFFBBLRR
FFBBFFFRRL
BBFBFBFRLL
BFFBFFFRRR
BBFBFFFRLR
BFFBFBBRLL
BFFFFBBRRR
BFBFFBFLLL
FFFFFBFLRL
FBBFBBBLRL
BFBBBFBRLR
BFFFFFFLLL
FFFBFFFRLR
BFBBBFFRRR
FBBFFBBLRL
BBFFFFBRRL
BFFFFBBRRL
BBBFFFBRRR
BFBBFBBRLL
FBBFFBFLLR
FFBBFBBRRR
BBFFBFBLRL
FFBFBFBRRR
BFBBFFBLRL
BFFBBFFLLL
FFFBBBBLLR
FFBFBBFRLL
FBBBFFBLLL
BFBFBFFLRR
BFBBFFFRLL
FFBFBBBRRL
FFBBFBFRRL
FBFBBFBRRL
BFFBBBBLLL
BFBFFBBRRR
BBFBBBFLRL
BFBFFBFRRL
BFFBFFBLLL
FFBFFBFRRL
BBBFFFBRLR
FBBFFFBRRR
FFFBFFFLRL
FFFFBFBLLL
BBBBFFBLLL
BBFFFFBLLL
BBBFBBBLRL
FBFBFBBLLR
BFBFFFFLRL
BFFFFFFRLR
FFFFFFBRLR
BFFFFFBLRL
BBBBFFFLRR
FBBFBFBRLR
BFBBBBFLLR
FBBBBBFLRL
FFBFFFFRRR
FBFFBBFLLR
BBBBFFFLLL
FBBFFFFLRR
BBFBBFFRRR
BFBBBBFRRR
FBBBFFBRRL
BBFFFFBLLR
BBFFFFFRRR
BBFBFFFLRL
BFFFBFFLRR
BBBFBFFLRR
FFFBBFFRRL
FFFBFBFLRL
BFBFFBBLLL
FFBBFBBLRL
FBFFFFBLRL
FFFFBBFLLR
BFFBBFBLRR
BFBBBFBRRL
BBFFFBFLRL
FFBBBBFRLL
BFFFBFBRRR
FBBFBFFRLR
FBFFFFFLLL
BBFFBFFRLR
FBBBBFFRRL
BFFFBBBRLL
BBBFFBBRLR
FBFFBBFRRL
BBFBBBFLLR
FFBFFBFLLL
FBBFFFBRLR
BBFBBBBRLL
FBFBBBFLLL
FBBBBFFLRR
FBBBFBFRLL
FFFBBFBRRR
BBFBFBFLLL
BFBBBBFRLR
BBFBFFFRLL
FBBFBFFLLR
FFBBBFBRLL
FBBBFBFRRR
FBFBFBFRRR
FBBBFFFLLR
BBFFFBFRLL
BBFFBBFLLL
FFFBFBFLLR
FFBBFBFLLR
FBBFBBBLLL
FBBFBBFRLR
BFFFFFFLLR
FBFBBFBLRR
BBFFBFFLRL
BFFFFBFRLL
FBBBBBBLRL
FFFFFBFRRR
FBFFBBBRLR
FBBFFFFLRL
BBFFBFFLLL
FFBBFFFRRR
FFFFBBFLRL
BBFBFBBLLR
FBFBFFBLRR
FBBBFFFRRL
BFBFFBFRLR
BFBFBFFRRR
FBBBFBBLRR
BBFFBFBRRR
FFFFFBBRRR
BBFBFBBRRR
BFBBFBBLLL
FFBFFBBRLL
FBFFBFFLLL
FFBBFBFRLR
BBBFBBFLLR
FBBFBFBLRR
FFFBBBBLLL
BBFFFFBRRR
FBFFBBBLLR
FBFBFBFRRL
BBBFFBBLRL
BBFBFFBRRL
FBBFFBFRRR
FBBBBBFRLR
BFFFFBFLRR
FBBFBBFLLL
BFFFBFFRRL
BBBFFBBRRR
BBBFBFBLLL
BFFFBFBLRR
FBBBFFFRLL
FBFFFFBRLL
FBBFFBBLRR
FFBFFBFLRR
FBBBFFFRRR
BFFBFBFRRR
BBFFBFFRRL
FFBFFFFLLL
BFFFBBBLRL
FBFBFFFRLL
FBFBFFBRLL
BBBFBBBLLR
FFBFBFFRRR
FBFBBFFRLR
BBBFBFBRLL
BFBBBFFLLR
BBFBFBFRRR
FBFBBFFRRL
FFBBBFFLLL
BBFFFBBRLL
FBBBFBFLRR
FBFFBFBLLL
FFBFBFBLRL
FFFBFBBRRR
FBBBBBFRRR
BFFFBFFLLL
FFBBBBBRRR
FFFFFBFRRL
FBBBFBBRLL
FBBFBBFLLR
FBBFFFFRRR
FFBBBFBRRL
BFFBFFFLRL
BFFFFBFRRR
BFFFFBBLLL
FBBBBBFLRR
BFFBBFFRRR
BFBFBBFLLR
FFBBBFFRRR
FFBBFFBRRL
BFBFFBBLRL
BFFBFFBLRL
FFBBBBFLRL
FFBBFFBRLL
FBFFBFFLRL
FFBBBFBLLL
BBFBBFFRLR
BBBFBBBLRR
FFFBBBBRRR
BFFFFBBLRR
FFBFFFFLRL
BFBBBBBLRL
BBBFBBFRLL
FBFFFFFRLR
BBFFFFFRLL
FBFBFFFLRL
FFFBFBBRLR
FBBFBBFRRR
FBFBBFBRRR
BBFFFBFRRR
FFFFBBFRRR
FFFFBFBLLR
BFBBFBFLLR
BBFFBBBRRL
FFBBFBFRLL
FBFBFFFLLR
BFFBBBFRLL
FBBBBBBRRR
FBFFBBBRRL
FFBFBBFLRR
BFFFBFFRLR
BFBBBBFLLL
FFBBFFFRLR
FFBFBFFLRL

58
2020/day06/day06.c Normal file
View file

@ -0,0 +1,58 @@
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s <input file>\n", argv[0]);
return 0;
}
FILE *fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("Could not open file %s\n", argv[1]);
return 1;
}
bool flag_newline = false;
unsigned int answer_count = 0;
unsigned int counts[26] = {0};
unsigned int part1 = 0;
unsigned int part2 = 0;
for (char c = getc(fp); c != EOF; c = getc(fp)) {
if (c == '\n' && flag_newline) {
for (int i = 0; i < 26; ++i) {
if (counts[i] > 0) {
part1++;
}
if (counts[i] == answer_count) {
part2++;
}
counts[i] = 0;
}
flag_newline = false;
answer_count = 0;
} else if (c == '\n') {
flag_newline = true;
answer_count++;
} else {
counts[c - 'a']++;
flag_newline = false;
}
}
for (int i = 0; i < 26; ++i) {
if (counts[i] > 0) {
part1++;
}
if (counts[i] == answer_count) {
part2++;
}
}
printf("%u\n", part1);
printf("%u\n", part2);
fclose(fp);
return 0;
}

4
2020/day06/day06.dyalog Normal file
View file

@ -0,0 +1,4 @@
p←⊃⎕NGET'input'1
p←(~p∊⊂'')⊆p
+/{≢⊃∪/⍵}¨p ⍝ Part 1
+/{≢⊃∩/⍵}¨p ⍝ Part 2

37
2020/day06/day06.rkt Normal file
View file

@ -0,0 +1,37 @@
#lang racket
(module+ test
(require rackunit))
(module+ main
(displayln "Day 6"))
(define (read-input filename)
(string-split (file->string filename) "\n\n"))
(define (count-unique str)
(set-count (set-remove (list->set (string->list str)) #\newline)))
(define (part1 filename)
(apply + (map count-unique (read-input filename))))
(module+ test
(check-equal? (part1 "test") 11))
(module+ main
(displayln (part1 "input")))
(define (count-intersection str)
(define answers (string-split str "\n"))
(set-count
(apply set-intersect
(map (compose list->set string->list) answers))))
(define (part2 filename)
(apply + (map count-intersection (read-input filename))))
(module+ test
(check-equal? (part2 "test") 6))
(module+ main
(displayln (part2 "input")))

2232
2020/day06/input Normal file

File diff suppressed because it is too large Load diff

15
2020/day06/test Normal file
View file

@ -0,0 +1,15 @@
abc
a
b
c
ab
ac
a
a
a
a
b

9
2020/day07/day07.dyalog Normal file
View file

@ -0,0 +1,9 @@
⎕IO←0
p←'(^|\d )\w+ \w+ bag'⎕S'&'¨⊃⎕NGET'input'1
bags←⊃¨p
edges←1↓¨p
adj←edges∘.{0⌈48-⍨⎕UCS⊃⊃(/¨(⊂⍵)⍷¨⍺)/}bags
gold←bags⊂'shiny gold bag'
¯1+({∪⍵,⊃¨⍸1⌊adj[;⍵]}⍣≡)1gold ⍝ Part 1
inside←{⊃{∊1↓¨⍸adj[⍵;]}¨⊂⍵}
¯1+⍴∊{(inside⍣⍵)1gold}¨100 ⍝ Part 2

52
2020/day07/day07.rkt Normal file
View file

@ -0,0 +1,52 @@
#lang racket/base
(require racket/list
racket/string
graph)
(module+ test
(require rackunit))
(module+ main
(displayln "Day 7"))
(define (read-input filename)
(with-input-from-file filename
(lambda ()
(weighted-graph/directed
(append*
(for/list ([line (in-lines)]
#:unless (string-contains? line "contain no"))
(define nodes (regexp-match* #px"\\w+\\s\\w+ bag" line))
(define weights (map string->number (regexp-match* #px"\\d+" line)))
(for/list ([node (cdr nodes)]
[w weights])
(list w (car nodes) node))))))))
(define (part1 filename)
(define g (read-input filename))
(define-values (dists preds) (bfs (transpose g) "shiny gold bag"))
(for/sum ([(k v) dists]
#:when (< 0 v +inf.0))
1))
(module+ test
(check-equal? (part1 "test") 4))
(module+ main
(displayln (part1 "input")))
(define (count-bags g bag)
(add1 (for/sum ([t (in-neighbors g bag)])
(* (edge-weight g bag t) (count-bags g t)))))
(define (part2 filename)
(define g (read-input filename))
(sub1 (count-bags g "shiny gold bag")))
(module+ test
(check-equal? (part2 "test") 32)
(check-equal? (part2 "test2") 126))
(module+ main
(displayln (part2 "input")))

594
2020/day07/input Normal file
View file

@ -0,0 +1,594 @@
mirrored gold bags contain 3 light teal bags.
clear gold bags contain 5 light maroon bags, 4 pale tomato bags, 5 clear blue bags.
dark olive bags contain 5 plaid black bags, 2 dim plum bags, 2 light cyan bags.
bright white bags contain 2 pale violet bags, 5 mirrored orange bags, 3 faded beige bags.
posh green bags contain 4 shiny gray bags.
posh lime bags contain 3 muted lavender bags, 1 clear magenta bag, 5 muted orange bags, 3 mirrored cyan bags.
striped turquoise bags contain 3 pale red bags, 4 wavy lime bags, 4 wavy aqua bags.
pale fuchsia bags contain 1 striped purple bag.
dark magenta bags contain 4 light indigo bags, 1 wavy lavender bag, 1 clear teal bag.
drab teal bags contain 5 pale bronze bags.
muted aqua bags contain 4 wavy bronze bags, 1 pale plum bag.
vibrant brown bags contain 4 dull turquoise bags.
vibrant green bags contain 5 dim violet bags, 2 dotted red bags, 2 dull indigo bags.
wavy black bags contain 3 posh yellow bags, 5 wavy coral bags.
light fuchsia bags contain 1 dull violet bag, 5 dim indigo bags, 4 plaid red bags, 5 dotted bronze bags.
drab bronze bags contain 5 dim tan bags, 4 mirrored yellow bags, 5 dim indigo bags.
plaid silver bags contain 4 pale orange bags.
wavy red bags contain 3 muted chartreuse bags, 4 light silver bags.
light aqua bags contain 4 dark cyan bags, 3 shiny aqua bags, 1 light olive bag, 3 wavy purple bags.
wavy salmon bags contain 1 shiny blue bag, 2 bright green bags, 5 dark beige bags.
vibrant indigo bags contain 4 drab lime bags, 5 plaid turquoise bags.
striped violet bags contain 3 dim violet bags, 3 striped purple bags.
dull salmon bags contain 5 vibrant turquoise bags, 5 muted black bags.
dark lavender bags contain 5 pale gold bags, 5 pale silver bags.
clear lavender bags contain 1 faded turquoise bag.
striped crimson bags contain 2 dull turquoise bags, 1 dotted red bag, 5 striped yellow bags.
posh chartreuse bags contain 2 wavy lavender bags, 2 striped black bags, 5 dim blue bags, 5 bright fuchsia bags.
clear tomato bags contain 1 mirrored violet bag, 4 pale gold bags, 5 bright bronze bags.
clear brown bags contain 3 plaid fuchsia bags.
pale aqua bags contain 3 pale indigo bags, 1 dark lime bag, 4 dim magenta bags.
bright maroon bags contain 4 wavy yellow bags, 4 bright tan bags, 2 posh indigo bags, 4 shiny white bags.
wavy purple bags contain 1 faded beige bag, 2 drab salmon bags, 3 mirrored yellow bags.
muted salmon bags contain 5 bright olive bags, 2 striped white bags, 3 dotted coral bags.
dotted maroon bags contain 4 striped brown bags.
wavy turquoise bags contain 1 dim indigo bag, 3 clear lavender bags.
muted tomato bags contain 2 wavy turquoise bags, 4 pale crimson bags.
faded teal bags contain 2 dotted yellow bags, 4 dull olive bags.
dotted blue bags contain 4 striped plum bags, 4 striped cyan bags, 2 drab bronze bags.
posh teal bags contain 2 vibrant purple bags, 4 plaid fuchsia bags, 2 light green bags, 3 light chartreuse bags.
muted gold bags contain 1 muted green bag, 1 vibrant brown bag, 5 pale crimson bags.
clear olive bags contain no other bags.
dotted beige bags contain 4 posh beige bags, 2 pale silver bags.
vibrant lavender bags contain 4 dark tomato bags, 5 dim black bags, 3 dim aqua bags.
wavy maroon bags contain 1 drab turquoise bag, 1 shiny indigo bag.
muted magenta bags contain 4 posh indigo bags, 4 faded brown bags.
dull tomato bags contain 1 pale green bag, 1 plaid gold bag, 5 plaid yellow bags, 5 mirrored blue bags.
mirrored black bags contain 5 drab crimson bags.
dull green bags contain 4 shiny orange bags.
dark cyan bags contain 3 pale gold bags.
faded black bags contain 2 clear beige bags, 4 bright red bags, 1 striped black bag.
wavy indigo bags contain 2 pale brown bags.
dim white bags contain 3 clear violet bags, 3 vibrant indigo bags.
muted green bags contain 1 bright white bag.
posh coral bags contain 3 shiny purple bags, 2 light brown bags, 3 pale gray bags, 1 dull turquoise bag.
dull white bags contain 5 bright plum bags, 5 light green bags, 3 plaid purple bags, 1 faded white bag.
bright salmon bags contain 3 dull indigo bags, 3 muted plum bags, 3 muted bronze bags.
dotted green bags contain 1 posh purple bag.
posh salmon bags contain 1 shiny brown bag, 2 dark red bags, 3 drab gold bags.
pale olive bags contain 4 shiny maroon bags, 3 shiny white bags, 2 dim lavender bags.
dotted lime bags contain 4 mirrored plum bags, 2 dotted blue bags, 3 light salmon bags.
dim blue bags contain 5 shiny lime bags, 5 wavy cyan bags, 3 dotted cyan bags, 5 vibrant turquoise bags.
dim gold bags contain 3 wavy lavender bags, 4 dark silver bags, 4 striped green bags, 4 posh plum bags.
drab lime bags contain 3 clear black bags.
dim red bags contain 1 mirrored olive bag, 1 plaid violet bag.
posh white bags contain 3 pale indigo bags, 1 pale black bag, 5 light green bags, 2 light maroon bags.
dim brown bags contain 5 dotted black bags, 5 dotted red bags.
drab gold bags contain 4 mirrored orange bags, 5 drab beige bags, 4 pale gold bags.
shiny green bags contain 5 mirrored gray bags, 4 pale maroon bags, 1 striped coral bag.
clear teal bags contain 3 vibrant crimson bags, 4 posh teal bags, 5 striped lime bags, 3 plaid green bags.
wavy coral bags contain 3 drab beige bags, 2 drab magenta bags.
plaid tan bags contain 4 faded yellow bags, 4 dull gray bags, 2 shiny lime bags.
shiny blue bags contain 1 faded white bag, 5 dull turquoise bags.
striped green bags contain 4 dull blue bags, 1 muted tan bag, 1 wavy lavender bag, 1 muted gray bag.
wavy tan bags contain 4 wavy bronze bags, 2 pale plum bags, 2 plaid indigo bags, 2 light lavender bags.
faded violet bags contain 5 dull turquoise bags, 4 bright orange bags, 5 drab lavender bags.
striped magenta bags contain 5 dotted orange bags, 5 wavy red bags.
drab beige bags contain 4 pale gold bags.
shiny coral bags contain 3 mirrored bronze bags.
faded indigo bags contain 5 clear violet bags, 5 vibrant fuchsia bags, 5 posh violet bags.
muted maroon bags contain 4 wavy coral bags.
pale violet bags contain 1 clear olive bag, 1 wavy fuchsia bag, 1 dull lime bag.
wavy chartreuse bags contain 2 faded blue bags.
faded purple bags contain 5 clear olive bags, 1 wavy orange bag, 2 posh beige bags, 1 mirrored salmon bag.
dull fuchsia bags contain 2 dark tan bags.
light gold bags contain 1 pale blue bag, 4 wavy cyan bags, 1 shiny chartreuse bag.
bright tan bags contain 2 shiny brown bags, 4 drab gold bags.
plaid fuchsia bags contain 4 shiny gold bags, 1 mirrored orange bag, 4 dark chartreuse bags, 1 faded tomato bag.
striped indigo bags contain 4 clear brown bags, 3 wavy silver bags, 1 plaid teal bag, 3 pale maroon bags.
drab salmon bags contain 1 wavy bronze bag, 2 pale violet bags, 5 plaid indigo bags.
muted teal bags contain 1 wavy maroon bag, 2 pale purple bags, 4 clear blue bags, 2 bright salmon bags.
clear violet bags contain 2 light chartreuse bags, 1 light silver bag, 4 dark brown bags.
posh red bags contain 4 light lavender bags, 4 plaid brown bags.
muted gray bags contain 1 pale olive bag.
posh black bags contain 1 muted maroon bag.
dotted silver bags contain 3 dull turquoise bags, 4 dotted black bags, 3 mirrored black bags.
wavy olive bags contain 3 dotted coral bags, 5 dim silver bags.
plaid olive bags contain 3 muted plum bags.
dim lavender bags contain 2 pale gold bags, 5 mirrored turquoise bags, 1 dull lime bag, 1 dull beige bag.
dark silver bags contain 4 light silver bags, 1 plaid fuchsia bag.
shiny tomato bags contain 2 pale coral bags, 4 dim lavender bags, 1 dim purple bag, 3 wavy magenta bags.
dull purple bags contain 1 shiny maroon bag.
wavy orange bags contain 2 dim black bags, 1 wavy aqua bag, 4 dull turquoise bags, 3 wavy bronze bags.
dim gray bags contain 2 faded bronze bags, 3 dull beige bags, 3 pale purple bags, 5 drab gold bags.
muted yellow bags contain 4 wavy aqua bags.
striped maroon bags contain 1 plaid plum bag, 5 dotted chartreuse bags, 3 dotted cyan bags, 2 bright plum bags.
muted white bags contain 2 dark blue bags, 4 posh aqua bags, 5 mirrored violet bags, 5 posh lavender bags.
wavy cyan bags contain 3 dim black bags, 2 striped lime bags.
striped teal bags contain 2 bright blue bags, 1 vibrant black bag.
posh olive bags contain 2 dim plum bags, 5 shiny turquoise bags, 1 vibrant tomato bag, 5 bright magenta bags.
dotted crimson bags contain 2 clear gray bags.
clear plum bags contain 4 vibrant teal bags.
vibrant chartreuse bags contain 4 posh bronze bags, 5 light purple bags.
vibrant teal bags contain 3 clear blue bags, 4 muted tan bags, 2 wavy fuchsia bags.
striped beige bags contain 4 faded tomato bags.
muted bronze bags contain 1 clear lavender bag, 4 mirrored gray bags.
light lavender bags contain 2 plaid turquoise bags.
dotted white bags contain 1 light yellow bag, 5 dull maroon bags, 5 posh brown bags, 2 clear olive bags.
pale teal bags contain 4 dark aqua bags, 5 dull violet bags.
wavy lime bags contain 2 drab red bags, 1 clear olive bag.
vibrant black bags contain 3 dim tan bags.
pale coral bags contain 5 dull gold bags.
plaid maroon bags contain 2 light fuchsia bags.
wavy aqua bags contain 5 dark coral bags, 5 mirrored orange bags, 3 muted aqua bags.
bright blue bags contain 3 faded bronze bags, 1 bright red bag, 5 mirrored coral bags.
wavy silver bags contain 1 posh olive bag, 1 shiny lime bag, 3 shiny beige bags.
faded maroon bags contain 1 dull tan bag.
light yellow bags contain 5 light lavender bags, 5 pale black bags, 1 plaid brown bag, 3 pale violet bags.
wavy fuchsia bags contain no other bags.
pale plum bags contain 4 light teal bags, 2 pale black bags, 1 pale green bag, 4 wavy bronze bags.
drab white bags contain 3 dark tan bags, 5 muted orange bags, 5 dull violet bags, 1 mirrored fuchsia bag.
pale salmon bags contain 5 faded violet bags, 1 clear cyan bag.
clear crimson bags contain 4 pale lavender bags, 1 dull turquoise bag, 2 mirrored blue bags.
posh gray bags contain 4 muted brown bags, 3 shiny teal bags.
dark aqua bags contain 1 shiny maroon bag, 5 dim brown bags, 4 striped maroon bags, 5 dim blue bags.
muted red bags contain 3 muted chartreuse bags, 4 wavy red bags, 1 drab tomato bag, 3 shiny yellow bags.
mirrored purple bags contain 2 clear blue bags, 2 mirrored lavender bags, 1 pale gold bag, 3 bright silver bags.
striped yellow bags contain 4 light silver bags, 2 dotted red bags, 3 mirrored black bags, 2 faded tomato bags.
dotted teal bags contain 1 drab bronze bag, 3 muted red bags, 5 mirrored gray bags, 4 bright olive bags.
clear turquoise bags contain 5 dim bronze bags, 3 faded silver bags, 1 dotted olive bag.
dull lavender bags contain 5 clear olive bags, 1 mirrored orange bag.
mirrored indigo bags contain 3 bright fuchsia bags, 3 dotted salmon bags.
shiny salmon bags contain 2 bright turquoise bags, 1 light plum bag.
plaid red bags contain 3 clear brown bags, 4 drab tomato bags, 2 plaid indigo bags.
drab black bags contain 5 dull maroon bags, 2 dark silver bags, 5 bright red bags, 5 bright cyan bags.
pale purple bags contain 5 light blue bags, 1 dull maroon bag.
plaid crimson bags contain 2 dark turquoise bags, 5 mirrored bronze bags, 5 dull gold bags, 2 posh yellow bags.
striped lime bags contain 2 wavy lime bags, 2 shiny teal bags.
plaid yellow bags contain 5 muted chartreuse bags.
dark violet bags contain 2 plaid fuchsia bags, 2 muted bronze bags, 3 posh green bags.
bright red bags contain 4 faded plum bags, 3 dim lavender bags.
striped purple bags contain 3 mirrored turquoise bags, 1 shiny yellow bag.
shiny red bags contain 4 wavy coral bags, 3 vibrant salmon bags.
striped cyan bags contain 2 dark yellow bags.
posh magenta bags contain 3 vibrant indigo bags, 2 pale violet bags, 3 bright fuchsia bags, 1 shiny teal bag.
drab cyan bags contain 3 plaid gold bags, 3 clear black bags, 5 striped green bags.
dim chartreuse bags contain 2 wavy coral bags, 2 striped black bags, 4 dotted tomato bags, 1 muted maroon bag.
faded beige bags contain 5 dim tomato bags, 3 plaid turquoise bags.
mirrored teal bags contain 4 posh silver bags, 3 dotted brown bags.
light turquoise bags contain 2 bright gray bags.
drab fuchsia bags contain 4 shiny brown bags, 1 muted olive bag.
mirrored bronze bags contain 3 dull turquoise bags, 3 mirrored turquoise bags, 2 drab red bags.
shiny fuchsia bags contain 3 striped gray bags, 3 faded blue bags.
dim beige bags contain 4 dark blue bags, 1 vibrant aqua bag, 2 shiny brown bags, 5 dull violet bags.
drab gray bags contain 1 wavy maroon bag.
drab orange bags contain 5 plaid brown bags, 1 vibrant yellow bag, 1 mirrored beige bag, 4 pale white bags.
dull magenta bags contain 4 light purple bags, 3 dark brown bags.
vibrant magenta bags contain 4 clear gray bags, 2 shiny aqua bags, 4 striped yellow bags, 3 shiny magenta bags.
drab tomato bags contain 5 drab crimson bags, 2 dull gold bags, 4 light silver bags.
wavy violet bags contain 3 faded plum bags.
mirrored fuchsia bags contain 1 mirrored black bag.
shiny white bags contain 4 light silver bags, 3 dotted fuchsia bags, 2 faded brown bags, 1 bright bronze bag.
clear chartreuse bags contain 4 plaid cyan bags, 1 striped gold bag.
muted turquoise bags contain 3 drab crimson bags, 3 drab olive bags.
faded aqua bags contain 1 dotted teal bag.
vibrant gold bags contain 2 light green bags, 1 dotted gold bag.
drab plum bags contain 5 dim salmon bags, 3 dotted teal bags.
dotted chartreuse bags contain 2 dull turquoise bags, 1 bright chartreuse bag, 4 faded tan bags, 1 mirrored lavender bag.
dull silver bags contain 1 mirrored indigo bag.
pale yellow bags contain 4 drab coral bags.
clear black bags contain 3 dim coral bags.
faded gold bags contain 3 faded chartreuse bags, 1 posh gray bag, 3 drab tomato bags.
muted chartreuse bags contain 1 clear olive bag.
shiny indigo bags contain 3 vibrant yellow bags, 2 plaid orange bags.
dull indigo bags contain 5 bright fuchsia bags, 2 shiny yellow bags, 2 plaid indigo bags, 4 bright olive bags.
faded silver bags contain 2 vibrant olive bags, 4 muted tomato bags.
pale green bags contain 1 pale red bag, 5 dull lavender bags, 4 clear olive bags.
dull violet bags contain 1 shiny black bag, 1 shiny fuchsia bag, 3 plaid indigo bags, 2 posh crimson bags.
dotted lavender bags contain 2 striped lavender bags.
clear orange bags contain 1 dotted cyan bag, 4 clear tomato bags.
bright crimson bags contain 1 dull black bag, 2 dim tomato bags, 1 drab bronze bag, 4 wavy orange bags.
dark orange bags contain 1 vibrant teal bag, 3 dull maroon bags, 4 light purple bags.
bright teal bags contain 5 mirrored tomato bags, 4 dull lime bags, 4 shiny olive bags.
vibrant beige bags contain 2 dark turquoise bags.
dark yellow bags contain 5 dark orange bags, 4 pale red bags, 2 striped fuchsia bags, 5 faded turquoise bags.
bright fuchsia bags contain 5 striped gray bags, 3 light teal bags, 5 mirrored orange bags.
clear maroon bags contain 2 dotted yellow bags, 1 mirrored green bag, 4 dotted coral bags, 3 dull indigo bags.
dim lime bags contain 3 dull fuchsia bags.
striped olive bags contain 5 wavy fuchsia bags, 2 light purple bags.
dull gray bags contain 4 dark beige bags, 1 mirrored white bag.
dim orange bags contain 5 mirrored white bags.
faded salmon bags contain 2 muted cyan bags.
clear red bags contain 2 dim violet bags, 1 shiny purple bag, 3 faded salmon bags, 2 mirrored brown bags.
plaid white bags contain 1 shiny aqua bag, 1 vibrant teal bag.
shiny violet bags contain 3 striped lime bags, 5 mirrored chartreuse bags, 3 pale red bags, 1 muted orange bag.
wavy green bags contain 2 dark tomato bags.
pale lavender bags contain 3 pale orange bags.
dark fuchsia bags contain 4 pale turquoise bags, 4 pale plum bags, 5 light purple bags, 3 dark beige bags.
posh indigo bags contain 2 pale violet bags, 5 shiny coral bags, 1 faded chartreuse bag, 2 plaid indigo bags.
light brown bags contain 1 posh black bag, 4 clear cyan bags.
faded red bags contain 1 drab maroon bag.
dark bronze bags contain 1 pale green bag, 4 shiny blue bags, 1 mirrored lime bag.
pale orange bags contain 4 plaid violet bags, 5 dim silver bags, 1 dim cyan bag, 3 clear blue bags.
dull brown bags contain 1 light tomato bag, 4 pale tomato bags.
mirrored plum bags contain 1 shiny tan bag, 5 wavy brown bags.
dull lime bags contain 4 mirrored orange bags.
drab yellow bags contain 3 clear teal bags, 3 posh aqua bags, 4 posh fuchsia bags, 3 posh turquoise bags.
bright cyan bags contain 5 muted lavender bags, 1 wavy purple bag.
drab chartreuse bags contain 1 wavy tan bag.
drab tan bags contain 5 drab bronze bags, 5 pale green bags, 1 wavy fuchsia bag.
shiny tan bags contain 1 pale red bag, 5 clear aqua bags.
dotted black bags contain 2 dim black bags.
dull blue bags contain 3 clear blue bags, 5 bright gold bags, 4 pale tomato bags, 4 drab beige bags.
light olive bags contain 2 mirrored salmon bags, 2 drab violet bags, 2 bright beige bags.
mirrored magenta bags contain 4 drab tomato bags, 5 clear teal bags, 3 dark coral bags, 5 shiny white bags.
bright silver bags contain 1 posh brown bag.
vibrant blue bags contain 3 clear tan bags.
dark indigo bags contain 3 dim aqua bags, 5 bright aqua bags.
bright brown bags contain 3 muted purple bags, 1 muted blue bag, 1 light green bag, 1 dark red bag.
dark salmon bags contain 3 dotted fuchsia bags, 2 dim tan bags.
mirrored maroon bags contain 2 posh purple bags.
faded crimson bags contain 1 posh white bag, 2 muted blue bags, 3 dark fuchsia bags, 3 light red bags.
bright lavender bags contain 4 bright chartreuse bags, 5 muted purple bags, 4 dull aqua bags, 1 shiny blue bag.
mirrored orange bags contain no other bags.
wavy bronze bags contain no other bags.
wavy yellow bags contain 2 mirrored yellow bags, 1 muted maroon bag, 2 striped purple bags, 4 pale silver bags.
drab magenta bags contain 3 dim indigo bags, 2 wavy bronze bags, 5 shiny yellow bags.
wavy blue bags contain 3 mirrored gold bags, 3 shiny lavender bags, 1 dim teal bag, 4 clear crimson bags.
clear purple bags contain 2 dark beige bags.
light cyan bags contain 1 dotted white bag, 5 muted yellow bags, 1 wavy lime bag.
clear yellow bags contain 2 plaid olive bags, 1 muted red bag, 1 mirrored bronze bag, 5 striped violet bags.
light plum bags contain 5 dotted fuchsia bags, 4 vibrant white bags, 5 muted red bags, 5 drab red bags.
vibrant fuchsia bags contain 1 posh green bag.
pale maroon bags contain 5 light purple bags, 5 shiny aqua bags, 3 clear teal bags, 2 clear green bags.
dark teal bags contain 2 dark lavender bags, 4 striped black bags, 1 drab lime bag, 2 dim teal bags.
clear fuchsia bags contain 2 shiny violet bags, 4 posh aqua bags, 4 bright red bags.
dotted magenta bags contain 2 dull olive bags, 1 clear magenta bag, 5 light beige bags, 1 dark brown bag.
muted black bags contain 2 clear blue bags, 2 muted red bags.
dim magenta bags contain 4 plaid silver bags, 4 plaid olive bags.
striped lavender bags contain 4 clear blue bags.
dull beige bags contain no other bags.
wavy lavender bags contain 2 shiny blue bags, 3 faded tomato bags, 5 dotted tan bags, 5 dull maroon bags.
light maroon bags contain 5 dim violet bags, 3 wavy turquoise bags, 3 mirrored salmon bags.
plaid green bags contain 1 dim teal bag, 5 pale brown bags, 2 striped chartreuse bags.
shiny plum bags contain 1 posh lavender bag, 3 vibrant red bags, 5 dark maroon bags, 1 dotted bronze bag.
plaid turquoise bags contain 4 light silver bags.
dim cyan bags contain 1 shiny coral bag, 4 bright lime bags.
shiny lime bags contain 3 wavy green bags, 5 posh white bags, 1 striped purple bag.
dim maroon bags contain 1 muted crimson bag.
dim aqua bags contain 1 dotted silver bag, 3 faded blue bags, 4 striped purple bags.
muted blue bags contain 2 posh yellow bags, 3 bright tan bags, 1 vibrant salmon bag.
vibrant olive bags contain 5 clear aqua bags.
plaid black bags contain 3 striped orange bags.
vibrant violet bags contain 2 pale gold bags.
light bronze bags contain 1 shiny maroon bag, 3 light blue bags.
pale magenta bags contain 5 pale tomato bags.
vibrant yellow bags contain 4 striped gray bags, 4 dotted yellow bags, 1 wavy fuchsia bag, 3 wavy purple bags.
shiny black bags contain 5 shiny yellow bags, 3 light purple bags, 1 pale olive bag, 1 clear blue bag.
dim crimson bags contain 5 posh gray bags, 1 bright chartreuse bag.
plaid salmon bags contain 2 wavy fuchsia bags, 1 posh olive bag, 2 dim tan bags.
shiny cyan bags contain 5 light green bags, 1 clear olive bag, 5 pale olive bags.
pale silver bags contain 3 mirrored orange bags, 1 light lavender bag, 2 faded tomato bags, 1 muted chartreuse bag.
light red bags contain 4 shiny gray bags, 4 wavy salmon bags, 4 clear lime bags.
dark turquoise bags contain 4 mirrored orange bags, 4 vibrant brown bags, 4 striped brown bags, 4 mirrored purple bags.
dark gray bags contain 1 pale violet bag, 5 striped turquoise bags, 2 wavy red bags, 2 light bronze bags.
pale gray bags contain 5 drab tan bags, 3 clear gray bags.
striped gold bags contain 2 dotted beige bags.
muted cyan bags contain 2 light bronze bags, 3 clear green bags.
faded white bags contain 3 striped tomato bags, 4 shiny black bags, 2 drab tomato bags.
clear lime bags contain 3 dotted fuchsia bags, 3 vibrant purple bags, 1 shiny bronze bag, 3 muted green bags.
dull bronze bags contain 5 plaid turquoise bags, 4 dark crimson bags, 3 pale yellow bags, 3 posh chartreuse bags.
mirrored cyan bags contain 4 clear olive bags, 2 vibrant purple bags, 4 dull olive bags.
pale bronze bags contain 3 vibrant purple bags, 4 dotted silver bags, 2 mirrored black bags.
pale blue bags contain 1 dark brown bag, 2 light brown bags, 2 drab lime bags.
clear bronze bags contain 4 clear blue bags, 2 light chartreuse bags, 1 pale violet bag.
clear aqua bags contain 2 clear cyan bags.
plaid plum bags contain 3 faded plum bags.
mirrored lime bags contain 4 posh brown bags.
plaid lavender bags contain 1 bright beige bag, 5 bright lime bags, 4 faded aqua bags.
drab crimson bags contain 2 shiny yellow bags, 1 posh brown bag.
shiny beige bags contain 2 muted aqua bags, 1 vibrant purple bag, 4 pale black bags, 3 dark chartreuse bags.
dim green bags contain 4 bright yellow bags, 1 shiny fuchsia bag, 1 wavy tomato bag, 4 shiny black bags.
drab coral bags contain 5 dark coral bags.
posh turquoise bags contain 1 dim violet bag, 2 faded turquoise bags.
dotted plum bags contain 2 dull salmon bags, 5 light green bags, 3 pale red bags, 2 posh yellow bags.
posh yellow bags contain 1 mirrored salmon bag, 1 drab tomato bag, 3 dark tomato bags, 2 dark chartreuse bags.
faded orange bags contain 1 drab yellow bag.
dull teal bags contain 2 plaid crimson bags, 5 shiny violet bags, 1 dull coral bag.
faded brown bags contain 5 muted red bags.
bright chartreuse bags contain 5 clear lime bags.
mirrored tan bags contain 4 striped lavender bags, 4 light plum bags.
clear indigo bags contain 5 plaid fuchsia bags, 2 plaid brown bags, 5 striped gray bags.
light teal bags contain 1 dull beige bag, 1 mirrored turquoise bag, 1 mirrored orange bag, 5 wavy bronze bags.
shiny gold bags contain 2 dark coral bags, 1 mirrored orange bag.
striped white bags contain 5 dull fuchsia bags.
wavy white bags contain 5 dull chartreuse bags, 5 wavy green bags.
mirrored beige bags contain 4 bright white bags, 5 plaid magenta bags, 3 plaid crimson bags, 1 shiny teal bag.
muted purple bags contain 5 pale black bags, 5 wavy aqua bags.
vibrant crimson bags contain 5 dim bronze bags, 2 vibrant plum bags.
striped aqua bags contain 3 plaid cyan bags, 3 light beige bags, 2 drab cyan bags.
dull crimson bags contain 1 light white bag, 3 drab indigo bags, 1 clear fuchsia bag.
clear magenta bags contain 4 light brown bags.
posh maroon bags contain 1 faded plum bag, 3 light olive bags.
bright violet bags contain 2 dotted bronze bags, 4 clear teal bags, 3 striped magenta bags, 3 muted indigo bags.
faded coral bags contain 5 dark violet bags, 3 plaid teal bags.
faded bronze bags contain 5 dotted fuchsia bags, 5 wavy bronze bags, 2 dotted purple bags, 5 dim black bags.
light beige bags contain 2 shiny olive bags.
mirrored white bags contain 1 dark indigo bag, 1 drab maroon bag, 3 shiny beige bags, 5 light blue bags.
muted silver bags contain 4 wavy lime bags, 1 dark tomato bag, 1 bright fuchsia bag, 4 dotted olive bags.
wavy gray bags contain 2 mirrored turquoise bags, 5 light lavender bags, 3 muted chartreuse bags.
clear salmon bags contain 5 bright tomato bags, 2 wavy aqua bags.
dull turquoise bags contain 1 pale tomato bag.
shiny yellow bags contain 4 dull lime bags, 3 shiny maroon bags, 3 light silver bags.
mirrored aqua bags contain 3 posh magenta bags, 4 drab tomato bags.
dull orange bags contain 5 dim teal bags, 3 light olive bags, 2 light magenta bags, 2 plaid orange bags.
plaid blue bags contain 3 pale purple bags, 1 shiny turquoise bag.
dim olive bags contain 3 shiny tomato bags, 4 dim black bags, 1 light plum bag.
dim fuchsia bags contain 1 dark chartreuse bag, 1 mirrored cyan bag, 3 plaid red bags.
dark plum bags contain 1 light yellow bag, 1 mirrored lime bag, 2 bright salmon bags.
faded tomato bags contain 2 muted chartreuse bags, 4 dark chartreuse bags.
dotted aqua bags contain 2 dull lavender bags, 4 pale tomato bags.
plaid lime bags contain 3 vibrant indigo bags, 1 muted red bag, 1 posh silver bag, 1 dim indigo bag.
vibrant lime bags contain 5 drab turquoise bags, 2 vibrant chartreuse bags, 4 clear blue bags.
posh brown bags contain 2 wavy red bags, 2 drab beige bags.
bright beige bags contain 3 faded blue bags, 4 muted red bags, 5 mirrored lavender bags, 2 pale red bags.
dotted yellow bags contain 5 striped gray bags, 3 pale gold bags, 2 clear olive bags, 5 mirrored yellow bags.
dull gold bags contain 5 clear tomato bags, 5 drab beige bags, 4 bright silver bags, 4 drab crimson bags.
dark maroon bags contain 2 wavy turquoise bags, 4 dark chartreuse bags.
drab olive bags contain 4 faded bronze bags.
posh plum bags contain 2 dull tan bags.
light indigo bags contain 2 wavy yellow bags.
vibrant tan bags contain 5 shiny teal bags.
dim purple bags contain 5 light olive bags, 5 mirrored violet bags.
vibrant gray bags contain 3 bright turquoise bags, 4 dim maroon bags, 4 vibrant chartreuse bags, 2 faded turquoise bags.
pale tan bags contain 2 light salmon bags, 3 dotted silver bags, 5 clear lime bags, 1 shiny teal bag.
dark tan bags contain 5 dim indigo bags, 3 shiny beige bags, 5 dim tan bags, 2 pale black bags.
dotted tomato bags contain 3 shiny black bags, 3 pale crimson bags, 2 dim tan bags.
posh violet bags contain 4 posh crimson bags, 1 muted fuchsia bag, 4 pale cyan bags, 3 mirrored gold bags.
clear tan bags contain 2 bright tan bags, 5 faded beige bags.
bright bronze bags contain no other bags.
dotted brown bags contain 2 dotted black bags, 3 wavy coral bags.
muted violet bags contain 3 faded magenta bags, 3 bright magenta bags.
faded plum bags contain 2 dull lime bags, 4 dim coral bags, 5 shiny maroon bags, 3 pale red bags.
dark lime bags contain 4 dim tomato bags.
dull aqua bags contain 4 drab beige bags, 4 drab maroon bags.
posh purple bags contain 2 vibrant purple bags, 5 shiny gold bags, 2 plaid turquoise bags.
dull plum bags contain 5 dark brown bags, 4 muted black bags, 1 striped lavender bag.
faded turquoise bags contain 3 shiny yellow bags, 4 faded plum bags, 5 pale violet bags, 4 dim lavender bags.
striped bronze bags contain 1 muted bronze bag, 4 clear green bags, 4 shiny fuchsia bags, 5 pale red bags.
mirrored blue bags contain 4 clear tomato bags, 5 shiny orange bags, 1 dull beige bag, 1 striped silver bag.
shiny orange bags contain 2 light bronze bags, 4 dark tomato bags, 2 drab gold bags.
shiny gray bags contain 1 dark maroon bag.
drab red bags contain 5 wavy purple bags.
posh fuchsia bags contain 3 mirrored chartreuse bags, 3 vibrant teal bags.
light crimson bags contain 2 shiny aqua bags, 2 plaid chartreuse bags, 1 shiny gold bag, 1 wavy maroon bag.
vibrant white bags contain 1 shiny brown bag, 5 light purple bags, 4 dull olive bags, 5 clear cyan bags.
dark green bags contain 5 drab indigo bags, 1 striped coral bag.
striped fuchsia bags contain 5 vibrant plum bags.
bright turquoise bags contain 1 striped fuchsia bag, 3 posh purple bags, 5 dim aqua bags.
striped tan bags contain 1 dotted cyan bag.
shiny magenta bags contain 2 dark yellow bags, 1 faded silver bag, 4 muted orange bags, 3 bright fuchsia bags.
dim violet bags contain 4 wavy bronze bags, 1 bright bronze bag.
vibrant orange bags contain 2 faded chartreuse bags, 2 vibrant turquoise bags, 2 dull white bags.
pale gold bags contain 5 light lavender bags, 4 mirrored orange bags, 4 muted chartreuse bags.
pale red bags contain no other bags.
plaid brown bags contain 3 mirrored orange bags.
posh aqua bags contain 5 light blue bags, 1 dark indigo bag, 1 pale red bag, 2 vibrant turquoise bags.
muted lime bags contain 1 dim chartreuse bag, 1 dotted olive bag, 4 pale violet bags, 3 muted fuchsia bags.
dotted fuchsia bags contain 4 light teal bags, 1 muted chartreuse bag, 3 dark chartreuse bags, 4 dim lavender bags.
dim turquoise bags contain 4 clear beige bags, 1 posh magenta bag, 3 faded brown bags.
muted coral bags contain 4 dark salmon bags, 1 pale tomato bag, 2 shiny brown bags.
dull chartreuse bags contain 3 shiny white bags, 4 shiny blue bags, 1 pale crimson bag.
muted indigo bags contain 4 posh silver bags, 1 pale maroon bag, 1 dotted red bag, 1 drab coral bag.
dim salmon bags contain 5 pale black bags, 3 dark salmon bags, 3 pale red bags, 5 dotted purple bags.
dotted bronze bags contain 1 dim aqua bag, 2 mirrored maroon bags, 4 muted olive bags, 3 dull fuchsia bags.
drab silver bags contain 2 dim coral bags, 3 dim salmon bags.
striped salmon bags contain 2 dotted purple bags, 2 posh green bags, 3 plaid beige bags.
mirrored tomato bags contain 5 faded tomato bags, 4 wavy red bags.
dotted cyan bags contain 1 posh white bag, 3 striped lime bags, 4 dotted purple bags, 2 muted red bags.
striped blue bags contain 4 dark silver bags, 4 pale silver bags.
faded green bags contain 3 dotted violet bags, 3 pale turquoise bags.
striped gray bags contain 2 pale tomato bags, 2 dark chartreuse bags, 5 muted red bags, 3 pale violet bags.
pale lime bags contain 4 posh maroon bags, 2 drab plum bags, 3 drab coral bags.
posh beige bags contain 4 wavy purple bags, 2 shiny gold bags, 1 dark tan bag.
dotted tan bags contain 2 bright silver bags, 1 posh bronze bag, 2 dim coral bags, 2 dim tomato bags.
shiny brown bags contain 4 dim violet bags, 5 bright silver bags.
mirrored silver bags contain 1 striped blue bag, 2 shiny teal bags, 2 light coral bags, 1 dim beige bag.
clear silver bags contain 4 mirrored fuchsia bags, 5 dull olive bags, 1 plaid crimson bag.
dotted orange bags contain 1 mirrored turquoise bag, 3 wavy lime bags, 3 dotted yellow bags, 5 muted lavender bags.
shiny purple bags contain 1 shiny beige bag, 3 plaid chartreuse bags.
drab brown bags contain 2 dull indigo bags, 3 mirrored cyan bags, 1 dim crimson bag.
vibrant tomato bags contain 5 faded plum bags.
light tan bags contain 1 dark gold bag, 3 light salmon bags.
vibrant cyan bags contain 4 shiny aqua bags.
dotted purple bags contain 4 wavy coral bags.
vibrant red bags contain 4 faded tan bags, 1 drab aqua bag, 4 striped black bags.
faded lime bags contain 3 light olive bags, 3 striped yellow bags.
posh gold bags contain 1 dull indigo bag, 1 mirrored chartreuse bag.
shiny aqua bags contain 2 vibrant turquoise bags.
light orange bags contain 3 vibrant violet bags, 2 dotted yellow bags, 1 dark gray bag, 5 striped chartreuse bags.
pale black bags contain 1 plaid brown bag, 2 muted chartreuse bags.
drab violet bags contain 5 clear cyan bags, 1 pale gold bag, 4 drab salmon bags, 2 posh orange bags.
dim silver bags contain 5 clear cyan bags.
muted beige bags contain 1 dim tomato bag, 3 light olive bags.
drab turquoise bags contain 3 plaid orange bags, 1 light purple bag.
dark red bags contain 2 vibrant yellow bags, 4 mirrored fuchsia bags, 5 posh bronze bags, 2 dark gold bags.
vibrant maroon bags contain 5 drab beige bags, 1 dark beige bag, 1 dark brown bag, 4 pale maroon bags.
wavy magenta bags contain 3 light tomato bags, 5 muted gold bags, 3 muted cyan bags.
shiny chartreuse bags contain 5 pale yellow bags.
dull cyan bags contain 4 bright maroon bags, 4 faded bronze bags.
light black bags contain 4 shiny teal bags, 5 faded beige bags, 1 muted gold bag, 4 plaid silver bags.
bright green bags contain 5 striped lime bags, 4 muted yellow bags, 4 light beige bags, 4 plaid violet bags.
striped orange bags contain 1 mirrored orange bag, 2 bright salmon bags.
muted plum bags contain 3 mirrored orange bags, 1 muted chartreuse bag, 2 dull olive bags, 4 dull brown bags.
pale white bags contain 5 light silver bags.
mirrored gray bags contain 1 mirrored violet bag, 5 striped gray bags, 5 dim aqua bags, 4 wavy fuchsia bags.
wavy beige bags contain 2 shiny beige bags.
dotted red bags contain 4 dotted purple bags, 3 muted aqua bags, 2 pale tomato bags, 4 pale bronze bags.
posh lavender bags contain 2 dotted tomato bags, 3 dim lavender bags, 2 muted gray bags, 3 light plum bags.
mirrored yellow bags contain 4 wavy gold bags.
wavy brown bags contain 3 dim fuchsia bags, 4 dull turquoise bags.
plaid chartreuse bags contain 5 plaid red bags.
shiny turquoise bags contain 2 faded turquoise bags, 3 muted tan bags.
mirrored brown bags contain 4 dotted fuchsia bags, 4 dim red bags, 2 dotted plum bags.
dim tan bags contain 1 drab tomato bag, 3 wavy red bags, 1 plaid turquoise bag, 2 clear lavender bags.
faded yellow bags contain 1 clear bronze bag, 3 clear olive bags.
bright orange bags contain 5 mirrored blue bags, 3 shiny blue bags.
striped red bags contain 5 bright green bags, 3 wavy yellow bags.
bright indigo bags contain 2 light maroon bags, 5 shiny bronze bags, 2 bright white bags.
light gray bags contain 2 dotted maroon bags.
light silver bags contain no other bags.
bright gold bags contain 2 striped fuchsia bags.
drab purple bags contain 5 light silver bags, 2 dull yellow bags, 2 shiny teal bags.
mirrored coral bags contain 4 dim plum bags.
light coral bags contain 3 dim lavender bags, 5 wavy green bags, 2 light bronze bags.
plaid indigo bags contain 3 mirrored orange bags, 5 pale gold bags.
dark crimson bags contain 4 dark turquoise bags, 4 plaid green bags, 4 clear fuchsia bags.
wavy teal bags contain 1 pale silver bag, 4 mirrored chartreuse bags, 4 shiny black bags.
dull tan bags contain 4 muted magenta bags.
light violet bags contain 4 faded yellow bags, 5 light maroon bags, 3 clear teal bags, 2 pale crimson bags.
striped silver bags contain 3 plaid fuchsia bags.
shiny crimson bags contain 5 muted yellow bags.
mirrored salmon bags contain 1 dim tan bag.
dotted coral bags contain 5 dark tan bags.
wavy gold bags contain 2 wavy turquoise bags, 4 dim indigo bags, 3 wavy bronze bags.
vibrant bronze bags contain 1 pale purple bag.
posh silver bags contain 4 posh chartreuse bags, 3 bright salmon bags, 1 dotted bronze bag, 3 shiny coral bags.
bright purple bags contain 5 clear beige bags, 3 pale yellow bags, 1 wavy tomato bag, 5 pale lavender bags.
muted tan bags contain 4 bright white bags, 5 dotted silver bags, 2 clear blue bags, 4 mirrored turquoise bags.
light white bags contain 2 shiny purple bags, 1 dull aqua bag, 2 vibrant blue bags.
faded fuchsia bags contain 2 dark green bags, 3 shiny violet bags, 4 drab plum bags, 3 vibrant olive bags.
clear gray bags contain 2 muted red bags.
dark tomato bags contain 4 dotted purple bags, 3 faded turquoise bags.
light magenta bags contain 1 dull fuchsia bag.
light purple bags contain 3 drab magenta bags, 4 dark coral bags, 3 light silver bags.
vibrant turquoise bags contain 4 dotted black bags.
dim indigo bags contain 4 muted chartreuse bags.
dim bronze bags contain 3 drab gold bags, 4 clear brown bags, 2 muted tan bags.
clear green bags contain 2 plaid fuchsia bags, 1 wavy bronze bag.
dull maroon bags contain 2 wavy yellow bags, 1 dotted fuchsia bag, 4 mirrored yellow bags.
dotted gray bags contain 5 dotted white bags, 2 pale tomato bags, 5 bright tan bags, 3 plaid turquoise bags.
plaid gray bags contain 5 wavy lime bags, 4 dull aqua bags.
mirrored crimson bags contain 1 shiny lavender bag, 4 plaid purple bags.
shiny silver bags contain 5 vibrant lavender bags, 3 light coral bags, 5 dark aqua bags.
dotted salmon bags contain 3 pale tomato bags.
muted crimson bags contain 4 clear olive bags, 3 dull plum bags, 1 dark gray bag, 1 wavy lime bag.
muted lavender bags contain 1 bright chartreuse bag, 3 pale yellow bags, 3 pale crimson bags.
posh tan bags contain 4 faded tomato bags, 3 dotted olive bags, 4 striped maroon bags.
vibrant salmon bags contain 4 vibrant indigo bags, 1 plaid orange bag.
faded chartreuse bags contain 2 mirrored orange bags, 1 pale crimson bag.
striped tomato bags contain 3 dim tan bags, 2 wavy gold bags.
dim yellow bags contain 1 clear purple bag, 1 wavy red bag, 1 drab bronze bag.
wavy tomato bags contain 5 dotted tomato bags, 3 dim salmon bags, 5 light tan bags, 3 dull brown bags.
bright lime bags contain 3 mirrored turquoise bags, 3 dotted tan bags, 3 posh black bags, 5 wavy gold bags.
muted brown bags contain 4 shiny indigo bags, 4 muted tan bags, 3 wavy tan bags.
pale cyan bags contain 1 dotted black bag.
drab green bags contain 1 muted cyan bag.
dim teal bags contain 4 faded lavender bags, 2 pale violet bags.
drab lavender bags contain 1 pale gold bag, 5 vibrant brown bags, 4 posh indigo bags, 1 plaid olive bag.
dotted turquoise bags contain 2 muted lime bags, 4 striped indigo bags.
clear white bags contain 2 bright lime bags, 1 mirrored coral bag.
dark purple bags contain 5 wavy crimson bags, 5 light olive bags.
light tomato bags contain 4 posh black bags, 1 faded blue bag, 5 dim black bags, 3 dull lime bags.
bright aqua bags contain 3 clear tomato bags.
bright tomato bags contain 1 clear green bag, 3 bright gray bags, 3 mirrored cyan bags, 5 posh chartreuse bags.
dull yellow bags contain 5 wavy purple bags, 3 light purple bags, 5 clear cyan bags, 2 wavy coral bags.
striped coral bags contain 3 mirrored black bags, 5 wavy coral bags, 2 posh white bags.
shiny bronze bags contain 2 dim tomato bags, 3 dull lime bags.
vibrant aqua bags contain 4 dull olive bags, 4 mirrored turquoise bags, 1 vibrant teal bag.
faded magenta bags contain 3 plaid chartreuse bags, 5 plaid white bags, 1 drab lime bag, 3 mirrored fuchsia bags.
pale beige bags contain 3 wavy gray bags, 5 mirrored tomato bags, 1 bright beige bag.
pale crimson bags contain 1 pale violet bag, 4 pale black bags, 5 dim tomato bags, 1 mirrored turquoise bag.
dark blue bags contain 4 dark maroon bags, 1 faded brown bag, 2 wavy red bags.
posh tomato bags contain 2 posh beige bags, 4 dark maroon bags.
dim plum bags contain 2 muted crimson bags, 1 striped coral bag, 2 plaid yellow bags, 5 striped violet bags.
dull black bags contain 3 posh tomato bags, 1 vibrant yellow bag, 4 mirrored salmon bags, 2 light green bags.
wavy plum bags contain 4 wavy blue bags.
bright coral bags contain 4 posh gold bags, 2 plaid lime bags, 3 shiny black bags, 5 dim magenta bags.
posh blue bags contain 2 dotted turquoise bags, 2 bright olive bags, 2 plaid gold bags.
vibrant purple bags contain 2 mirrored orange bags, 4 dull lavender bags, 2 pale red bags.
dark white bags contain 4 drab lime bags.
wavy crimson bags contain 2 dark salmon bags, 5 wavy yellow bags, 2 bright bronze bags, 2 drab crimson bags.
clear coral bags contain 4 vibrant blue bags.
muted olive bags contain 3 plaid brown bags, 1 dim fuchsia bag, 2 posh yellow bags.
plaid violet bags contain 4 muted aqua bags.
plaid teal bags contain 4 bright tan bags, 2 dark tomato bags.
plaid purple bags contain 3 posh teal bags.
pale turquoise bags contain 2 faded purple bags, 4 mirrored maroon bags, 1 mirrored salmon bag.
muted fuchsia bags contain 5 bright bronze bags, 4 muted gold bags.
bright olive bags contain 2 faded blue bags, 3 faded turquoise bags, 5 light bronze bags, 3 dim tan bags.
bright gray bags contain 1 bright white bag, 2 muted orange bags.
light blue bags contain 1 dotted purple bag, 3 dim black bags, 3 posh purple bags, 2 mirrored violet bags.
posh bronze bags contain 3 plaid fuchsia bags, 1 drab gold bag, 4 mirrored orange bags, 4 light teal bags.
faded olive bags contain 3 striped blue bags, 3 dim salmon bags, 4 pale red bags, 2 dull maroon bags.
dull coral bags contain 2 wavy gold bags, 1 dark magenta bag.
dull olive bags contain 3 plaid turquoise bags, 3 plaid fuchsia bags, 4 wavy lime bags, 1 dotted black bag.
plaid orange bags contain 1 dark salmon bag, 1 striped turquoise bag.
clear blue bags contain 3 dim tan bags, 3 muted red bags, 3 faded tomato bags.
dark chartreuse bags contain 4 bright bronze bags, 1 dim indigo bag.
plaid tomato bags contain 5 shiny turquoise bags, 4 clear tan bags, 2 dotted bronze bags, 5 muted magenta bags.
mirrored green bags contain 2 light silver bags, 3 light brown bags, 4 vibrant purple bags, 2 posh green bags.
drab blue bags contain 4 drab indigo bags.
vibrant silver bags contain 3 striped violet bags, 1 striped white bag, 2 bright blue bags.
shiny olive bags contain 3 drab tomato bags.
dull red bags contain 4 dim cyan bags, 3 wavy lime bags.
vibrant plum bags contain 3 wavy coral bags, 2 light lavender bags.
faded cyan bags contain 1 dim brown bag, 5 posh indigo bags.
dotted violet bags contain 1 pale tomato bag, 5 dim plum bags.
striped brown bags contain 5 dim coral bags, 4 clear blue bags.
dotted indigo bags contain 5 clear salmon bags, 4 dim bronze bags.
posh cyan bags contain 2 vibrant magenta bags.
clear beige bags contain 1 bright olive bag.
dark black bags contain 4 dull crimson bags, 3 plaid green bags.
mirrored lavender bags contain 5 dark silver bags.
bright black bags contain 4 shiny brown bags, 1 vibrant crimson bag, 2 posh white bags, 3 wavy gold bags.
pale indigo bags contain 5 shiny gold bags, 3 light bronze bags, 3 striped turquoise bags.
plaid cyan bags contain 1 shiny tan bag, 4 dark tan bags, 1 dull yellow bag.
bright plum bags contain 1 pale chartreuse bag, 3 plaid red bags, 1 faded beige bag, 1 posh gray bag.
drab maroon bags contain 3 dull olive bags, 1 pale green bag, 2 mirrored turquoise bags.
pale chartreuse bags contain 4 dim tomato bags.
striped black bags contain 4 vibrant turquoise bags, 3 faded white bags, 4 light plum bags, 1 pale black bag.
dotted gold bags contain 5 posh teal bags, 5 striped violet bags.
posh orange bags contain 1 clear green bag.
light green bags contain 5 wavy turquoise bags, 2 pale red bags, 3 dark tomato bags, 3 dull turquoise bags.
plaid beige bags contain 4 light silver bags, 4 plaid turquoise bags, 5 drab purple bags, 4 clear lime bags.
mirrored violet bags contain 2 wavy fuchsia bags, 5 bright bronze bags.
striped plum bags contain 2 plaid indigo bags, 5 bright yellow bags, 1 wavy magenta bag.
bright yellow bags contain 3 wavy yellow bags.
drab aqua bags contain 5 dark red bags, 2 light gold bags.
plaid bronze bags contain 1 drab magenta bag.
faded tan bags contain 4 shiny aqua bags, 2 light chartreuse bags.
drab indigo bags contain 5 dotted beige bags, 3 dull lime bags, 1 striped violet bag, 4 vibrant tan bags.
dark gold bags contain 4 mirrored lime bags, 3 dark salmon bags.
muted orange bags contain 1 dull yellow bag, 2 shiny brown bags.
plaid gold bags contain 4 drab coral bags, 5 shiny cyan bags.
posh crimson bags contain 3 light brown bags, 3 bright bronze bags, 3 shiny yellow bags.
bright magenta bags contain 5 dim lavender bags.
light chartreuse bags contain 2 drab bronze bags, 3 dim coral bags.
dim tomato bags contain no other bags.
dark beige bags contain 3 mirrored yellow bags, 2 dull olive bags, 5 striped brown bags.
clear cyan bags contain 5 drab beige bags, 1 shiny yellow bag, 5 wavy purple bags, 5 dark chartreuse bags.
dark coral bags contain 3 dim lavender bags, 3 pale green bags, 4 mirrored orange bags, 1 dim coral bag.
light lime bags contain 5 mirrored brown bags.
shiny lavender bags contain 5 drab tan bags.
faded lavender bags contain 1 light salmon bag, 2 dotted purple bags, 5 pale gold bags, 3 muted gold bags.
pale tomato bags contain 5 dim coral bags.
plaid coral bags contain 3 dull blue bags, 1 posh white bag, 3 light orange bags.
dim coral bags contain no other bags.
dotted olive bags contain 5 mirrored green bags, 3 drab aqua bags, 2 dull beige bags, 3 dim indigo bags.
dark brown bags contain 1 muted tan bag, 5 wavy lime bags.
mirrored red bags contain 5 vibrant aqua bags, 3 bright gray bags, 4 striped gray bags, 2 light lavender bags.
mirrored olive bags contain 5 dark chartreuse bags, 1 dim lavender bag, 5 faded plum bags.
dim black bags contain 1 shiny yellow bag, 4 plaid indigo bags.
shiny maroon bags contain 1 mirrored orange bag, 1 muted chartreuse bag, 5 wavy bronze bags, 1 dull lavender bag.
pale brown bags contain 4 light teal bags, 1 light plum bag, 3 bright aqua bags.
striped chartreuse bags contain 2 shiny maroon bags.
mirrored chartreuse bags contain 4 dotted tan bags, 4 bright bronze bags.
plaid magenta bags contain 1 vibrant yellow bag, 5 wavy aqua bags, 5 dull turquoise bags, 2 wavy fuchsia bags.
light salmon bags contain 3 muted tan bags, 3 faded turquoise bags, 4 drab bronze bags, 3 bright bronze bags.
faded blue bags contain 1 wavy red bag, 5 wavy fuchsia bags, 4 bright bronze bags, 3 faded turquoise bags.
plaid aqua bags contain 1 pale tan bag, 3 light white bags.
mirrored turquoise bags contain 5 drab beige bags, 1 faded plum bag, 4 mirrored orange bags.
shiny teal bags contain 2 pale black bags, 4 dull indigo bags, 4 vibrant teal bags.
vibrant coral bags contain 3 drab turquoise bags, 4 striped beige bags, 1 wavy turquoise bag, 4 light crimson bags.
faded gray bags contain 3 striped purple bags.

9
2020/day07/test Normal file
View file

@ -0,0 +1,9 @@
light red bags contain 1 bright white bag, 2 muted yellow bags.
dark orange bags contain 3 bright white bags, 4 muted yellow bags.
bright white bags contain 1 shiny gold bag.
muted yellow bags contain 2 shiny gold bags, 9 faded blue bags.
shiny gold bags contain 1 dark olive bag, 2 vibrant plum bags.
dark olive bags contain 3 faded blue bags, 4 dotted black bags.
vibrant plum bags contain 5 faded blue bags, 6 dotted black bags.
faded blue bags contain no other bags.
dotted black bags contain no other bags.

7
2020/day07/test2 Normal file
View file

@ -0,0 +1,7 @@
shiny gold bags contain 2 dark red bags.
dark red bags contain 2 dark orange bags.
dark orange bags contain 2 dark yellow bags.
dark yellow bags contain 2 dark green bags.
dark green bags contain 2 dark blue bags.
dark blue bags contain 2 dark violet bags.
dark violet bags contain no other bags.

165
2020/day08/day08.c Normal file
View file

@ -0,0 +1,165 @@
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
enum operation {
NOP,
ACC,
JMP,
};
struct instruction {
enum operation op;
int arg;
};
enum outcome {
ERROR,
LOOP,
END,
};
struct result {
enum outcome out;
int ret;
};
size_t count_lines(FILE *fp) {
size_t count = 0;
for (char c = getc(fp); c != EOF; c = getc(fp)) {
if (c == '\n') {
count++;
}
}
return count;
}
struct result execute(size_t n, struct instruction program[n]) {
int acc = 0;
size_t ip = 0;
bool visited[n];
for (size_t i = 0; i < n; ++i) {
visited[i] = false;
}
while (visited[ip] == false && ip < n) {
visited[ip] = true;
switch (program[ip].op) {
case NOP: {
ip++;
break;
}
case ACC: {
acc += program[ip].arg;
ip++;
break;
}
case JMP: {
ip += program[ip].arg;
break;
}
default:
printf("ERROR: invalid instruction %d %d in position %zu\n",
program[ip].op, program[ip].arg, ip);
return (struct result){.out = ERROR, .ret = 0};
}
}
if (ip == n) {
return (struct result){.out = END, .ret = acc};
}
return (struct result){.out = LOOP, .ret = acc};
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s <input file>\n", argv[0]);
return 0;
}
FILE *fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("Could not open file %s\n", argv[1]);
return 1;
}
size_t n = count_lines(fp);
struct instruction program[n];
rewind(fp);
char *buf = NULL;
size_t buf_size = 0;
size_t i = 0;
while (getline(&buf, &buf_size, fp) != -1) {
int arg;
if (strncmp(buf, "nop", 3) == 0) {
sscanf(buf, "nop %d", &arg);
program[i] = (struct instruction){.op = NOP, .arg = arg};
} else if (strncmp(buf, "acc", 3) == 0) {
sscanf(buf, "acc %d", &arg);
program[i] = (struct instruction){.op = ACC, .arg = arg};
} else if (strncmp(buf, "jmp", 3) == 0) {
sscanf(buf, "jmp %d", &arg);
program[i] = (struct instruction){.op = JMP, .arg = arg};
}
i++;
}
free(buf);
fclose(fp);
// Part 1
printf("Part 1: ");
struct timeval tv1, tv2;
gettimeofday(&tv1, NULL);
struct result res = execute(n, program);
if (res.out == LOOP) {
printf("%d\n", res.ret);
}
gettimeofday(&tv2, NULL);
printf("Time: %lds %ldµs\n", tv2.tv_sec - tv1.tv_sec,
tv2.tv_usec - tv1.tv_usec);
// Part 2 (bruteforce)
printf("Part 2: ");
gettimeofday(&tv1, NULL);
bool finished = false;
i = 0;
while (!finished && i < n) {
switch (program[i].op) {
case NOP: {
program[i].op = JMP;
res = execute(n, program);
if (res.out == END) {
finished = true;
}
program[i].op = NOP;
break;
}
case JMP: {
program[i].op = NOP;
res = execute(n, program);
if (res.out == END) {
finished = true;
}
program[i].op = JMP;
break;
}
default:
break;
}
i++;
}
printf("%d\n", res.ret);
gettimeofday(&tv2, NULL);
printf("Time: %lds %ldµs\n", tv2.tv_sec - tv1.tv_sec,
tv2.tv_usec - tv1.tv_usec);
return 0;
}

75
2020/day08/day08.rkt Normal file
View file

@ -0,0 +1,75 @@
#lang racket/base
(require racket/string
racket/vector
racket/file
racket/match)
(module+ test
(require rackunit))
(module+ main
(displayln "Day 8"))
(define (parse-instruction str)
(define instr (string-split str))
(cons (string->symbol (car instr))
(map string->number (cdr instr))))
(define (read-input filename)
(list->vector (map parse-instruction (file->lines filename))))
(define (execute program)
(define n (vector-length program))
(let loop ([acc 0]
[i 0]
[visited '()])
(cond
[(member i visited) (values 'loop visited acc)]
[(= i n) (values 'end visited acc)]
[else (match (vector-ref program i)
[(list 'nop x) (loop acc (add1 i) (cons i visited))]
[(list 'acc x) (loop (+ acc x) (add1 i) (cons i visited))]
[(list 'jmp x) (loop acc (+ i x) (cons i visited))]
[instr (error "invalid instruction" i instr)])])))
(define (part1 filename)
(define program (read-input filename))
(define-values (state visited acc) (execute program))
acc)
(module+ test
(check-equal? (part1 "test") 5))
(module+ main
(displayln (part1 "input")))
(define (change-instruction program visited)
(define new-program (vector-copy program))
(define new-visited
(let loop ([instructions visited])
(match (vector-ref new-program (car instructions))
[(list 'nop x)
(vector-set! new-program (car instructions) (list 'jmp x))
(cdr instructions)]
[(list 'jmp x)
(vector-set! new-program (car instructions) (list 'nop x))
(cdr instructions)]
[z (loop (cdr instructions))])))
(values new-program new-visited))
(define (part2 filename)
(define program (read-input filename))
(define-values (initial-reason initial-visited initial-acc) (execute program))
(let loop ([visited initial-visited])
(let*-values ([(new-program new-visited) (change-instruction program visited)]
[(reason visited acc) (execute new-program)])
(if (equal? reason 'end)
acc
(loop new-visited)))))
(module+ test
(check-equal? (part2 "test") 8))
(module+ main
(displayln (part2 "input")))

641
2020/day08/input Normal file
View file

@ -0,0 +1,641 @@
acc +29
acc +0
acc +36
jmp +292
acc +11
acc +16
nop +280
nop +320
jmp +310
acc +15
jmp +76
acc +31
acc +6
acc +29
acc +35
jmp +524
acc +4
acc +12
jmp +162
acc +14
acc -10
jmp +312
acc +19
jmp +385
acc +46
acc +13
acc -19
jmp +366
jmp +56
acc -9
nop +74
jmp +357
acc +28
jmp +223
acc -12
jmp +292
nop +385
acc +45
jmp +255
jmp +337
nop +465
acc +43
jmp +555
acc +20
acc +23
acc +39
jmp -6
acc -4
jmp -39
acc +7
acc -13
acc +41
acc +4
jmp +80
jmp +1
jmp +484
acc -16
acc +2
acc +20
jmp +244
jmp +258
acc +27
acc -7
acc +40
nop +490
jmp +247
nop +363
acc +46
acc +27
acc -4
jmp +379
jmp +62
acc -15
acc +38
acc -4
acc +4
jmp +312
acc +37
jmp +271
acc +3
jmp +538
jmp +1
acc +33
jmp +99
jmp +107
jmp -38
jmp +359
jmp +1
acc +11
acc -3
jmp +109
acc +17
jmp +146
acc +34
acc -5
jmp +174
jmp +482
acc +43
acc +35
acc +8
acc +36
jmp -41
jmp +260
jmp -49
acc +30
nop -33
acc +49
acc +40
jmp +157
acc -11
acc -11
acc +21
acc +35
jmp +489
jmp +219
acc +33
acc +22
jmp +224
jmp +1
jmp +278
acc +0
acc +31
jmp +271
acc -19
acc +38
acc -15
acc +0
jmp +81
acc +7
acc +50
nop +55
nop +2
jmp +195
acc -18
acc +14
jmp +1
jmp -57
acc -17
nop +495
jmp -21
jmp +1
acc +39
acc +35
acc +27
jmp +301
acc +6
acc +11
acc -10
jmp +1
jmp +56
acc +38
jmp +333
acc +26
acc -15
acc +32
acc -9
jmp +412
acc -17
acc +9
jmp +110
nop +298
acc +4
acc +25
acc +0
jmp -136
acc +24
jmp +418
acc -2
acc +38
jmp +92
acc +5
acc +22
acc -4
acc -12
jmp +241
acc +19
nop -6
acc -11
acc +24
jmp +236
jmp +106
jmp +343
jmp -17
acc +5
jmp +143
nop +354
acc +20
acc -11
jmp +63
nop +252
jmp +96
acc -11
acc +35
nop +409
acc +2
jmp +83
acc +0
acc -1
jmp +299
acc +46
jmp +426
acc +8
acc +50
acc +33
jmp +384
nop -20
jmp -152
jmp +283
nop -161
nop -76
acc +34
nop -202
jmp -98
acc +11
jmp +194
acc +12
acc +32
acc -18
acc +4
jmp +202
acc -12
acc +43
acc -11
jmp +70
acc +8
acc -5
acc +9
jmp -187
acc +49
acc +42
acc +10
jmp +274
jmp -216
acc -11
acc -8
acc +49
nop -56
jmp -197
nop -33
nop -167
jmp -174
acc +41
acc +19
acc +13
jmp +334
acc +48
acc +37
acc +35
jmp +323
jmp +1
jmp -184
nop +76
acc +47
acc +5
jmp -150
jmp +133
acc -1
jmp +197
nop +175
acc +28
jmp +328
jmp +209
nop -190
jmp +1
jmp +181
acc +33
acc +34
jmp +345
jmp -118
acc +40
acc +36
nop +32
jmp +261
acc +38
acc +1
acc -19
acc +48
jmp +320
acc +32
acc -7
acc +34
jmp +64
acc +6
acc +3
acc -11
jmp +293
acc +49
acc +23
acc +46
jmp +231
jmp +1
acc -17
jmp +35
jmp -78
jmp +82
acc +31
nop +31
acc +35
acc +42
jmp -208
acc +2
acc -16
jmp +139
nop -170
acc -4
acc +22
acc +9
jmp +295
nop -248
acc +33
acc +32
jmp +186
acc -11
jmp +151
acc +15
acc -7
acc +20
jmp -215
acc +43
acc +12
acc +6
acc +5
jmp +225
acc +15
jmp +1
nop +263
jmp -317
acc +34
jmp +1
jmp -275
acc -15
acc -12
jmp +165
nop -254
acc +12
nop +277
jmp +105
acc +35
jmp +1
acc +34
jmp +93
acc +9
jmp -282
acc +43
jmp -335
acc +21
jmp -114
acc +30
jmp -246
acc -17
acc +10
nop -211
nop +202
jmp +76
acc +34
acc +23
acc +9
acc +48
jmp -208
jmp -241
acc +37
jmp +97
acc +10
acc +47
nop -292
acc -13
jmp +27
acc -18
nop -56
jmp +33
acc +7
jmp -12
acc -11
acc -2
acc +13
jmp -328
acc +21
acc +30
jmp -208
acc -7
jmp -87
acc +41
nop +76
acc +22
jmp +222
acc +48
acc +4
jmp +225
jmp +200
acc -14
acc -12
nop -79
jmp +192
acc +41
acc +3
jmp -355
jmp -292
acc -18
jmp -174
acc +44
acc +23
jmp -163
acc +5
nop -125
nop -7
acc +41
jmp -266
jmp +90
acc +5
jmp +213
acc +10
acc -11
nop -403
jmp +1
jmp -386
acc -18
acc +9
nop +107
acc +0
jmp -383
jmp +104
acc +30
acc -3
nop -208
acc -15
jmp +211
acc -12
acc +18
jmp -392
acc +25
acc +30
jmp -170
jmp -282
acc +38
acc -16
jmp -108
acc +29
acc +31
acc +29
acc +32
jmp -258
acc -16
jmp -40
acc +41
jmp -365
acc +17
acc +20
jmp -77
jmp -55
acc +3
acc +28
nop -227
jmp +116
jmp +165
acc +16
jmp -74
acc -4
jmp -275
acc +28
jmp -254
acc +13
acc -12
acc -16
jmp -5
acc +17
nop -369
nop -375
nop +66
jmp -173
jmp -40
jmp -448
acc -10
nop -332
acc +39
acc -8
jmp +64
acc -19
acc +14
jmp -376
acc +20
acc +25
acc +11
acc +29
jmp -392
acc +33
acc +28
nop -241
acc -6
jmp +2
jmp -410
acc +15
nop -351
jmp -254
acc -2
acc +15
acc +11
jmp -103
acc +29
acc +7
jmp +21
acc +20
acc +3
acc -4
acc +31
jmp -7
acc -1
jmp +1
jmp -158
acc +11
acc -8
jmp +123
acc -9
acc +42
acc +6
acc -18
jmp -483
nop -507
acc +37
acc -10
jmp -61
jmp +98
acc +38
acc +36
jmp -358
nop -231
acc +23
acc +49
jmp -151
acc +48
acc +2
acc +19
acc +34
jmp -8
acc -14
acc -16
jmp -439
acc -7
acc -14
jmp -466
acc +1
nop -254
acc +11
jmp -72
acc +33
acc +11
acc +40
jmp -428
acc +26
acc +8
acc +19
jmp -305
nop +71
acc +3
jmp -457
acc -6
acc +36
jmp +77
acc +11
nop +68
jmp -69
acc +7
acc -8
acc +50
jmp -516
acc +11
acc +46
acc +4
jmp -179
jmp -265
nop -64
jmp +63
acc +27
nop -340
jmp -62
acc +15
acc +42
acc -9
jmp -549
acc +3
acc -10
acc +28
jmp -376
jmp +1
jmp -78
jmp -87
acc +34
acc -17
jmp -275
acc +50
acc +17
acc +39
jmp -133
nop -331
acc +33
acc +38
acc +25
jmp -215
acc +0
acc -9
jmp -258
acc +25
jmp -81
jmp -574
acc +37
acc +48
jmp -327
acc +34
nop -493
acc +42
jmp -459
jmp +1
jmp -135
jmp -489
acc +33
acc +19
acc +17
acc +7
jmp -106
nop -164
jmp -462
acc +27
jmp -612
acc +15
jmp -438
acc +35
jmp -171
acc +10
acc +4
acc +34
jmp -496
nop -4
acc +16
jmp -541
acc +13
jmp -201
jmp -551
acc +40
acc +9
acc +0
acc +33
jmp +1

9
2020/day08/test Normal file
View file

@ -0,0 +1,9 @@
nop +0
acc +1
jmp +4
acc +3
jmp -3
acc -99
acc +1
jmp -4
acc +6

98
2020/day09/day09.c Normal file
View file

@ -0,0 +1,98 @@
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
bool in_state(unsigned int m, unsigned int state[m][m], unsigned int x) {
for (int i = 0; i < m; ++i) {
for (int j = i + 1; j < m; ++j) {
if (state[i][j] == x) {
return true;
}
}
}
return false;
}
void print_state(unsigned int m, unsigned int state[m][m]) {
for (int i = 0; i < m; ++i) {
for (int j = 0; j < m; ++j) {
printf("%u ", state[i][j]);
}
printf("\n");
}
}
void update_state(unsigned int m, unsigned int state[m][m], unsigned int *input,
unsigned int k) {
for (int i = k - m +1; i < k; ++i) {
state[k % m][i % m] = input[i] + input[k];
state[i % m][k % m] = input[i] + input[k];
}
}
int main(int argc, char *argv[]) {
if (argc < 3) {
printf("Usage: %s <input file> <preamble size>\n", argv[0]);
return 0;
}
FILE *fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("Could not open file %s\n", argv[1]);
return 1;
}
unsigned int m;
sscanf(argv[2], "%d", &m);
unsigned int input[1024] = {0};
unsigned int n = 0;
unsigned int d;
while (fscanf(fp, "%d\n", &d) == 1) {
input[n] = d;
n++;
}
fclose(fp);
// Part 1
unsigned int state[m][m];
for (int i = 0; i < m; ++i) {
for (int j = 0; j < m; ++j) {
if (i != j) {
state[i][j] = input[i] + input[j];
} else {
state[i][j] = 0;
}
}
}
unsigned int k = m;
while (in_state(m, state, input[k])) {
update_state(m, state, input, k);
k++;
}
printf("%u\n", input[k]);
// Part 2
unsigned int invalid_number = input[k];
for (int width = 2; width < n; ++width) {
for (int i = 0; i < n - width; ++i) {
unsigned int sum = 0;
unsigned int min = UINT_MAX;
unsigned int max = 0;
for (int j = 0; j < width; ++j) {
sum += input[i + j];
min = (input[i + j] < min) ? input[i + j] : min;
max = (input[i + j] > max) ? input[i + j] : max;
}
if (sum == invalid_number) {
printf("%u\n", min + max);
return 0;
}
}
}
return 0;
}

6
2020/day09/day09.dyalog Normal file
View file

@ -0,0 +1,6 @@
⎕IO←0
p←⍎¨⊃⎕NGET'input'1
m←25
⊢x←p⌷⍨m+⍸~(m↓p)∊¨{(,∘.<⍨m)/,⍵}¨∘.+⍨¨¯1↓m,/p ⍝ Part 1
⍝+/∊{{(x=+/⍵)×(⌈/+⌊/)⍵}¨⍵,/p}¨2+p ⍝ Part 2
(⌈/+⌊/)p[{(1+1⊃⍵)+⍳⊃-/⍵}⊃⍸x=∘.-⍨+\p] ⍝ Part 2 (faster)

65
2020/day09/day09.rkt Normal file
View file

@ -0,0 +1,65 @@
#lang racket
(module+ test
(require rackunit))
(module+ main
(displayln "Day 9"))
(define (read-input filename)
(list->vector (map string->number (file->lines filename))))
(define (initial-state p m)
(reverse (for/list ([x (in-vector p 0 m)])
(for/list ([y (in-vector p 0 m)]
#:unless (= x y))
(+ x y)))))
(define (update-state s p k)
(define m (length (car s)))
(define new-sums (for/list ([x (in-vector p (- k m) k)])
(+ x (vector-ref p k))))
(append (cdr s) (list new-sums)))
(define (in-state? s x)
(member x (flatten s)))
;; The initial state is computed in O(m^2), and the search itself is
;; only O(nm), where n is the length of the input, because updating
;; the state is linear in m. So the overall complexity is O(m^2 + nm)
;; instead of O(nm^2) for the naïve solution.
(define (find-invalid-number p m)
(define-values (s x)
(for/fold ([s (initial-state p m)]
[x (vector-ref p m)])
([k (in-naturals m)]
#:break (not (in-state? s x)))
(values (update-state s p k)
(vector-ref p k))))
x)
(define (part1 filename m)
(find-invalid-number (read-input filename) m))
(module+ test
(check-equal? (part1 "test" 5) 127))
(module+ main
(displayln (part1 "input" 25)))
(define (part2 filename m)
(define p (read-input filename))
(define n (vector-length p))
(define invalid (find-invalid-number p m))
(for*/last ([width (in-range 2 n)]
[i (in-range 0 (- n width))])
(define contiguous (vector->list (vector-copy p i (+ i width))))
#:final (= invalid (apply + contiguous))
(+ (apply min contiguous)
(apply max contiguous))))
(module+ test
(check-equal? (part2 "test" 5) 62))
(module+ main
(displayln (part2 "input" 25)))

1000
2020/day09/input Normal file

File diff suppressed because it is too large Load diff

20
2020/day09/test Normal file
View file

@ -0,0 +1,20 @@
35
20
15
25
47
40
62
55
65
95
102
117
150
182
127
219
299
277
309
576

63
2020/day10/day10.c Normal file
View file

@ -0,0 +1,63 @@
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int compare(const void* a, const void* b) {
unsigned int x = *(const unsigned int*)a;
unsigned int y = *(const unsigned int*)b;
if (x < y) return -1;
if (x > y) return 1;
return 0;
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s <input file>\n", argv[0]);
return 0;
}
FILE *fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("Could not open file %s\n", argv[1]);
return 1;
}
unsigned int input[128] = {0};
unsigned int n = 1;
unsigned int d = 0;
unsigned int max = 0;
while (fscanf(fp, "%d\n", &d) == 1) {
input[n] = d;
n++;
max = d > max ? d : max;
}
max += 3;
input[n] = max;
n++;
fclose(fp);
qsort(input, n, sizeof(unsigned int), compare);
// Part 1
int ones = 0;
int threes = 0;
for (int i = 1; i < n; ++i) {
int diff = input[i] - input[i-1];
ones += (diff == 1);
threes += (diff == 3);
}
printf("%d\n", ones * threes);
// Part 2
unsigned long counts[1024] = {0};
counts[2] = 1;
for (int i = 1; i < n; ++i) {
unsigned int x = input[i];
counts[x+2] = counts[x-1] + counts[x] + counts[x+1];
}
printf("%lu\n", counts[max+2]);
return 0;
}

10
2020/day10/day10.dyalog Normal file
View file

@ -0,0 +1,10 @@
⎕IO←0 ⋄ ⎕PP←15
p←⍎¨⊃⎕NGET'input'1
p←0,p[⍋p],3+⌈/p
×/⊢∘≢⌸2-/p ⍝ Part 1
c←0,0,1,(⌈/p)0 ⍝ paths counts
{c[⍵+2]←+/c[⍵+¯1 0 1]}¨1↓p
⊃⌽c ⍝ Part 2
a←(0∘<∧≤∘3)∘.-⍨p ⍝ adjacency matrix
+/{⊃⊖({a+.×⍵}⍣⍵)a}¨p ⍝ Part 2, the matrix way

49
2020/day10/day10.rkt Normal file
View file

@ -0,0 +1,49 @@
#lang racket
(module+ test
(require rackunit))
(module+ main
(displayln "Day 10"))
(define (read-input filename)
(define input (map string->number (file->lines filename)))
(sort (cons 0 (cons (target input) input)) <))
(define (target lst)
(+ 3 (apply max lst)))
(define (part1 filename)
(define jolts (read-input filename))
(define counts (make-hash))
(for ([x (in-list (drop jolts 1))]
[y (in-list jolts)])
(hash-update! counts (- x y) add1 0))
(* (hash-ref counts 1 0) (hash-ref counts 3 0)))
(module+ test
(check-equal? (part1 "test1") (* 7 5))
(check-equal? (part1 "test2") (* 22 10)))
(module+ main
(displayln (part1 "input")))
(define (count-paths jolts)
(define counts (make-hash))
(hash-set! counts 0 1)
(for ([x (in-list (cdr jolts))])
(hash-set! counts x (+ (hash-ref counts (- x 1) 0)
(hash-ref counts (- x 2) 0)
(hash-ref counts (- x 3) 0))))
(hash-ref counts (last jolts)))
(define (part2 filename)
(define jolts (read-input filename))
(count-paths jolts))
(module+ test
(check-equal? (part2 "test1") 8)
(check-equal? (part2 "test2") 19208))
(module+ main
(displayln (part2 "input")))

95
2020/day10/input Normal file
View file

@ -0,0 +1,95 @@
86
149
4
75
87
132
12
115
62
61
153
78
138
43
88
108
59
152
109
63
42
60
7
104
49
156
35
2
52
72
125
94
46
136
26
16
76
117
116
150
20
13
141
131
127
67
3
40
54
82
36
100
41
56
146
157
89
23
8
55
111
135
144
77
124
18
53
92
126
101
69
27
145
11
151
31
19
34
17
130
118
28
107
137
68
93
85
66
97
110
37
114
79
121
1

11
2020/day10/test1 Normal file
View file

@ -0,0 +1,11 @@
16
10
15
5
1
11
7
19
6
12
4

31
2020/day10/test2 Normal file
View file

@ -0,0 +1,31 @@
28
33
18
42
31
14
46
20
48
47
24
23
49
45
19
38
39
11
1
32
25
35
8
17
7
9
4
2
34
10
3

4
2020/day11/day11.dyalog Normal file
View file

@ -0,0 +1,4 @@
⎕IO←0
p←'L'=↑⊃⎕NGET'input'1
s←{(1=1 1⌷⍵)∧∧/2≠,⍵:2 ⋄ (2=1 1⌷⍵)∧4<+/2=,⍵:1 ⋄ 1:1 1⌷⍵}⌺3 3
+/,2=(s⍣≡)p ⍝ Part 1

119
2020/day11/day11.rkt Normal file
View file

@ -0,0 +1,119 @@
#lang racket
(module+ test
(require rackunit))
(module+ main
(displayln "Day 11"))
(define (matrix-ref mat i j default)
(define n (vector-length mat))
(define m (vector-length (vector-ref mat 0)))
(if (or (< i 0) (<= n i) (< j 0) (<= m j))
default
(vector-ref (vector-ref mat i) j)))
(define (matrix-set! mat i j v)
(vector-set! (vector-ref mat i) j v))
(define (matrix-copy mat)
(for/vector ([l (in-vector mat)])
(vector-copy l)))
(define (display-state state)
(for ([l (in-vector state)])
(displayln (list->string (vector->list l))))
(displayln ""))
(define (parse-line str)
(list->vector (string->list str)))
(define (read-input filename)
(with-input-from-file filename
(lambda ()
(for/vector ([line (in-lines)])
(parse-line line)))))
(define (update-seat-neighbours state x y)
(define neighbours (for*/sum ([i '(-1 0 1)]
[j '(-1 0 1)]
#:unless (= 0 i j))
(if (eq? #\# (matrix-ref state (+ x i) (+ y j) #\.)) 1 0)))
(define s (matrix-ref state x y #\.))
(cond
[(and (eq? s #\L) (= neighbours 0)) #\#]
[(and (eq? s #\#) (>= neighbours 4)) #\L]
[else s]))
(define (update-state state update-seat-fn)
(define n (vector-length state))
(define m (vector-length (vector-ref state 0)))
(define new-state (matrix-copy state))
(for* ([x (in-range n)]
[y (in-range m)])
(matrix-set! new-state x y (update-seat-fn state x y)))
new-state)
(define (count-occupied state)
(for*/sum ([l (in-vector state)]
[v (in-vector l)]
#:when (eq? v #\#))
1))
(define (part1 filename)
(define input (read-input filename))
(define n (vector-length input))
(define m (vector-length (vector-ref input 0)))
(define-values (prev final)
(for/fold ([prev-state 0]
[state input])
([i (in-naturals)]
#:break (equal? prev-state state))
(define new-state (update-state state update-seat-neighbours))
(values state new-state)))
(count-occupied final))
(module+ test
(check-equal? (part1 "test") 37))
(module+ main
(displayln (part1 "input")))
(define (visible state x y dx dy)
(define n (vector-length state))
(define m (vector-length (vector-ref state 0)))
(let loop ([u (+ x dx)]
[v (+ y dy)])
(cond
[(or (< u 0) (< v 0) (<= n u) (<= m v)) 0]
[(eq? #\L (matrix-ref state u v #\.)) 0]
[(eq? #\# (matrix-ref state u v #\.)) 1]
[else (loop (+ u dx) (+ v dy))])))
(define (update-seat-visible state x y)
(define n-visible (apply + (for*/list ([dx '(-1 0 1)]
[dy '(-1 0 1)]
#:unless (= 0 dx dy))
(visible state x y dx dy))))
(define s (matrix-ref state x y #\.))
(cond
[(and (eq? s #\L) (= n-visible 0)) #\#]
[(and (eq? s #\#) (>= n-visible 5)) #\L]
[else s]))
(define (part2 filename)
(define input (read-input filename))
(define-values (prev final)
(for/fold ([prev-state 0]
[state input])
([i (in-naturals)]
#:break (equal? prev-state state))
(define new-state (update-state state update-seat-visible))
(values state new-state)))
(count-occupied final))
(module+ test
(check-equal? (part2 "test") 26))
(module+ main
(displayln (part2 "input")))

98
2020/day11/input Normal file
View file

@ -0,0 +1,98 @@
LLLLLLLLL.LLLL.LLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLL..LLLL.LLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL.L
LLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL
......L.LL.....L.L..L.....L.L..LL.L.LL.L...L..L..............L..L......LL.....LL...L.L.....
LLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLLLLLL..LLLLLLLLLLLL.LLLLLLLL.LLLLLLLL..LLLLLLL.LLLLLLLL
LLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLL.LLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLL..LLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
...L..L....LL.L.L......LLLLL.....LL....L.......L.LL.L.L.L..LL...LLLLLL.LL........L.L.......
LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL
.LLLLLLLL.LLLL..LLLL.LLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LL.LLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLL.LL.LLLLLLL.LLLLLLLL
LLLLLLLLL.L.LL.LLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL
LLLLLLLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL
......L.L..L.L...LLL.....L.L..L......LL...L..L..L.L......L.L..L....LLLL....L..L....L.L..L.L
LLLLLL.LL.LLLLLLLLLL.LLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLL.LLL.LLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL
LLLL.LLLL.LLLLLLLLL..LLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLL.LLLLLLLLLLL.LLL.LL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLL.LLLL.LLLLLLLLLLLL.LL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLL.LLL.LLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL
LLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL
LLLLLLLLL.L.LL.LLLLL.LLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL
.LLL......L........L.....L..LL.L..L..L.L....L.L............L...........LLL..L..LL....LL..L.
LLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLLLLLLLLLLLLL..LLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL
LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLL.L.LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL
.......LL..L.LLL.L....L..L....L......L..L...LL...L.L...LL....L.L........L...L...L.L.......L
LLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL
LLLLLLLLLLLLLL..LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLL.LLLLLLLLLLLL.LL.LLLL.LLLLLLLL
LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL
.L..LLL.L....LL.L..L..LL..L.LL.L......L........LLL.....L..LL...L.LL.LL.....L....L..LL.L....
LLLLLLLLLLL.LL.LLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL
LLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL
LLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLL..LLLLLLLLL.LLLLLLLLLLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL
L..L.LL....L..LL.L.....L.....L...L..L..L...L....L.L.L..LL.L......L...L......L....L.....L.L.
LLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLL..LLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLL.LLLL.L.LLL.LLLLLL.LLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLL.L.LLLLL.LLLLLLLLLLL.LLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL
.L..L.L...LLL.LL.L.L...L........LLLLL.L..L......L.....L....L.LL.L.LLL...LL..LL.LL..LL.....L
LLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL
LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL..LLLLLLL.LLLLLLLL
..L.L..L...L..L.L........L.L.LLL..L.L...LLL..L..........L........L....LLLL.LL...L......LL..
LLLLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLL..LLLLLLL.LLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLL.LLL
LLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLL.LLL.LL.LLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL
....LL.L..L...LL......L.....L..LL.L.......LL...L....LLLLL..L..L.LLL.......LL..LL...LL.....L
LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLL.L.LLLLLL
LLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL
LLLLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLL.L.LLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL
LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLL.LLLLLLL.
.L.LL..L.LLL.L...L.......L..LLL.....L...LL...LLL...L.LL............L.L....LL.....L.L..LL..L
LLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLL.LLLLL
LLLLLLLLL.LLLL.LLLLL.L.L.LLLLLLLLLLL.LLLL.L.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
LLLLLLLLLLLLLL.LLLLLLLLLL.L.LLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL
LLL..L....L.LL..L.L.LLL.LL..L.......L.LL..L..L....L..L...L...L.L..L.L.L.L.L.L.LLL.L.....L.L
LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLL.LL.LLLLL
LLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLLLLLLLLLLLLL.LLLLLL.LL.LLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLLL
LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL
LLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL
.L..L..LL.L..L..L.L.L.LL..L....L.....L.LL..........L..L...LLL.L....LL...LL...L.LL.L.....LL.
LLLL.LLLL.LLLL.LLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLL
LLLLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL
LLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL
LLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL
LLLLLLLLLL.LLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LL.L.LLLLLL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL
LLLLLLLLL.LLLL..LLLL.LLLLLL.LLLLLLLL.LL.L.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL
LLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL
LLLLLLLLL.LLLLLLLLLL.LLLLLL.LLLLL.LLLLLLL.LL.LLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL..LLLLLLLL
LLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLL.LLLLL

10
2020/day11/test Normal file
View file

@ -0,0 +1,10 @@
L.LL.LL.LL
LLLLLLL.LL
L.L.L..L..
LLLL.LL.LL
L.LL.LL.LL
L.LLLLL.LL
..L.L.....
LLLLLLLLLL
L.LLLLLL.L
L.LLLLL.LL

119
2020/day12/day12.c Normal file
View file

@ -0,0 +1,119 @@
#include <complex.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define PI
struct instruction {
char action;
int value;
};
struct state {
double complex pos;
double complex dir;
};
void step1(struct state *st, struct instruction instr) {
switch (instr.action) {
case 'N': {
st->pos += instr.value * I;
break;
}
case 'S': {
st->pos -= instr.value * I;
break;
}
case 'E': {
st->pos += instr.value;
break;
}
case 'W': {
st->pos -= instr.value;
break;
}
case 'F': {
st->pos += instr.value * st->dir;
break;
}
case 'R': {
st->dir *= cexp(-instr.value * I * M_PI / 180);
break;
}
case 'L': {
st->dir *= cexp(instr.value * I * M_PI / 180);
break;
}
default:
printf("Invalid instruction %c %d\n", instr.action, instr.value);
break;
}
}
void step2(struct state *st, struct instruction instr) {
switch (instr.action) {
case 'N': {
st->dir += instr.value * I;
break;
}
case 'S': {
st->dir -= instr.value * I;
break;
}
case 'E': {
st->dir += instr.value;
break;
}
case 'W': {
st->dir -= instr.value;
break;
}
case 'F': {
st->pos += instr.value * st->dir;
break;
}
case 'R': {
st->dir *= cexp(-instr.value * I * M_PI / 180);
break;
}
case 'L': {
st->dir *= cexp(instr.value * I * M_PI / 180);
break;
}
default:
printf("Invalid instruction %c %d\n", instr.action, instr.value);
break;
}
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s <input file>\n", argv[0]);
return 0;
}
FILE *fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("Could not open file %s\n", argv[1]);
return 1;
}
struct instruction in[1024];
int n = 0;
while (fscanf(fp, "%c%d\n", &in[n].action, &in[n].value) == 2) {
n++;
}
fclose(fp);
struct state st1 = {.pos = 0, .dir = 1};
struct state st2 = {.pos = 0, .dir = 10 + I};
for (int i = 0; i < n; ++i) {
step1(&st1, in[i]);
step2(&st2, in[i]);
}
printf("%d\n", (int)round(fabs(creal(st1.pos)) + fabs(cimag(st1.pos))));
printf("%d\n", (int)round(fabs(creal(st2.pos)) + fabs(cimag(st2.pos))));
return 0;
}

66
2020/day12/day12.rkt Normal file
View file

@ -0,0 +1,66 @@
#lang racket
(module+ test
(require rackunit))
(module+ main
(displayln "Day 12"))
(define (parse-instruction str)
(list (string->symbol (substring str 0 1))
(string->number (substring str 1))))
(define (read-input filename)
(map parse-instruction (file->lines filename)))
(struct state
(pos dir)
#:transparent)
(define (step st instr)
(match instr
[`(N ,n) (struct-copy state st [pos (+ (state-pos st) (make-rectangular 0 n))])]
[`(S ,n) (struct-copy state st [pos (- (state-pos st) (make-rectangular 0 n))])]
[`(E ,n) (struct-copy state st [pos (+ (state-pos st) (make-rectangular n 0))])]
[`(W ,n) (struct-copy state st [pos (- (state-pos st) (make-rectangular n 0))])]
[`(F ,n) (struct-copy state st [pos (+ (state-pos st) (* n (state-dir st)))])]
[`(R ,n) (struct-copy state st [dir (* (state-dir st) (make-polar 1 (degrees->radians (- n))))])]
[`(L ,n) (struct-copy state st [dir (* (state-dir st) (make-polar 1 (degrees->radians n)))])]))
(define (part1 filename)
(define input (read-input filename))
(define final
(state-pos (for/fold ([st (state 0 1)])
([instr (in-list input)])
(step st instr))))
(exact-round (+ (abs (real-part final)) (abs (imag-part final)))))
(module+ test
(check-equal? (part1 "test") 25))
(module+ main
(displayln (part1 "input")))
(define (step2 st instr)
(match instr
[`(N ,n) (struct-copy state st [dir (+ (state-dir st) (make-rectangular 0 n))])]
[`(S ,n) (struct-copy state st [dir (- (state-dir st) (make-rectangular 0 n))])]
[`(E ,n) (struct-copy state st [dir (+ (state-dir st) (make-rectangular n 0))])]
[`(W ,n) (struct-copy state st [dir (- (state-dir st) (make-rectangular n 0))])]
[`(F ,n) (struct-copy state st [pos (+ (state-pos st) (* n (state-dir st)))])]
[`(R ,n) (struct-copy state st [dir (* (state-dir st) (make-polar 1 (degrees->radians (- n))))])]
[`(L ,n) (struct-copy state st [dir (* (state-dir st) (make-polar 1 (degrees->radians n)))])]))
(define (part2 filename)
(define input (read-input filename))
(define final
(state-pos (for/fold ([st (state 0 (make-rectangular 10 1))])
([instr (in-list input)])
(step2 st instr))))
(exact-round (+ (abs (real-part final)) (abs (imag-part final)))))
(module+ test
(check-equal? (part2 "test") 286))
(module+ main
(displayln (part2 "input")))

776
2020/day12/input Normal file
View file

@ -0,0 +1,776 @@
R180
E1
N1
R90
E4
F84
W3
F19
E5
N1
W5
W4
R90
S1
F70
R90
W2
S3
L180
E2
R90
E1
R90
N2
E3
F55
W3
R90
S2
E4
L90
F33
W4
S3
F11
N4
W4
F88
W3
F62
L90
S3
W3
N1
E3
E2
N1
E3
S3
E5
S4
W5
L90
W5
R90
E4
F36
N4
E4
E5
F47
R90
N3
E3
L180
S5
R90
S5
W2
S3
F43
W2
R180
W2
S2
L180
E2
F49
L90
F77
S5
E1
S2
F39
L180
F12
W1
L90
F60
S2
E3
N1
E5
R90
E1
N4
W4
S4
E2
L90
F100
E3
F58
S2
E4
F83
W3
N1
R90
F99
W5
W4
F19
N3
W1
W5
F70
R180
R90
F58
E5
N3
R90
N4
F86
N4
F70
L90
F36
R90
S4
R180
N5
F81
W5
R90
E5
L90
F73
S5
E3
N1
F27
E2
N3
L180
W2
F24
N2
L90
F69
N2
E3
F49
L90
S4
W5
F18
R180
F62
S2
F65
E3
F100
N1
F96
W1
F75
L180
W2
S2
F93
E5
S3
R90
S2
F34
R90
F83
S1
W1
F58
L180
N4
E1
R90
W2
F93
S3
F20
R90
N3
E3
N3
L90
F8
S3
F18
S3
N2
F6
L270
F70
W5
S3
F54
E2
F75
E3
R90
N2
W3
L90
E4
F58
N5
F97
W2
L90
W5
S2
W1
S5
F85
N1
E1
N4
E4
L90
E1
R90
S5
L180
R270
N1
L90
E4
N3
F45
N2
F68
R90
F36
N5
F82
S5
E4
R180
S2
L180
N3
R270
W5
F70
L90
W5
F80
W4
N2
R90
S3
W1
F23
N1
W1
N4
F70
S3
L180
F57
R90
L90
F55
L90
N4
F87
L90
F1
L270
F17
N5
R180
F84
R90
W5
F7
W1
S1
E3
F46
S5
E2
F23
R90
E4
W2
F96
E5
L90
F65
F3
S5
E5
N3
W4
L90
S2
F57
E1
R90
F68
E3
L90
W1
F29
N5
W5
N1
F95
N1
L90
F31
S5
L180
N2
W5
R90
F27
E1
R90
E3
S5
F10
R90
N4
E2
F25
S4
E5
F51
N3
W2
L90
S3
L180
F17
E4
F93
E3
L90
F41
L90
S5
L90
W5
N1
F81
L90
E4
W2
R90
W1
S5
R90
F39
W3
R90
N5
E1
L90
F82
S3
R90
W4
F66
F4
L90
F77
R90
E1
L90
F53
S4
F35
W1
F64
R90
F9
S1
E1
L90
W4
R90
S2
W5
R90
S4
L90
N3
F8
L180
N5
E5
N4
F35
N5
W1
N1
E5
F15
R180
F92
W3
L90
F4
L90
E1
S3
W3
R90
F37
N5
F19
S2
F98
L90
F24
W3
F68
N5
R90
W3
L90
W3
L90
S1
L90
S4
W3
F56
N4
R90
E3
W1
L90
E4
N3
R180
E1
S1
W2
R90
N3
F82
N2
F37
S3
L180
E2
L180
F6
N2
F96
E2
R180
E2
W3
R90
E2
S5
S1
F23
R90
W5
F75
S1
L90
S3
E1
F83
W4
L180
W5
L90
N1
E1
S2
F17
L90
S2
F53
R90
S3
N3
W1
N4
L180
L90
E3
F9
S5
F24
W3
E5
N2
F73
N1
F28
N2
W4
N3
F53
E5
F47
W2
F60
L90
E2
F19
S1
F63
W5
F100
N3
L180
F83
N4
W5
F37
S1
F50
E1
N2
W3
R90
F85
S4
F72
N4
L90
F48
R90
F99
R90
F58
W3
W4
F64
E1
R90
F74
L90
F23
N3
N3
E1
S1
W5
L180
F98
L90
F36
W4
S2
W3
F9
F72
W5
F78
N2
F65
S3
F47
S5
R90
F68
L180
W2
F7
E2
E3
S4
R90
N2
L180
W2
R180
E4
R90
W3
L90
E4
F54
L180
E2
F6
W5
F82
E4
R90
E4
F25
N2
R270
N4
F18
N5
R90
S3
R90
F38
R90
F97
W4
F85
S4
F56
E4
S1
F40
W3
F52
L90
F76
N4
F15
S2
F22
S5
L180
F91
L180
F8
L90
E4
N4
F67
L90
S3
R180
R90
N4
F71
W3
F34
E2
N1
F43
W5
L180
N5
W2
F42
R90
W3
F39
E1
S2
L180
N5
E3
N5
F28
E1
R90
S3
F40
L90
S2
S2
L90
W5
L90
F93
R180
W4
S4
W4
F100
S3
R90
E2
L180
W1
E3
S5
L90
F87
N1
R90
F3
R90
E5
R90
S3
F45
L90
S2
F42
R90
F95
L90
E1
N3
R90
F73
S3
E1
L90
S2
E3
L90
L270
F38
S5
R90
F42
L90
N1
F7
S3
F65
N2
F42
L180
W5
S4
E4
F65
S4
E5
F51
E4
R180
F70
R90
F28
N5
W5
N1
F96
L90
W4
S3
W3
F89
W1
L90
F75
L270
S3
R90
L90
F7
E2
F24
R180
S2
L180
F48
R90
F37
W2
R90
W4
L90
W3
F81
E4
N2
F39
E4
N1
W1
L90
F59

5
2020/day12/test Normal file
View file

@ -0,0 +1,5 @@
F10
N3
F7
R90
F11

89
2020/day13/day13.c Normal file
View file

@ -0,0 +1,89 @@
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
long egcd(long *x, long *y, long a, long b) {
if (b == 0) {
*x = 1;
*y = 0;
return a;
}
long x1, y1;
long gcd = egcd(&x1, &y1, b, a % b);
*x = y1;
*y = x1 - (a / b) * y1;
return gcd;
}
long modinv(long a, long m) {
long x, y;
long gcd = egcd(&x, &y, a, m);
if (gcd != 1) {
return -1;
}
if (x < 0) {
return m + x;
}
return x;
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s <input file>\n", argv[0]);
return 0;
}
FILE *fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("Could not open file %s\n", argv[1]);
return 1;
}
int t;
fscanf(fp, "%d\n", &t);
int buses[100] = {0};
int n = 0;
while (fscanf(fp, "%d,", &buses[n++]) == 1 || fscanf(fp, "x,") == 0)
;
n--;
fclose(fp);
// Part 1
int min = INT_MAX;
int tmin = 0;
for (int i = 0; i < n; ++i) {
if (buses[i] == 0) {
continue;
}
int x = buses[i] - t % buses[i];
if (x < min) {
min = x;
tmin = i;
}
}
printf("%d\n", min * buses[tmin]);
// Part 2
unsigned long N = 1;
for (int i = 0; i < n; ++i) {
if (buses[i] == 0) {
continue;
}
N *= buses[i];
}
long x = 0;
for (int i = 0; i < n; ++i) {
if (buses[i] == 0) {
continue;
}
long Ni = N / buses[i];
x += (buses[i] - i) * modinv(Ni, buses[i]) * Ni;
}
printf("%ld\n", x % N);
return 0;
}

18
2020/day13/day13.dyalog Normal file
View file

@ -0,0 +1,18 @@
⎕IO←0 ⋄ (⎕FR ⎕PP)←1287 34
p←⊃⎕NGET'input'1
t←⍎⊃p
b←⍎¨((1<',x'∘⍳)⊆⊢)1⊃p
b{×/((⊢⍳⌊/)⍵)⌷¨(⊂⍺),⊂⍵}b|-t ⍝ Part 1
⍝ https://www.jsoftware.com/papers/50/50_44.htm
xea←{(,1 0){0=⊃⍵: ⋄ ⍵ ∇ -⍵×⌊(⊃⍺)÷⊃⍵}(⍵,0 1)}
∇r←larg cr rarg
m r←larg
n s←rarg
gcd a b←m xea n
lcm←m×n÷gcd
c←lcm|gcd÷⍨(r×b×n)+(s×a×m)
r←lcm,c
c←','(≠⊆⊢)1⊃p
b←↓⍉⍎¨⍕¨↑(⊂~('x'≡⊃)¨c)/¨(⊂c),⊂-c
1⊃⊃cr/{x y←⍵ ⋄ 0=y:x,y ⋄ 1:x(x+y)}¨b ⍝ Part 2

42
2020/day13/day13.rkt Normal file
View file

@ -0,0 +1,42 @@
#lang racket
(require math/number-theory)
(module+ test
(require rackunit))
(module+ main
(displayln "Day 13"))
(define (parse-buses str)
(map string->number (string-split str ",")))
(define (read-input filename)
(define in (file->lines filename))
(values (string->number (car in))
(parse-buses (cadr in))))
(define (part1 filename)
(define-values (t buses) (read-input filename))
(define waits (for/list ([b (in-list buses)]
#:when b)
(list b (- b (modulo t b)))))
(apply * (argmin cadr waits)))
(module+ test
(check-equal? (part1 "test") 295))
(module+ main
(displayln (part1 "input")))
(define (part2 filename)
(define-values (t buses) (read-input filename))
(define active-buses (for/list ([b (in-list buses)] #:when b) b))
(define times (for/list ([b (in-list buses)] [i (in-naturals)] #:when b) (- i)))
(solve-chinese times active-buses))
(module+ test
(check-equal? (part2 "test") 1068781))
(module+ main
(displayln (part2 "input")))

2
2020/day13/input Normal file
View file

@ -0,0 +1,2 @@
1000509
17,x,x,x,x,x,x,x,x,x,x,37,x,x,x,x,x,739,x,29,x,x,x,x,x,x,x,x,x,x,13,x,x,x,x,x,x,x,x,x,23,x,x,x,x,x,x,x,971,x,x,x,x,x,x,x,x,x,41,x,x,x,x,x,x,x,x,19

2
2020/day13/test Normal file
View file

@ -0,0 +1,2 @@
939
7,13,x,x,59,x,31,19

123
2020/day14/day14.c Normal file
View file

@ -0,0 +1,123 @@
#include "uthash.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct memcell {
unsigned long key;
unsigned long val;
UT_hash_handle hh;
};
unsigned long part1(FILE *fp) {
char *buf = NULL;
size_t buf_size = 0;
struct memcell *mem = NULL;
char mask[36];
while (getline(&buf, &buf_size, fp) != -1) {
if (strncmp(buf, "mask", 4) == 0) {
sscanf(buf, "mask = %s", mask);
}
else {
unsigned long addr, val;
sscanf(buf, "mem[%ld] = %ld", &addr, &val);
for (int i = 0; i < 36; ++i) {
if (mask[35 - i] == '1') {
val |= 1UL << i;
} else if (mask[35 - i] == '0') {
val &= ~(1UL << i);
}
}
struct memcell *elt = (struct memcell *)malloc(sizeof(struct memcell));
struct memcell *prev_elt =
(struct memcell *)malloc(sizeof(struct memcell));
elt->key = addr;
elt->val = val;
HASH_REPLACE(hh, mem, key, sizeof(unsigned long), elt, prev_elt);
}
}
unsigned long sum = 0;
for (struct memcell *cell = mem; cell != NULL; cell = cell->hh.next) {
sum += cell->val;
}
return sum;
}
unsigned long part2(FILE *fp) {
char *buf = NULL;
size_t buf_size = 0;
struct memcell *mem = NULL;
char mask[36];
int xcount;
while (getline(&buf, &buf_size, fp) != -1) {
if (strncmp(buf, "mask", 4) == 0) {
sscanf(buf, "mask = %s", mask);
xcount = 0;
for (int i = 0; i < 36; ++i) {
if (mask[i] == 'X') {
xcount++;
}
}
}
else {
unsigned long addr, val;
sscanf(buf, "mem[%ld] = %ld", &addr, &val);
for (unsigned long m = 0; m < (1UL << xcount); ++m) {
unsigned long new_addr = addr;
int x_idx = 0;
for (int i = 0; i < 36; ++i) {
if (mask[35 - i] == '1') {
new_addr |= 1UL << i;
} else if (mask[35 - i] == 'X') {
unsigned long bit = (1UL & (m >> x_idx));
new_addr ^= (-bit ^ new_addr) & (1UL << i);
x_idx++;
}
}
struct memcell *elt = (struct memcell *)malloc(sizeof(struct memcell));
struct memcell *prev_elt =
(struct memcell *)malloc(sizeof(struct memcell));
elt->key = new_addr;
elt->val = val;
HASH_REPLACE(hh, mem, key, sizeof(unsigned long), elt, prev_elt);
}
}
}
unsigned long sum = 0;
for (struct memcell *cell = mem; cell != NULL; cell = cell->hh.next) {
sum += cell->val;
}
return sum;
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s <input file>\n", argv[0]);
return 0;
}
FILE *fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("Could not open file %s\n", argv[1]);
return 1;
}
printf("%lu\n", part1(fp));
rewind(fp);
printf("%lu\n", part2(fp));
fclose(fp);
return 0;
}

82
2020/day14/day14.rkt Normal file
View file

@ -0,0 +1,82 @@
#lang racket
(module+ test
(require rackunit))
(define (parse-line str)
(if (string-prefix? str "mask")
(list 'mask (string-trim str "mask = "))
(let ([params (map string->number (cdr (regexp-match #px"mem\\[(\\d+)\\] = (\\d+)" str)))])
(list 'mem (car params) (cadr params)))))
(define (read-input filename)
(map parse-line (file->lines filename)))
(define (apply-mask mask num)
(define num-binary (reverse (string->list (number->string num 2))))
(define num-lst (append num-binary (make-list (- 36 (length num-binary)) #\0)))
(define mask-lst (reverse (string->list mask)))
(define res-lst (for/list ([d (in-list num-lst)]
[m (in-list mask-lst)])
(cond
[(eq? m #\1) #\1]
[(eq? m #\0) #\0]
[else d])))
(string->number (list->string (reverse res-lst)) 2))
(define (part1 filename)
(define input (read-input filename))
(define mem (make-hash))
(for/fold ([mask ""])
([instr (in-list input)])
(match instr
[`(mask ,x) x]
[`(mem ,i ,x) (hash-set! mem i (apply-mask mask x))
mask]))
(apply + (hash-values mem)))
(module+ test
(check-equal? (part1 "test") 165))
(module+ main
(displayln (part1 "input")))
(define (floating-expansion mask)
(define x-indexes (indexes-of (reverse (string->list mask)) #\X))
(for/list ([idxs (in-combinations x-indexes)])
(apply + (map (λ (idx) (- (expt 2 idx))) idxs))))
(define (destinations mask mask-expansion addr)
(map (λ (x) (+ (bitwise-ior mask addr) x)) mask-expansion))
(module+ test
(let* ([mask "000000000000000000000000000000X1001X"]
[mask-num (string->number (string-replace mask "X" "1") 2)]
[mask-expansion (floating-expansion mask)])
(check-equal? (sort (destinations mask-num mask-expansion 42) <)
'(26 27 58 59)))
(let* ([mask "00000000000000000000000000000000X0XX"]
[mask-num (string->number (string-replace mask "X" "1") 2)]
[mask-expansion (floating-expansion mask)])
(check-equal? (sort (destinations mask-num mask-expansion 16) <)
'(16 17 18 19 24 25 26 27))))
(define (part2 filename)
(define input (read-input filename))
(define mem (make-hash))
(for/fold ([mask 0]
[mask-expansion '()])
([instr (in-list input)])
(match instr
[`(mask ,x) (values (string->number (string-replace x "X" "1") 2)
(floating-expansion x))]
[`(mem ,i ,x) (for ([dest (in-list (destinations mask mask-expansion i))])
(hash-set! mem dest x))
(values mask mask-expansion)]))
(apply + (hash-values mem)))
(module+ test
(check-equal? (part2 "test2") 208))
(module+ main
(displayln (part2 "input")))

592
2020/day14/input Normal file
View file

@ -0,0 +1,592 @@
mask = 100X100X101011111X100000100X11010011
mem[33323] = 349380
mem[52742] = 116688965
mem[4113] = 11499
mem[15819] = 313303
mem[23239] = 755579063
mask = X00X10X1X010110110111X00010X100X000X
mem[49207] = 466621685
mem[34069] = 6874604
mask = 1001100XX00011110110100XX0110000001X
mem[61278] = 56361674
mem[51360] = 61871432
mem[31903] = 45067
mask = 100X100XX0101X11X1X00X00001001X101X0
mem[22981] = 144008
mem[12013] = 49165315
mem[54643] = 50677
mem[59166] = 678129
mem[64022] = 27522
mask = 100110X0001X11011000101X1000001X00X0
mem[32693] = 425145
mem[11437] = 236593490
mem[16078] = 227582
mem[35266] = 197465438
mem[39279] = 127942
mask = 10101000X0X00001X1001000010100111X00
mem[49794] = 2082
mem[60407] = 2129
mem[33300] = 921
mem[18582] = 62106545
mem[32160] = 843912
mem[36917] = 7740
mem[1836] = 54721591
mask = 100010X1X0X011X1101XX00001X01000X10X
mem[8385] = 1381
mem[38022] = 2501412
mem[34713] = 3648024
mem[33245] = 1178087
mem[22176] = 263
mem[20535] = 1289
mem[2092] = 88590569
mask = X001100X00X0X01X0X100X100010110XX101
mem[65061] = 2768
mem[56375] = 6734
mem[18070] = 20571066
mem[61511] = 403157281
mem[4164] = 179682
mem[11801] = 5501
mem[22339] = 14414879
mask = X0011000001X1001X0100111110X00110111
mem[3844] = 1046
mem[33741] = 109390
mem[54311] = 94183595
mem[48744] = 112575
mem[29663] = 2042
mask = X00X100000101001101001001X00001000X1
mem[25325] = 177269
mem[919] = 50779835
mem[52113] = 2386630
mem[60154] = 29645195
mem[24761] = 8101
mask = X101X000X01011011010X100001101110X01
mem[5169] = 2865
mem[55126] = 50829
mem[60154] = 124556261
mem[48753] = 377574
mem[48662] = 9144531
mask = 10011X00001010011010000101110XX0X00X
mem[41623] = 632353121
mem[10365] = 70888870
mem[59458] = 849
mem[18992] = 486294339
mask = X00X100X011011111100X00001001010100X
mem[42046] = 518245944
mem[4654] = 39071
mem[46109] = 1540
mem[3245] = 822
mem[25937] = 257692
mem[19118] = 6601278
mask = 1001001XXX100XXX101XX0001010001000X0
mem[34356] = 55967
mem[52601] = 522574
mem[31903] = 7669828
mem[36165] = 10552
mask = 110X101X00X0111111XX001X0001000XX10X
mem[42649] = 1534730
mem[8324] = 467628
mem[9447] = 3054
mem[41788] = 28205
mem[9353] = 14315559
mask = 1X01X01100111111X101000000X100100000
mem[270] = 3208
mem[20373] = 186089492
mem[43940] = 449607191
mem[63389] = 674
mem[437] = 6933780
mask = 1001X00001X01X0X101101X0010X00110110
mem[22829] = 3301
mem[59260] = 6763
mem[22305] = 203360
mask = 10011110101010X010XX011X0010001XX000
mem[55041] = 6199
mem[55452] = 151
mem[2746] = 464657
mask = 1001000000X0X10110X01101X00100111000
mem[54354] = 666913
mem[44827] = 214920
mem[44621] = 13259544
mem[29462] = 14725
mem[27633] = 284739975
mem[63195] = 11668372
mask = 10X010X10100X111001X101010101X11100X
mem[21667] = 426958
mem[55530] = 91533
mem[10365] = 493
mem[51246] = 513589450
mem[44622] = 1773
mem[4113] = 401
mask = 100X1000001011XXX0100XXX100010X10X00
mem[60407] = 869913
mem[10365] = 59083
mem[18321] = 3019
mem[65061] = 10794134
mem[62827] = 2777572
mem[20373] = 23798334
mask = 1000X10011X010011X10X0000101X0100001
mem[17936] = 4347
mem[38270] = 611
mem[7408] = 2854792
mem[2612] = 604172
mem[24287] = 418220
mem[27110] = 31440
mem[64742] = 1872667
mask = 10X110000010100110X001X01X1000000111
mem[30518] = 13431
mem[64496] = 204238
mem[62259] = 1191
mem[17457] = 3652
mask = 100X1X0XX1101XX11010X000X01010010011
mem[25325] = 67829
mem[4021] = 8039
mask = 1XXXXX0X0010110X11100111001111101110
mem[34600] = 4128134
mem[47565] = 28022073
mask = X0X110000XX010X10010X0X111X111010101
mem[64746] = 17532220
mem[55786] = 109034
mem[12715] = 185475
mask = 1001110X011010111010X1010010100XX100
mem[28923] = 1444
mem[7508] = 41968
mem[39856] = 447
mem[19698] = 4420683
mem[60924] = 7222
mem[8056] = 225410214
mask = 100X10X1X0X011X10110X01X011000X10X00
mem[58206] = 585282
mem[10984] = 105158307
mem[31562] = 526874
mem[60154] = 107013
mem[4409] = 4126230
mask = 1010100010X0XX0111X00X00011X000X0XX0
mem[7122] = 428629
mem[29394] = 262029322
mem[33832] = 6067254
mask = 0001100XXX0010X001100010X000110001X1
mem[1975] = 32392
mem[14891] = 9350
mem[19905] = 28213400
mem[11981] = 132973999
mem[49582] = 4347
mem[64106] = 235564
mem[9648] = 1440
mask = 000110010011XXXX0X1001010001X00X0100
mem[18992] = 628
mem[37263] = 1031
mem[4387] = 1442306
mem[2471] = 1123350
mem[1493] = 88891215
mem[22500] = 3553
mem[6845] = 26007
mask = 10011X00011011X1101X00X001X1X001X111
mem[49101] = 13289
mem[32] = 391365
mem[31906] = 79
mem[48744] = 71043
mask = 1001X0X00010100110X001011001101X01X0
mem[25999] = 2473051
mem[36408] = 56819077
mem[46656] = 2074748
mem[10871] = 8606
mem[7122] = 2053
mem[59403] = 5442
mask = 1XX0X01X100X11111010X000X00X000101X0
mem[1160] = 280063168
mem[20571] = 19030
mem[23225] = 51089295
mem[40992] = 17475
mem[63413] = 1144
mem[19458] = 284777610
mem[21502] = 10410
mask = 100X100X00101X0100X0X0X11100111XX11X
mem[33860] = 160
mem[37007] = 56420
mem[55140] = 490726
mem[47752] = 521745
mem[55594] = 336661995
mem[44008] = 265991679
mask = 1001100001X010011100100X01X0X011111X
mem[1289] = 55191
mem[53058] = 23079796
mem[25362] = 57315626
mem[8895] = 35287816
mask = 0001100100XX00100X1X0X00XX00XX000110
mem[12568] = 136661
mem[9931] = 303487
mem[38781] = 91532
mem[25506] = 950257996
mem[3694] = 6225663
mem[6631] = 62710499
mem[3205] = 7586715
mask = X0001000001X111110100000X0110001000X
mem[61696] = 34763
mem[42583] = 2987088
mem[8416] = 2293694
mem[21503] = 8071
mem[41788] = 950960
mem[9648] = 23284946
mask = 100010000010XX0XX01000000X011100X1X0
mem[30270] = 421
mem[52379] = 86815089
mem[16627] = 3647190
mem[36794] = 132421727
mem[54580] = 248096
mask = 10X1101000X01001X00111110101110001X0
mem[48399] = 9196559
mem[6869] = 32793911
mem[20422] = 1560
mem[12101] = 15618
mem[25154] = 390003034
mem[23791] = 229770864
mem[49558] = 12206144
mask = 100X10010X101XX1XXX000001X00101X1100
mem[3205] = 110968351
mem[65515] = 7362194
mem[2197] = 52580964
mem[13004] = 3723834
mem[46931] = 24935229
mem[919] = 6284
mask = 10001X11100X1X1X10X111X100X0000010X1
mem[30162] = 1665
mem[35687] = 3554
mem[3735] = 8003
mem[18258] = 44276232
mem[48625] = 401841687
mem[62781] = 2814958
mem[5302] = 175144514
mask = 1001X0XX001X101110101000X11X00010X00
mem[38152] = 42369373
mem[36392] = 13302
mem[13867] = 940605082
mask = 10001100X11010X1101000X0X11100110011
mem[63412] = 5289
mem[788] = 6600
mem[27915] = 254034
mem[24347] = 16264001
mem[52437] = 651358
mask = 10011X0X0110X0X11X101100101100X11100
mem[56524] = 1244173
mem[64911] = 2124386
mem[3815] = 107466
mem[14375] = 6798
mem[16285] = 66968238
mem[7968] = 835823180
mask = 10X110100X101XX110X11110XX0111001010
mem[58730] = 132998954
mem[8056] = 754181
mem[39247] = 126
mask = 1001X000001XX10110101X1110110X10101X
mem[59028] = 10817
mem[17977] = 61299509
mask = 1X001100X1X0100110100000X111XXX001X0
mem[2056] = 32701076
mem[2071] = 2401082
mem[9887] = 998417
mask = 100110X11X101X1110X00100X0101111X0X1
mem[33860] = 388064
mem[59050] = 16623098
mem[5188] = 319
mem[37207] = 2470432
mem[27333] = 2026
mask = 1000X000001X1X0X00XXX00X100011X11010
mem[24029] = 9105
mem[14364] = 243545984
mem[4113] = 3279
mask = 1X0X1001X0101011110XX1000100X000X101
mem[17781] = 509963835
mem[37716] = 62611707
mem[23997] = 1023138975
mem[5927] = 32777
mem[55304] = 264062857
mask = 100110X001X01X01100011100X100110X11X
mem[58338] = 741
mem[34693] = 991498
mem[32339] = 30979944
mem[50216] = 66393532
mem[29090] = 11574321
mem[30824] = 15729
mem[16868] = 23942
mask = 1X0XX0010X0011110X101010111011111010
mem[48969] = 3327849
mem[52521] = 460105388
mem[33860] = 422661865
mem[44621] = 6715
mem[27762] = 11952
mem[34536] = 4064
mask = 1001X001001X0011001000100110010001XX
mem[195] = 487302
mem[17992] = 889
mem[11858] = 958195
mem[11013] = 202443463
mask = 1000101X100X1111011000X100110000X001
mem[13097] = 3534
mem[41292] = 85120
mem[9497] = 154119
mem[19610] = 5709354
mem[34972] = 48311
mem[50753] = 180578
mem[35921] = 667946365
mask = XX1010X00110X00111000XX00001000110X0
mem[3712] = 2843518
mem[34604] = 2965
mem[54311] = 162583
mask = 0001X0X00100100X001000001X1X10X01X10
mem[49406] = 965493
mem[59050] = 392048
mem[3574] = 922708604
mem[7419] = 33525859
mem[1933] = 8
mem[4367] = 11521
mask = 1001X0X00X10X00X101X00001110X0100X00
mem[29215] = 417522
mem[56468] = 34229032
mem[26868] = 552971
mem[36368] = 420213
mask = 100110X0X1101011101X01X01101101X001X
mem[4913] = 455
mem[3815] = 11211510
mem[21545] = 1469
mem[35762] = 1806
mem[58825] = 3743
mem[23225] = 474872535
mem[53173] = 46538
mask = 1XX0X00X0X101001001010100X0X01X00010
mem[64106] = 98247289
mem[13686] = 54961348
mem[38944] = 462290318
mem[53185] = 7075
mem[30162] = 39454
mem[14983] = 1010603
mem[38339] = 970
mask = X001100X010X111110001000001X01100110
mem[12827] = 22328
mem[18628] = 7082210
mem[31013] = 20804915
mem[13966] = 86
mem[518] = 1757
mask = X001100XX001001001110000000000XX1110
mem[14375] = 8414661
mem[1568] = 225486
mem[25775] = 336197
mask = 100110000X00100X100001100X111X100X01
mem[2071] = 51386682
mem[32897] = 162194
mem[11308] = 1799417
mem[20829] = 299249
mask = 1X0010XXX0001111XX1100X001X1X0000101
mem[29189] = 36530
mem[657] = 114543286
mem[9356] = 451
mask = X000100000101X0110X0011XX10000110001
mem[30577] = 117881
mem[60874] = 19567558
mem[10363] = 13493
mem[5690] = 382
mem[61059] = 4757304
mem[36165] = 95983791
mask = 100X00X00010100X1010000X101000X10000
mem[33324] = 39476477
mem[34713] = 7398
mem[46214] = 98709
mem[35856] = 1020446010
mask = 10X01X000010000X11100101011X001X0100
mem[65061] = 61054
mem[54052] = 92826
mem[35603] = 58759
mem[58037] = 40910
mem[62217] = 45701380
mask = 1X011000001011011010XX00X10X0X010001
mem[15920] = 5645
mem[28828] = 265910022
mem[29437] = 5544
mem[56112] = 637
mem[45033] = 36063036
mem[12783] = 13776458
mask = 10011011X010100110XX100100XX11011X00
mem[518] = 25998191
mem[13053] = 7866406
mem[38152] = 3208
mem[18730] = 711
mask = 10X11000001XX1X000100X11101XX1X10111
mem[47121] = 11272115
mem[43618] = 27683
mask = 100X1101X0101001100X010000X11001X100
mem[21702] = 34688805
mem[43624] = 3956780
mem[24476] = 17239393
mem[23321] = 25573609
mem[15163] = 1713
mem[65338] = 27386792
mask = 10011010010X10011X0011110XX100001111
mem[53501] = 16700270
mem[28069] = 20683243
mem[33593] = 114830
mem[9962] = 403282549
mem[54061] = 2336
mem[46656] = 7039
mem[58616] = 181
mask = 10001X11001011XX101X0100010010101100
mem[8738] = 234383093
mem[11512] = 1792627
mem[54326] = 1574223
mask = 10011X101X10100XX000X10010X01X01100X
mem[51382] = 17879
mem[44905] = 783
mem[57514] = 1018128542
mem[18628] = 240492
mem[2108] = 3429
mem[2304] = 3748
mask = 0X011001X0X000X000110100101000000000
mem[4452] = 19437119
mem[64742] = 179090
mem[16430] = 486207
mask = 1001X000111X1X1110110X011111100X0011
mem[52004] = 41486
mem[48779] = 83675
mem[17861] = 48577395
mem[39247] = 16952
mem[8738] = 3981
mem[32923] = 1168904
mask = 10011001XX0011X11X0010X1010X10101000
mem[33319] = 44401
mem[4142] = 517003945
mem[29189] = 415157
mem[33358] = 1395165
mask = 1001100X010010011XX00XXX1100101X0101
mem[13618] = 246280673
mem[58338] = 17884
mem[10885] = 816
mem[11277] = 24331199
mem[17936] = 1616051
mask = 1001100X01X01001X00011000110X0X001XX
mem[58338] = 302363844
mem[53596] = 175604903
mem[56468] = 419729
mem[27915] = 581
mem[41501] = 69718
mask = 100110000X1010110100X1X001X00X01001X
mem[18333] = 15544
mem[3929] = 2622169
mem[37718] = 176413
mem[27333] = 848
mem[17456] = 1097
mask = 100110101010X001X000X0001X00001011X0
mem[53045] = 2356198
mem[49908] = 1086
mem[17019] = 7107107
mem[12013] = 70971
mem[7048] = 1585
mem[3666] = 4937143
mask = 10011XXXX01010011000010X1X11100XXX00
mem[65524] = 4129175
mem[5636] = 315661
mem[39270] = 455882795
mask = X1001100110010011010000001110X0X00XX
mem[50481] = 26734
mem[57708] = 199726127
mem[20422] = 130991
mem[13651] = 1094687
mem[1292] = 60536
mask = 110X1011001XX111110100X0000010X1X101
mem[39644] = 14574
mem[8596] = 30400
mask = 1000101XX0X0X1110110111X110011X00110
mem[919] = 32148
mem[41] = 453324
mem[36794] = 179133
mem[2780] = 958033590
mask = 100010X1X11011110010X01101101110X100
mem[20035] = 1674335
mem[18909] = 33271
mem[21491] = 4013451
mem[21792] = 78760
mem[42156] = 980
mem[3276] = 3971405
mask = 10XX10000X10X00111X0XX00X0010011X100
mem[36368] = 5097527
mem[3099] = 104365
mem[57092] = 74461253
mem[46314] = 30483860
mask = X000101X101011X10110XXX001X00X11X010
mem[9948] = 43011947
mem[53185] = 41588
mem[25699] = 101124
mem[60046] = 123243
mem[23975] = 125991
mask = 1X00100000X01X00101011100X1010000101
mem[65101] = 504575
mem[55313] = 14953613
mem[42156] = 526
mem[55573] = 1303957
mem[53260] = 16252
mem[48073] = 8667
mask = 1001100100101X11110X0X0X0111X00001X0
mem[10402] = 793546
mem[45910] = 18
mem[23627] = 72728
mem[7408] = 16579752
mem[22105] = 10576
mem[61054] = 1160961
mem[2989] = 149675383
mask = 0001X001000000XX0111X110010001010110
mem[15867] = 14
mem[23379] = 10511918
mem[4217] = 4840435
mem[29978] = 11828937
mem[28303] = 2358671
mask = 10010010011X0XX11010X000110000110X00
mem[11923] = 149358903
mem[46246] = 3148
mem[17596] = 9370
mem[1540] = 12848
mem[25775] = 29444
mem[32564] = 64008
mem[16097] = 641
mask = 0X011001X010X010X0100X1X0X0X000111X1
mem[45770] = 1008133
mem[15551] = 3912928
mem[53058] = 188856
mem[44827] = 9036496
mem[59530] = 20033543
mask = 1001100X0XX01X0110X000XX010010XX1101
mem[2056] = 737
mem[34972] = 30655
mem[50728] = 927954
mask = 10001X0000X0X0010010101010X001100110
mem[39247] = 425181
mem[64200] = 13111811
mem[8169] = 1250162
mask = 100110000X10XXX11010X0001110X011XX00
mem[62259] = 4350710
mem[56112] = 42327
mem[53173] = 2221557
mem[36759] = 242686307
mem[29077] = 1179326
mem[2056] = 356
mask = 10000000001XX000101000X0X11000X10110
mem[18542] = 454113
mem[44192] = 501708
mem[54994] = 149470837
mem[54260] = 582959
mem[65424] = 295679271
mem[36368] = 2002
mem[16392] = 99
mask = 10100001XX101001X0101100101101000XX0
mem[17861] = 3340321
mem[24705] = 4143350
mem[38940] = 201585
mem[35632] = 19204465
mem[9443] = 5273035
mask = 10X110010010100101000X00001010X0111X
mem[2991] = 51624
mem[56468] = 1603
mem[35633] = 4068
mask = 10011X01001010X10000X011000111101X11
mem[58842] = 69158
mem[43765] = 1624
mem[24913] = 133864698
mem[15015] = 247
mem[10155] = 1064
mem[33787] = 142284522
mem[17457] = 15488682

4
2020/day14/test Normal file
View file

@ -0,0 +1,4 @@
mask = XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X
mem[8] = 11
mem[7] = 101
mem[8] = 0

4
2020/day14/test2 Normal file
View file

@ -0,0 +1,4 @@
mask = 000000000000000000000000000000X1001X
mem[42] = 100
mask = 00000000000000000000000000000000X0XX
mem[26] = 1

1143
2020/day14/uthash.h Normal file

File diff suppressed because it is too large Load diff

34
2020/day15/day15.c Normal file
View file

@ -0,0 +1,34 @@
#include <stdio.h>
#include <stdlib.h>
#define SIZE 30000000
size_t a[SIZE];
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s <input list>\n", argv[0]);
return 0;
}
for (size_t i = 1; i < argc - 1; ++i) {
a[atoi(argv[i])] = i;
}
size_t n = atoi(argv[argc - 1]);
for (size_t i = argc - 1; i < SIZE; ++i) {
if (i == 2020) { // Part 1
printf("%zu\n", n);
}
size_t prev_n = n;
if (a[n] == 0) {
n = 0;
} else {
n = i - a[n];
}
a[prev_n] = i;
}
printf("%zu\n", n); // Part 2
return 0;
}

39
2020/day15/day15.rkt Normal file
View file

@ -0,0 +1,39 @@
#lang racket
(module+ test
(require rackunit))
(define (run-game input idx)
(define h (make-hash))
(for ([n (in-list (drop-right input 1))]
[i (in-naturals)])
(hash-set! h n (add1 i)))
(for/fold ([n (last input)])
([i (in-range (length input) idx)])
(define res (- i (hash-ref h n i)))
(hash-set! h n i)
res))
(module+ test
(check-equal? (run-game '(0 3 6) 2020) 436)
(check-equal? (run-game '(1 3 2) 2020) 1)
(check-equal? (run-game '(2 1 3) 2020) 10)
(check-equal? (run-game '(1 2 3) 2020) 27)
(check-equal? (run-game '(2 3 1) 2020) 78)
(check-equal? (run-game '(3 2 1) 2020) 438)
(check-equal? (run-game '(3 1 2) 2020) 1836))
(module+ main
(displayln (run-game '(14 1 17 0 3 20) 2020)))
(module+ test
(check-equal? (run-game '(0 3 6) 30000000) 175594)
(check-equal? (run-game '(1 3 2) 30000000) 2578)
(check-equal? (run-game '(2 1 3) 30000000) 3544142)
(check-equal? (run-game '(1 2 3) 30000000) 261214)
(check-equal? (run-game '(2 3 1) 30000000) 6895259)
(check-equal? (run-game '(3 2 1) 30000000) 18)
(check-equal? (run-game '(3 1 2) 30000000) 362))
(module+ main
(displayln (run-game '(14 1 17 0 3 20) 30000000)))

88
2020/day16/day16.rkt Normal file
View file

@ -0,0 +1,88 @@
#lang racket
(module+ test
(require rackunit))
(define (parse-ticket str)
(map string->number (string-split str ",")))
(define (parse-rules lst)
(for/hash ([str (in-list lst)])
(define name (car (string-split str ": ")))
(define ranges (map string->number (regexp-match* #px"\\d+" str)))
(values name
(λ (n) (or (<= (first ranges) n (second ranges))
(<= (third ranges) n (fourth ranges)))))))
(define (read-input filename)
(define in-str (file->string filename))
(define rules (parse-rules (regexp-match* #px"[\\w ]+: \\d+-\\d+ or \\d+-\\d+" in-str)))
(define my-ticket
(parse-ticket (cadr (regexp-match #px"your ticket:\n([\\d,]+)" in-str))))
(define nearby-tickets
(map parse-ticket
(string-split
(cadr (regexp-match #px"nearby tickets:\n([\\d,\n]+)" in-str)))))
(values rules my-ticket nearby-tickets))
(define (part1 filename)
(define-values (rules my-ticket nearby-tickets) (read-input filename))
(define invalid-values
(for*/list ([ticket (in-list nearby-tickets)]
[val (in-list ticket)]
#:when (for/and ([(name rule-proc) (in-hash rules)])
(not (rule-proc val))))
val))
(apply + invalid-values))
(module+ test
(check-equal? (part1 "test1") 71))
(module+ main
(displayln (part1 "input")))
(define ((valid? rules) ticket)
(for/and ([val (in-list ticket)])
(for/or ([(name rule-proc) (in-hash rules)])
(rule-proc val))))
(define (field-positions h)
(if (for/and ([(k v) (in-hash h)]) (= 1 (length v)))
(for/hash ([(k v) (in-hash h)]) (values k (car v)))
(begin
(for ([(name lst) (in-hash h)]
#:when (= 1 (length lst)))
(for ([(other-name other-lst) (in-hash h)]
#:unless (equal? other-name name))
(hash-set! h other-name (remove (car lst) other-lst))))
(field-positions h))))
(define (determine-ticket filename)
(define-values (rules my-ticket nearby-tickets) (read-input filename))
(define valid-tickets (filter (valid? rules) nearby-tickets))
(define h (make-hash))
(for ([(name rule-proc) (in-hash rules)])
(hash-set! h name (range (length my-ticket))))
(for ([(name rule-proc) (in-hash rules)]
#:when #t
[ticket (in-list valid-tickets)]
#:when #t
[val (in-list ticket)]
[i (in-naturals)]
#:when (not (rule-proc val)))
(hash-update! h name (λ (lst) (remove i lst =))))
(define positions (field-positions h))
(for/hash ([(name pos) (in-hash positions)])
(values name (list-ref my-ticket pos))))
(module+ test
(check-equal? (determine-ticket "test2") (hash "class" 12 "row" 11 "seat" 13)))
(define (part2 filename)
(define ticket (determine-ticket filename))
(apply * (for/list ([(name val) (in-hash ticket)]
#:when (string-prefix? name "departure"))
val)))
(module+ main
(displayln (part2 "input")))

260
2020/day16/input Normal file
View file

@ -0,0 +1,260 @@
departure location: 29-458 or 484-956
departure station: 40-723 or 738-960
departure platform: 30-759 or 784-956
departure track: 37-608 or 623-964
departure date: 31-664 or 685-950
departure time: 27-498 or 508-959
arrival location: 36-245 or 269-961
arrival station: 35-808 or 814-973
arrival platform: 40-831 or 856-951
arrival track: 36-857 or 875-971
class: 43-161 or 167-963
duration: 25-75 or 91-966
price: 37-708 or 724-972
route: 39-370 or 396-971
row: 47-280 or 299-949
seat: 41-105 or 125-952
train: 43-351 or 359-966
type: 34-575 or 586-965
wagon: 27-397 or 420-953
zone: 48-206 or 226-965
your ticket:
61,151,59,101,173,71,103,167,127,157,137,73,181,97,179,149,131,139,67,53
nearby tickets:
136,368,517,218,187,318,185,172,146,646,804,747,816,625,695,701,420,588,167,302
144,452,191,495,196,652,878,605,607,61,932,897,539,82,456,806,587,595,153,168
517,981,569,738,886,608,935,882,943,627,884,644,228,698,640,53,748,570,880,322
65,428,312,692,61,465,626,312,644,645,539,189,485,182,310,555,442,493,550,275
701,547,434,796,278,451,179,397,233,645,741,512,442,800,693,213,188,429,654,707
898,573,456,132,190,898,705,447,875,160,688,592,627,520,434,81,517,634,240,185
155,433,198,917,513,425,143,149,421,131,815,13,69,887,928,451,497,923,623,347
908,896,430,539,532,406,439,75,857,134,589,631,552,541,633,933,522,557,807,917
367,397,712,343,276,195,334,131,137,881,884,912,197,548,817,744,54,226,457,899
340,453,916,915,430,487,816,543,485,712,703,899,638,756,431,649,364,925,238,815
525,70,427,894,279,430,792,365,278,946,624,568,371,61,453,595,324,947,598,104
986,444,243,741,822,745,484,878,457,486,937,368,746,652,126,589,907,317,828,741
171,830,687,65,815,368,508,799,71,230,560,595,364,303,312,757,112,274,597,881
917,135,661,130,898,699,618,58,206,73,149,488,458,818,69,803,572,328,888,75
270,133,228,458,519,56,425,450,277,750,365,538,591,522,925,201,533,982,857,190
810,599,315,529,515,898,857,605,92,438,629,533,899,491,360,603,537,458,542,597
307,128,930,489,156,323,924,900,309,216,101,127,312,647,605,491,237,523,746,875
632,660,660,701,700,106,169,144,341,625,432,196,799,880,808,944,443,200,341,750
349,881,943,793,541,772,643,171,540,572,647,55,882,569,934,365,944,199,278,568
703,755,639,929,140,196,897,235,342,79,360,370,302,314,818,786,565,535,186,444
936,458,393,624,509,563,540,830,788,902,200,628,896,917,795,95,496,332,941,308
154,234,305,793,927,947,632,661,367,271,273,205,527,638,151,547,285,806,186,328
641,530,616,660,626,274,368,171,280,149,269,456,658,336,306,194,659,102,318,149
322,72,125,138,550,365,688,280,442,303,491,509,136,696,996,235,202,704,334,913
640,571,170,700,803,650,592,545,421,703,600,638,590,242,316,203,3,531,906,233
424,899,571,333,226,66,159,698,326,330,62,662,140,191,933,742,755,478,349,99
645,790,316,205,637,935,187,700,565,485,746,947,130,188,436,726,311,827,309,58
153,200,307,361,169,634,608,312,228,163,313,654,520,511,527,705,300,173,306,433
125,56,770,177,237,447,425,55,557,192,275,652,160,568,495,508,525,100,487,588
877,457,275,799,205,889,890,304,568,893,237,825,597,202,911,175,917,164,337,822
312,306,427,893,562,326,904,931,703,693,946,71,181,631,328,566,552,190,750,709
91,137,910,193,277,702,142,457,562,335,228,568,672,195,349,139,759,754,946,57
548,892,303,808,883,514,69,705,942,615,128,822,514,366,54,934,554,420,433,926
306,518,931,549,652,792,282,808,157,752,60,857,341,104,632,202,806,98,336,940
144,991,568,185,756,367,893,695,784,631,901,797,607,69,545,696,369,944,948,641
60,542,350,690,178,793,273,322,688,321,719,433,592,67,518,808,449,758,180,447
901,740,339,828,898,913,895,284,93,794,789,894,529,238,75,439,519,797,54,890
301,314,556,624,202,207,161,277,140,138,330,740,908,553,190,432,99,532,789,54
534,67,160,994,129,272,550,599,657,630,786,556,626,319,245,692,64,948,397,532
518,545,351,652,920,142,105,706,185,167,268,549,540,184,140,347,597,830,653,753
275,75,743,916,512,918,162,805,150,798,797,178,67,935,603,300,94,494,491,452
555,322,542,648,363,787,747,747,909,245,305,203,455,758,920,110,349,150,451,315
640,309,891,542,541,519,69,720,699,435,799,131,699,686,948,541,520,703,529,696
918,924,201,345,458,359,821,535,528,431,164,93,563,497,657,187,606,102,325,897
154,877,828,160,346,675,144,300,304,174,605,708,437,831,934,234,234,911,550,793
428,128,570,341,530,891,303,184,366,752,485,573,156,277,335,104,217,202,174,149
500,558,336,927,881,135,640,440,931,242,648,304,338,235,895,232,126,61,308,551
201,899,52,447,175,624,677,518,519,915,343,788,429,664,647,233,420,276,655,490
396,884,892,744,877,186,988,203,639,103,143,181,900,510,346,556,631,788,742,177
630,534,685,517,134,590,908,627,370,525,541,907,320,807,302,186,706,340,815,247
791,490,78,232,73,273,890,589,543,271,655,169,180,530,441,137,629,918,278,920
814,0,436,661,362,458,497,787,72,318,900,341,190,130,897,896,487,602,95,904
918,179,141,508,886,99,307,894,686,634,641,318,546,232,563,165,543,885,705,929
652,807,144,143,642,265,420,887,55,51,157,513,748,169,420,427,651,692,880,937
318,565,305,929,754,587,318,308,306,825,568,457,72,218,146,805,160,342,269,70
555,688,323,557,816,651,229,491,237,795,694,517,931,827,629,586,150,229,108,663
907,230,149,455,109,536,910,601,801,548,346,942,159,125,158,59,74,174,446,496
396,756,177,597,157,940,802,337,122,623,795,938,883,746,397,227,741,70,900,55
536,159,803,195,336,426,228,888,434,911,887,753,888,735,309,185,876,920,799,623
280,920,396,155,202,367,656,454,454,875,324,24,240,562,885,821,493,519,702,142
491,199,150,134,433,186,949,200,101,97,546,152,706,788,337,56,760,366,145,857
644,528,644,422,752,165,351,593,549,347,941,243,244,512,757,537,99,626,905,804
631,901,747,424,904,510,206,99,594,820,180,910,357,171,231,488,59,328,805,656
229,923,194,517,656,364,74,485,99,804,943,190,946,343,573,751,392,819,420,236
616,823,922,633,149,746,565,558,322,593,319,897,695,496,914,568,552,511,94,587
119,568,129,320,302,305,804,554,232,647,303,194,923,891,915,744,485,551,540,68
74,336,432,197,715,923,914,527,278,660,910,53,692,452,422,513,568,531,650,944
787,604,243,646,429,56,73,546,553,883,170,883,432,200,634,701,920,22,54,896
318,271,875,590,360,445,177,63,999,154,746,637,535,329,92,892,949,204,442,435
51,558,155,421,441,325,920,568,820,300,804,537,544,423,74,231,91,616,245,312
659,652,941,431,349,351,50,662,520,646,305,642,96,490,350,697,671,637,495,797
776,131,949,887,272,457,910,642,940,425,702,176,746,510,271,245,885,928,886,562
313,420,594,938,946,571,193,999,938,534,161,100,607,136,101,894,934,595,561,590
269,745,143,347,305,593,722,69,487,662,60,137,569,240,653,71,590,891,648,632
542,623,629,806,515,178,898,230,496,143,748,509,485,604,518,445,918,981,818,626
706,303,536,635,196,190,642,884,300,55,179,920,813,634,520,328,796,189,560,101
239,542,116,685,104,801,759,52,567,436,322,745,628,487,687,520,203,856,191,641
332,748,664,896,929,593,740,881,318,654,427,148,7,235,939,205,422,348,128,800
919,553,103,430,426,727,437,663,368,368,795,103,912,751,933,922,361,492,231,516
231,586,567,204,101,574,762,167,567,567,161,568,317,934,603,510,68,655,892,907
491,273,431,135,161,192,930,484,167,361,396,197,247,830,938,454,939,363,605,931
339,888,500,830,328,630,629,750,273,300,279,603,562,103,57,277,127,342,309,306
733,68,884,341,650,602,804,656,307,891,551,789,201,485,185,488,69,188,183,600
525,601,168,649,235,519,922,453,130,193,87,105,529,943,799,880,898,788,320,56
822,164,814,195,519,700,546,896,595,94,916,492,457,745,491,919,597,278,67,894
703,310,529,551,898,564,857,924,915,538,530,61,529,788,920,819,730,314,493,699
497,337,168,443,698,502,911,496,700,800,814,905,422,62,493,202,881,820,430,891
185,794,689,155,191,797,131,103,163,91,897,602,902,154,520,927,686,447,364,277
927,607,746,440,322,752,202,596,427,101,194,22,346,630,127,128,752,947,561,508
159,513,441,763,644,856,146,698,527,595,239,439,178,918,142,600,149,494,820,552
343,557,340,70,452,655,381,883,785,137,130,908,496,653,877,894,940,791,151,433
169,586,177,757,332,717,367,540,826,536,815,750,542,800,520,792,831,364,324,902
935,516,687,946,99,337,447,625,936,422,351,518,79,661,149,826,184,457,73,434
744,289,881,568,484,703,640,334,520,917,828,133,199,328,304,137,345,370,560,439
804,487,367,273,67,239,739,587,892,697,158,508,929,143,523,909,418,637,184,135
297,627,931,235,828,324,941,586,703,520,934,634,423,439,941,158,67,180,883,902
432,155,443,557,254,311,340,450,807,239,277,243,628,817,789,689,591,554,696,517
307,73,278,429,881,197,328,792,900,918,882,332,105,740,58,758,933,195,92,81
697,759,167,816,537,430,875,444,790,943,498,649,144,525,655,359,463,909,324,573
370,883,875,67,428,97,206,143,518,124,920,513,439,201,918,179,791,176,650,641
792,63,139,564,738,520,175,520,365,591,694,932,631,249,887,438,103,946,174,98
945,909,559,597,605,270,928,692,881,149,366,571,703,754,784,744,572,898,495,162
754,316,191,157,704,153,111,551,883,535,362,800,925,130,929,949,425,686,91,923
551,440,753,714,104,749,691,445,143,340,427,555,277,167,758,606,300,305,314,302
433,604,649,372,751,889,568,305,654,160,194,536,921,930,573,337,230,552,303,817
568,926,140,332,144,183,724,924,313,935,132,935,795,535,798,823,146,201,591,233
351,605,724,662,56,704,443,562,896,787,347,234,793,816,494,561,659,898,552,454
857,893,188,127,184,93,562,795,125,490,54,243,361,943,276,348,988,818,103,540
308,787,793,232,426,273,704,397,740,907,830,311,126,100,985,542,628,636,157,485
650,551,594,909,534,514,277,554,745,432,569,494,582,230,590,922,750,562,126,311
814,904,444,204,821,160,492,205,324,489,792,912,699,454,828,341,983,275,830,187
637,924,804,175,948,515,211,604,624,827,746,820,798,742,485,451,785,488,184,100
153,208,199,827,200,56,530,185,655,821,177,700,148,170,535,337,707,900,343,521
192,878,310,319,922,133,898,368,794,804,898,96,311,622,787,894,564,690,589,942
242,899,820,143,58,623,811,52,661,342,702,562,878,146,538,510,307,206,795,900
928,893,947,827,895,161,275,266,99,338,882,930,227,445,129,50,192,626,337,906
756,554,564,101,96,287,198,800,192,92,798,639,687,878,932,321,785,694,153,631
789,743,557,565,915,188,481,740,538,422,159,625,70,270,660,143,139,695,523,701
437,657,397,336,698,592,329,175,452,913,492,816,492,478,313,923,915,181,819,645
926,248,489,490,180,526,273,91,819,515,742,875,65,875,62,307,439,930,701,442
787,892,816,592,332,299,331,786,151,547,161,755,798,95,572,235,499,567,644,311
754,125,490,559,71,553,514,279,397,437,929,5,204,327,228,132,234,340,560,633
913,87,426,522,242,240,184,193,708,750,510,558,697,103,151,651,625,332,948,571
300,427,555,241,423,949,59,230,339,590,685,806,647,914,100,630,544,213,71,100
755,343,926,350,822,445,943,693,932,200,905,97,129,664,159,916,251,450,557,589
698,54,529,201,71,55,693,187,488,24,607,915,456,448,179,489,454,160,876,545
437,756,54,565,445,901,194,206,945,821,349,59,696,496,902,532,166,160,633,150
101,177,158,698,165,928,572,364,60,545,547,554,706,350,319,200,95,97,327,697
51,68,223,67,883,827,533,432,949,643,497,906,519,66,312,593,188,97,635,66
306,98,918,128,664,184,428,140,181,492,758,325,291,922,590,441,231,878,562,789
468,541,235,433,334,946,192,97,449,940,168,61,495,155,560,639,657,825,587,948
451,541,754,99,586,534,692,19,132,758,441,366,929,531,420,690,633,876,178,532
553,331,320,193,887,433,104,817,241,374,91,700,708,498,269,708,151,269,635,739
630,824,178,166,829,645,68,339,397,747,103,132,857,243,596,204,690,97,898,335
550,741,634,426,58,381,934,363,456,895,345,487,898,703,99,906,528,498,635,360
907,934,498,698,793,810,691,275,423,238,313,438,575,425,141,563,322,884,135,201
14,330,588,105,146,173,309,897,59,176,334,891,785,656,492,315,571,426,104,795
153,876,887,321,657,931,855,510,362,333,556,92,64,591,180,641,54,179,931,910
361,328,275,565,359,532,894,133,61,567,701,632,470,67,509,806,626,747,911,271
2,198,322,698,608,447,817,454,532,68,888,540,690,447,434,921,949,705,946,97
182,361,485,348,368,922,52,799,433,187,298,369,238,168,693,797,156,631,200,936
754,553,559,545,685,191,490,634,589,539,392,879,128,105,701,509,549,815,511,687
882,564,261,156,564,655,455,908,739,359,137,516,485,426,904,933,597,307,349,660
419,896,64,802,443,543,804,300,746,914,793,593,426,314,489,803,929,743,275,59
171,636,681,93,927,315,520,587,168,694,50,130,333,441,795,628,702,202,68,920
139,738,164,895,128,344,806,653,438,887,136,939,351,458,361,239,746,102,510,594
921,911,367,799,548,897,51,122,366,934,929,229,625,157,685,945,130,513,916,367
947,195,626,827,707,535,439,700,707,326,657,455,109,179,147,450,599,96,690,159
438,95,521,520,937,226,794,364,522,127,883,645,424,423,524,704,312,917,1,344
947,635,455,738,814,740,422,450,793,138,519,988,232,947,792,64,426,65,663,428
840,367,447,188,909,333,130,245,927,241,73,315,574,173,229,325,273,508,878,689
882,143,361,90,309,447,909,929,330,234,509,363,743,50,931,756,336,603,516,332
129,829,154,143,646,350,105,155,524,443,171,65,338,345,336,742,302,644,982,688
575,739,805,347,944,747,308,509,686,569,928,203,757,92,436,912,822,281,205,808
744,710,565,141,237,67,694,569,147,434,664,949,700,528,820,623,337,597,68,340
719,185,486,550,369,316,831,175,420,632,490,629,899,364,912,485,923,657,61,646
885,276,511,745,789,313,400,545,573,708,687,650,72,692,876,625,202,823,750,608
74,930,695,875,635,608,335,658,642,689,227,657,743,16,896,142,944,795,167,525
423,831,603,795,452,351,794,238,857,97,606,360,735,426,426,895,931,336,514,315
902,227,487,754,520,177,98,191,316,332,745,738,502,645,828,240,148,826,703,541
136,173,317,265,640,348,653,894,75,686,563,125,949,443,641,183,634,104,650,334
191,628,943,661,808,657,645,160,316,148,316,637,166,606,652,344,277,943,565,448
370,949,693,569,147,938,204,926,796,700,880,437,328,891,172,308,5,100,635,145
498,304,533,453,446,52,184,310,634,527,933,59,405,913,650,624,545,521,59,446
451,14,454,313,143,799,643,784,485,690,651,58,565,938,330,742,300,756,193,556
799,103,882,650,785,603,820,317,636,453,111,593,626,902,630,795,638,928,534,527
303,134,527,820,145,127,548,825,200,232,801,573,594,598,920,456,925,723,593,341
829,540,461,605,702,534,785,237,587,155,635,143,176,489,930,205,126,705,228,320
915,144,484,559,142,804,158,76,237,335,921,660,531,370,194,457,891,660,627,508
426,239,910,745,557,805,435,154,431,795,528,856,989,539,206,346,659,231,182,326
54,893,815,195,567,142,940,452,628,638,533,319,936,760,547,425,569,695,749,818
663,157,244,699,323,129,489,510,93,100,143,821,72,543,549,172,335,648,165,228
597,426,936,829,799,315,787,148,98,259,913,497,200,326,344,641,276,278,201,822
250,941,689,157,312,639,631,588,572,902,632,334,311,226,921,522,647,240,566,820
746,928,535,791,342,51,931,167,637,935,155,655,848,831,926,342,881,882,126,136
437,792,745,628,556,69,91,893,161,436,64,877,186,436,533,679,423,184,552,170
147,192,755,556,570,199,181,642,103,128,125,549,593,741,934,202,984,435,101,308
275,948,568,340,538,947,338,156,541,487,334,336,219,561,738,365,530,188,624,422
531,397,664,617,908,57,93,171,149,364,598,148,875,818,199,823,455,128,328,820
193,489,794,169,159,365,76,803,75,484,915,634,276,330,229,421,156,98,587,456
324,159,6,66,237,458,489,167,887,155,530,934,321,53,226,97,748,605,359,179
744,596,339,431,759,453,889,456,441,130,12,485,927,877,498,561,746,545,457,300
944,194,517,587,426,489,129,96,136,885,801,788,554,157,457,538,615,154,527,428
628,485,820,803,883,203,888,599,204,794,784,564,245,692,606,288,327,906,434,146
510,314,660,644,698,568,262,351,359,513,946,361,657,607,56,310,351,884,624,498
798,928,439,531,555,159,4,331,742,75,931,790,532,822,425,792,144,196,305,902
786,751,749,893,808,91,190,445,944,877,921,887,686,165,97,820,135,234,337,662
829,925,635,819,559,748,205,594,803,71,791,319,449,937,203,132,71,386,62,520
892,226,631,900,803,172,203,305,495,397,143,175,328,194,72,171,588,130,722,320
301,518,630,913,143,548,226,132,184,448,304,229,662,231,608,763,245,906,828,437
453,273,189,550,269,600,441,703,125,299,631,759,436,321,882,125,644,263,815,426
787,879,590,455,154,203,74,95,334,359,559,314,552,319,513,454,24,299,364,656
429,437,322,739,827,230,168,197,708,701,186,441,749,312,635,856,445,777,902,635
946,4,831,146,508,326,450,206,492,662,69,98,897,650,658,547,333,889,197,129
300,917,642,791,661,825,306,450,278,237,940,943,188,158,138,713,630,946,550,817
511,340,588,630,545,554,359,443,269,824,325,639,752,829,128,423,493,936,787,123
928,92,807,754,161,280,317,337,877,493,299,546,940,802,820,877,716,143,707,902
207,424,789,178,179,552,707,785,275,233,455,598,887,68,921,641,522,754,432,738
514,116,60,191,534,633,598,427,327,369,341,54,130,599,347,572,707,337,102,232
807,530,347,364,543,330,695,93,901,190,333,603,615,57,648,697,449,320,592,822
878,696,303,298,892,366,697,234,754,186,443,572,488,188,172,700,443,935,927,183
495,147,901,788,647,197,171,925,745,919,701,941,73,568,542,390,429,912,529,131
800,696,330,793,655,914,59,180,447,816,50,321,806,917,58,51,78,900,430,881
166,808,924,185,139,428,64,888,659,151,519,336,277,194,91,484,875,488,526,363
875,172,904,364,919,794,926,236,915,816,816,135,909,118,595,750,530,925,656,193
807,379,919,57,440,741,931,426,307,757,487,940,487,362,485,195,226,623,323,493
206,789,424,130,573,831,355,945,60,658,790,368,931,944,548,534,757,942,341,486
948,280,664,190,126,560,436,885,571,893,550,785,68,281,159,889,881,312,942,705
557,542,818,697,913,351,635,130,801,930,66,946,351,230,170,260,508,93,438,903
890,570,314,658,785,245,882,510,325,636,929,322,337,710,923,451,303,550,187,458
891,790,943,449,689,549,519,588,2,443,304,160,556,240,553,75,320,275,436,572
56,946,556,623,142,930,875,318,686,285,454,562,637,935,152,902,496,704,97,917
637,102,294,643,179,522,493,442,546,453,884,185,351,652,178,206,129,341,931,168
522,626,821,308,198,547,637,792,984,827,693,456,596,330,73,204,646,234,698,149
198,327,324,564,815,904,947,702,798,70,203,758,233,129,647,96,880,269,2,904
682,420,455,944,928,168,368,943,947,273,940,556,552,424,924,135,346,324,56,561
508,101,190,526,934,622,945,925,341,159,586,549,180,703,437,820,65,368,635,396
748,787,876,487,158,589,169,653,905,334,631,637,329,270,338,615,625,324,238,228
183,803,751,563,206,204,320,876,13,949,594,647,568,317,750,628,877,155,546,880
90,818,606,509,636,172,59,599,818,498,435,229,234,801,904,168,802,315,567,458
522,327,105,857,186,641,131,234,821,154,817,887,718,608,232,140,566,598,804,485
645,744,827,913,103,602,229,525,569,187,544,163,370,793,450,925,245,510,68,738
932,365,93,115,147,237,654,137,50,913,485,92,458,787,342,174,898,58,817,910
315,488,205,645,638,699,235,364,663,74,687,597,771,749,896,631,139,532,897,550
145,130,336,914,322,76,492,338,359,798,536,64,361,509,917,370,95,586,934,935
525,544,796,226,96,572,367,916,652,71,634,745,161,998,591,942,547,344,227,626
794,806,486,897,231,361,808,739,183,370,227,192,69,136,560,439,887,109,269,331
496,928,270,550,800,179,788,646,197,789,906,511,640,550,904,227,592,81,895,92
396,334,738,230,104,929,502,137,302,440,927,175,449,169,304,451,421,559,901,513
899,187,303,161,608,545,638,160,496,537,338,426,516,374,66,303,650,430,453,758
95,991,554,932,943,95,740,276,323,190,856,697,888,270,498,595,600,786,149,454
384,155,54,630,181,230,645,58,540,745,548,520,430,935,155,755,171,571,592,892
892,695,529,937,330,605,60,901,520,539,553,330,205,588,538,472,689,753,934,423
53,195,67,817,21,625,543,912,368,945,509,183,425,486,367,922,156,829,755,793
271,337,271,229,827,947,313,163,548,278,823,186,687,747,59,328,149,897,926,892

12
2020/day16/test1 Normal file
View file

@ -0,0 +1,12 @@
class: 1-3 or 5-7
row: 6-11 or 33-44
seat: 13-40 or 45-50
your ticket:
7,1,14
nearby tickets:
7,3,47
40,4,50
55,2,20
38,6,12

11
2020/day16/test2 Normal file
View file

@ -0,0 +1,11 @@
class: 0-1 or 4-19
row: 0-5 or 8-19
seat: 0-13 or 16-19
your ticket:
11,12,13
nearby tickets:
3,9,18
15,1,5
5,14,9

144
2020/day17/day17.c Normal file
View file

@ -0,0 +1,144 @@
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define INPUT_SIZE 8
#define SIZE 30 // = (size of the input + 6 for growth + 1 padding) * 2
bool alive3(bool state[SIZE][SIZE][SIZE], int x, int y, int z) {
int neighbours_count = 0;
for (int i = -1; i <= 1; ++i) {
for (int j = -1; j <= 1; ++j) {
for (int k = -1; k <= 1; ++k) {
neighbours_count += state[x + i][y + j][z + k];
}
}
}
neighbours_count -= state[x][y][z];
if (state[x][y][z]) {
return (2 <= neighbours_count) && (neighbours_count <= 3);
}
return 3 == neighbours_count;
}
bool alive4(bool state[SIZE][SIZE][SIZE][SIZE], int x, int y, int z, int w) {
int neighbours_count = 0;
for (int i = -1; i <= 1; ++i) {
for (int j = -1; j <= 1; ++j) {
for (int k = -1; k <= 1; ++k) {
for (int l = -1; l <= 1; ++l) {
neighbours_count += state[x + i][y + j][z + k][w + l];
}
}
}
}
neighbours_count -= state[x][y][z][w];
if (state[x][y][z][w]) {
return (2 <= neighbours_count) && (neighbours_count <= 3);
}
return 3 == neighbours_count;
}
int part1(bool input[INPUT_SIZE][INPUT_SIZE]) {
bool state[SIZE][SIZE][SIZE] = {false};
bool new_state[SIZE][SIZE][SIZE] = {false};
for (int i = 0; i < INPUT_SIZE; ++i) {
for (int j = 0; j < INPUT_SIZE; ++j) {
state[SIZE / 2 + i][SIZE / 2 + j][SIZE / 2] = input[i][j];
}
}
for (int step = 0; step < 6; ++step) {
for (int x = 1; x < SIZE - 1; ++x) {
for (int y = 1; y < SIZE - 1; ++y) {
for (int z = 1; z < SIZE - 1; ++z) {
new_state[x][y][z] = alive3(state, x, y, z);
}
}
}
memcpy(state, new_state, sizeof(state));
}
int active_count = 0;
for (int x = 1; x < SIZE - 1; ++x) {
for (int y = 1; y < SIZE - 1; ++y) {
for (int z = 1; z < SIZE - 1; ++z) {
active_count += state[x][y][z];
}
}
}
return active_count;
}
int part2(bool input[INPUT_SIZE][INPUT_SIZE]) {
bool state[SIZE][SIZE][SIZE][SIZE] = {false};
bool new_state[SIZE][SIZE][SIZE][SIZE] = {false};
for (int i = 0; i < INPUT_SIZE; ++i) {
for (int j = 0; j < INPUT_SIZE; ++j) {
state[SIZE / 2 + i][SIZE / 2 + j][SIZE / 2][SIZE / 2] = input[i][j];
}
}
for (int step = 0; step < 6; ++step) {
for (int x = 1; x < SIZE - 1; ++x) {
for (int y = 1; y < SIZE - 1; ++y) {
for (int z = 1; z < SIZE - 1; ++z) {
for (int w = 1; w < SIZE - 1; ++w) {
new_state[x][y][z][w] = alive4(state, x, y, z, w);
}
}
}
}
memcpy(state, new_state, sizeof(state));
}
int active_count = 0;
for (int x = 1; x < SIZE - 1; ++x) {
for (int y = 1; y < SIZE - 1; ++y) {
for (int z = 1; z < SIZE - 1; ++z) {
for (int w = 1; w < SIZE - 1; ++w) {
active_count += state[x][y][z][w];
}
}
}
}
return active_count;
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s <input file>\n", argv[0]);
return 0;
}
FILE *fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("Could not open file %s\n", argv[1]);
return 1;
}
bool input[INPUT_SIZE][INPUT_SIZE] = {false};
int i = 0;
int j = 0;
char c;
while ((c = fgetc(fp)) != EOF) {
if (c == '\n') {
i++;
j = 0;
} else {
input[i][j] = (c == '#');
j++;
}
}
fclose(fp);
printf("%d\n", part1(input));
printf("%d\n", part2(input));
return 0;
}

58
2020/day17/day17.rkt Normal file
View file

@ -0,0 +1,58 @@
#lang racket/base
(require racket/list
racket/set)
(module+ test
(require rackunit))
(define (read-input filename dimension)
(with-input-from-file filename
(lambda ()
(for/set ([line (in-lines)]
[i (in-naturals)]
#:when #t
[c (in-list (string->list line))]
[j (in-naturals)]
#:when (eq? c #\#))
(append (list i j) (make-list (- dimension 2) 0))))))
(define (neighbours pos)
(define dim (length pos))
(define relative (remove (make-list dim 0) (apply cartesian-product (make-list dim '(-1 0 1)))))
(map (λ (rel) (map + pos rel)) relative))
(define (lives? state pos)
(define neighbours-count (length (filter (λ (n) (set-member? state n))
(neighbours pos))))
(define current (set-member? state pos))
(or (and current (<= 2 neighbours-count 3))
(and (not current) (= 3 neighbours-count))))
(define (step state)
(define dim (length (set-first state)))
(define indexes (flatten (set->list state)))
(define min-index (sub1 (apply min indexes)))
(define max-index (+ 2 (apply max indexes)))
(for/set ([pos (apply cartesian-product (make-list dim (range min-index max-index)))]
#:when (lives? state pos))
pos))
(define (power n f)
(apply compose (make-list n f)))
(define (part1 filename)
(define input (read-input filename 3))
(set-count ((power 6 step) input)))
(define (part2 filename)
(define input (read-input filename 4))
(set-count ((power 6 step) input)))
(module+ test
(check-equal? (part1 "test") 112)
(check-equal? (part2 "test") 848))
(module+ main
(displayln (part1 "input"))
(displayln (part2 "input")))

8
2020/day17/input Normal file
View file

@ -0,0 +1,8 @@
..##.#.#
.#####..
#.....##
##.##.#.
..#...#.
.#..##..
.#...#.#
#..##.##

3
2020/day17/test Normal file
View file

@ -0,0 +1,3 @@
.#.
..#
###

4
2020/day18/day18.dyalog Normal file
View file

@ -0,0 +1,4 @@
⎕io←0 ⋄ ⎕pp←34
p←⊃⎕NGET'input'1
+/⍎¨⌽¨('\(' '\)' '\*'⎕R{')(×'[⍵.PatternNum]})¨p ⍝ part 1
+/⍎¨⌽¨('()*'{(⍵⍵⌷⍨∘⊂⍳)@(∊∘⍺⍺)⍵}')(×')¨p ⍝ part 1 (without regex)

63
2020/day18/day18.rkt Normal file
View file

@ -0,0 +1,63 @@
#lang racket
(module+ test
(require rackunit))
(define (read-input filename)
(with-input-from-file filename
(lambda ()
(for/list ([line (in-lines)])
(parse-expression line)))))
(define (parse-expression str)
(read (open-input-string (string-append "(" str ")"))))
(define (eval-left lst)
(match lst
[(? number? x) x]
[(list x) x]
[(list-rest a '+ b r)
(eval-left (cons (+ (eval-left a) (eval-left b)) r))]
[(list-rest a '* b r)
(eval-left (cons (* (eval-left a) (eval-left b)) r))]))
(define (part1 filename)
(define input (read-input filename))
(apply + (map eval-left input)))
(module+ test
(check-equal? (eval-left (parse-expression "1 + 2 * 3 + 4 * 5 + 6")) 71)
(check-equal? (eval-left (parse-expression "1 + (2 * 3) + (4 * (5 + 6))")) 51)
(check-equal? (eval-left (parse-expression "2 * 3 + (4 * 5)")) 26)
(check-equal? (eval-left (parse-expression "5 + (8 * 3 + 9 + 3 * 4 * 3)")) 437)
(check-equal? (eval-left (parse-expression "5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))")) 12240)
(check-equal? (eval-left (parse-expression "((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2")) 13632))
(module+ main
(displayln (part1 "input")))
(define (eval-left-priority lst)
(match lst
[(? number? x) x]
[(list x) x]
[(list-rest a '* b '+ c r)
(eval-left-priority (list* a '* (+ (eval-left-priority b) (eval-left-priority c)) r))]
[(list-rest a '+ b r)
(eval-left-priority (cons (+ (eval-left-priority a) (eval-left-priority b)) r))]
[(list-rest a '* b r)
(eval-left-priority (cons (* (eval-left-priority a) (eval-left-priority b)) r))]))
(module+ test
(check-equal? (eval-left-priority (parse-expression "1 + 2 * 3 + 4 * 5 + 6")) 231)
(check-equal? (eval-left-priority (parse-expression "1 + (2 * 3) + (4 * (5 + 6))")) 51)
(check-equal? (eval-left-priority (parse-expression "2 * 3 + (4 * 5)")) 46)
(check-equal? (eval-left-priority (parse-expression "5 + (8 * 3 + 9 + 3 * 4 * 3)")) 1445)
(check-equal? (eval-left-priority (parse-expression "5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))")) 669060)
(check-equal? (eval-left-priority (parse-expression "((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2")) 23340))
(define (part2 filename)
(define input (read-input filename))
(apply + (map eval-left-priority input)))
(module+ main
(displayln (part2 "input")))

380
2020/day18/input Normal file
View file

@ -0,0 +1,380 @@
7 + (9 * 8 + 5 + 5 * (3 * 4 * 7 + 6 * 4)) * ((3 * 6 + 3 * 4 * 7 * 4) + 4 * 3 * 5 + 5 * (5 * 6 + 7)) * 2 + 6 * 4
9 * 4 * ((9 * 8 + 9 + 2 + 9) + 2 * 9 + 2 + 2) * 5 * 6
3 * ((9 * 3 * 8 * 6 * 6 * 7) + 8) * 2 * 9 + 4 * 8
(3 + 4 + 4 * 4 + 9) + (7 + 6 + 2 * 8) * 9 + 7 * 8
9 + 6 + 6 + 9 * 9 * 5
(3 * 5 + (4 + 3 * 7 * 8) + 7 + 8 + 2) * 8 * (3 * 4 * 8) * ((4 + 5 * 2) * 7)
6 + (5 + 8 * (6 * 8 * 9 + 9 + 8 * 9) * 4 + (5 * 9)) * 2 + 2
(6 + 8 + (6 * 6 + 2) * 6 * (7 + 7 + 8 + 9)) * 3 + 8 + (6 * (8 + 8 + 9)) + 2
9 + (4 + 6 + 5 * 9 * 4)
(5 * 3 * 4 * 4 + (6 * 4 * 5)) * 2 * 9
(2 * 3 * 9) * 2
6 + (4 + 8 + 2)
(9 * 7 + (2 + 9 * 9 * 9 + 3) + (7 * 3 * 4 * 2 + 3 * 7) + (5 + 9 + 4 + 3) + 4) * 9
(2 + 2 * 5 + 9) * ((5 + 9 * 4 + 7) * 2) * 7 + 4
4 + 2 + ((4 + 3 * 2 * 4 + 5) * 6 + 7 * (4 * 2) * 9 * (6 + 3 + 8 + 2 * 5))
(5 + 9) + 6 + 9 + 8 * 5 + 4
5 * 5 + ((3 + 5 * 4 + 7 * 9 * 7) + (7 + 2 * 3 * 4 + 8) * 6) + (5 * 9 + 9 + (3 + 5) * (8 + 2) + 5) + (3 * 3 * (6 + 3 + 7 * 8) + 3 + 2)
2 + 4 + 8 + 4 + 7 + (2 + (4 + 8 * 4 + 4 + 6) * 8 * (6 * 6 + 7 * 2) * 6 * (8 + 5 + 9 * 4 + 5 + 6))
7 * 4 + 8 + (8 + (7 * 3 + 4)) * 3
(6 + 7 + 8 * 4) + ((8 + 7 + 8 * 5) + 8 * 8)
9 * 5 * 8 + 2
6 * (9 * 5 * 9 + 9 + (3 + 7) * (8 + 9 + 3 + 5 + 2 + 7)) * (6 + 7 + 4) + (2 + (2 + 7 * 2 + 4 + 2) + 4 * (9 + 6 * 5 + 2 * 9)) + (8 + (8 + 6 * 5 + 6 + 9) + (2 * 7 + 2 * 9 * 9) + 7)
4 + 2 + 9 + ((3 * 6 + 8 + 4 + 5 + 4) + 4 + (5 + 4 * 8 + 8) * (3 * 4 * 8) * 7 + (8 * 3 + 8)) + 5
6 + 9 + 4
9 * 3 * 4 * 3 * 9
2 * 7 * (9 * (6 + 9 + 6 + 5 * 5 + 6) + (2 * 7 * 2 + 3) + 6 * 2)
(6 + 3 + 6) * 9 + 5 * ((9 + 9 + 7 + 5) + 4)
8 * 4 * (8 + (7 * 4) * 5 + 6 + 7 + (5 * 7 + 9)) + (5 + (8 + 7 * 2 + 2 + 3) + 8 + 6 + 2 + 2) * (5 + (7 + 4 * 2 + 6 + 6 + 3) + 3 * 8 + 7)
9 + (5 * 6 + 5 * 2 + 8) * 3
5 * ((9 * 5 + 9) * 9) + 4 * 8
4 * 5 * (5 + 5 + (2 * 9 + 3) * 4) * 7
9 * 8 * (8 * (9 * 4 + 7 * 2 + 3 * 8) + (2 * 7 * 2 * 3 + 7 * 2))
9 * 4 + 2 * 7 * (5 * (4 * 5 * 6) * 3 * 4 + 4) * (4 + 4)
2 * (5 + 6 + (2 * 3 * 3 * 2 * 5 * 5)) + 4
(5 * 7 * 8 + 4 + 6) * 2 + 3
8 * ((5 * 3) * (6 + 6 * 6 * 2) * 8 * 6 * 6) * 7 * (3 + 6 * 2 + (9 * 8 * 8 + 7) * (5 + 2 * 2 + 5) + 9)
7 * (7 + 5 + 2 + (5 + 9 * 4 + 5 + 3) * 8) + 2 * 8 * 6
2 * (6 + 7 * 7) + 3 * 7 * (4 * 7 * 6)
7 + 7 + 8 * (7 + 2 * (3 + 9 + 8 + 7 + 4) * 9) + 5
8 + 3 * 9 * (8 + 8 * 5) + 8 * 2
6 * 6 * 5 * (8 * 9 * 2 + 6 * 2 * (9 + 3 + 4 * 3 + 6)) + 2 + 4
3 + 8 + 7 + 3 * 5 + 9
(4 * (9 * 2 + 3 * 4) * 5 * 2 + 5) + (7 * 7 * 4 + (4 + 3 + 5 + 6 + 3 + 7) + 6 + 3) * (3 + 9 * 2 + 2) + 3 + 8 * (7 * 8 * 5)
8 * (6 + 6 * (4 * 3 * 6 + 9 + 9) + (2 * 3 * 2 * 4 * 2)) * (2 * (8 + 8) * 6 * 4 + 3) + 9 * 6
3 * ((7 + 6 * 8 * 9) + 7 * 7 * 2 + 3 * 7) * 8 + 9 + (2 + 7 * 6) * 3
4 * 8 + 6 + (3 * 3 + 8 * 7 * 9) + 4 * 6
2 * 5 * (8 * 2) * 4
((3 + 9) * 2 * 5 + 5 + 8 + 8) * 6 + 2
9 + 2 + 3
7 + 4 + 9 * 9 + (9 * 6 * 5 * (3 + 3 * 7 + 3 + 9 * 7) * 9 + 8) + 9
(6 + 2 * 9) + (6 * 6 + 2 + (6 * 6 * 3 * 6)) * 4 + 2 + 2
5 + 9 * ((3 + 8 + 7 + 3 + 9 + 3) + 8)
(4 + 7 * 9 * (4 * 8 + 7 + 2 + 6) + 2) + 9 * 9 * 2 + 8 + 8
(3 * 6 + 3 + 7 + 5) + ((2 * 3 + 2 * 3 * 7 * 5) + 6 + 6 * 9 * 7 * 8)
5 * 7 + 7 * (6 * 5 + 8 * (7 + 5 * 9)) + 8
(7 + 6 * (2 * 5) + 3 * 6) + 5 * 2 + ((8 + 9) * 6) * 2
4 + 8 * 3 * (7 * (5 * 5) * 3) + 3
9 + 7 + (3 + 7 * 5 + 3 + 2) + (8 + 7 * 5)
2 * ((5 * 8 * 2 + 5 * 2 + 8) * 2 * 4 * 3) + 5 * 5 * 9 * 4
3 * 6 + 6 + (8 + (3 * 8 * 4 * 7) * (6 + 5)) * 6
6 + (5 * 3 * 7 * 2 + (2 * 6 * 6 + 4) + 9) * 2 * 6 + 6
(4 + 9 + 9 * (3 + 6 + 3 * 7 + 8 + 5)) * 8 + 5 + 5 * (8 + 6 + 3) * 4
7 * 8 + (2 + (5 + 6 * 5) * 6 * 6 + 5 + 3)
7 + (3 + (8 + 7 * 5 + 5 + 5) * 5 + 4 + 8) + 9 + 3
7 * ((7 * 5 * 9 + 7) * 6 * 4 * 6 * 6 + 6)
7 + 5 + (3 * 3) * 6 + 5
(4 * (3 * 3 * 5 + 8 + 9) * 4 * 8 + 7 * 3) + 5 * 5 + (8 + 2) * 9 * 3
8 * (2 + 3 + 4) + 4 + 8 + (3 * 4 * (3 + 2) * 4)
9 * 2 * (9 + (8 + 6) * (7 + 9 * 5 * 6) * 8 + 7 + 7) + 5 * 2 * 9
7 * 7 + 7 + 2 + (5 + 2 + 6 + 7 * 6 + 8) + (9 * (6 + 2) * 3 + 9 + 4 + 7)
(3 * 4) * 9 + ((2 + 5 * 2 + 9 + 6) + 5 + 9 * (4 * 9 * 7 + 2 + 3 + 6) + 4 + (4 + 7 * 8 + 5 * 9)) * 9 + ((8 * 9 + 2 + 7 + 8 + 5) * 7 + 5 * 2 * 9 + (7 * 8 * 6 + 8 + 2))
((4 + 9 + 7 * 6 * 6) + 3 + 6 * 3 + 3 * 5) * 7 + 2 * 9 * 4
3 * 7 * 3
(6 * (9 + 8) + (3 * 4 * 8) + 9 * 4 * (8 + 6 * 8 + 8 + 3 * 5)) + 3 * 4 * 9 * 6 + 2
((5 * 7) * (9 + 2)) + (2 * 9 * 7 + 3) * 8 + (7 * 5 * 5 * (9 * 9 * 2)) + ((7 + 7 + 8 + 4) * (5 * 3 * 7) * 6 * (7 * 7) * (2 + 2) + 7) * 6
((9 * 9) * (8 + 3 * 5 + 9) + 5 * 7 + 3 + 8) + 2 + 7 + 3
8 * 5 * (8 + 3 * 6) + 4 + 8 + 5
(4 * 9 + (8 + 9 + 8 * 9 * 3) + (3 * 8 * 9 * 9 * 2) + 6 + 5) + 2 + (5 * (6 + 4 * 9 + 3)) + (4 * 9 * (9 * 8 * 7 * 6) * 5 * (2 * 7 * 9) + 5) * ((4 * 5 + 6 * 4) * 6 * 6 + 9 * 7)
(8 * 8 * 7 * 5 * 2 + (9 * 9 + 4 + 8 + 3 + 5)) + 5 * 3 * 3
5 + (8 * (3 * 3 * 2 + 7) + 9 + 2) * 8 * 4
9 * (9 * 4 + 2 + 9 * 5 + 3) * 3 + 3 * (5 * (9 * 5 * 8 + 2) * (3 + 8 + 3 + 2) + (6 * 5 * 9 * 5) * (4 + 2 + 5 + 2 * 9) + 4) * 5
8 + (7 * 7 * 9) * 7 * 8 * 9 * 3
6 + 9
(3 * 8 + (8 * 2 + 9 + 3 * 5 * 6) * 2) * 6 * 2 + 4 + 4 * (4 + 5 * 4)
(6 + 8) * 3 + 4
7 + 2 * 4 + 9 + 7
8 * (7 + 2 * (2 + 4) + 3 + 6 + 9) * 2 * 9
(6 * 9 * (2 * 6 + 2)) * 4 + 7 + 9
((2 + 7 + 7 + 4 * 2) + 2 * 9) * 9
3 + 8 + 9
5 * 9 * (3 + 4 * 6 + (8 + 3 * 3 + 5))
(4 * 4 + (8 * 6 * 7) + (7 * 5 + 9 + 6 * 7 + 8) + 8 * 7) * (6 + 2) * 5 * 3
6 * 3 + 5 * (9 * 2 + 8 + 5 * 9) * 8
(8 * 9 + 7 * 7 * 8 * 8) * 7 * 6
6 + 7 * 6 + 2 * (6 + 7 * 5 * 9 + 6 * 4)
4 + ((9 * 3 + 9 * 9 * 5) + 5) * 9
2 * (2 * 7) * 6 + 9 + (8 * 7 + (2 * 5 + 8 + 5) + 4 * 5 * (4 * 3))
(9 + 2 + (9 + 5 + 7) * 3 + 7 * 3) + 3 + 8 + (6 * 5 * 9)
(9 * (7 + 6 * 9) * 5 + 5 + 6 + 6) * 5 + 9
7 * 8 * 2 * 9
5 * 2 + 7 + ((6 * 4) + 8 + 2 * 3 + 6) * 9 * 2
((6 * 8 * 6 * 5 + 3 * 4) * (4 + 5) + 4) + 9 + 4
4 + 7 + 7 + (4 * 7 * 3 + 9 + (6 + 5) * 9) + 5
(2 + 4 * (8 + 6 * 5 + 4) * 2 + (9 + 6)) * 2 + 8
(2 * (3 + 2 + 9 * 4)) * 8 * 9
3 * 3 * (9 + 6 + 7)
6 + 2 * 6 * 5 + (4 * 7) + 8
((6 * 4 * 8 + 2 + 4) + 5 * 5) + 4 * 4 * 9 + 4
(7 + 9 * 2 + 8 * (7 * 3)) * 6 * 9 + 4
(5 * 8 + 6 + 2 + 3) + 6 + 8 * (4 + 4 * 7 + 8 + 7 * 4) + 3
(8 * 5 + 4 + 3 * 2) + (8 + 5 + (9 + 7) * (5 * 9 * 2 * 5 + 9 + 9)) * (7 + 8) + 2
9 + (2 + 7 * 2 * 7 * 8) + 9 * 5 + 4 + 9
5 * 7 * ((5 + 9 * 5 * 5 + 9) + 2) + 4
7 + 7 + (4 + (3 * 6 * 9 + 8) + 2 + (9 * 6 + 5) * 2)
9 * 8 + ((7 * 5 * 2 * 3 * 3) * (4 * 8 * 2 * 9 * 8 + 5)) * 6 + 4 * 9
(8 * 5 * 8 * (2 * 5)) * 6
((9 + 7 * 5 * 6 + 3 + 8) + 8) * 6 + (5 + 2 * 2) + 4 + 9 * ((4 * 5 * 7 * 9 + 4) + 9 + 2)
((3 + 3 + 2 * 4 * 4) * 7) * 3 * 8 + 4 + 8
2 + (2 * 3 * 7 * 2 * (3 * 4 * 6 * 2 + 2 + 5) * 7) * 3 * ((8 + 5) * 4 * 4)
(7 * 3 * 9 + 7) * 9 * 6 + 2 + 6 + (8 + (5 + 6 + 9 * 7) + 6 + 4)
(8 * 4 * 6 * 7 * 2 * 4) * 5 + 2 * 3 + 9
7 * (7 * 3 + 8 * (5 * 4 + 8 * 8) + 7) + ((3 * 6 * 3 * 2 + 6) * 5 * 9) + 4
5 + 3 + ((4 + 9 + 8 * 4 * 3) * 4 + 3 * 6)
5 + ((4 + 4) * 2) * (9 * 5 + 3 * 3 + 9) * 7
9 * 2 * 4 * (4 + 3 * (4 + 3) * 3) * 4
3 + 4 * ((5 * 8 * 2 * 3) + (9 + 8 * 2) * (5 * 3 + 3 + 7) * (2 + 8) * (6 * 4 * 9 * 4))
9 + 3 + 5 + (4 + (3 * 2 * 6) * 9 * 9)
9 * 2 + 3 + 5 * 2 + 3
((9 + 3 + 3 * 6 * 4 + 5) + (9 * 3) * 4 + 2 + (2 * 5 + 5)) * (9 + 5 * 3 * 7) * 8 * 4 + 9 + (2 * 8 * 4)
9 + ((4 * 8 + 2) * (8 + 4 * 4) + 4 + (7 + 9 + 6 * 3 * 4 * 8) * 8 * (5 + 8 + 9 * 8)) + 3 * (4 + 3 * 5 + (3 * 4 * 9))
(9 * 3 + 9 * 8 + 6 + 2) + 6 * (4 + 4)
(6 + 3 + 6 + 4) * 9 * 5
6 + 8 * (6 + 3) * (7 + 6 + 7 * 9 * (2 + 5 * 2)) + 3
3 + 5 + (4 * 5 * 2) + 2 + 7
6 + 9 * 5 + (4 + 2 + 5) * (2 + 6 * 2 * 3)
8 * ((9 * 5 + 9 * 2 * 9 * 9) * (2 + 5 * 3 + 9 + 6 + 2) + 6 * 8 + (8 * 8)) * 6 + 6 + (9 * 8 * 8 * 2 * 5) + 5
3 + 5 + 2 + (2 * 4)
2 * (2 + 6 + 8 * 2 + (2 * 5 + 6) * 5)
(9 + (2 * 8 * 3 * 3) + 9 + 8 * 2) + 2 * 9 + 7
2 * (9 + 6 + 7) + (2 * 2 * (7 + 8) * 4 * (4 * 4 + 3 * 5)) + 6 * 3
(3 * 4 * (5 + 9) * (7 * 3 * 3 + 3 + 9 + 8)) * 2 * 8
(7 * 2 + 7) * ((2 * 4 * 5) + 2 * 3 + (7 + 8)) + 3 + 9 + 3
4 + 2 * (5 * 4 + 7 + 6) * 6
2 * (7 * 3)
((9 + 9 * 4 * 4 + 6) + 6 + (4 + 7 * 9 * 5 + 9)) + 8 + 7
3 + (6 * 3 * (8 + 4 * 8 + 8 * 7 + 9)) * 3 + 5 + (5 + 4 * 7 + 4 + 3 * 4) * 2
5 * 5 * 3 * 9 + ((5 + 2 + 8) * 2 * 2)
(9 + 5 * 7 + 8 * 5 * (2 * 6 * 8 + 3)) * 5
5 * 7 * 4 * ((6 + 5) * 3)
5 * 8 * ((3 + 2 + 8) + 2 + (7 * 2) + 3 * 9 * 9) + 5 * 8 + (5 + 8 + 2 * 6)
2 + 2 * ((4 + 6 * 9) + 3 + 5 + 8)
(5 * 6 + 8 + 5) + 7 * 5 * 8 * 2
2 + (7 * 2 * (2 * 9) * 3) * (5 + 7) * 8
((8 * 3 + 2 * 8) + 4) + 2 + 8 + 3 * 7 + 9
2 + 3 + 3 * 9 + (4 + 6 + (6 + 8) + 5 * 5 * 5)
9 * 8 * (2 * 3 + (4 * 8 * 7 + 9) * 7 + (6 + 7 + 9)) * 7
6 * (8 * (4 * 3 + 9 + 7 + 2) * 8 + (6 + 4 + 9 + 7) + 3)
(5 * 8 * (2 * 8) + 7 * 4) + 3 + (7 + 6) * 3
(5 + 4) * 3 + ((9 * 2) + 3 + 5) * 2
(2 * 6 * (8 * 5) + 9 * 5) + (3 * 9 + (2 + 5 + 6))
6 * (5 + 3 * 3 * (2 * 6 * 4 + 6 * 4 + 6) + 4) + 5 + 2 * 4
(9 + 3 * 8 + 8) + 3 + 3 + 9
3 * ((8 * 4 + 4 + 9) * 7) + 8 * 3 * 7
5 * 2 + 9 * 7 + 4
5 * 5 + 7 * 6
2 * 7 + ((2 * 8 + 4 + 4 + 2 + 4) * 9 * 2 * (9 + 7 + 8 * 9)) * 5 + 8
4 + 6 + ((2 * 3) + 2) * 4 + 9
2 * ((6 * 6 * 5 * 6 * 3 * 9) * 6) * 4
((4 * 8) * 3 * (9 * 2 * 5 * 3 * 3 * 2) + (6 * 7 + 3 + 9) + (3 + 5) * (6 * 4)) * 4 * 8
5 * 3 + (9 + 4) + 3 + 9 * 6
(5 * 8 + 5 * 2 + (7 * 5 + 4)) + 5 * 9 * 7
(6 * 2 + 9 * 5 * 5) + 2 + 2 * 5
3 * (4 + 7 + 2 * (7 * 9 + 5 * 6 * 6)) * 6 + 8
6 + 9 + (4 * 4 + 6 * 7 + 6) * 5 + 8 + 6
8 + ((2 + 5 + 4) * 9 * 5)
4 * (9 + 5 + 7 * (6 + 8 * 7 * 2) * 4 + (9 * 8 * 7))
5 * 5 + (9 * 4 * 5) + 2
(4 + 3 * (5 + 9 + 8 + 4) + 4 * 4) + 2 * 2 * (5 * (3 + 9) * (4 * 9 * 8) * (2 + 8 + 3 + 5 * 4 + 4) * 6)
7 * 2 * 3 + 2 + 9
(9 + 5 * (8 * 2 * 5) * 9) + 7
8 + 3 + (8 * 2 * 6 * (8 * 2) * 4 + 3) * 2
(3 + 6 * 3) + 9 * (7 * 6)
5 + (6 * 3 + 6 * 3 * 7) + 4 + 9
9 + (7 * 5 * 8 * (8 * 2 * 5 + 5 * 3) * 3 * 5) * 2 * 4
4 * ((6 + 7 * 9) * (9 * 2 + 2)) + ((2 + 3 + 5 + 6 + 9) * 9) + 6
9 * 3 + (4 * 7 + (9 + 8 + 5)) + 4 + 4
((3 * 4 + 6) * 9 + 8) * 4 * 3 * 2 + 7
(6 * 9 + 3 * 5 + 2) + 2 * 5 + (8 * 8 * 7 + 6) + ((6 * 5 + 4 + 3 * 9 + 7) + 3 + 4 * 3 * 9) + 5
7 * (8 + (7 * 2 * 7 + 5 * 4) + 7 + 4 + 7 + 2) * 2 * 4
3 + (7 * 8 + (3 * 9 * 9 * 6 * 6)) + ((7 * 8 + 8 * 9) + 5 + 2 * 9 * 6 + 8) + 3 * 6 + (8 * 8 + 2 * 8)
4 * 4 * 5
(3 + 8) + 4 + 6 * 8 * 5
4 * (8 + 9 * 2 * (5 * 9) + (2 + 8)) * 5 + 8
(3 * (6 * 4 + 9 + 8 * 5 * 3) * (7 + 4) + (7 * 2 + 4 * 7 + 5) + 7 * 4) + 9 + 2 * 5 * 8
3 * 8 + 6 + 6 * 4 * 9
4 * 5 * 2 * (2 * 5 * 4 + 5 * 4 * 2)
((3 * 9 * 9) + 4 + 7 * 4 * (8 + 2 * 4 + 3 + 3) + 8) * 8 * (6 * (5 * 8 + 9 + 9 + 3 * 8) * 7 * 5 * 2)
(5 * 3 + (6 * 6 + 3 + 7 * 6 * 9)) * 9 * 2 * 5 + 3
9 + (7 * (7 + 9) + 3 * 2)
2 + 5 * ((3 + 4 + 5) * 6) * 9 + ((6 * 6) + 5)
5 + (5 + 2) + (3 + 8 + 4) + 6 * 4 + 8
(6 + 5 + 7 + 3) * 5 + ((6 + 7 + 5 + 3) + (2 * 6 + 9 + 2 * 8) + 4) * ((7 * 7 + 8 + 8) + 4 * 7 * 8 * 2 + (4 + 5)) + (7 + (5 * 9 * 6 * 5) * 9 * (7 + 2) + 7 * (8 * 6 + 9))
(9 * 8 * 5 + 8 + 9 + (6 * 9 + 4)) + (6 * 4 * 8 + 3 + 4 * 5) + 8 + 5
5 * 2 * (4 + 5 * 6) + 5 + 9 + (9 * 9 + 2 + 3 + (3 + 2 * 4 * 6 * 3))
3 + 2 + (7 * 9 + (4 + 8 * 2)) + 3 * ((7 + 9) * 9 + 8 * 8)
(5 * 7 * 4 + 3 * 2) + 9
7 * (5 + (7 * 4 + 6 + 7)) + 2 + 3
(4 + 4 * 7) * 2 * (7 + (8 + 8 * 8 + 2 + 7) * 2)
(6 + (4 * 2)) + 5 * 8
6 + (5 + 2 * 7 + 4 * (8 * 7 + 3 + 3 + 9 * 9)) * 6
4 * 9 * (9 * 8 * 4 + 2 + (5 * 6 + 7) * (7 + 5 * 7 * 4 + 8)) + 9 + 2 + (4 * 8)
((9 + 7 * 7 * 3 * 6) * (9 + 6 * 2 * 7 * 6 + 6) + 2 + 3 * (8 * 8 * 5) + 8) + 6 + 5 * 4
(6 + (5 * 2) + 9 + 6) + 2 * 8 * 8
8 * 2 * 5 * 8 * 4 + ((2 + 6 * 6 + 4 + 4) + 7 + 6 * 5 + 6 * 5)
4 * 5 * ((8 * 5 * 6) + 2 + (5 + 8 + 3 * 9 * 9) + 8 * 2)
2 * ((2 * 9 * 8 * 7) + (2 + 2 * 6 + 6) * 2)
9 + 3
3 * (5 + 2 + 6 + 5 * 6 + (3 + 7 + 4 + 7 * 8 * 5)) * 9 + 7 + 7
2 + (7 * 5 * (4 * 5 * 5)) + (7 * 7 * 3 * 3 * 7)
8 + (4 + (6 + 3 * 9 + 2 + 8) * 6 * 5) + 3 + (3 + 8 * 3 * 3 + (7 + 9 * 3) + 4)
((9 * 4 + 5 * 2 * 4) * 4 + 8 * (9 * 8 + 7 * 7) * 9) * 8 + 4 * 2 * 2 + 4
3 * 6 + (4 * 7 + (4 + 8 + 7 + 7) * (9 * 4) + 4) + 3 * 7 + 7
7 * (8 + 8 + 2 + 4 + 6) + 7 + (8 + 3) + 3
(3 + (9 + 3 + 8 * 8 + 2 + 2)) + 2 + 9 * 2 + 5 + 4
5 * 3 * 8 + 7 + (3 + 4 * 9 + 7 * 7)
3 * 2 * (2 + (3 * 5 + 3 * 3) * (9 + 6) + (5 + 5 + 5 * 4)) * 4
(3 * 5 * 9 + 4) + 8 * (5 + 7 + 6 + 4)
2 * 9
8 + 2 + 5 + ((8 + 3) * 4 + 6) * 4 * 6
8 + (5 * 7 * 2 + (6 * 6 * 2 * 5) * 5 * 5) + (5 + 3 + (7 * 5) * 5) * (5 * 7 * 6 + 3 * 2 + 3) + 7 + 5
2 + (5 * 8 + 9) * 7 * 7 + 8
(6 + 6 + (6 * 7 * 6 + 4 + 2)) + 8 * 5 + 9 + 7 * 5
6 + (3 * 9) + 9
6 * (5 + 6 * 9 * 8 * 5 * 6)
6 * 4 * (4 * (7 + 4 * 9 + 4 * 3) * 4 + 5) + (4 + 6 * (5 + 4 * 9) * (8 + 7 * 8 + 9 * 2))
4 + 7
((5 + 4 * 3 * 7 + 2 * 3) * (8 + 5 * 4 + 3 + 6) + 7 + 9 * 2 * 9) * 7 + 6 + 7 + 7
(5 * 9 + 2 * 6 * 4) + 8 + 7 * 3 * 2
2 * (8 * (2 * 2 + 6)) * 3
9 + (9 * 7 + 3 + 5 + 2 + 3) * 2 * 2
(8 + 4 * (2 * 5 * 6) + 9) * 8 * 6
7 * 2 * (6 + 4 + 3 + 9) * 7 + 4
2 * 3 + 8 * ((5 + 9 + 6) * 5 * (7 * 4 * 5)) * 8
3 + ((2 + 3 * 2 * 9 * 3 * 4) + 6 * 5 * 2 * 2)
7 * ((5 + 7 * 9 + 9 + 3 + 2) * 5 * 6 * 8 + 6 + (9 + 9 + 7 * 8 * 2 + 3)) * 3 * 4 * 6
3 + 3 + (6 + 6 * 6 + 7 * 9 * 4) * 8
3 + 4 * (4 + 5 + 8 * 4) * (3 + 7 * 6 * 7 + (9 + 4)) * (2 + 8 + 5) + 6
5 * 9 + (4 * 6 + 7 * 5 + 8) + (2 + 4) * 4
(6 * 2 * 7 * 8 * 9 + 7) * 9
9 + (5 + 2 + 8 + (6 * 9 * 7 + 2)) + 9
7 + (7 * 9 + 8 * 5 + 2 * 2) + 8 + 6 * 5
(6 + 6 * 8) + (5 * 5 + 6 + (9 * 2 * 6 * 3) + 2 * 7) + 8
(2 * (5 * 8 + 5 + 5) + 7) + 5 * 8 * 6 * 8 + 2
(8 * (7 * 7 * 3 * 4 + 9 * 4) * (9 * 3 + 8) + 6) * 7 * 6 * 2 * 8
9 * ((9 + 7 + 3 * 5 * 3 * 5) + 6 * 7 * 3) * (6 + 6 + 6 * 2 + 9 + 5) + 4 * 9
4 * 3 * 8 + ((9 + 3 * 2) * 9 + 2 + 2)
3 + 6 * ((6 * 2) + 2 * 3 + 6 * 5)
7 * (2 * 5 * 2) * 5
(8 + 2) + (6 + 9) * 6
((2 * 3) * (8 * 7 * 4) * 4 + 8) * 9 * 9 + (7 * (4 * 2 + 2 * 7) + 4) * (9 + 3 * 6 + 6 + 8 + 7)
5 * 5 + (8 + 7 + 4 * 2) * 7 + 9 * 2
5 + (2 * 7 * 3) * 9 * 9
3 + (3 * (6 * 2)) + 6 + (3 + (7 * 7 * 6 * 3 + 4) * 9 + (9 + 9 * 5 * 2 + 9 * 4) * 6 * 6) + 9 * 6
2 + 9 * (6 * 6 * 3 * 4)
8 * 6 + (3 * 9 * 9 * 4 * (8 * 2 * 2)) + 8 + 5
(2 + (7 + 3 + 2 * 6 * 8)) + 4 * ((5 + 4 * 7 * 2) * 8 * 5 + (5 + 8 + 9 * 9)) + 8 + 6 * (8 + 7 * (7 + 3 * 4 * 7) * 4 + (9 * 8 + 3) + 3)
(4 * (8 * 8 * 6 * 2) * 7 + (8 + 3) + 7 + (6 * 4)) * 3 * 8 * 2 * 9
3 + (4 * 3 + 3 * 2) * 7 * 3
(4 + 2 + 8) * 2 * 6 + 8 + 9
7 * (8 * (8 * 7 * 6 * 5) + 8 * 6 + 6)
(7 + (6 + 3 * 5) + 2 + 4 * (5 + 9 * 7 * 5 + 7) * (2 * 4 + 6 * 5 + 2 * 3)) + 9 * 7
5 * (5 * 5 * 4 * 2) + 3
(5 + 8 * 8) * (5 + 5 * 7) * 3 * 5
8 + (7 + 6 * 3 * 4) + 5 * 4 * 3 + 8
3 * 5 * ((4 + 2 + 5) * 8 * 3 * 4 + 5) + 4 + 9 + 4
(9 * (7 + 2 + 6 + 4 + 4 * 2) * 8 + 6 * 8) + 3 + 9 * 3
9 + 8
6 + 6 * (7 + 9 + 7 + 3 + 4) + 6 + 7
7 + (6 + 2 + 6 + 7)
6 + (9 * (6 + 2 + 6 * 9 * 2) * 7 * (9 + 6 * 7 * 3 + 5 + 2))
3 * 7 + 2 * 9
9 * 7 + 9 * (2 * (2 * 6 + 6 * 6) + 8 * 9 * 2)
((7 * 9 + 7 + 7) * 6 * 5) + 4
2 * (7 + 4 + 3 * 5 * 6 + 3) * 5 * ((6 * 6 * 9 + 3 + 2 + 9) + 5 * 3 + 3 + 5 * 3) * 7 + (8 + 4)
(7 * 6 * 9 * 3 + 8 + 4) + 6 * 7 * 6 + 3 + 4
2 + 6 * 7 * 5 + (7 * (2 * 3 + 4 + 6) + (3 * 3 + 7 * 4) * (3 + 8 + 7 + 6 + 4 + 4))
(8 * 3 + (7 + 4 + 5 + 5)) + (3 + 3 + 7 * (9 + 2 * 9))
8 * 4 + (9 + (7 * 3 * 9 + 4 * 7) + 6 + 9 + 5 + 6)
2 + 4 + 2 + 4 * 7
((7 + 5 + 5 + 3) * 3) + (5 + 6 + (3 + 8) * 2 + 4) + (6 + 2 * (5 + 6 + 9 + 8 + 5) + (9 * 9) + 3 * 6) * 3
(5 * 7) * 6 + (8 + 4) * 6
(2 * 4 * (8 * 6) * 2) + 5 + 8 * 9 * 7
((5 + 5) * 5) * 9 + (5 + 4) + 4 * 6
5 * (8 + (4 * 5 + 7 + 5) + (8 + 4 + 6)) + 9 + 7
2 * 8 + 7 + (3 + (8 + 8 * 5 * 5 * 8 * 5) + 9 + 9) + 7 + (7 * 8 + (3 + 5 + 8 * 7 * 8 * 8))
(9 + 7 * (7 + 6 + 8 + 2 * 5 * 2)) * 9
4 + (2 * 5) * (4 * (8 + 5 * 4) * 9 * 4 + 9)
4 + (8 + 8 + 8) + 3 * 2 + (2 + (5 * 6 * 7)) + 7
((5 * 3 * 6 * 6 + 7) + 2 + 2 + 2 * 8 + (6 + 3 + 2 * 4 + 8)) + 4 + 3 * (4 + 6) * 9 * 3
5 + 9 + 7 + 4 * ((2 + 5) * 4 + 9 * 9 + 4)
6 * 7 + 4 * 5 + (4 * 7 * 8 * (2 * 4 * 9 + 9 + 5) * 6)
6 * 9 + (3 * 9) * 8 + (4 * (8 * 3 * 2 * 2 + 3) * 4 * 8 * 7 * (4 + 5 + 7 * 3 + 4 * 3))
8 + (4 + 2) * (8 * 8 + 9 + 5)
((6 * 8 + 3 * 2 * 6 * 9) + 7 + 8 + 4) * 4
4 + (2 * 3 + 3 * 7) + 2 * (2 * 5 + 7 * 6) + 8 + 6
8 + 7 + ((3 + 2 + 4 * 5 * 3 * 2) + (2 + 4) * 8 + 5 * (7 * 2 * 9) + 3) * 2
8 + 6 + (7 + 6 * 7 * 8 + 4)
(7 * 9 + (2 + 6)) + 5 + 3 * 8 + 7 * 3
(6 * 9 + 6 + 3 + 5 + 4) * 8 * 4 * ((8 * 4 + 7) + 2 + 9 + (3 + 4 + 8 + 6 * 2 + 7) + (3 + 2 + 7 + 5 * 7) + 2)
8 * 8 + 2 * (8 * (8 + 6 + 6 + 5 * 6)) + (2 + 6 * 3 * 5)
8 * 3 * 3 + (3 * (4 + 6 + 6 * 4 * 2) + 4 + (7 + 3 * 3 * 9) + 6)
5 + 7 + (3 * 8 + 8 + 2 + 4 + 9)
(3 * (5 * 3 + 2 * 8) + 8) * 7 + 5 + (8 * 5 + 3 * (6 * 9 * 5 + 9 * 6)) + 4
6 + (6 * (3 * 2 * 4 * 7 + 4 + 5) * 4) * 5 + 8 + 3 + 5
(8 * (2 + 8) + 9 + 7 + 8 * (3 * 6 + 7 * 6 + 5 + 7)) * (2 + 9 * (4 * 7 + 3 + 4 + 6 * 5)) * ((2 + 9 + 6 * 3 * 8) * 5 * 4) * 7
5 * 7 + 2 + 7 * (5 * 8 * 5 * 4 * 2 + 3) + 8
2 * 6 + 2 + 8 * 6 * 6
4 * 4 * (9 * 8)
8 * (2 * 8) + 5 * 5
2 + 4 * 3 * 8
8 * (5 + (8 + 9 + 8) * 8) * ((3 + 9 + 8 + 2 + 7 * 2) * 8 * 5 + 8) * 7 + 2
(2 * 3) + 3
4 + 4 + 2 + 5 + ((9 + 2 * 2 + 6 + 6) * 4)
7 * 9 + (9 + 4 * (4 * 2 * 7 * 6 * 2 + 4))
8 + (6 + 8) + 3 + 2 + 3
(3 * 4) + 8 + 3 + (3 + 5 * 3 * (4 + 8 * 7 + 2) * (4 + 7) * 5) * 3 + 2
3 + (6 * 3 + 2) + 6 * (6 + 4 * 8) + 7
6 * 7 * 9 + 8 * 6 * (4 * 4 + 8 + 3 + 7)
8 * 9 + 9 + (7 + 5) + 8 * 6
(4 * 3 + 2 * 7) * 3 * 4 * 6 * 2 + 5
(8 * (4 + 9 * 5) * 5 * (4 * 9 + 8 + 6 * 7)) + 6
6 + 8 * 9 * (9 + (4 * 6 + 2) + 8 + 8 + 8)
4 + 4 * ((3 + 4 + 5) * (3 * 6 + 2) * 4 + 4 + 9) + 4 + 7
3 * 3 * 4 * (6 * 6 + 4 + 2 * (7 * 5 * 7)) * 3 * (4 + 4 * 3 * 4)
2 + (5 * 9 * 2 * 8 * 4 * 6) + 8
6 + (6 * 2 * 9 * 4 + (5 + 8 * 7) + 4) + (5 + 9 * 5 * 7 + (5 * 9 + 6)) + 3 * 3 + 8
2 + (4 + (9 * 6 + 2 * 6) * 2 + 7 * (4 * 4)) * 7 + 2 + 3 + 7
(4 + 4 + 8 * 9 * 2) * (9 + 5 + (6 + 4) * 4 + (6 + 3 + 7 * 9 * 3) * 7)
8 * 9 * (7 + (7 * 4 + 7 * 2 + 7)) * 9
(9 * 6 * 8 * 6) + (3 * 4 * 5 * 8) * 6 + (9 * 5 + 6 + (3 * 2) + (5 + 8 * 5 + 6 * 9 + 5)) * 7
7 + 3 * 2 + (5 + (5 + 8 * 9 * 3 + 3) * 9 * 9) + 2
7 + 7 * 4 * (8 * (9 * 8 * 9 * 8 + 3) + 6 * (2 + 7 * 8 + 8) * 3 * 2)
8 + ((4 + 2 * 4 * 7 * 2) + 2 * 9 + 9 + 7) * 9 + 9 * 3
(8 + (5 + 5 + 2) * 8 + (8 + 6 + 4 * 7 * 2)) + 2 + 9
(6 * 3 + (9 + 6) + 8 + 3) * 5 + 6 * 7 + (5 * 9) + 9
2 + ((3 * 2 + 6) * (6 * 5) + 6) + 6 + 4
6 + 6 * 7 * (3 * 8 + 8) + 2
((8 * 9) + 3 * 7 * 4) + (3 * 7 * 5 * 6)
(3 * (8 + 6 + 3 * 9 * 3 * 4) * 9) + 2
((7 * 9 + 7 * 2) * 2 * 3 + 6) * 5 * 4 * 9 + 5
5 + (5 + 6 + 7 + 2 + 6 + 6) * 9 * (5 + 4 + 3) * 6 * 9
(9 * 9 + 8 * 5 + 4 * 5) + 9 * (3 + 3 + 8) + 2
6 + 5 * (5 * 9 + (6 + 4 * 5 + 2 + 7 * 6) + 5 + (9 * 9)) * 4 * 5
(2 + 2 * 7 + 6 + (5 + 3)) * 7 * 4
((4 * 3) * 8 * 2 * 7 * 3 * 2) * 4 * 2 + 8 * (5 + 6 + (9 * 6 + 2 * 4) + 4 + 7 + 9) * 8
3 + 4 + 7 + (2 * 7 + (2 + 9 + 3 + 6) + (2 * 2 + 4 + 3 + 2 * 5) + (3 * 8 + 4 + 4 * 9 * 4)) * 5
8 * 6 * 2 * ((6 * 7 * 4) + 6 * 9)
5 * 5 * 6 * (7 + (4 + 2 * 6 * 6)) + 9 + 7
4 + (5 + (2 * 3) * 8 * 3 + 8 + 5)
(5 * 9 * (3 * 6 * 9 * 4) + 4) * 9 + 5
(5 * (5 + 3 + 8 + 9) * 3) + 6
(7 + 9 + 3 + (7 + 3 + 5 * 2) + 9 * 5) + 8 + 8 + (3 + 8 * 9 * 9 + (7 * 7 + 2 + 5 * 6 + 4) * 7)
((9 * 9 * 3 * 4 + 9) * 5) * 7
4 + 3 + 7 * 6 * (6 + 2 * 6 + 9) * 6
8 * 2 + 7 + (9 + (6 + 7 * 8 + 5 + 2) * 3 + 4 + (8 * 4)) * 2 + 6
3 + 5 * 6 * 2 + (9 + 3)
(7 * 2 + 4 * 3 + 2 * (6 + 4 * 8 * 2 * 9 + 9)) * 7
(8 + 9) * 8 + 7 + 5
2 * 6 * 7 + (5 * 9) * 5
(5 + (4 + 7 * 9 * 3) * 8 + 3 * 2 + 3) + 8 * 9 + (4 + 3 * (2 + 4 + 4) + (3 * 3 + 8 * 6) + 5 * 8) * 4
9 * 8 + (6 * 5) * (6 + 7)
(3 * (2 * 4 + 9 * 5) + 2 * 5) * ((5 + 9) * 2 + 2)
2 * (2 + (2 * 9 + 7 * 6 + 8))
(5 + 2 + 6 + 2 + 6) + (2 * 6 + 4 * 3 + 9 * 4) * (2 + 9 * 7 + 6) + (5 + 5) * (2 + 5 + 7) * 6
5 + 4 + 3 + 2 + (3 + 4 + 3)
((6 * 9 + 7 + 7) * 9 * 7 + 7 * 6 + 6) * 2 * 9 + ((5 * 6) * 3 * 3 * 8)
5 * 8 + (7 + 2 + 6) * (8 + 2 + 8 + 4 + 9) + (5 * 6 * 6 * 3) + 8
6 + (7 * 4 + 4 * 7 + 3 * 7) + 9 + 5 * 7 * 5
3 + 2 + 8 + (4 + 9 * 4 * 2 + (9 * 9 + 9 + 5) * 5) + 6
3 * 9 * 4 * (5 * 4 * (8 + 3))

64
2020/day19/day19.rkt Normal file
View file

@ -0,0 +1,64 @@
#lang racket
(module+ test
(require rackunit))
(define (read-input filename)
(define file-str (string-split (file->string filename) "\n\n"))
(define rules (for/hash ([str (string-split (car file-str) "\n")])
(define rule (string-split str ": "))
(values (string->number (car rule))
(string-split (cadr rule)))))
(define messages (string-split (cadr file-str) "\n"))
(values rules messages))
(define (rule->str rules idx)
(match (hash-ref rules idx)
[(list (regexp #rx"\"(.)\"" (list _ x))) x]
[(list x ... "|" y ...)
(string-append "(?:"
(apply string-append
(map (λ (s) (rule->str rules (string->number s))) x))
"|"
(apply string-append
(map (λ (s) (rule->str rules (string->number s))) y))
")")]
[(list x ...) (apply string-append
(map (λ (s) (rule->str rules (string->number s))) x))]))
(define (part1 filename)
(define-values (rules messages) (read-input filename))
(define rule0 (regexp (rule->str rules 0)))
(length (for/list ([msg (in-list messages)]
#:when (regexp-match-exact? rule0 msg))
msg)))
(module+ test
(check-equal? (part1 "test") 2))
(module+ main
(displayln (part1 "input")))
(define (part2 filename)
(define-values (rules messages) (read-input filename))
;; Rule 0 is just "8 11", rule 8 is just "(rule42)+", and rule 11
;; matches "(rule42)+(rule31)+" with the same repetition. Thus we
;; only need to check that rule 42 matches more times than rule 31.
(define rule42 (rule->str rules 42))
(define rule31 (rule->str rules 31))
(define rule0 (regexp (string-append "(" rule42 ")+(" rule31 ")+")))
(for/sum ([msg (in-list messages)]
#:when (regexp-match-exact? rule0 msg))
(define n31 (length
(regexp-match* rule31
(cadr (regexp-split (regexp (string-append "^(" rule42 ")+")) msg)))))
(define n42 (length
(regexp-match* rule42
(car (regexp-split (regexp (string-append "(" rule31 ")+$")) msg)))))
(if (> n42 n31) 1 0)))
(module+ test
(check-equal? (part2 "test2") 12))
(module+ main
(displayln (part2 "input")))

587
2020/day19/input Normal file
View file

@ -0,0 +1,587 @@
105: 12 | 69
42: 69 48 | 12 41
66: 69 69 | 12 12
91: 69 38 | 12 26
75: 105 105
39: 69 119 | 12 124
88: 12 87 | 69 133
7: 69 55 | 12 84
55: 12 12
31: 116 69 | 125 12
100: 96 69 | 87 12
40: 49 12 | 66 69
58: 69 71 | 12 57
122: 12 34 | 69 17
65: 12 98 | 69 124
2: 69 49 | 12 84
111: 20 69 | 54 12
64: 12 51 | 69 108
9: 98 69 | 82 12
38: 55 69 | 84 12
71: 59 12 | 100 69
120: 86 12 | 30 69
6: 12 87 | 69 124
63: 12 124 | 69 49
129: 12 52 | 69 103
0: 8 11
69: "a"
35: 111 12 | 58 69
32: 69 3 | 12 46
78: 69 37 | 12 87
93: 69 82 | 12 49
99: 2 12 | 61 69
16: 12 133 | 69 98
37: 12 69
115: 12 119 | 69 66
21: 117 69 | 124 12
119: 69 69 | 12 69
8: 42
84: 69 105 | 12 12
83: 69 49 | 12 117
130: 12 56 | 69 21
132: 66 69 | 98 12
124: 69 12
24: 12 113 | 69 123
53: 12 93 | 69 83
117: 69 12 | 12 105
18: 55 12 | 75 69
68: 133 69
17: 12 106 | 69 127
56: 12 55 | 69 75
112: 124 12 | 66 69
57: 12 2 | 69 59
30: 87 12 | 119 69
12: "b"
70: 96 69 | 101 12
3: 75 12 | 119 69
73: 69 29 | 12 130
79: 12 85 | 69 81
92: 69 55 | 12 87
26: 12 124 | 69 96
41: 12 35 | 69 89
47: 87 12 | 124 69
114: 69 47 | 12 16
28: 91 12 | 45 69
11: 42 31
22: 133 69 | 55 12
72: 39 12 | 70 69
118: 75 105
52: 69 134 | 12 80
131: 12 66 | 69 37
13: 76 12 | 27 69
4: 69 75 | 12 87
27: 12 63 | 69 7
113: 69 114 | 12 79
80: 12 5 | 69 118
125: 12 126 | 69 129
51: 112 12 | 15 69
33: 69 131 | 12 59
101: 12 69 | 69 105
10: 69 23 | 12 25
77: 69 33 | 12 104
20: 69 102 | 12 18
25: 59 12 | 60 69
126: 12 13 | 69 64
116: 69 122 | 12 19
97: 69 117 | 12 55
87: 12 69 | 69 12
109: 98 69 | 75 12
96: 12 12 | 105 69
15: 12 101 | 69 119
107: 69 96 | 12 87
14: 12 10 | 69 1
108: 12 59 | 69 94
123: 95 69 | 32 12
46: 87 69 | 98 12
86: 82 12 | 124 69
61: 117 12 | 49 69
121: 117 12 | 98 69
74: 96 12 | 124 69
59: 124 12 | 84 69
102: 82 12 | 84 69
135: 62 69 | 38 12
34: 99 12 | 67 69
95: 74 12 | 65 69
5: 37 69 | 96 12
81: 49 12 | 98 69
98: 69 69 | 69 12
89: 69 73 | 12 44
48: 12 14 | 69 24
110: 69 133 | 12 37
67: 121 12 | 78 69
82: 69 69
62: 84 69
134: 132 12 | 110 69
43: 88 12 | 97 69
50: 84 12 | 37 69
94: 101 12 | 98 69
103: 12 120 | 69 90
104: 6 69 | 40 12
60: 87 69 | 124 12
49: 12 12 | 69 12
29: 22 12 | 4 69
76: 12 63 | 69 109
133: 12 69 | 12 12
90: 50 69 | 36 12
19: 77 69 | 28 12
106: 69 107 | 12 88
45: 92 69 | 110 12
1: 12 53 | 69 72
54: 12 18 | 69 68
23: 9 69
128: 49 12 | 84 69
85: 66 69 | 75 12
44: 69 43 | 12 135
127: 115 12 | 128 69
36: 55 69 | 55 12
babababbabaababbaaabababbaabaaabaaabbbbb
abaabbaaaaababbbabbbaaaa
bbbbbabbbbbabbaabaabaabbaabaabaa
ababbbbbabbaabaabbabbaaabbbbabbbaabaaaababaaaabb
aabaaaabbabababaabbababa
abbbababbbaabababbaababaabbabbbbabaabaab
bbabaaaabbbbaabaabbbaabb
bbbaaaabaaababaaaaaaaaabbbaababababbbbaabbbabbba
abbbaaabbbbaabbaabbbaaabaabbbabbabaabbaaabaaabaa
aaaaabbbaababbbaabaabbab
ababbbbbabbbaaabbabaaaaa
aabbbaabbbbbabbabbabbabbbaaabbaabbababba
bbaaaababbbbbabbbababaaa
abbbabbabbabaabbabaaababbbbbabab
babbbbbbbbbaabaaaabbbbaa
bbbaabaabbaabbbaabbbabba
ababaabbbbbbaaabaaabbaaa
baaabbabbaabaabaaaabbbbabbbbaaaabbbabbbb
aaabababbbbbbababbbaaabbaabbbbaaabbbaaaa
bbbbbbabbbabbababaaabaabbbaaababaaabaaba
babaabbbabaaababbbaaabbb
abbbabaababbaaaaabaabbab
aaaaabaaabbbbabaabbbbbba
bababbbaabaabababbabbbaa
bbabbabaabaaaaaaabbaaabaabaabaabbbbaabbbbababaabbbbbaaaaababbabb
abaababaabaaaaabaaaababaaaaababaabbbaaaa
bbbabaabbaababaabaaababb
aaabababaaababbbbbabaaaaaaaaabbabbbaaabaabbbbaab
aaabaabbabbaabaabbabbaaabbaabbaaabbabbbbbbabbbabbabbaabaabaaabaa
abababbabbabbabbabbbbbaa
abbbababbabaababbbbabbba
ababaabbbbbaaabbbababbbaaaaabbbbbaaabaaabbbaaaba
aaababbaababbbaabbababbb
abaaaabaabaaabbabbaaaabababbabbbabbbaaba
bbabbaaaababababbaaaabaa
abbaabaaaaaabbbabababababbbaabbbbababaabbbbbabaaaaaabbabbbaaaabbaabaaaba
babbbbabbbbbbbbaaaaaaaaa
bbbbbabaaabbbabbaaaaaaba
baaaabbaaababaaaabababaa
bbaaaabbbabbababbbababbaaabbabba
abbabaabbbaaaaaabbababbbabaabbaabababaababaabbaa
bbbbbababbbbaaabbaaaaaaababbabbbaabaabab
babbabbbbabaaababbbabaaa
bbaaaaabaaabbaababbbaaabbbaabbba
babaabbbbbaaaaabbaabaaab
babbbbbbabbbabaaabaaaaabbbaaabbb
bbbaaabababbaabbbbbbbaababbabbaaabbabbabbbabababababbbbababbababababaabb
bbbaabbababbbbbbbaaaaaaa
aaabababbaabaabbbaabbababbbbbbbaabababbbaaabbaab
baaaaabababbabbbaaababbbbbaabaabbabbbabbbbababba
abaabaaaaabaaabbbabaaabb
bbbaaaaaaaaaabbbbababaaa
bbbababbababbbabbbababab
abbbabbaaababbbbaabbbbbbbaabababaaabbbab
abaabbaabaabbabaababbaaababbbbaababbabaaaabababa
abababbbababbaaabaaabbba
baabbababaabbaaaababaaba
bbbbbababbbaaaaabababaaa
babbaabbbbbababbaaabbaba
baabbbbabaabababbbbabbaaaabaabaaaaabaabaabababbabbaababababaaaaabbababaababbbbbbaabbbbbb
aaaabaababbbbbabaabaabaa
bbabbababbbbbaabaaabbbaa
bbaabbaaabaabbaabaababbb
aabaaabaaaabbaabbbbbbbabaabbbbbbbbbbbabaabbbabaaabbaabbb
abbaaabaabaababbabbbaaabbbaaabba
babbbbaaabbaabaabbbababbbababbaa
bbabaaaabaaaaaaaaabaaaab
abaabbababbabababaabbbabaabaaaababbbbbbb
abbbbbabbaaaaaaababbbaba
baabbbbbbbbabbbbbbabbbaa
bbababaaaabbbbbbabbaabab
babbbbbbaaaabaabaaaabaabaabbbbaaaaaaabab
aabbbaabbbaabbabbbababbaaabbbabbbbbbababbaabaabaabbaaaaaaabaaabbabaaaabaabbbababbbbbaaba
bababbabbbabaabbbaaaabab
abaabababaaabbaaabbbaaaa
bbababbababbababbbabaabaaabbaaab
bbbaabbaaaabababbbbaabab
bbbbbabaaaabbbabbaaabababbbbaaaabbabaabaaabababbaaabbaaaabbaabbbaaaaabbababbaaabaabbabaaabbbbabb
abababbaaabaabababaaabbb
aaaaaaabbabbabbbaaaabaababababababbabaabbbaaabba
bbbaaaabaaaababbabaabbab
abaabbaabbbbbbababaabbaabbbabaaaabaabbba
bbbaabbaabbaaaaabaaaabaababbaaba
bbbaabaabaaabaababaabaab
babbabaababbbbabababaaaa
aabbbaababababbabbabaabbbbbbabab
bbbbbbbbabbaabbbbbaababaaaabbaaaaabbaaaabaaabbaabaabbabbabaabbbabbbabaaa
abbaabbbbabbabbaaabaaaaabaaaabbabaaabbaaabbaababaaaaaaabbbaababbbbbaaaba
aaababababbaabaabbbaaabbbbaaabba
aabbbbbbaabbbbabbbbaabababaaaabbabaaaabbbaabbababaabbbaa
abbbabbabbabaaaabababaab
babaababbbababaabaabaabbabababaabaaabbba
aabaaabababbbbbbbababbbb
abbaaaababaabaabbbaaabbaabbabaabaabbbabbabaaaaabbbbaabbb
babbaaaababaabbababbbabb
baaaabaaaaaaabbabaabbabbbaabbababbbaabaabbbbbaaabbbabbbb
bbaaaababbbaaaaaaababaabbaabaaababbabaab
aabaaabbaaababaaaaaaaabbaababbbabaaababaabbabbabbaabbbba
aaabaabababbaaaabbaaaaaaaaaaaabbaabaabbbaabaaaababbabbbaaabbbbba
bbbababbbaabbbaaabababbbbabbbaaababbbbaa
bbaabaababaaabababaabbbb
bbaabbbaabbbbaaabbaabbbb
ababababbaaabbaaabbaabbb
abaaabbaabaaabbaabbbababbbbababbabbabbababbbbaabababaababbaabaaaabbbbaba
abbaabbaabbababbabbaabbbaabbaaabaabaaabaaabaabbbbbbaabbabababbab
abbaabaaaabbaaaababbbbabaabbbabaabababaa
baababbababaababbbaaabaa
baaabbbbbaaaabbaabaabaaaabbbbbabaababaabaabaabbb
babaabbbbbabaabbabaaaaabaaabababbbbbbbaaaaabbababbaabbab
bbababaabbaabbbabaaaabbb
ababaabbbaaababaaababbaa
aabababaabaabbbbabbabbbaabaabbbb
baabbaaaaababaabbabbbbba
bbbbbbbbbaababaabbabbbaa
ababbbabbbbbbaaaabaababb
bbabbabbababababaabababa
bbbbbbbbbaaaabbbabbaaababaabaaaaaaabbbaabbbaaabbabbbbabbbaabababbbabbbbb
bbaababaaabbbbbabaaababb
aabbabbbaabbbabbaaabaaba
baabbaaaaaaaabbaabbaabab
abbbabbabaababbaabaabbbb
baaaaaaababbabbbbbabbbaa
aabbaabbbaaabbbbbbbaabaabbabbababbaabaababbaababbbababba
bbbbbbbaaaaaababbbababab
aabbbbabababbaaaaaabbbab
aaaaaaabbabbaaabbbabbbaaababbbba
aabaaababaaabaababbabbabaaaabbabbbabaaba
bbbaaaabaaaaaaabababbaaababaaaaa
aaaaaaababaabaaababbbbba
ababbbabbaabbabbbabbbbba
babbbbabbbaaabbbbaabababbaaaabab
abbbbaaaabaaaaabaababbaa
abbaaaaabbaabbabbbabbbbabbbabaaaabbbbaaaabbabbbababababaababbbbb
aaabaabbaaaababababbabab
aabaaaabaabbabbaabababaabbbbabaa
aaabaabbbabbaabbaabababa
abbbaaabbbbaaaabaaabbbab
abaaaaabaaaaabbaabbbaabb
baababbabbbaaaaaaabaaabbaababbaababbbaaabbaaabba
bababbbaaaaabbbbaabbaabbbbbababaabababaaababaaaa
baaabbabbababbabaabaaaab
bbbbaaaaaaaaaaabaaabaaabbaaaabbabaaabaabaabbbaaaabbabbabbabaaabbaabaabaaabaaabbb
aaaaababbbaaababbabbabbabbaabbbbaaaabaaabbaababbaaaabaaa
bbbabbbbaabbbbbabababbabbabbaaabbbaaabababbaabaabaabaaaababbbbabbbaaabbabbbaaaaaababbaab
abababbababbabbbabaaabbaabaabbababbaabbb
aabbbbababbbabbbbabbbabb
bbabbaabbbbaaaabaaaabaabaabaaaaa
aaaaabbaababbaaabbbaabba
abbaabaaaaaaabaababbabab
aaaababaaabbbabbbaabaaabaaabbbab
aabbabbbaaaababbaabababa
aaabababbaaaaaaababbabaaaabaaaab
aabaabbabbbbbaaaababbabbabbbbaaababbbababbabbabbabababbaaaabaaababaabaababaababbbaaaabaaaabaabba
abaaaaaabbbaabbaabbbbbbbbabbbbbabbabaaabaaabbbbaabaabbbabbbbabababbbbaab
aabaabababbbabababbbbbaa
bbabbababbbbbaababababbaaaaabbaa
babaabbabaaaabaaaabaaabb
abaababaabaaaaaababbbbbbbabbbababbabaaab
bbaaababaaababaaababbbabbbaabbbaabaabaababbabaab
abbaabaaaaabaaaaaaaaabba
bababbbaabababbbbaaabbaababaaaaababbaaba
aaaabaabaaaaabbaabbbbabb
ababaabbbabbaaaabbabbbab
babaabababbaaabaababbaab
aaabababababbbbbbbaabbaaababbbbabaabbbba
aaaaaaababaaaababbabaaba
bbbbbabaaaaababbabaabbaabbbbaabbbbabaabbabaabbbbaaabbbabbbbabababaaaabbb
aaabaabaaabababbbbbbbbaa
bbbbaababbabaabbbaaabbabababababbbabbaababaabbbb
baabbabbabaababbbaabbabbaaaababbabbbbbbb
baabaababaaabbabaaabbabb
bbbbbaabaabbaabbaababbbabababbaa
bbbabbaaababaabbaabaababaaabbabb
bbbaaabbaabbabbaabbbaaaa
abbbbbabbbabaaabbaaaabababbbaabb
aabbbaaabbbababbabaababaaababbbaababbaaabbbaaaaaabbabbbb
aabaaaabbbbbbbbaabbabbbbbbabaabbbabbbaabbbaabbbabbbabbbaabbaaaaababbbabbbaabbbba
aabaaababaaaaaaaaaabbaba
babaabaabbbbbababbbabbbb
bbabbbabbaaaababaabbbaababbaabaaaaabbbaabbbbaaabbbabaabaaaabbbbbbbaaabaabbbaaabbabbababbbaaaabbb
aaabbaabbbbaabbaababaaabaaabbaba
aaaabbbbaaabbbbaaabbbaababbaabaabaabbabbbbbbaaaababbbaaabbbbbabaaabaabbaabbabbaaaaaabaaa
bbbbaababbbbaababaaaabab
ababababbbbbbababbbbbbbbabbbbbba
bbbababbbbaabbaaababbaba
baabbbbbbbabbaaabaabbbabbbbabbaaaabbbbaaaaabbaabaaaaabaaababbbbabbbbaaababaaaaaa
abaabaaaabaababbbbbabaaa
bbbaabaabbbbabbababbaaba
baabaaabbbaaaaaaaaaabbbaababaaaaabbabababbbaaabaabbaaaaabaababbaaabbabaaabaaabbbabbaabbb
bbaabaababababbaabbababa
bbabaabbaabbbaabbaaababb
abababbbbbaabababababbbaabbababa
aaaaaaabbaaaaaaaaabaaaaa
aabbbbababbbaaabaaababbaababaabbaabaabbb
aabbaababbabbaabbababbbb
bababbbabbaabbbabbbbaaabaabbbbababaaabbb
aaabbaababaaaababbbbabbbbbbababa
aaaabaababaaabababaaababaaabaaab
aaaababaabbbabaaaabaabababbbbaaabbabbaaaaabbbbbabbaaaabb
aabbaababbbbbabaabaaabbb
bbbabaabbaaaaaaaabababaa
bbbbabbababbabbbbbaabbaabaababbabbbaabab
aaaaabbabaabbbbbabaaaaaaaaaabbababbababb
bbabbababaaabaabbaababbb
ababaabbbabbbbabbbaabbab
babaaabababbaabbbaabbaabbbbaaaba
abaabaaababaabbabbbabbbb
bababbbaababbbaaaabbaaaabbabbbababbaaaaabbbbaababaabbbaa
aaaabaababbbbbabbaaaabab
abbababbbbabbbaaabbabbab
abbababbaabbbbaabbbbaabbabaaabababbabbaaabbbaaaabbabaabbbbbaaaba
aabbbbbabaaabbbbaabaaaaa
bbbbabbabaabbabaababaaba
baaabbbbbbaababaaaaaaaaaaabaabbaaaaabbabaaababab
ababaabbaabbaabbbabbbbab
bbbaaaaaabbbababbabbbbabaaababbabaabbbbaabbabbabaaabbbbbaaabbaaaaabbabaaabaabaaa
aaabbbabaaabaababbbbaabaabaaaabbaaaaabaaababbbbababaabaa
aaabaabbaaaabababaaaabab
bbabaaaaaaabbbbabbabbaabaaaaaabbbbbbbbaa
abaaaabaabbaaaaaaaaababbbbbaabbaaabaabba
bbaabbbababbbbababbbaaba
aaabbaabaabbaaaabbbbbaaabbabbababbbbbaab
abbbabbbbbbbbbabaaaaabbaaabaaaababbbaaba
bbbaaabaaaabaababbbabaababbbaaabbaabbaabbbbbbaaabbababab
aaabbaabbbabbabbababbbaa
abaaabbaabaaaaabbabaaaab
baabbbbbbabaababbaabaaaa
baabbaabababbbababbabbab
bbbbaabbabbbabaaaaaababbabaaababbabbabaabbbbababbabbbabaabbabaaa
bbaabaabbbbaaaababababbbaabaabba
aaababbbbbbaabaabababaaa
babababbbbbbabaabaabbaababaaabbabbbbabbbbaaaabbb
baabbabbaaaaabbabbbabaaa
abbaaaaabbababaabaaaaabb
bbabaabbbaaabaaaaabbbbabbbaabbbaaaabaaabaabbabab
abababbababbbbaaabbaabba
aabbbbabbbbbbaababbbababbaabbbbbabaababaaabaaaab
bbbaaabbbaabbabbabababbababbaaaabbbbbaabaaabbbbabaabbbabaabaabbbbbbababaababbbaa
babababbaaababaabaabbbbbbaabbaabbbaabbbb
baaabbababaabbaaabbbbbaa
aabbbbbabbaabaabaaabaaaaaaabbbaa
bbaabaabbbababbbabaabaab
aababaabaabaaabbaaababbbbbbabbbbaabaabba
bbbaaabbbabbbbabaabbbaaaabaababaabbbbbaa
bababbababababbaaaaaaaba
aabbbaabbbabbaaababbbbabbabbbbbbbabbbaaa
bbbaaaaaaaabaaaabaaababb
bbaaababbbbbbabaabbbbaba
baaabbbbbbbabbaaabbabbaa
abaababbabaaaaaaaaabaaaabaaaaabaaaaabbabbbbababa
baabaaabbbbbababaaabbbabbbaaaaab
aaababaababbbbaaabaababa
aababaabaaaaaaaaabbababaaaababbbbbbbbabb
baaabababbbabaababbbbbbb
babababbaabbbbabbabaaabb
bababbbabababbbabaabbbab
baaabbaabbbbbbabbaabbbab
ababbbbbbabbaaaabbbbabaa
baabbbbabbbbbbaabababbabaababababababbaaababbaaaabbbabbabbabbaaabbbababa
babaabbabbabbaaabbabbabbbabbababbbbbbbaa
aaaababababaaabaaabaaaabaababaaabbaabbbabbbabbaaaaaabbbbbbbabbabbbabaabaaaababbbabababaaaabaabaa
abbbbaaabbbbbababaaaabbabaaabaabbabbbaab
aaaaaabbbbaaaaaabaaaaabb
aaaaabbabbaabbbbaabbbbaabbabaabbaabababbaaaaabbbbbaaaaaabbbbaabbabbabbababbaabaa
babababbabababbbaaabbaba
bbabbaabbbbbbaaabbaabbbaababbaab
bbaabbaaaabbbbbbaabbaabbbabbbaaa
abbaabaaabaaababbbaaabba
abaaaaaababaabaaababbabb
baaabaabbbbabbaabaabaaab
babbabbbaaaaaaabbbbaaaba
aaabaabbbaaababaaabaaabaaabbabbababaaaab
bbbaaaabbbbaabbbbaabbabaababbbbaaaaaabbabbaabbbabbbbabab
abaaabbaabbbbbababbabaaa
aaababaabbbaabbaaaaaabaaabbabbba
ababbaaabbabbaaabaabaabbaaabaaaaabbaabba
ababbbbbbbaabaabaaabaabbabbaababbbbaabbb
babbbbbbaababbbbbabbaaba
bbbaaaabbabababbabababbb
babbbbaabababbbaabababbababaabaabaaaabbbbbaaaabbaabbabab
abbbbababbbbbbbabbbbaaababbbbababbbbabbaaabbabbbbaababbabbabababbbabbabbabaaabbabbbbbaaa
abbbabbaaaababababaabbaabbaababaabbaaabbabbaabbb
aaababaaaaabbaabbbaaababbaabbbbbbbaabaaababaaaab
aabbaabbabbbbaaababaaaaa
bbbaabbaabababbababbabbbbaaaaabbbbaaaabb
aabbaaababaaabaaabaabbbbaaabbbab
baaaabbabbaabababbaaabba
aabbbaaaaababbbbbaaabaaa
aababaababbaabaabbababaabbababbaaabbabba
bbaabbaaababbaaababababa
abaababbbabbabaaababaaaa
aaaaabaaababbbabbbbbbaab
bbbababbbbbbbbbabbabbbab
bababbabbababbbaababbbbbaabbaaab
aaaaaabbaaaabaabaabaabba
babaabbabbaabababbbaabaaaaabbabb
bbbaaabaabbabababbbaaaba
aabbbbbbaabbbabbbbaaaaabbabbbaabababbaba
abbbabbaabaabaabaaabaaaa
abaabaaaaaabbbbaaaababaaaababbbabbaabaabababbaababbabbbbbbabaaba
bbabbabbababbaaaabaabbbb
aabbbababbbaaaaabbbabbaaaaabaaabaaabaaabbbaababbbaaabbaabbbbabaaaabbaaabbaaaababbaabbbbb
ababaaabbababbabbabaaaaa
abaaaaaaabbaabbbaabbaababbbbbbab
aaababbabaabbbbbbbbaaabbbabbbaab
aabbaabbbaaabbababaabababbaaabbbbbbaabab
bbaaaaaabbbbbabaaabaaaaa
abababbbaaaaabaabababaab
abaaabbaaabbbbabaaaabbab
abbabbaabbabbbbabaaabbabaaabaaababaaaaabaaaabababbabbaba
bbbabbaaabaaabbaabbbabbababbaabb
babbbabaababbabaaabababbbbabaaaabbbaababbaaababb
aabaaabaaabbbaaaababababaaaabbab
bbbaaaabbababbbaabbabaab
aaabababaabaaabbbaabbbba
baababaabaaabaabbaabbabaababaaaabbbbabab
aabbbabbaabbbaaaaabbbbbababaaabababbbaaa
abaaabababaaaabaaaabbaba
aaaababbbaaaaaaaabaaaaaaaababbaaabbaaaab
bbabaabbababbaababababaaabbbbabb
ababaabbaaaaabbbbbaaabba
ababaaabbaaabbaababbbbbbabbaabba
bbbbbabbabbabbbabbabaababbbbabbabbbabababbaababbaabaaaaaabababaababababb
abaaabbaabbaaaaaababaaaa
baabaabbbabaabaabbbaabbabaabbbaabbaababbaaabaaab
baaaabbaababbbbaababbaba
aabaaabaabaaabbaaaabbbbaaabbbbaa
baaababaaaabaaaababaaaab
bbaababbabaabaabbbaabaabbbbaaabbabbabbbbbabbaabbbbbaaaababbbaabb
bbbababbbbbaaabbbabbaaaababbbbbbaaabbbabaabbabaaaaabaaba
bbabaabbbabaabbbaabbaababbbaabbbbbaaaabb
abaabaaabbaabaababaabbbb
abaaabaaaabbabbbbbabababbaabababbbbababbaababbbbaaaaaaaaaaabaaabbbaaaaababbababb
bbbaabbabbbaabbbbabbabab
bbbaaaaaaabbbabbaaaabbaa
aaaabbbbababaaabbbbbbaabbabaabbabbaaabaaababaaaaaaaaaaaa
bbaaababbaabaabbbaaabaabaabbbbaaababbaab
aabbbaaabaaabbaabababbba
bbaaababaaaababbbaaabaabbbbababa
bbbaaaaabbbbbbabaabbabbbabbabbbb
baaababaaaabababaaaabaaabaabbabbababbbabaaaababbaabaabbbaaababbbbbbaabaabbaababababbbbbb
bbbbbabbaaaaabbaabbaaaaaabbbabaabbbbbbaa
baaaabbabbabbaabbaabaaaa
abbaaaaabbbbbbbabaaaabbaabaaaabb
abbaabaabbaaabbaabbaaaabbaaaaabaaababbbbbbbabbbaaaabbbabbbbabaaababbabaaaabaabbbbbbababb
baabaaaababaaaabbabbbabb
baababbababaabbabbbabaaa
bbaabbbaaaaaabaaabaaaaaabbbaaaaaabaababbababaaaaaaaabbabbababbaa
bbbabbaaaabbbbababaaaaaaabaaaaaaabababbbbbbababa
bbaabababbbaaaabaabbbbbabaabaabaabbbbabbabaaaabb
abababababaaaaaababbbbaaaabbbbbbaababbbaaabaabbbaababbaaabababaa
abaabbaababbaaaababbbaab
abbbbaaaabababbabbabbaabababbaaabbaaabba
bbaaaaabbabbabaabbabbaaaaabbabababbaaaabababbbbabbaaabbbbabababa
bbbaabaabababbabaabbaaaababaaaabaabaaabaabbbaabbaababbababbbaaabbbaaaaba
aaabbaabbaaabbbbbaabaabaaabbbaaabbaabbaabaaaaaaaabbaabba
baaabbbbaabbaabaaaabbaaa
bbabaaaabaabbababbbbbbbaaabbbaaaaabaabbbbabbbabb
abbaaabaaababaabbabbbaba
abbbaaabbaabbababbbbabab
babaabaaabababababbaabba
bbabaaaabaabbaaabaabbaaababaabaababbabbbbaaaabaaababbbaaabbaabbaaaabbabaababbababbbbbbaa
babaaaaabababaaaabbbaabbaaababbbaabbabbbbaaaabba
aabababaabbbaabbbabababbaabbbbbabaaaaababaaaabbbabaabaaaaaaaabaaaaaaaabb
baabbbabaaabbaabbaaaababaabbabbbbbbaabbbbaaabbaaaaaababbbbabbbbabaabaaaabbaabbbaabaaaabbbbaabbbb
aaabbaabbaababbaaabababa
bbaaababbbaaababbbaaababaaababaabaaaaabaaabababbaababbababbabbba
aabbabbbbabbbbaababbbaaa
abaabaaabaaaaaaabbaabbabaaaaaaabbbbabbaabbabbbab
ababaabbbabbabaaabbbaaaa
abaabbaaabbaaabaaaaabaaa
bbbaabaabbaabaabbaabbabbbbbaabbaaabaaaaa
babbaaaabaabbaaaababbbbbbbbbaaaa
bbaaaaabbbababaaaaaaaaaa
abbbabbbbbabaaaaabababab
baabaabbbaaabababababaaa
aabaabaaabbbbaababbaaabbbbaaabbbabbbbabaabbbaaba
babbaaaaaaabaabbbbbbabaa
ababaaababaabbbbbaabbbbabbabaababaabaaaa
abbbabaaaabbaaaabbbbbbbabbaababb
bbbabbbbaaabbabbbabbabba
baababbaababbaaaaaabbbbb
abaabaaaaaaaaabbbbaababaabaaaaaaaaabaaba
baaabbbbaabbabbbbbbbbaabbaaababbaabbabab
bbbabbaababaaababbaabaaa
abbabbaaabbbaabaaabaabaa
ababaaabbaaabbaabaaaabbb
abaabbaaabaaababaaaabbaa
baababaaaababbbbabbabbaa
bbbbaababbababaaabbbbaab
aababbbabbbaaabbaabbabbbaaababbabbabbbba
abababbaababbaaabbbaabaababababbbaaabbaabbaaaaaaaabbaaababbbbbba
aaaaaabbbaaababaaaabbaaa
abaabbaaaababaabbababbbabbbbabbb
aabbabbbaababbbbbbbbaabbbabbabbbbaaababb
babababbaaabbbbabbbababa
aababaaabaabaabbbabbaaaababaaabb
bbbbbaaababaabaababaaababaaaabbaaaabbabb
bbbaaabbbbabbabababaabbbbbaaaaaaababbbababbbbbaaabaabbbabbbaaaba
aaaababaaabbbabbabaabbbb
babaaabaabababbaababaaaa
abbaabaabbbbbaabbaaaaabb
abbbbabaaabaaaabbabbaabaaaaabbab
abaaabbaaabaaabaababbabb
abbbbbabaabaababbaababbaaaabaaab
bbabbababbaababbbbabbbbabbabaabbbbaabbabbbabbabbaabaabbbabaaaaababbababbaaababababbabbab
bbbbbaaaabaabbaaabaaaabaaaaaaabbbaaaabaaabbababbaaabaaba
bababaaabbbbabbaababaaabbbababbaababbaaaabbaabbaaaabbbab
bbabbabaaaabaabbbabbabbbabbbaaba
ababaaabbaababaaaaaaabbabaaaaabaaabbabab
bbbaabbaababbbbbaabbbaabbbbaabba
baaabaabaaaababbabaaabaababbaabaabaabbbaabbaabbb
abaaabbaabaaabaabaabababaaaabbababaabbabababbaabbaaabaab
abbaaaabaababbabababaaba
bbbabbbabaababaaaaaabbababbabbbaaaabbbab
bababbabbbabbabaaabbbbbabaabaaaa
abababababaabaaabbabaabbababbbaa
bbbbaabbaabbaabaabbbabaabbabbaaabbaaabaa
aaababaaaaabbbbabaabbbba
babbbbabbbaaaabaabbababa
abaababbaabbaaaaaabaabaa
abaabbaabbabaabbbbaabbbaaaaaabbbbaabaaabbababbaa
abbaaaaaaabbbbababababbbaaaaaaaa
baaaabaabbabbbaaaaaaaabaaaabaabaaabbbabbaaaabbbb
aaaababaabbbabbabaabbaaabbbabbbababbbaab
bbaabaababaabaaaabbbabaaabbabbab
bbbbabaababbbaaaabbaaabaaabababababaaababbaaaabbbaaababa
abaabaaaaababbbbbaaabbba
baabbabbbabbbbabbbbbbbbbaaaaabbaabaaabbabbbabbba
babaabbaabbbbbaababbbabbaabaabbaaabbabaa
abbbbbabaaaabaabbbbaaaaaabbbababbaabaabababaaabbaaaaaaaaabbbbabb
ababababbaaabbbbbbbbabaa
abaaaababbbabbaaabbabbab
aabbaabbbbbaabaabbbababa
baabbaabbabbbbaaaabababa
babbaabbbbbbababaabbbbabaabaabbaabbbaaaaabaabbab
abbabbbaabbaabbababbbaababbbbaab
bbbbbbbaaabbabbbaaabbaba
babbaabbabbbaaabbbaabbbaabababbbaabaaabbaaabbabb
bbaaaababbbbbaaabbaaabba
aaaabababaabbaabbabaaaaa
bbabaaaaaabbbaabbabbbbbbbbbabbaabaaaaabbaabaabbb
aabbbbabbabbbbaabaaabbbbababaabaabaabbbbbaabbbba
aaababaabbbababbbbababab
baaabbbabaaabaaaaababbaabbaaabba
baabaabaababbaaabababbbb
baababbabaaaaabaaaaabaabababaaabbabbbbabaaaaaabaaaaaababaabaabba
aabaaabbaababaabaaabaaab
babababbbbaaaabaabbaaaab
bbbaaabbbbabaabaaaaabbab

12
2020/day19/test Normal file
View file

@ -0,0 +1,12 @@
0: 4 1 5
1: 2 3 | 3 2
2: 4 4 | 5 5
3: 4 5 | 5 4
4: "a"
5: "b"
ababbb
bababa
abbbab
aaabbb
aaaabbb

47
2020/day19/test2 Normal file
View file

@ -0,0 +1,47 @@
42: 9 14 | 10 1
9: 14 27 | 1 26
10: 23 14 | 28 1
1: "a"
11: 42 31
5: 1 14 | 15 1
19: 14 1 | 14 14
12: 24 14 | 19 1
16: 15 1 | 14 14
31: 14 17 | 1 13
6: 14 14 | 1 14
2: 1 24 | 14 4
0: 8 11
13: 14 3 | 1 12
15: 1 | 14
17: 14 2 | 1 7
23: 25 1 | 22 14
28: 16 1
4: 1 1
20: 14 14 | 1 15
3: 5 14 | 16 1
27: 1 6 | 14 18
14: "b"
21: 14 1 | 1 14
25: 1 1 | 1 14
22: 14 14
8: 42
26: 14 22 | 1 20
18: 15 15
7: 14 5 | 1 21
24: 14 1
abbbbbabbbaaaababbaabbbbabababbbabbbbbbabaaaa
bbabbbbaabaabba
babbbbaabbbbbabbbbbbaabaaabaaa
aaabbbbbbaaaabaababaabababbabaaabbababababaaa
bbbbbbbaaaabbbbaaabbabaaa
bbbababbbbaaaaaaaabbababaaababaabab
ababaaaaaabaaab
ababaaaaabbbaba
baabbaaaabbaaaababbaababb
abbbbabbbbaaaababbbbbbaaaababb
aaaaabbaabaaaaababaa
aaaabbaaaabbaaa
aaaabbaabbaaaaaaabbbabbbaaabbaabaaa
babaaabbbaaabaababbaabababaaab
aabbbbbaabbbaaaaaabbbbbababaaaaabbaaabba

107
2020/day20/day20.rkt Normal file
View file

@ -0,0 +1,107 @@
#lang racket
(module+ test
(require rackunit))
(define (read-input filename)
(define tiles-str (string-split (file->string filename) "\n\n"))
(for/hash ([str tiles-str])
(parse-tile str)))
(define (parse-tile str)
(define tile-id
(string->number (cadr (string-split (car (string-split str ":\n"))))))
(define tile (string-split (cadr (string-split str ":\n"))))
(values tile-id
(for/set ([s (in-list tile)]
[i (in-range 10)]
#:when #t
[x (in-string s)]
[j (in-range 10)]
#:when (eq? x #\#))
(list i j))))
(define (get-tile-edges tile)
(define edges-lists
(list (for/list ([k (in-range 10)])
(if (set-member? tile (list 0 k)) #\1 #\0))
(for/list ([k (in-range 10)])
(if (set-member? tile (list k 0)) #\1 #\0))
(for/list ([k (in-range 10)])
(if (set-member? tile (list 9 k)) #\1 #\0))
(for/list ([k (in-range 10)])
(if (set-member? tile (list k 9)) #\1 #\0))))
(define reversed-edges-lists (map reverse edges-lists))
(map (λ (lst) (string->number (list->string lst) 2)) (append edges-lists reversed-edges-lists)))
(define (get-neighbours tiles)
(define neighbours (make-hash))
(for* ([(tile1-idx tile1) (in-hash tiles)]
[(tile2-idx tile2) (in-hash tiles)]
#:unless (= tile1-idx tile2-idx)
#:when (not (set-empty? (set-intersect (get-tile-edges tile1) (get-tile-edges tile2)))))
(hash-update! neighbours tile1-idx (λ (ns) (set-add ns tile2-idx)) (set))
(hash-update! neighbours tile2-idx (λ (ns) (set-add ns tile1-idx)) (set)))
neighbours)
(define (part1 filename)
(define tiles (read-input filename))
(define neighbours (get-neighbours tiles))
(for/product ([(tile-idx tile) (in-hash tiles)]
#:when (= 2 (set-count (hash-ref neighbours tile-idx))))
tile-idx))
(module+ test
(check-equal? (part1 "test") 20899048083289))
(module+ main
(displayln (part1 "input")))
(define (display-tile tile)
(for* ([j (in-range 10)]
[i (in-range 10)])
(when (= i 0)
(printf "\n"))
(if (set-member? tile (list i j))
(printf "#")
(printf "."))))
(define (rotate tile)
(for/set ([x (in-set tile)])
(list (- 9 (cadr x)) (car x))))
(define (flipx tile)
(for/set ([x (in-set tile)])
(list (- 9 (car x)) (cadr x))))
(define (flipy tile)
(for/set ([x (in-set tile)])
(list (car x) (- 9 (cadr x)))))
(define (all-transformations tiles)
(define r1 (set-map (hash-values tiles) rotate))
(define r2 (set-map r1 rotate))
(define r3 (set-map r2 rotate))
(define s (set-union (hash-values tiles) r1 r2 r3))
(list->set (set-union s
(set-map s flipx)
(set-map s flipy))))
(define (edge tile side)
(define side-fn (match side
[1 (λ (k) (make-rectangular 0 k))]
[-1 (λ (k) (make-rectangular 9 k))]
[0+1i (λ (k) (make-rectangular k 0))]
[0-1i (λ (k) (make-rectangular k 9))]))
(string->number
(list->string (for/list ([k (in-range 10)])
(if (set-member? tile (side-fn k)) #\1 #\0))) 2))
(define (find-corner tiles)
(define neighbours (get-neighbours tiles))
(define corner (for/first ([(tile-idx tile) (in-hash tiles)]
#:when (= 2 (set-count (hash-ref neighbours tile-idx))))
tile))
corner)
;; Too boring, cheated

1728
2020/day20/input Normal file

File diff suppressed because it is too large Load diff

107
2020/day20/test Normal file
View file

@ -0,0 +1,107 @@
Tile 2311:
..##.#..#.
##..#.....
#...##..#.
####.#...#
##.##.###.
##...#.###
.#.#.#..##
..#....#..
###...#.#.
..###..###
Tile 1951:
#.##...##.
#.####...#
.....#..##
#...######
.##.#....#
.###.#####
###.##.##.
.###....#.
..#.#..#.#
#...##.#..
Tile 1171:
####...##.
#..##.#..#
##.#..#.#.
.###.####.
..###.####
.##....##.
.#...####.
#.##.####.
####..#...
.....##...
Tile 1427:
###.##.#..
.#..#.##..
.#.##.#..#
#.#.#.##.#
....#...##
...##..##.
...#.#####
.#.####.#.
..#..###.#
..##.#..#.
Tile 1489:
##.#.#....
..##...#..
.##..##...
..#...#...
#####...#.
#..#.#.#.#
...#.#.#..
##.#...##.
..##.##.##
###.##.#..
Tile 2473:
#....####.
#..#.##...
#.##..#...
######.#.#
.#...#.#.#
.#########
.###.#..#.
########.#
##...##.#.
..###.#.#.
Tile 2971:
..#.#....#
#...###...
#.#.###...
##.##..#..
.#####..##
.#..####.#
#..#.#..#.
..####.###
..#.#.###.
...#.#.#.#
Tile 2729:
...#.#.#.#
####.#....
..#.#.....
....#..#.#
.##..##.#.
.#.####...
####.#.#..
##.####...
##..#.##..
#.##...##.
Tile 3079:
#.#.#####.
.#..######
..#.......
######....
####.#..#.
.#...#.##.
#.#####.##
..#.###...
..#.......
..#.###...

59
2020/day21/day21.rkt Normal file
View file

@ -0,0 +1,59 @@
#lang racket
(module+ test
(require rackunit))
(define (read-input filename)
(map parse-food (file->lines filename)))
(define (parse-food str)
(define match (regexp-match #px"(.+)\\(contains (.+)\\)" str))
(list (string-split (cadr match))
(string-split (caddr match) ", ")))
(define (find-allergens foods)
(define h (make-hash))
(for* ([food (in-list foods)]
[allergen (in-list (cadr food))])
(define s (hash-ref h allergen (list->set (car food))))
(hash-set! h allergen (set-intersect s (list->set (car food)))))
(unique-allergens h))
(define (unique-allergens h)
(if (for/and ([(k v) (in-hash h)]) (= 1 (set-count v)))
(for/hash ([(k v) (in-hash h)]) (values k (set-first v)))
(begin
(for ([(k v) (in-hash h)]
#:when (= 1 (set-count v))
[(other-k other-v) (in-hash h)]
#:unless (equal? other-k k))
(hash-set! h other-k (set-remove other-v (set-first v))))
(unique-allergens h))))
(define (part1 filename)
(define foods (read-input filename))
(define allergens (find-allergens foods))
(define all-ingredients (apply append (map car foods)))
(define allergen-ingredients (hash-values allergens))
(length (for/list ([ingredient (in-list all-ingredients)]
#:unless (set-member? allergen-ingredients ingredient))
ingredient)))
(module+ test
(check-equal? (part1 "test") 5))
(module+ main
(displayln (part1 "input")))
(define (part2 filename)
(define foods (read-input filename))
(define allergens (find-allergens foods))
(define allergen-ingredients (for/list ([allergen (sort (hash-keys allergens) string<=?)])
(hash-ref allergens allergen)))
(string-join allergen-ingredients ","))
(module+ test
(check-equal? (part2 "test") "mxmxvkd,sqjhc,fvjkl"))
(module+ main
(displayln (part2 "input")))

36
2020/day21/input Normal file
View file

@ -0,0 +1,36 @@
smfnh svztk rqqf sfhvsx xctnhp bvn krv gkcplx ngpq hmhll dq mqr vnvgrb xbp dqsbql dlx mgvr cqvpp nqfjgtsj zscj jbndg gz xrkckp srzsljf mzmph gbxk mvqkdj frkpm vnhn sjfcj rgfx fjbqn lvrsl dvvsn rgpbkp vhdzgz pvq ktlh pzvvlgt knpp sbpkr bbzn rrjjt tsfx brnsf gfxb qmcj fdfr glllxz cmkqcs fctjm fmrdsr xmrd bpdfhd cjxgg gszbq gtqsr ftds qrdtdv vjmfl phbhgqh nbhpx sjlk xhzj kmfj xdsxjv hcrz xzxth xxcq kpnl pbhvldj msfmt sttj fdrzd bprg jdbpd hbhsx dfllj frvs fltn xxgp vlhnhf ggsz dmxdkc qbrqsr cgbgf gbgf szp zrtfglg (contains nuts)
msfmt vcnrl tsfx dqsbql hcxhl nbhpx vjmfl fltn gfxb cmkqcs knpp lcqn srnbhq zrtr xg gspk gvnj mvqkdj vhchvg ggsz bpxggt kmfj gkcplx nlh xjggx jbndg fjbqn dq svztk lcrpq xhksjm sqzhc rgfx gbxk lttlx ssbrn xlkm fcps kkkt ppdplc lxkbs frkpm fjvf hbhsx hnxc (contains soy)
gz fjbqn xqxgc xbp lcrpq vnhn ftds gszbq qbrqsr nkmxp zjg hnxc hbhsx sjfcj svztk ggsz nvsd rgfx mzmph tllxsfs dvvsn mvqkdj brnsf rqlljq rqqf vbn jbndg tclx ppdplc lxkbs szp gkcplx sqzfbq sqxsf mqr fmrdsr ktv hcxhl jbmlk ktlh ppskx kkkt cbpx zsxfl cdrm tbhxh drnrd nx gspk nmdv kvgbhx fjvf xjggx dqsbql lvrsl ndtf zbjtv (contains fish, eggs)
gbgf xhksjm xg zscj nbhpx xzxth sqzfbq sfhvsx vnvgrb phbhgqh kctf tsfx fkfr pzvvlgt nqfjgtsj bhtxd qmcj hbhsx zbjtv jbndg xxgp smscxzt gfjqxx cbpx zsxfl tfd qbrqsr phbrht nmdv zgvqnlv ppdplc bxpdm xbsps rrjjt cqvpp zrtr xvrvnt vdnvf lttlx qjjxv mvqkdj ndtf prrpm tmkc tllxsfs cgbgf fjbqn hnxc frkpm gszbq rqlljq lhtqk ngqg ppskx knpp xqxgc fnmx msfmt gvnj pbhvldj kmfj rqqf hdmpps ktlh glllxz ssbrn zrtfglg hcrz dqsbql frvs cjcvh vnhn ggsz fdfr vhchvg tclx fjvf (contains soy)
sbpkr hbhsx gszbq lgxx hmhll tsfx cqvpp gkphjq nvsd tfd fzrfrs fvgpcjh dfllj drnrd xg hcxhl vjmfl mvqkdj ndtf dvvsn ngpq gkcplx fkfr xmrd lttlx qmcj dqsbql fdfr msfmt sqxsf sttj nkmxp nbhpx pvq cjxgg jbmlk xjggx xhzj fdrzd ktv kmfj vhchvg frkpm mqr rgfx mzmph srnbhq pbcptj zscj cgbgf sqzhc ppdplc xvrvnt ssbrn tmsn ktlh bprg cmkqcs lcqn cdvdt lvrsl rgpbkp smscxzt cdrm tclx xzxth xbsps xlkm srzsljf tmkc zrtfglg gvnj krv gxgbkd dfkt npjrb xbp vdnvf zgvqnlv pbhvldj (contains dairy, fish, eggs)
vdnvf kkxq sttj mhzdcc srnbhq krtlhc fjbqn fjvf mvvbb vhchvg lgxx cqvpp lxkbs ggsz xjggx jbndg rqqf qrdtdv lttlx bhtxd xdsxjv nbhpx mvqkdj dfllj ndtf hcrz gtqsr ftds fnmx rrjjt fvgpcjh szp tmkc brnsf vbn frxfc zscj bxpdm dqsbql xhzj bpdfhd kddggl fhhq sjlk prrpm hdmpps msfmt gbxk phbhgqh xmrd vpsv zsxfl xzxth xvrvnt gkcplx kctf xxgp xg fzrfrs fspk kvgbhx cjcvh lcqn ppskx zrtfglg drnrd dfkt hnxc fdfr rqlljq tclx gszbq cbpx hbhsx gspk ngpq bpxggt ktlh gbgf xqxgc kxmgm (contains wheat, fish, soy)
fdfr vpsv kkkt kctf kkxq drnrd prrpm kmfj gz qjjxv vhdzgz dqsbql bxpdm fqrtvrv qbrqsr dfllj cdrm vlhnhf tclx ktlh sjlk lhtqk vhchvg pzvvlgt pvjd lttlx tllxsfs sqzhc bvn xdsxjv mzmph cmkqcs xxcq blbl sqzfbq frkpm ggsz fkfr jdbpd cqvpp zjg vjmfl gbxk mvvbb mhzdcc ngqg ndtf llhld cjxgg pbcptj fmrdsr ppdplc msfmt dlx zrtfglg mvqkdj ccxlqzv gkcplx brjx fspk fvgpcjh jsmpg pvq fdrzd smscxzt xvrvnt rgpbkp gtqsr lpgptlj hdmpps fzrfrs zgvqnlv (contains shellfish)
gspk vdnvf lcqn fqxcjh jdbpd tsfx kkxq hmhll vhchvg gxgbkd xzxth krtlhc krv jbndg fdfr ggsz dqsbql xqxgc fkfr mgvr zscj sqzhc svztk gkphjq vpsv glllxz srnbhq ngqg gkcplx kvgbhx cbpx zrtr hpqf hdmpps cmkqcs ppdplc srzsljf gcch sqzfbq fctjm pvjd qfktb cdrm cgbgf xbp cjxgg kkkt lttlx vnvgrb xxgp hrbbhg msfmt mvqkdj dq gfjqxx ktv hcxhl tbhxh drnrd nmdv hcrz ktlh (contains dairy, eggs, sesame)
sqzhc vdnvf krv nkmxp pvq dq fvgpcjh dfkt xmrd fjvf vpsv xdsxjv zrtr zjg xhzj zgvqnlv nbhpx fnmx tfd ppdplc xhksjm ktlh pzvvlgt msfmt xg dqsbql hrbbhg gszbq cjcvh rqqf mzq ndtf gtqsr cdvdt mvqkdj vnvgrb hpqf lpgptlj gkcplx srzsljf lcrpq jbndg gcch fltn gbgf fhhq hbhsx fqrtvrv xbsps gbxk vjmfl xbp hcxhl llhld rggl zsxfl kvgbhx frxfc xxgp (contains sesame, wheat)
dnkcf fqrtvrv cmkqcs ktlh pbhvldj blbl nx xmrd vlhnhf rqqf gkcplx hcxhl nmdv brjx tllxsfs hbhsx frxfc hdmpps qfktb lcrpq mvqkdj smscxzt qjjxv zsxfl frkpm lttlx ppdplc vhdzgz fctjm ndtf kkxq gkphjq ggsz ktv xctnhp fkfr zscj dqsbql xzxth xbsps brnsf tclx tbhxh jsmpg vjmfl xxcq lgxx kvgbhx llhld (contains shellfish, sesame, fish)
zrtr frxfc mvqkdj zrtfglg nx hbhsx phbrht nlh brjx ssbrn pvq sqxsf jbmlk jzjb jshns nkmxp fdrzd hcxhl pgtrjst mgvr qjjxv ggsz xlkm smfnh srzsljf vnhn fctjm rqlljq fqrtvrv lttlx bpdfhd sttj nmdv dfllj knpp ktlh frkpm zbjtv tllxsfs fjbqn fvgpcjh zscj fjvf vjmfl xxgp xg msfmt fnmx llhld vdnvf phbhgqh mhzdcc xzxth sqzhc xmrd hcrz xctnhp ktv vlhnhf gkcplx qvxntmh dqsbql tbhxh gcch hdmpps ngqg glllxz fmrdsr sfhvsx dmxdkc (contains eggs, soy)
ccxlqzv ngpq qmcj hcrz nkmxp fspk rxtp gcch ktv vcnrl rgfx llhld sqzhc jbndg ssbrn pzvvlgt prrpm xqxgc rkgb lpgptlj srzsljf fltn srnbhq fjvf mqr krv dfkt fdfr glllxz jdbpd npjrb ktlh dnkcf pvjd hbhsx cjcvh dmxdkc xrkckp qfktb rqlljq dqsbql ggsz tmsn phbhgqh kctf mvqkdj szp gkcplx gbxk qvxntmh fnmx vnvgrb nqfjgtsj gvnj tfd nlh ppdplc pvq bbzn lttlx bpxggt lgxx xxgp hdmpps cjxgg gfxb kxmgm knpp brjx (contains wheat)
nkmxp hbhsx frkpm tfd vlhnhf mgvr fdfr mqr zjg tsfx xdsxjv vnvgrb fqxcjh vcnrl llhld lpgptlj sfhvsx rgpbkp fzrfrs xrkckp qmcj bvn gkphjq lcqn pvq xhksjm smfnh ggsz vbn gfxb cqvpp bxpdm xmrd fcps pbhvldj msfmt qfktb mzq rggl fltn ppdplc fjbqn xzxth ppskx gfjqxx fdrzd nx gvnj ktlh srnbhq xbp fnmx qsx jbmlk hmhll vhchvg xbsps krv dqsbql sqzfbq xctnhp gkcplx lxkbs ssbrn szp pvjd blbl fhhq (contains wheat)
fltn frxfc qrdtdv gkcplx jdbpd phbhgqh mhzdcc dfllj mvqkdj sfhvsx rggl zrtfglg nqfjgtsj gszbq hcrz sqxsf fzrfrs kpnl ppdplc pbhvldj llhld fjbqn kkxq ssbrn qsx phbrht gvnj cjcvh fcps fqrtvrv xctnhp hbhsx zscj smscxzt dlx fjvf msfmt vjmfl xvrvnt dqsbql gcch ndtf rxtp kmfj gspk dnkcf sjfcj lcqn ggsz zsxfl jshns (contains nuts)
qfktb fqxcjh cjcvh cdvdt hcxhl mvvbb hcrz glllxz nqfjgtsj sqzhc nbhpx zjg xmrd pgtrjst tmkc vnvgrb cgbgf lttlx ppdplc sjfcj dvvsn gszbq dmxdkc kxmgm dq brnsf fjbqn vdnvf qrdtdv ggsz vcnrl cbpx phbhgqh pvq jsmpg sttj mvqkdj xbsps sqxsf ktlh xdsxjv bpdfhd vhchvg tfd lvrsl xzxth lcqn qbrqsr hpqf nlh krtlhc lgxx zbjtv ccxlqzv rxtp zrtfglg nmdv ftds msfmt xhksjm gkcplx dqsbql mzmph tbhxh srzsljf jzjb cmkqcs gbgf dlx srnbhq lpgptlj rrjjt (contains shellfish, eggs)
dqsbql lcrpq ftds hbhsx brjx fqxcjh llhld msfmt drnrd gfxb xbsps nvsd gkcplx xvrvnt zscj gtqsr tfd qsx ngqg fqrtvrv phbhgqh dnkcf gz xg qjjxv sqzfbq jdbpd sbpkr mzmph ssbrn hmhll cqvpp xqxgc cjxgg krtlhc smscxzt gxgbkd mvqkdj xdsxjv brnsf vhchvg lcqn kxmgm qvxntmh pbhvldj ktlh cdvdt dq szp ppdplc dfllj fvgpcjh fdrzd knpp kpnl tmsn nqfjgtsj rggl jsmpg xzxth cdrm bpxggt vjmfl cgbgf rkgb xhksjm nlh dfkt sqxsf (contains fish, eggs)
xrkckp nlh ktlh gfxb jbndg zscj rqlljq xctnhp nkmxp vhdzgz gfjqxx mgvr fdfr sqxsf bxpdm gkcplx fmrdsr msfmt smscxzt krv fqxcjh kpnl cgbgf npjrb prrpm qbrqsr ppskx gxgbkd mvvbb ggsz gcch ppdplc gszbq lttlx fspk dqsbql dfkt bpxggt szp rggl fltn tsfx bvn fnmx lpgptlj mzmph svztk gbgf mqr xg lcqn mvqkdj pgtrjst phbrht fhhq cbpx glllxz qjjxv kctf brnsf drnrd sjlk kkkt (contains sesame, shellfish, dairy)
ngqg mvqkdj gkphjq dlx dqsbql ktlh rqlljq bpxggt vnhn srnbhq frxfc fspk frvs kctf lxkbs jzjb glllxz rgfx pbcptj fnmx xxcq bprg ppskx rqqf qvxntmh cmkqcs rggl jdbpd fjbqn frkpm mzq hpqf sqzfbq llhld xqxgc vnvgrb tllxsfs zscj lvrsl ngpq vhdzgz nlh ppdplc gz zgvqnlv bvn gspk jsmpg fzrfrs fkfr rrjjt msfmt cjxgg krv vhchvg ggsz npjrb smscxzt gtqsr kddggl hbhsx kpnl xg sbpkr tmsn nkmxp xjggx nbhpx jshns cjcvh (contains shellfish)
ppdplc dqsbql brjx ktlh xrkckp kpnl zrtfglg svztk dfkt mhzdcc xmrd kddggl sjlk nkmxp jshns xvrvnt zbjtv xdsxjv mvqkdj glllxz vlhnhf hbhsx hrbbhg fdrzd xg pbcptj xbp rkgb ngpq msfmt lttlx fdfr llhld dmxdkc krv cdvdt rggl qjjxv xxgp vbn sbpkr gvnj vnvgrb pbhvldj vjmfl dq srnbhq mvvbb gkcplx vnhn bvn jbmlk xzxth krtlhc fjvf kxmgm dvvsn vpsv rxtp cgbgf nmdv (contains nuts)
pgtrjst ktlh fmrdsr llhld pbhvldj dfllj lvrsl xqxgc ppdplc rqqf lcrpq nlh vnhn cdvdt msfmt hmhll zbjtv ktv fspk tclx fdfr prrpm lgxx sbpkr dfkt qrdtdv sjfcj vhdzgz dlx cqvpp xhzj vhchvg tllxsfs fctjm mvqkdj bbzn qjjxv vjmfl sttj ndtf nkmxp tsfx vnvgrb sjlk dqsbql ggsz sqxsf fjbqn qbrqsr vbn dnkcf gfxb lxkbs cmkqcs hbhsx kxmgm zgvqnlv vlhnhf xmrd gszbq srnbhq gxgbkd xhksjm xrkckp mvvbb gtqsr ccxlqzv jshns tmkc jbndg frxfc tfd zrtr fzrfrs (contains nuts, shellfish)
nmdv svztk vpsv zsxfl gfxb fnmx pzvvlgt dlx rkgb tclx fdfr rqlljq lvrsl sfhvsx blbl kvgbhx jsmpg tfd xrkckp kkkt gkcplx cdvdt ppdplc fqxcjh brjx tmsn dq kxmgm bhtxd xvrvnt fspk sjfcj gcch xxgp hpqf mgvr srnbhq qvxntmh xzxth msfmt jbmlk dqsbql srzsljf ktlh zbjtv gz mvqkdj nkmxp rrjjt xqxgc cjcvh kctf mzq dfllj hbhsx fmrdsr fdrzd bpxggt kmfj gkphjq (contains wheat)
rgfx fvgpcjh mzmph cqvpp ggsz gfjqxx kctf gspk zrtfglg gkphjq dmxdkc ktlh fdfr qfktb srnbhq xctnhp phbhgqh zgvqnlv xqxgc rqqf sfhvsx xbsps cjcvh kkkt nlh fhhq cdrm kddggl mvqkdj npjrb lhtqk hdmpps zbjtv nmdv lttlx vbn pzvvlgt lcrpq dvvsn cdvdt bpdfhd nkmxp hrbbhg ssbrn rggl dfllj vhchvg pbcptj dnkcf xjggx nbhpx fdrzd vhdzgz pbhvldj mvvbb qjjxv zscj hbhsx gxgbkd vnhn gz ppdplc cmkqcs hcrz bprg prrpm vnvgrb msfmt pvq gkcplx rkgb bxpdm (contains wheat, shellfish, soy)
nkmxp xg vjmfl gspk gxgbkd ggsz cmkqcs fjbqn mvqkdj mgvr jdbpd hbhsx cjcvh zbjtv xxcq xqxgc gkcplx zgvqnlv gtqsr lgxx gfxb msfmt qjjxv pbcptj bpdfhd bvn xrkckp fzrfrs pgtrjst xmrd vpsv nx gz dfkt fcps xhksjm nlh bprg vhdzgz drnrd ngqg gkphjq dfllj rgpbkp fkfr fqxcjh xzxth kctf tbhxh mvvbb dq hpqf mzmph xctnhp dmxdkc lvrsl tmsn lxkbs fdrzd rxtp cgbgf nvsd gbgf krv rggl frvs gvnj vcnrl ppdplc sttj hrbbhg gszbq qmcj hcxhl fspk fnmx dqsbql nqfjgtsj kxmgm ccxlqzv zjg (contains nuts, sesame, eggs)
npjrb xvrvnt sttj pvjd lvrsl pgtrjst fjbqn lcqn xxgp kvgbhx qvxntmh bvn cbpx gkphjq gkcplx gszbq rxtp mzmph lgxx zrtfglg gspk gbxk nvsd bpdfhd sjlk kctf qsx kddggl vhdzgz ktv xrkckp fqrtvrv jdbpd fltn fctjm frxfc svztk nx phbhgqh vpsv kxmgm hmhll ktlh xdsxjv phbrht zgvqnlv smfnh tbhxh sbpkr srzsljf xjggx mhzdcc xhzj fdrzd ccxlqzv cdrm dlx msfmt mgvr ppdplc qmcj lhtqk hcxhl gbgf fspk ngpq lpgptlj ftds jzjb cmkqcs ggsz rqqf mvqkdj cdvdt brnsf xzxth smscxzt fdfr tmsn ndtf brjx gfxb rrjjt sjfcj vhchvg dqsbql cqvpp qrdtdv (contains soy, dairy)
lcrpq fmrdsr fdfr gtqsr nlh hnxc bprg dqsbql hmhll mvqkdj hbhsx sqxsf fdrzd szp bbzn pbcptj sbpkr qsx rgpbkp xctnhp rxtp bvn ktlh bxpdm zgvqnlv lhtqk bpdfhd sjfcj xdsxjv nmdv qjjxv ppdplc ggsz qfktb vhdzgz vlhnhf xhksjm nqfjgtsj vnvgrb mhzdcc msfmt jsmpg dfkt (contains fish)
ppdplc rqqf vbn zjg xdsxjv msfmt nlh nkmxp mhzdcc glllxz bvn xjggx gfxb zrtfglg qvxntmh sqzfbq qfktb gz bpxggt fqxcjh phbhgqh bhtxd frkpm rqlljq dmxdkc lcqn vlhnhf vdnvf mzq sfhvsx svztk qbrqsr hnxc hbhsx brjx mvqkdj dq ktlh dqsbql dvvsn fzrfrs mvvbb tmkc vcnrl blbl gkcplx vhchvg (contains sesame)
rrjjt zsxfl dqsbql dmxdkc vcnrl vhchvg vnhn mzmph ssbrn rgpbkp msfmt fvgpcjh lpgptlj gbgf xmrd frxfc ktv ggsz nqfjgtsj qjjxv xzxth lhtqk qfktb cdvdt ktlh xbsps ftds phbrht jsmpg jbndg zjg mvqkdj sqxsf brnsf ccxlqzv zrtr pvq bpdfhd frvs ppdplc vjmfl gbxk blbl kvgbhx sjfcj mvvbb xg gz kmfj xdsxjv nkmxp svztk lvrsl hbhsx bxpdm xxgp vpsv hcxhl (contains nuts, soy, wheat)
nkmxp hnxc rqlljq knpp vnhn zjg rqqf rrjjt xlkm msfmt xbsps jshns vhdzgz gfxb brnsf qmcj fspk dmxdkc xzxth lcrpq phbhgqh ggsz bpxggt szp lxkbs sqxsf gszbq brjx ngqg qrdtdv dqsbql gkphjq bpdfhd ktlh mgvr ktv mvqkdj xctnhp ppdplc ndtf nqfjgtsj pzvvlgt jbmlk dlx lgxx rgfx fjvf gkcplx xhksjm kmfj llhld (contains fish)
gvnj kkxq ktlh gkphjq tsfx svztk msfmt pvq lpgptlj gz gbgf fzrfrs hcxhl dnkcf xbp gfxb tllxsfs kpnl fjbqn zscj ppdplc lxkbs lcqn hcrz zjg kddggl gkcplx ngqg vnvgrb hbhsx hmhll rxtp bpdfhd frxfc fqxcjh pgtrjst qfktb fhhq xbsps xhzj srnbhq bhtxd vjmfl ggsz ktv phbhgqh fkfr dqsbql vbn jsmpg rgfx xrkckp sjfcj llhld nbhpx phbrht rggl tbhxh blbl vcnrl rgpbkp nqfjgtsj lvrsl dq nvsd mvvbb ngpq xxgp nkmxp xmrd gxgbkd fltn jbmlk rqlljq qvxntmh (contains dairy, sesame, eggs)
nbhpx gcch fvgpcjh gtqsr srzsljf cgbgf nmdv cjxgg tsfx ngpq vbn rkgb dnkcf nqfjgtsj vnhn xqxgc ngqg dmxdkc vhdzgz fzrfrs glllxz kddggl dqsbql vhchvg xbp svztk mhzdcc ppdplc mzq qvxntmh phbhgqh frxfc pvq lxkbs bxpdm sqxsf kkxq gkcplx zrtr fnmx bvn kkkt pzvvlgt gz fdfr gfxb xhzj fltn vjmfl qsx sfhvsx hbhsx sttj ftds qmcj tmsn rgfx mzmph gfjqxx jbmlk qjjxv kxmgm fcps vnvgrb ggsz mvqkdj sjfcj nkmxp pbhvldj ktlh (contains eggs, dairy, fish)
gkcplx xrkckp vbn smscxzt mhzdcc cjxgg kddggl zgvqnlv dqsbql ppdplc kkkt hbhsx gspk kvgbhx rqqf prrpm xxcq mzq srzsljf msfmt xbsps hpqf ngpq pbcptj mzmph xmrd gvnj ktlh cmkqcs dlx cbpx hmhll xlkm bhtxd mvqkdj gbxk nx (contains shellfish, fish)
qsx zjg lcrpq glllxz zscj rggl dmxdkc jshns frvs sjfcj kddggl xlkm msfmt rxtp zsxfl ktlh kpnl frkpm sttj ngpq brjx brnsf hcrz fctjm fcps zbjtv nx cmkqcs mhzdcc kkxq vpsv pbcptj qrdtdv fltn llhld gkcplx mvvbb qmcj nkmxp szp rqqf dvvsn nvsd jzjb mzmph dlx gbgf mvqkdj dqsbql vjmfl gszbq phbhgqh ppdplc tbhxh xxgp fvgpcjh ccxlqzv ggsz lhtqk vcnrl bxpdm gtqsr jbmlk srzsljf bbzn lgxx rqlljq frxfc zrtfglg (contains dairy)
ppdplc dmxdkc gtqsr fdfr srnbhq hnxc xvrvnt jbndg lxkbs bhtxd fzrfrs vpsv pzvvlgt dqsbql zrtfglg frkpm cqvpp zjg npjrb fvgpcjh vnvgrb fnmx pvjd fdrzd frxfc nmdv zbjtv tclx bxpdm phbhgqh krv ktv qrdtdv knpp sttj hbhsx sqxsf xqxgc vhdzgz gkcplx lcqn rrjjt tmkc xxgp rqlljq bbzn gszbq jzjb zscj fjvf ktlh vlhnhf mgvr xbp smfnh dlx rgpbkp lgxx msfmt lcrpq hcrz ggsz xhzj qvxntmh gxgbkd vnhn cgbgf xbsps xjggx gspk jshns ftds cdvdt rggl pvq xhksjm ndtf kkxq gz pbhvldj fmrdsr mzmph gfjqxx (contains fish, eggs, soy)
kctf bxpdm tmsn cgbgf kpnl vnvgrb rggl bpxggt kddggl pvq msfmt xvrvnt lxkbs xxgp npjrb knpp svztk gz fvgpcjh ndtf fdrzd sqzhc gfxb fqxcjh sbpkr gbxk hcrz zsxfl zgvqnlv nx blbl llhld sjfcj rqqf cdrm ggsz xqxgc ftds sfhvsx fctjm krtlhc srzsljf jdbpd mvvbb dqsbql nvsd dmxdkc lcqn gkcplx fjbqn glllxz ktlh vhchvg ssbrn gxgbkd dvvsn kxmgm pbcptj xbp tmkc hbhsx mvqkdj (contains wheat, nuts, shellfish)
fmrdsr gtqsr sqxsf fvgpcjh lpgptlj mvqkdj frvs nkmxp zrtr bxpdm ccxlqzv msfmt vjmfl dvvsn hnxc zgvqnlv nqfjgtsj mzmph rrjjt gkcplx pgtrjst mvvbb vbn tllxsfs bhtxd nlh qsx vpsv npjrb jbndg gxgbkd tclx xhksjm sjfcj ktv rxtp hcxhl xzxth qjjxv hbhsx ggsz xxgp tmsn ktlh dqsbql dlx kctf gszbq bbzn pzvvlgt gbgf cqvpp fqrtvrv szp pbhvldj (contains eggs, sesame)
xhksjm mhzdcc kvgbhx ngpq rkgb nlh ppdplc qbrqsr gbxk ngqg drnrd phbrht zrtr dq rgfx qvxntmh dnkcf phbhgqh mvqkdj rrjjt fjbqn nkmxp xdsxjv cjxgg ktlh kctf xmrd zgvqnlv blbl msfmt fdfr cjcvh tsfx sjlk lgxx vhchvg ggsz sqzfbq svztk lhtqk zsxfl nvsd vhdzgz gkcplx ssbrn lcqn rqqf kmfj vcnrl mvvbb hbhsx pbhvldj gspk tmkc hpqf kddggl nmdv xbp cdvdt ktv xctnhp (contains eggs)

4
2020/day21/test Normal file
View file

@ -0,0 +1,4 @@
mxmxvkd kfcds sqjhc nhms (contains dairy, fish)
trh fvjkl sbzzf mxmxvkd (contains dairy)
sqjhc fvjkl (contains soy)
sqjhc mxmxvkd sbzzf (contains fish)

59
2020/day22/day22.rkt Normal file
View file

@ -0,0 +1,59 @@
#lang racket
(module+ test
(require rackunit))
(define (read-input filename)
(apply values
(map (λ (s) (map string->number (cdr (string-split s "\n"))))
(string-split (file->string filename) "\n\n"))))
(define (play p1 p2)
(match (list p1 p2)
[(list xs '()) (list xs '())]
[(list '() ys) (list '() ys)]
[(list (list-rest x xs) (list-rest y ys))
(if (< x y)
(play xs (append ys (list y x)))
(play (append xs (list x y)) ys))]))
(define (play-recursive deck1 deck2)
(define states (mutable-set))
(let loop ([p1 deck1]
[p2 deck2])
(let/cc return
(when (set-member? states (list p1 p2)) (return (list p1 '())))
(set-add! states (list p1 p2))
(match (list p1 p2)
[(list xs '()) (list xs '())]
[(list '() ys) (list '() ys)]
[(list (list-rest x xs) (list-rest y ys))
(if (and (<= x (length xs)) (<= y (length ys)))
(if (empty? (cadr (play-recursive (take xs x) (take ys y))))
(loop (append xs (list x y)) ys)
(loop xs (append ys (list y x))))
(if (> x y)
(loop (append xs (list x y)) ys)
(loop xs (append ys (list y x)))))]))))
(define (winning-score play-fn deck1 deck2)
(define final-deck (apply append (play-fn deck1 deck2)))
(for/sum ([x (in-list (reverse final-deck))]
[i (in-naturals 1)])
(* x i)))
(define (part1 filename)
(define-values (deck1 deck2) (read-input filename))
(winning-score play deck1 deck2))
(define (part2 filename)
(define-values (deck1 deck2) (read-input filename))
(winning-score play-recursive deck1 deck2))
(module+ test
(check-equal? (part1 "test") 306)
(check-equal? (part2 "test") 291))
(module+ main
(displayln (part1 "input"))
(displayln (part2 "input")))

53
2020/day22/input Normal file
View file

@ -0,0 +1,53 @@
Player 1:
41
33
20
32
7
45
2
12
14
29
49
37
6
11
39
46
47
38
23
22
28
10
36
35
24
Player 2:
17
4
44
9
27
18
30
42
21
26
16
48
8
15
34
50
19
43
25
1
13
31
3
5
40

13
2020/day22/test Normal file
View file

@ -0,0 +1,13 @@
Player 1:
9
2
6
3
1
Player 2:
5
8
4
7
10

133
2020/day23/day23.c Normal file
View file

@ -0,0 +1,133 @@
#include <stdio.h>
#include <stdlib.h>
#define TEST_INPUT 389125467UL
#define TEST_RESULT_10 92658374UL
#define TEST_RESULT_100 67384529UL
#define TEST_RESULT_PART2 149245887792UL
#define INPUT 198753462UL
void print_cups(unsigned long cups[static 1], unsigned long start) {
printf("(%lu) ", start);
unsigned long c = cups[start];
while (c != start) {
printf("%lu ", c);
if (c == 0) {
printf("\nreached zero, abort!\n");
return;
}
c = cups[c];
}
printf("\n");
}
unsigned long move(size_t size, unsigned long cups[size], unsigned long current) {
/* print_cups(cups, current); */
/* printf("current: %lu\n", current); */
unsigned long picked_up[3] = {0};
unsigned long c = current;
for (int i = 0; i < 3; ++i) {
picked_up[i] = cups[c];
c = cups[c];
}
/* printf("pick up: %lu, %lu, %lu\n", picked_up[0], picked_up[1],
* picked_up[2]); */
unsigned long dest = current - 1;
while ((dest == 0) || (dest == picked_up[0]) || (dest == picked_up[1]) ||
(dest == picked_up[2])) {
dest = (size + dest - 1) % size;
}
/* printf("destination: %lu\n", dest); */
cups[current] = cups[picked_up[2]];
cups[picked_up[2]] = cups[dest];
cups[dest] = picked_up[0];
return cups[current];
}
unsigned long *play(size_t size, unsigned long cups[size], unsigned long start,
unsigned long steps) {
unsigned long current = start;
for (size_t i = 0; i < steps; ++i) {
/* printf("-- move %zu --\n", i+1); */
current = move(size, cups, current);
}
return cups;
}
unsigned long *init_cups(unsigned long n, size_t size) {
unsigned long *cups = calloc(size, sizeof(unsigned long));
unsigned long start = n / 100000000;
unsigned long q = n;
unsigned long r = start;
while (q != 0) {
cups[q % 10] = r;
r = q % 10;
q = q / 10;
}
if (size > 10) {
cups[n % 10] = 10;
for (size_t i = 10; i < size - 1; ++i) {
cups[i] = i + 1;
}
cups[size - 1] = start;
}
return cups;
}
unsigned long run_part(int part, unsigned long n, unsigned long steps) {
size_t size = 0;
if (part == 1) {
size = 10;
} else if (part == 2) {
size = 1000001;
}
unsigned long *cups = init_cups(n, size);
unsigned long start = n / 100000000;
play(size, cups, start, steps);
unsigned long res = 0;
if (part == 1) {
unsigned long c = cups[1];
while (c != 1) {
res = 10 * res + c;
c = cups[c];
}
} else if (part == 2) {
res = cups[1] * cups[cups[1]];
}
free(cups);
return res;
}
int main(int argc, char *argv[]) {
unsigned long res = 0;
res = run_part(1, TEST_INPUT, 10);
if (res != TEST_RESULT_10) {
printf("Test 1: %lu (expected = %lu)\n", res, TEST_RESULT_10);
}
res = run_part(1, TEST_INPUT, 100);
if (res != TEST_RESULT_100) {
printf("Test 2: %lu (expected = %lu)\n", res, TEST_RESULT_100);
}
printf("%lu\n", run_part(1, INPUT, 100));
res = run_part(2, TEST_INPUT, 10000000);
if (res != TEST_RESULT_PART2) {
printf("Test 3: %lu (expected = %lu)\n", res, TEST_RESULT_PART2);
}
printf("%lu\n", run_part(2, INPUT, 10000000));
return EXIT_SUCCESS;
}

71
2020/day23/day23.rkt Normal file
View file

@ -0,0 +1,71 @@
#lang racket
(module+ test
(require rackunit))
(define (labelling->cups num)
(define cups (make-vector 10 0))
(define start (quotient num 100000000))
(let loop ([prev start]
[n num])
(define-values (q r) (quotient/remainder n 10))
(vector-set! cups r prev)
(if (= q 0)
(values cups start)
(loop r q))))
(define (cups->labelling cups)
(let loop ([idx (vector-ref cups 1)]
[num 0])
(if (= 1 idx)
num
(loop (vector-ref cups idx) (+ (* 10 num) idx)))))
(define (move! cups current)
(define picked-up (let loop ([idxs (list (vector-ref cups current))]
[i 0])
(if (>= i 2)
idxs
(loop (cons (vector-ref cups (car idxs)) idxs) (add1 i)))))
(define destination (let loop ([d (sub1 current)])
(if (or (= 0 d) (member d picked-up))
(loop (modulo (sub1 d) (vector-length cups)))
d)))
(vector-set! cups current (vector-ref cups (car picked-up)))
(vector-set! cups (car picked-up) (vector-ref cups destination))
(vector-set! cups destination (last picked-up))
(vector-ref cups current))
(define (play! cups start steps)
(for/fold ([current start])
([i (in-range steps)])
(move! cups current)))
(define (part1 input steps)
(define-values (cups start) (labelling->cups input))
(play! cups start steps)
(cups->labelling cups))
(module+ test
(check-equal? (part1 389125467 10) 92658374)
(check-equal? (part1 389125467 100) 67384529))
(module+ main
(displayln (part1 198753462 100)))
(define (part2 input)
(define-values (base-cups start) (labelling->cups input))
(define cups (make-vector 1000001 0))
(vector-copy! cups 0 base-cups)
(vector-set! cups (remainder input 10) 10)
(for ([i (in-range 10 1000000)])
(vector-set! cups i (add1 i)))
(vector-set! cups 1000000 start)
(play! cups start 10000000)
(* (vector-ref cups 1) (vector-ref cups (vector-ref cups 1))))
(module+ test
(check-equal? (part2 389125467) 149245887792))
(module+ main
(displayln (part2 198753462)))

80
2020/day24/day24.rkt Normal file
View file

@ -0,0 +1,80 @@
#lang racket
(module+ test
(require rackunit))
(define (read-input filename)
(map string->tile (file->lines filename)))
(define (string->tile str)
(path->tile (map string->symbol (regexp-match* #rx"(e|w|se|sw|ne|nw)" str))))
(define (path->tile path)
(define-values (q r)
(for/fold ([q 0]
[r 0])
([s (in-list path)])
(match s
['e (values (add1 q) r)]
['ne (values (add1 q) (sub1 r))]
['nw (values q (sub1 r))]
['w (values (sub1 q) r)]
['sw (values (sub1 q) (add1 r))]
['se (values q (add1 r))])))
(list q r))
(define (initial-grid tiles)
(define grid (make-hash))
(for ([tile (in-list tiles)])
(hash-update! grid tile not #f))
grid)
(define (count-alive grid)
(for/sum ([(k v) (in-hash grid)]
#:when v)
1))
(define (part1 filename)
(define tiles (read-input filename))
(count-alive (initial-grid tiles)))
(module+ test
(check-equal? (part1 "test") 10))
(module+ main
(displayln (part1 "input")))
(define (count-alive-neighbours grid tile)
(define q (car tile))
(define r (cadr tile))
(for*/sum ([i (in-range -1 2)]
[j (in-range -1 2)]
#:unless (= 0 i j)
#:unless (= 2 (abs (+ i j)))
#:when (hash-ref grid (list (+ q i) (+ r j)) #f))
1))
(define (step grid)
(define size (+ 2 (apply max (flatten (hash-keys grid)))))
(for*/hash ([q (in-range (- size) size)]
[r (in-range (- size) size)])
(define color (hash-ref grid (list q r) #f))
(define n (count-alive-neighbours grid (list q r)))
(values (list q r)
(cond
[(and color (or (= 0 n) (> n 2))) #f]
[(and (not color) (= 2 n)) #t]
[else color]))))
(define (part2 filename)
(define tiles (read-input filename))
(count-alive
(for/fold ([grid (initial-grid tiles)])
([i (in-range 100)])
(step grid))))
(module+ test
(check-equal? (part2 "test") 2208))
(module+ main
(displayln (part2 "input")))

561
2020/day24/input Normal file
View file

@ -0,0 +1,561 @@
wwwnewnwwnwewswnwsenwwwnwnwwwnww
wewswseswnwwwwenwnewnwswenwsenee
sesesesesesenewsesesesesesesesesesesese
swnenewneneeeseeswnenweswsenenwnenene
eneeeenenesweneseneeeenew
neseneseewenewswnwsesenwwnenenwene
nwwsewwwnwnwnenwwwenwwwnwwnwswse
nwnenwnewnwsenwnwnwnwnwsenwwnwnwnwnwnwnwnw
seseseseseeseseseseswseseseseswswsenwse
eeweseseeeeenwneewweeseeee
seseeseseseseseweseseneseseseseseesee
seseseseeseseeweseseseneeseseesese
swwnwwwnwnwwnwnwenwnwnwnwwwnwwnwnw
eewsenwseneseseswseenwsesenwseesewsw
wswwwswswswwswswwwwswswweswww
nwnwnwnwwnwnwewnwnwnwseswewnwwnwnwnw
wwswswswswwneswswswwseswwnewwswswsw
swsenwswswswswswwsesweeswsese
eseesenwesesewweeeneeneenewenew
eenwswnwnwnwnwswnwnwnwenwwnwnenewsw
wweweswnwwweswswnwwwwwswwww
swneswwswswswswswseswswswnwswsweseswswsw
wswseseswsesenesesesesewseswseseswnesese
nenwnwwwnwswewnwwwnwwwswnwnwnwnwnw
seseseswswswsenwswswne
swswwnewneswswswswneseswsesese
seswseswseswswsenwseswsewswseswswseesw
wsewwwwwwwswwnewwwwwwwww
sesesesesesenesesesewseseseseseseseswse
enwseswswseswswswswswswswseswseswsesesw
nenenenwneenwneenenenwnwnenenenwswnwsw
enwseeeeeneswseewswnwnenewwe
eewnenwwswswneneeewweeseenesene
eswswnwnwnenwenwneswnwnwnwnenwnwnwnwne
wwseeesenwnwneeewwseweewneesw
seesenwneeseesweseeeeeseseseseese
wwwswswswwswswweswswwswswwswsww
nwnweseswswswswswswswseswseswswswswswsw
eneseneneneeenenenenwnenenwneeneese
senwsenenewnwseewnesesenwsesesesesew
neeeeneneneeneeneeeeweeneesene
swenwsweswsweseswweenwnww
nwnwwwnwwnwwwwwwwnwwnewswwnw
eesenweseeeeswsesese
swseseeseesenwseseseswseswseswsesesew
nenwnewwenenwwswseswesewnenwenwene
wwswwwnwwnwnwnwwwwnwwneww
seneeeeeneenwnwsweseeneeneeweee
nenwswnwswswnwnwnwwnwwnwnenenwnwnwesenwse
neneeswneneeeeneeeneeneneeneeswne
wswsenenwneseswswwnwwweseneswswsene
seseseseseseseswseseneseseswsenewsesesesw
wswseswsesenwneswnwsewwneeswse
swnwswwswswswwswseeswesweeneswswnw
swswneswswswswenwswwswswseswswseswswsw
esesewseeweswsesenwswswswneseswseswse
nwwneswswswswswnweeenwnenwnwnenesewe
seeseewseeseewseseeeseeeseese
newsenwseseseswseesenenewseseseseesesww
wneswswwswswswwswswwswswswswsewswsww
wesesesewewseseewwseseseseeseese
enenwnwnwnwnwnenewnwnwneswenwwnwnwne
seeeseseeseseeeseeeesesesew
swnwnenwnwswnenwnwenwnenwnenwnwnenenwnwnw
nenenenenewneenwneeswswnene
enwnwwnwnwnwswesenwnwswseeewewse
swwnwenenewwnwseeneswenwsewenene
seeseeweesenesenweeeeesesesee
nwnwnwnwnwnwneswwnwnwwnenwnwwsenwnwenw
wswswseseseswswswseneseseswsenenwswseswse
wwwsewwwwswwwwwnwwnewwww
wnwnwwwswewswwswwweww
nwswswswseseeseseseseseseseseseswnesese
eeeeweneneeneeewe
swswswsewswswswsesenwswnwseswswseeew
nwnwnwnwwnwswenwenwneswwnwnwnwnwnwswnwnw
nwnwnwnwnwsenwwnwnwwnenwnwnwnwnwnwnwnwnw
nwneswneswnwswenwneneeneseenewnwnenwse
neewswswswseneseneseswsesewsewswsesww
enwneneneneneneeeeneneseneneneneene
eneeseseeeeseeeeeeeeeswee
seeseeeseneseeeeesesesweseseswnwsee
newnesewswneewnwneeneeneseneenenew
ewsenwnwsweenwnesewnwseseseswsewsenw
ewseseseseseseseseeeeeeseeseewse
wwswswwewwnwwwwwwwwswwwnewsw
eeswneeswnwenwenweseeneesesesenwe
eswswswswnewwnwseswwseseneswnenenwswsw
sesesesenwsenwneseseseneswnenwsewwsenww
neeeeeneeeneseeneeeenweneee
nenwwswwwwwnwwwwwwnww
nwnenwnenwnenwnenenwnwnwnwnenwnwsenewnene
nwwwneswwswswswsweswsewswwswswswswswsw
nenwnwnwnwnwsenwnwsenwnwnwnw
seeeeeeeeeeeeeweesee
nwnwnwnwnwnwnenwnwnwsenenwnwnwnwnenwewnw
eenesesweeeseeneenweswseeeeee
neswsenewnenesenenenesenwneneneneneswwne
sesesewsenwseseseseseseseseseseesesese
seseseseesesesesesesesesesesenwseswsesese
enwswseesewsesesewnesesesewnwseseesw
seseswseneseseseseseseseseseseswsesesese
nwsenwnwnwswwnwnwnwnenwsewnwnewnwnwwe
wesenweswswneneewnenwswswswnwesew
seseseseeseseswseseseseswswsesesenwsesw
wnwswneeneswwnwwswenwnwswnwnenwnesenw
swnenenwnwnwnenwnwnwswnenenesene
neneewnesenenewnewsenwnenenwnwnenenenene
swewwnwwnwwnwwwnewwwswwnw
senwsewswesesenwnesesesesesesesweseswse
seseeeenwseeseseneesewseeew
wnweswnesenewwseswsewwnwwwnese
eeeeseeweseseneeseseeseseneesesw
senewesenewnwswwwnesenwewwnesw
nwnwnwnwnwnwwnwnwnwnwnenwnwnenwe
eeneewneesenenenenenenenenenenenene
sweeneneneswneeneneswneneswnenenwswene
wswwswswweswwswswwnesweswswwsw
eeeeneeenwneneeeeewnesenenenee
sweswswswswswswswswswswwnwswswswswswsw
sesewseseeseenweseeseeeseseesese
swnwswswseswseswswswseseseswswsesenw
sesewsesesenwseseseseseseewneseesese
swwswswswswswswswwswwwswswneswswswsw
eenwseeeeenwneeenwsewswseeswee
swswseseseseseseswseneswswswswseswswsesenw
wwswswnwewwwswswesw
neneneneenwswnenenwwnenwnenw
seswseswswsweswswswwnwswseswseswswswsese
seseseeweseenweseeseesweeneeese
swswwwwwwswwwswwwswwnenwewww
swwwewnewwwwwenewswwwww
eeenenesenwseeneeeew
wwwwnwswswswwwewwwwwwswwswe
seenwseseseseseeneseseeseswseseswsesese
sesewnwesenwnewseswwneneseswseswew
swswswswsweseswswseswswswseseseswswsew
eneenwneenwseeseneeeenwswweswsww
seewneseseseesesesenesenwsesewseeee
sweeesewneweweeeese
nwnwnwnenwnwnwnwnwnenwnwnwnwsenwnwnwnew
wwswswneneswswswswseswswswswswswewswnwsw
wwnwwwwswwnewnewwwsewwwwwnw
sewsesesenweseswsesewswseseneeswsese
seswswswswswswswswswswneswswswswswwsesesw
eeseenesenwsewseneeesenweswnweesw
swseesenwewneseseeseswswnewewnesw
nenesweeeenenewnwneeeneneswnewsene
swwseswsweswseswsesesenwseeswswseswsw
nwnwneswweswesenwnwnwwnwnwnwnenenwwwse
wwwwswwwwnwswwwwwwwewww
eseseneeseswwneweeswswnenwnwneswese
senwwnwnwenenenwsenew
swswswswseswswswneswswswswswswswswseswnw
seswsesenwswseseswseswswswseseswswswswsw
enweenenweesewneeeeeseeswseenenw
neneneneeseweeneneneeeneneneeene
esesenesenwseswseseswseseneseseseseww
eswswsenewseswseswenweswwnwseseswsenw
seseneseseseseseseseseseseewseesesese
nenenenenenenesenenewnenene
swswswswwswswswneswenewswswwswseswwsesw
nwnwwenenwsenwnenwwnenwsenenw
seeneseseesewsewnweneesesewesese
neseeseenweneeeneneweesweeenww
swsesenwseseseseseswsesesesesesesesesese
swwseneseswsewseseseneswseswswseswseeswse
nwnwneewnenwnwnwwwnwnwwnwswwswsese
wwewwwsweswwwnww
swnwnwnwnwnwwnwewnwnwneenwnwnwwswnw
swwwwswwwseneswswwswwwswwswwww
neeseseseseewsesewseenesesesesenenwwse
nwnwwnwnwnwnwnwnwnwnwnwnwsenwwnwnwnwnw
eeweneeeeeeeeeneseeeeee
enwwesweeeneeneneeeseneenenenew
swswsenwswwswweswwswwswswwwwswne
wewnwwnewnwwnwnwnwwnwnwwnwswwswnw
nenwneneneseneeneneeneeneeenenenene
nwwswnewsewnwwwwwnewwww
eneneneesenwneneeneeeswswnesweenwne
wwwwwwwwwwwnwwwwsenwwenww
swswnwesewwswswwwwswswwwwnewswwsw
wwnwwwwwwnwnwnwwwenwwnwww
seesenwseseseseseswswseswseswwnwseswsw
nwnwnwnwnwneneneneswswnenwnenwenwnwnenenw
sewwwsewnewnwnwsenwwnenwnwswnwnwnew
neneseeneeeneneneneeneenwneneneee
sweswewswwswnwnwswswswswsesweswnwwsw
wwnenwenwsenwnwwnwnwwnwnwnwnwwwnw
eneeneweeesewneneeeeneneeeee
swswnewswswswseseseswswswswneswseswswsw
wwnewwswnwewsw
neenwneeeswenweneseneeeneenenese
seswswnwsesesenwswseswseswseeswswswseswse
neneswswswswseswswwswneswswwswsweseneswne
sesewnwwnwnenwnwnwenwnwnewneenwnenw
wswsenwewnewewwswswwswswwswswwwne
senwnwsesesweswswnesewseseseeesee
eeswneneneeneenenenenenenenenenenene
swwseswswswswswswswneswswseseswnewswswswne
eswseswswswswswwswseswswseswneswswnesw
swsesenwwnwswsenwseseeswsesenenenwwse
seesewseseseeeseseseseeeeseeese
swseseswswneswseswswswseseseseswswswsesw
wwwnwwwewnwnwwwwwwwwwswww
nwnenwnenenenenenenenwneneswnenenenwswene
neseneneneseenwnenenenewnewnwnwnenwnww
wwnwweenwwwwwwnwnwwwswwwwnw
wnwwsenwsenewnewnwwnwnwwnwwnwww
wnwwwwnwnwwwwwnwnwwswwnwweww
wswswwwswswwswwwneswwseweswwe
seeneseeeseseweeee
senwnwnwenwnwnwswwnwnwenwnw
eneneeneenwneeswnenenenenewnenenee
swwweeseseeseeeneneseseseseeeene
seseeseseeseeseseseseneseseseseswese
neswsenwswsesesesesenwseseseseeseesesw
senwswnenwnenenenwewnwnwnenwnwnwne
nweenwswseswnwneseneseseswnewseswnwwne
swwwsewwwewwswwwwnwswwwwswnwsw
wnwnwnwenenenenwnwsenwneenwneseswnwswnwnw
neswnenenwneneenenenenwneseweswnenwsene
wwswneneswnwsenewneeneeeenenewsw
eseneeeseeeseseseswseseneewseewe
nwnenwnenwnwnwnwwnwsenenenwsenwnwneswne
wwwsewwwenewwsw
nwnwnenwnesenwwwwwnwnwwnwsewewnw
nwnwenwnwnwnwnwnwnwnwsewnwnwswnwnwnwnww
swnenwnewwnweswswenwnwnwsenwwnwenw
nwnwnwnwnwwenwnwwewwnw
swswnwnewnenenwseswnenenenenenenenwswesene
swswsweeswsewseswsesesesesesewswswsenw
wnwwswswwwswsewswneewswswswwneww
eweeeeweneenee
seeswseneneseneswsewneswsewswswwsese
nenesenwneneneneewneeneeee
wswswwsenewswswewnwwwswsw
wneenenwnwnenwnesenwnwnenwnwnwnwnwwnw
enwseewenwswswnwnwseswswnweswsesenwnw
nwswswsesenenwnwwnenesenwnew
neswwsewwneewswswnewswwnwnwwsesw
nwnenenenwneneeswnenenwnenwneswnwnwnene
neesewnwnwwwwnw
seeseseseweseneeeseesenewseseese
sweneneneneswsweeeesenwnenww
neneneneneneneseneneneneneewenene
seseseenweseseseeseseseseseenwse
seswswswswwwswwwswswswneswswswwnwswsw
swswwswswswnwswsweswswewswswswswweswsw
senenenewnwnenwsene
swnenwnwneswnwnwnenweenwnw
sewwwseseesenesesenwwswseesesenesese
nwnwsenenwnwnwnwwnenwnwnenwnesenwsenenenw
eeeseseeeseseeseeeenweseseee
neseseseswnwsenwsenwsesesenenwsewsesese
eeeeeneeseseseseesewesweeneesese
nwwwwswnewwwwwewenenesesewsenw
wnenenwnwnenesenwnwnenwswnwnenwneeswnwnw
seeswswnwseenesenwsesesenwwenwswwswse
seseseneseseseswseseseneseneseseseswwse
nwnwnwnwnweswenwnwnwnwswnwnwseswewnwse
eeswneeeneeeweeneeenweenenew
swneswswwwnwswwwswnewswseswwewswne
sesenwseseseseseseesesenwsesesesesese
enwseneswwswewwswwewwwwswnenwnww
wwnewwwwwwnwwwwnwsewwwnwwnw
nwswwwswwswwseswswswwwswwwswww
eewnwsweeeeeenweeeenesweseee
seeeseeeeeeseseeseseseseeesenw
neseswsenewseseeswswsewne
nwseseseseseseseswneesewseswswseswsese
swnwnwnwwnesesenww
senwnwwnwneweswnwwsenesewwnewwne
eenwsweeeseeeseseeeeseeseesee
eeseswneseeseeeswesenwseseeseese
eeeseseneesesweeseenweseeesewew
wwwswnweswwswswswswnwswnewseswswsw
nwwswnewseswswswnewwswewwwswseww
swnwswswwsesweswswswswswswswswswswswswse
nwswwswneswnwwweswwwseswwwwswwwsw
ewwnwswwnwnewseww
wwwwwsesewwwwnenwewwnwwseww
seseseesenweseseeseseenwsesenwseswnwswnw
swswsewswswwswnew
neneneneneneneneneswnenenenenenenenenene
wnwswwewwnwsewweneswwwwswweww
seseseseesewswseseseseenenesesesesese
ewswswwswwswwewswwwwnwwsweww
nwnwnwnwwsewnwnwnwnwnenwnwnwnwnwsenewnwnw
seseswswswswnweswsenesesesesenwsesese
nenenwnwwnesenesenwswnenwnwnweewnese
wwwswswswwwewwswwwwwwwswsw
nesewweenwswnesewsewnewnwenwsewse
swnwwwnwwewwewseswwswwswwsww
eseeeeseseeswneseeeesenwse
swswswsesweswswswswswswswswswnwswswnwswswsw
newwneswwwwsewwwswsewwwseneesw
senwswseneeswseseesenwwnesesesweseesese
nwenewneenesenenwneswnwnwsenwnwnenwwnw
eeeeneesweeeenwneweeeneeee
wewwwwwwsewwwwswwswwwneww
nenenwneswewswneneswsenesenew
nwneswnwnwnwneenenenwsenwnwne
nwseweenwnweweeeeswsesenwwee
enwseswwwswwwwnewwwswswswwswswsew
nenewneeneneenenesenenenesenenewnene
seswsweeseswswsewseswswsewnwswsw
nwnwnwnwnwnwneenwnenwnwnwnwnwnwwnwnwnw
eeeneeeeeeswneenwneeeeeswe
senwnenwnwnwnwnwnwnwwnwnenwneenwwnenwse
swwwnwnwwwswwnenwwnwneenweseseew
sesenesewsewneswsesesesenwwesenwsese
newwnwneewsewwswwnwnwwwnwwswnw
nenwwswwnwwwwnw
nenenenwneswneeeenwenenesweneswnenene
nwwswwswwwnesewwwwswwswse
sesenwseswswswseswswswswsw
eesweeeeneee
swewswswsesesweswswswseseseswswswsenw
swswswseseswsenwseseseswsweswswseseswsesw
wwnwenwnwwwsewwewwnwwnwwww
swswswwswswswwswswneswswswwseswswswsw
wewseseenesenwsenwnenwnwnwnwsenwnwnwnw
neneswnenwnenenenenenwneswnenwne
seswweswswseseseswseswswsweseswswswswswnw
swswswwswswwwswwwneswswseswswswswsw
eneneeweeseeeneneewe
nwnwnewseneneeneneseswswnenenenenwnwnenw
wneeeneneneneseneneeswnewneeweese
nwsenwnewnenwnwnwnenwsenenwnesenwnewnwnwnw
eesweeseeeeenweeeeeweeee
nwnwnwwwnwwwnwnewwse
wseseenwnwsenwnwnwnwnenenwnwnwnwswnwnwnw
wnwsenwwnwsewnwnewnwnwwwwwneww
nwsenwnenesenenenwnenenenwnwwnwwnenenenwse
neeseseenesewsewnwnesweeewwneeee
swseseseseseseseeeseseseseesesesesene
eweeeseeneeseeseeseweseesesw
wwnwsenwneswnenenwnenweseneneswnwswne
neewwnesenesenewenenenenenenenenenene
nwnenwnwnwenwnwwnwwswnwnenwnwswswsew
esenenenenenenenenenenenewneneneneseewne
senwseswseswswseeseswseseseseseswsesesese
wnwewwnwwnewsewnwww
seewwseseseseswswseseeseswswseseseswnw
seneseeswnwsesesesesenweesesenwwsee
wwwswwwwweswswww
sesesesewnwsenwsweseweseseeseseenesese
swwwseseseswnwwnenwnwswsw
swseseseesenwswnewsenwseswseseseswnesesw
swswswwwswewswwnwswwwwwswswswsw
neneswseswswnwneswnwswswswswsewswsesw
eeeewenenweeeeesenwseeeew
swseswseswswnwswswseswsweswswswwswswsw
nenenewnwnenenwnenwnenwnenenesenenenenenw
wwwwnewnwwsewwnwwwwwsewnewwnw
nwswswseswswswsenwseswswseswswswswnwsene
nenenwsweneneneeneneewneneewseswnenwne
seseswswseswseswswneswsweswnwenwseswswsw
nwneswnewnwnwseewewneeneswnwnwenesw
senwnwnwnwnwnwnwwswenwnwnewnenwwnwsee
nenenenenenenenwnenenenenenenesenesenewnw
eenenwenweeneneswneneesw
newwwwswnewwnwwwsewwwsewwse
enwnwnesenenwenweswsewseweswnewswse
nwnwnwnwnwnenwnenenwnwnenwnwnwswnwswnenwenw
nenenweeneneneeeneeeneneseenene
eswwsweswsweswswswwswswwsw
eeneneenenenenwneeneneneneeneeneesw
wwwswnwwewwnwnwnwnwnwnwenwnwwnw
swswnwswswswwwswswneswseeswswswswswww
eeneneseneneneneneswnwneeseneenenwne
nwwwseenwnwnwwsww
nwesesenwnwsesweeseseseeseeseesee
weweeeweeneeseeeswseeenwew
wswwwwwwwwsewwewwswwnenew
wewneeeeeesweeeeewswenene
nwwneewsesewswwwnwewwsewnwnwnw
seeseswenwneseeeeeseneseewnwwwnw
neneneswnenenenwnenenenenenenenenenenene
sewnwnwnwwwswnwewnwneswwnesenww
neswsesewswwsenwswnwnweswne
eneeneswneeneeweeeene
swnwsenwnwnwnwnwnwnwnwnwnwnwewnwnwnwnw
eseseseseseseeeesenwseseeseseewse
nwnwnwnwsenwwwnwwwnwnwnenwswnwnesenw
neswneswneseneneneswenenenenenenenewnenw
seenwenweeseswesweeeeeeeese
wnenweswwnwneneneenenenwnwesewnenw
neneneeswenenenenenenenenenwnenenenenene
weneeswnweeweeeseseeeese
wwwwwnewwwswnwwwwwwwwww
nwsenwsesesenwwwnwnwwewnwnwsenwnwnenw
nwnenwwsenenwesenwnwwsewnwnwnenewsw
nwnwnwnenwnwnenwswnwneneneenwsenenwnwnew
neneneneneneneneneneneneneseewnenenenwne
nenewnenwneneeseeewseenenwnenesesw
enewswswswswswswweswswwseswwswswenww
wswswswswswswswswswsweswswneneswswswne
wnwnwnwnwenwswnwwnwwwwnwnwwenwnwnw
seseseewesesenwseseeeseese
nwnesenwnenwnwnenwnwenenwnenwneswnwnenwsw
wesenwneswwswwswnewwswwwewww
sewewnwwewsewnenenwseswwwswweswsw
eswswswseswswwewwwwnenwwnewsww
wnwswwswnwneseswseswswsesesweeesesenene
seseswneneseswseseswnewseseseseswsesew
wwwnwwwwwwwneewnwwwsew
esenewsewseswnese
wnwnwswnwwnewnwwnwnwwnwnwnwwnwww
sewseseswseswneeswseseesesesewsese
wwwswewnwwwwenwnwwnwew
neneseeneeneneneeeneswwnwnwneneeenene
eeeeeneeeeeeeeesweeeene
wwwwswwwwwnwwwsewwnewwwwne
swsenwswsewneswswswswswswseneswswsw
nenewweneeseenesenwnenwwneeeseswsene
swswwwswswswwneswswswweswswwswwsw
sweneewwswwswswswneswswwnwwswwswse
wseneneswneswnenenenenenwenwnwswswsenenee
wswwswwwneswwswseswswswwwswswene
enweeeeeeeeeeeeeeeswee
enwseseeeeneeewenweeeesewe
nenwnwnenenwnwneenenwnwnwnenenwswnwnene
nenenewneswneeesenwneneneneewenenene
nenwneneneneneneneneseswnewneseenenenenew
nwnwnwnenwnwnwnwnwswnwnenwnwnwnwnwenwnenw
seeswnwseseseswseswseseswswswswswswsesw
nwewewnwnwnwewnwwsewnwwswweww
nwnwnwnwenwnwnwnwnwswnwnwnwnwnwnwnwnwnw
seseseneswwsweesesewseseseswseswwne
wseneseseeswswswsewseswswseswswwese
wwnwswwwnwnwsewwwenwnwnwww
wseswseseseeseseseseseseseseswsesesese
swsesenwswwswsweswneswswnwswswswswsesw
weeeenenenwseewnesweneeeneswnene
eenwnenenenenenenwneesenenesenenwnwsesw
swesweswnwnewenwnwnwwnwwenwwwnwnw
seewsenwswswswseseseseseseseswseswswsese
neeenewsewneneneseweeneneenenwne
nenwnwnwnwneeenwnenwnenenwswnenenwwne
swswwswswewswswwswswswswswswswswswsw
eseseseseseseesewenwseswseeesesese
nwnwnwsenwnenwnwwnwnwnwnwnwnenwnenene
esweenwneeeeseenw
sesenwseseesesesesesesesesesesesesesenw
wwwwnwwnewwwwwwwnwwse
swnwewnwneeswweneeeseeenenenenene
newenewnenesewswnenwsenenwsenwenenw
seneseseseseseeswseseseswseswnwswseseswse
nwwwwwwwwwwswwwnewwwnwwnw
eenwsweewswnwewnwseswswswwwsesw
eeneneneeneenenesweneneeeeenwne
nenewnenewneneneneneneseenenwnenwnenene
weeenweneeneeeneneeneeeeesee
nenwneneeesenwswsewnewwnesweenesene
wswnewneseswsenwsesewnwswsenenesewsw
swswswnwnwwswsewnenewnesesww
nwwenwnwwnwnwwnwseneenwwnwsew
seeseseseseswseseseseseseseswsesenwswnwnw
sewwwwswwewwwwswwwswwneswsewne
seneseneneenenesenwnenesenwnenewwenene
nenenenenenenwnesenenenenw
swwswswswswweweswwswswswwwwwenw
wwwsenwswswswwewwwswwwswwneww
wwwwwsewsewwswnwwnwwnwsewwww
eeneswswnwewweeneesweee
eneswswwswswswswswswwnwswwswwwswse
swseseseseswnwseseseseneswswswswsesesesw
swseseseseswsewswseseswsesenesesesesese
neeeweeneeenesweeneeewesenene
nwswswswseswswswseswsenwseseswseseswswsw
swneeseneneneenwenweeeeewnenene
wwsesweswnwwwwwwenwwsewnwnwne
swswseseswswsewswseeswsese
wwwwswswswwwswswnwewwswswwwsw
swwsweswwswewewwwswnwewwww
esenwsewsenesweseesenweesee
eneeeeseeseeeneswweneseenewwe
swnwswswswswswswswswswswswswswswswswswesw
eneeseeesesesenwwenwsese
neeneneeesweeneeneneeeneeenenenw
wsenwwwswwwwnwnewwnwnwwwnwwww
neseeneneneeneneneneneenweneeeee
nwneswwswwswnwenwwneneseeseseswwswnw
nwnwnwnenwnwnwewnwwsenwnwnwnwnwnwnwnwne
ewwnewseenwwnwew
nwnenenenenewnenwnenwneneenenwnenenwnw
nenwnwnewnwnwnwwsewsew
eseeseeeeeeseeeeew
seseeseeseseswnwsenwsesenwsesesesenwsenwse
wnwenwnwenwnwsewnwnewnwneswwewswsw
neneneneneneswnenenewnenwnenenenwnesene
sesesesesesesenweswseseseseseesesesesese
enweeeeeeseseeeeenweeeeese
sesesesenewseseneseseneseseseswsesesewse
seswswseweswnwswnweseswneswwswswswse
wsenwwnwwwwww
nwsewwnwwswwnewnewwwwwswww
newwwsewwnwnewwwswswwwswwwsw
sesenwneneswseswesewseseeneseeswnwnw
nwseseseeseswseseeeseseswsenwesenese
nwnwswswswewswewsewswwsw
sesenwseseseseneseseeswseneseswseswwsese
ewwwsewwwwewwnwwwnwwwww
eeswneenweeenwseeeesweenweee
wswseesweswswnwswwwswewswneswswsw
swseseseswsweswwseeseseswswnwsenweswse
seseswwseseswseswswseseseswnesesesesesesw
swneswswnewenwnesewnesewnenenwseeene
nwenwnwnwnwwnwnwnwswnwnwsenwnwnwnwsenw
wnwenwneswseesee
eeeenweseseeesweeeeeeenwnw
swswswswswswsesweswswswswnwswswswswswswsw
nwwewwwwwwewwwwwew
nenenwnwswnwnwnwnwnwnenenenwnwnwenwnenwnw
neewnenewnwnenenwsenwe
sesewsenwseseenwnwswene
nenwnwenenesenenewneswnenenenesenw
eeeseeesenweeenwenweeeneese
wnewswnwwwwwswwswseswswnewwwnew
sesesesesewseseesenesesesw
nenenesenenenenenenwneenene
swsesesesenesewseseseseswsesesesesesene
neeneeeneeneneenenweeeesee
senwnwnwnwenenenwnwnwswnw
swswneswswneswswwwswwswswswswswwsww
wwwwwwsewwwwwwwwwnewnwsew
eeseesesewneeeseseseseeeeesesese
neswnenwswswwswsenesweswwswswsweswswsw
swseswwwwnwswsenwwwwewwwnesww
neeseeswnwnwsweswe
wenwnwnewnwnwsenwnenenwnwsenwnwswnwnwne
eweswneeesesesenwneeseeesesesewsee
nwneswneenwnwnenwnwnwnenwnwnwnwnwnwnenw
swseseseswswneswnwwseseseseswsesesesesese
nenwnewenenwneswsenenenenwnenewsenenenw
nwnwnenwnwnwnwwnwnwnwnenwnwse
esesewsenweseseseeneseee
swsesenweeeeeenwneeeeesweeswe
nwnwnwwswewsewwwwnwsewwwnwwe
nwnwenwnwwnwnwnwnwnwwnwnwnwnwwwwwe
nwwesweewsesenwsenewnwswnwsenwswsesw
nesenenwnenenenenenwswnenenwnwnenwnew
seneewnwnesweseneenwnenewnenenene
nenenenwneswnwnenenwnwwenwenenenwnwnenw
nwnwenwnwnwnwnwnwnwnwnwnwnwnwnwswnwww
nenenenenenenenenewneswneneneenenene
swnwenwnwnwswnenwnenewwweseeseewswne
eeenweeneesweeeeeeeneeee
eeneeneweneee
wseswenewseeneenwneneseenwwesesw
nwnwnwnwnwenwwnwnwnwwwnwwnwnwnwwnw
nesewswswsesewesweswswseseswswnwnene
nwswswnwwnewwwsesesenwesewswnese
wwwsewnenwsewwswswswwnwwsewewsw
eswsesewseseneswwseesenenwnwnweswseswse
swswwswswseswswswswswswswswswswswswneswsw
nwneseseswwnesewsenwswnenewsene
wswswswnwswswswswswswswswsweswswseswnesw
senesenesewseeewseseswsesesesenesesese

Some files were not shown because too many files have changed in this diff Show more