├── 01.go ├── 01.py ├── 01.txt ├── 02.go ├── 02.py ├── 02.txt ├── 03.go ├── 03.py ├── 03.txt ├── 04.go ├── 04.py ├── 04.txt ├── 05.go ├── 05.golf.py ├── 05.py ├── 05.txt ├── 06.go ├── 06.py ├── 06.txt ├── 07.go ├── 07.py ├── 07.txt ├── 08.go ├── 08.py ├── 08.txt ├── 09.py ├── 09.txt ├── 10.py ├── 10.txt ├── 11.py ├── 11.txt ├── 12.py ├── 12.txt ├── 13.py ├── 13.txt ├── 14.py ├── 14.txt ├── 15.py ├── 15.txt ├── 16.py ├── 16.txt ├── 17.py ├── 17.txt ├── 18.py ├── 18.txt ├── 19.py ├── 19.txt ├── 20.py ├── 20.txt ├── 21.py ├── 21.txt ├── 22.py ├── 22.txt ├── 23.py ├── 23.txt ├── 24.py ├── 24.txt ├── 25.py ├── 25.txt └── README.md /01.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bufio" 5 | "fmt" 6 | "os" 7 | "strconv" 8 | ) 9 | 10 | func find(values map[int]bool, sum, depth int) int { 11 | if sum < 0 { 12 | return -1 13 | } 14 | if depth == 1 { 15 | if values[sum] { 16 | return sum 17 | } 18 | return -1 19 | } 20 | for value, ok := range values { 21 | if !ok { 22 | continue 23 | } 24 | values[value] = false 25 | product := find(values, sum-value, depth-1) 26 | values[value] = true 27 | if product >= 0 { 28 | return product * value 29 | } 30 | } 31 | return -1 32 | } 33 | 34 | func main() { 35 | values := make(map[int]bool) 36 | scanner := bufio.NewScanner(os.Stdin) 37 | for scanner.Scan() { 38 | value, _ := strconv.ParseInt(scanner.Text(), 0, 0) 39 | values[int(value)] = true 40 | } 41 | 42 | fmt.Println(find(values, 2020, 2)) 43 | fmt.Println(find(values, 2020, 3)) 44 | } 45 | -------------------------------------------------------------------------------- /01.py: -------------------------------------------------------------------------------- 1 | import fileinput 2 | import itertools 3 | import math 4 | 5 | def search(values, total, count): 6 | for group in itertools.combinations(values, count - 1): 7 | need = total - sum(group) 8 | if need in values: 9 | return math.prod(group, start=need) 10 | 11 | values = set(map(int, fileinput.input())) 12 | print(search(values, 2020, 2)) 13 | print(search(values, 2020, 3)) 14 | -------------------------------------------------------------------------------- /01.txt: -------------------------------------------------------------------------------- 1 | 2004 2 | 1823 3 | 1628 4 | 1867 5 | 1073 6 | 1951 7 | 1909 8 | 1761 9 | 1093 10 | 1992 11 | 1986 12 | 1106 13 | 1537 14 | 1905 15 | 1233 16 | 1961 17 | 1760 18 | 1562 19 | 1781 20 | 1329 21 | 1272 22 | 1660 23 | 1367 24 | 1248 25 | 1697 26 | 1515 27 | 1470 28 | 1980 29 | 1884 30 | 1784 31 | 1966 32 | 1778 33 | 1426 34 | 1255 35 | 1089 36 | 1748 37 | 1253 38 | 1870 39 | 1651 40 | 1131 41 | 1623 42 | 1595 43 | 1128 44 | 1014 45 | 1863 46 | 1855 47 | 1203 48 | 1395 49 | 1521 50 | 1365 51 | 1202 52 | 780 53 | 1560 54 | 1834 55 | 1494 56 | 1551 57 | 1398 58 | 1190 59 | 1975 60 | 1940 61 | 1217 62 | 1793 63 | 1310 64 | 1070 65 | 1865 66 | 1307 67 | 1735 68 | 1897 69 | 1410 70 | 1994 71 | 1541 72 | 1569 73 | 1731 74 | 1238 75 | 1193 76 | 1226 77 | 1435 78 | 1159 79 | 1642 80 | 1652 81 | 1908 82 | 1920 83 | 1930 84 | 1068 85 | 1914 86 | 1186 87 | 1795 88 | 1888 89 | 1634 90 | 1750 91 | 1950 92 | 1493 93 | 1353 94 | 1461 95 | 1658 96 | 1856 97 | 1301 98 | 1538 99 | 1948 100 | 1998 101 | 1847 102 | 1880 103 | 1657 104 | 1536 105 | 1457 106 | 1762 107 | 1706 108 | 1894 109 | 542 110 | 1991 111 | 1108 112 | 1072 113 | 1064 114 | 1511 115 | 1496 116 | 1480 117 | 1955 118 | 1604 119 | 1766 120 | 1983 121 | 1713 122 | 1234 123 | 1503 124 | 1583 125 | 1729 126 | 1140 127 | 1006 128 | 1600 129 | 1699 130 | 1280 131 | 1891 132 | 1996 133 | 1375 134 | 1167 135 | 1625 136 | 1129 137 | 1770 138 | 1497 139 | 1620 140 | 1267 141 | 1421 142 | 1399 143 | 1563 144 | 1636 145 | 1293 146 | 1506 147 | 1613 148 | 1958 149 | 1967 150 | 1182 151 | 1050 152 | 1947 153 | 1787 154 | 1774 155 | 1928 156 | 1896 157 | 1303 158 | 1826 159 | 1132 160 | 1254 161 | 1752 162 | 1510 163 | 1705 164 | 1229 165 | 1558 166 | 1989 167 | 1567 168 | 698 169 | 1738 170 | 1357 171 | 1587 172 | 1316 173 | 1838 174 | 1311 175 | 1057 176 | 1644 177 | 1135 178 | 1300 179 | 1134 180 | 1577 181 | 1381 182 | 1806 183 | 1176 184 | 1993 185 | 1769 186 | 1633 187 | 1450 188 | 1819 189 | 1973 190 | 1694 191 | 969 192 | 1987 193 | 1095 194 | 1717 195 | 1933 196 | 1593 197 | 1045 198 | 1355 199 | 1459 200 | 1619 201 | -------------------------------------------------------------------------------- /02.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bufio" 5 | "fmt" 6 | "os" 7 | "regexp" 8 | "strconv" 9 | "strings" 10 | ) 11 | 12 | func main() { 13 | var part1, part2 int 14 | re := regexp.MustCompile(`(\d+)\-(\d+) (\w)\: (\w+)`) 15 | scanner := bufio.NewScanner(os.Stdin) 16 | for scanner.Scan() { 17 | line := scanner.Text() 18 | tokens := re.FindStringSubmatch(line) 19 | a, _ := strconv.ParseInt(tokens[1], 0, 0) 20 | b, _ := strconv.ParseInt(tokens[2], 0, 0) 21 | letter := tokens[3] 22 | password := tokens[4] 23 | n := strings.Count(password, letter) 24 | if n >= int(a) && n <= int(b) { 25 | part1++ 26 | } 27 | if (password[a-1] == letter[0]) != (password[b-1] == letter[0]) { 28 | part2++ 29 | } 30 | } 31 | fmt.Println(part1) 32 | fmt.Println(part2) 33 | } 34 | -------------------------------------------------------------------------------- /02.py: -------------------------------------------------------------------------------- 1 | import fileinput 2 | import re 3 | 4 | records = [] 5 | for line in fileinput.input(): 6 | m = re.match(r'(\d+)\-(\d+) (\w)\: (\w+)', line) 7 | a, b, letter, password = m.groups() 8 | records.append((int(a), int(b), letter, password)) 9 | 10 | print(sum(a <= password.count(letter) <= b 11 | for a, b, letter, password in records)) 12 | 13 | print(sum(((password[a-1] == letter) + (password[b-1] == letter)) == 1 14 | for a, b, letter, password in records)) 15 | -------------------------------------------------------------------------------- /03.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bufio" 5 | "fmt" 6 | "os" 7 | ) 8 | 9 | type Vector struct { 10 | X int 11 | Y int 12 | } 13 | 14 | func hits(grid []string, dir Vector) int { 15 | var result int 16 | var pos Vector 17 | size := Vector{len(grid[0]), len(grid)} 18 | for pos.Y < size.Y { 19 | if grid[pos.Y][pos.X%size.X] == '#' { 20 | result++ 21 | } 22 | pos.X += dir.X 23 | pos.Y += dir.Y 24 | } 25 | return result 26 | } 27 | 28 | func main() { 29 | var grid []string 30 | scanner := bufio.NewScanner(os.Stdin) 31 | for scanner.Scan() { 32 | grid = append(grid, scanner.Text()) 33 | } 34 | 35 | // part 1 36 | fmt.Println(hits(grid, Vector{3, 1})) 37 | 38 | // part 2 39 | dirs := []Vector{ 40 | {1, 1}, 41 | {3, 1}, 42 | {5, 1}, 43 | {7, 1}, 44 | {1, 2}, 45 | } 46 | product := 1 47 | for _, d := range dirs { 48 | product *= hits(grid, d) 49 | } 50 | fmt.Println(product) 51 | } 52 | -------------------------------------------------------------------------------- /03.py: -------------------------------------------------------------------------------- 1 | import fileinput 2 | import math 3 | 4 | def hits(grid, dx, dy): 5 | w = len(grid[0]) 6 | h = len(grid) 7 | x = y = count = 0 8 | while y < h: 9 | if grid[y][x%w] == '#': 10 | count += 1 11 | x += dx 12 | y += dy 13 | return count 14 | 15 | grid = [x.strip() for x in fileinput.input()] 16 | 17 | # part 1 18 | print(hits(grid, 3, 1)) 19 | 20 | # part 2 21 | dirs = [(1, 1), (3, 1), (5, 1), (7, 1), (1, 2)] 22 | counts = [hits(grid, dx, dy) for dx, dy in dirs] 23 | print(math.prod(counts)) 24 | -------------------------------------------------------------------------------- /03.txt: -------------------------------------------------------------------------------- 1 | .#.#....##.......#..........#.. 2 | ...#...........##...#..#....... 3 | #.####......##.#...#......#.#.. 4 | ##.....#.#.#..#.#............#. 5 | ##.....#....#.........#...##... 6 | ###..#.....#....#.............. 7 | ..........#..#.#..#.#....#..... 8 | ##.....#....#.#...#.##......... 9 | #...#......#....##....#..#.#... 10 | .##.##...#....##..#.#.....#...# 11 | .....#.#..........##.#........# 12 | .##..................#..#..##.# 13 | #.#..........##....#.####...... 14 | .#......#.#......#.........#... 15 | #....#..##.##..##........#.#... 16 | ##..#.##..#...#..####.#..#..... 17 | ###....#.###.##...........##..# 18 | .....#.##.....##.#..#####....## 19 | ....#.###....#..##....##...#... 20 | ..###.#...##.....#.##..#..#.#.. 21 | #...#..#..#.........#..#....... 22 | ##..#.#.....#.#.#.......#...#.# 23 | ...#...##.#........#...#....... 24 | ..#..#.#..#...#...#...........# 25 | ........#.....#......#...##.... 26 | #........##.##.#.#...#...#..... 27 | ####.......#.##.###.#....#..... 28 | ...#...........#...#......#...# 29 | ##...#...#............#.......# 30 | ....#...........##.......#..... 31 | ###......#.....#....#...#.#...# 32 | .....##..........#.......#.#... 33 | ##.##.##...#......#....#....... 34 | ##..#.#..#......#...#..#....... 35 | ....#....##.##............####. 36 | ..#.###..#.##.###..#.##.......# 37 | #.##..#.#.....#..#.....##...... 38 | ..##..#.....##.#.##........#... 39 | .#..#.#......#..#............#. 40 | .....#..#.#...#....#.##.#...... 41 | .#...##.#..#.#...##...##..##... 42 | ###............#.#..#..#...#... 43 | ..#..##.####.#.....#.....##.### 44 | #....#.##..##....#..#...#.##.#. 45 | .....#.##.........##...##...... 46 | .........####.#....#.#......#.# 47 | .........#.#..#...#.#..#.#....# 48 | .#.....#..##.##..##....#....... 49 | ..........##......#.##.###....# 50 | .##...###..##.#...#........##.. 51 | ..............#.#....#.#.###.## 52 | ..##.##.......#.#......##...#.. 53 | .#.....#..##..#.###...#..#.##.# 54 | #.....#.#..#...#........#...#.. 55 | .#......#....#.#.....###...#..# 56 | ..##.#....#..##......#.....#... 57 | ..#.#.##..#.....#.####..###.... 58 | .........#......#..#........... 59 | ..#........#.##.#.....##.##..#. 60 | .......#.........#....#...#.#.. 61 | .##.....#.#....#.#.......#..... 62 | ..........#.##........##...##.. 63 | ###..###.#.#..#..#####.##.#.##. 64 | ..##..##.#.#...#..#.#.#......#. 65 | #..#..#..#..##..#.....#......#. 66 | ..#....#.##..#......##......... 67 | ..#.##......#...##.#......#.... 68 | .......#..#.##.#.....#......... 69 | .......#.#.#.###...##......#... 70 | .....#.#..........#..#...#..... 71 | ....##..........#..........##.. 72 | ..#......#.....#.##.#..#...#.#. 73 | ....#.....#..#...#..#.#.##..### 74 | .####....#........#...#........ 75 | ...##.#.##.#..#...##...#.##.... 76 | ....#...#...#.#.#.#...#..#..... 77 | .....#...#.#.....#.#........##. 78 | ..#.#.......###.#.....##....... 79 | ......#.........##....#....#..# 80 | .............##.....##......... 81 | .........##...##.......#.....#. 82 | ##.........#..........#.###..## 83 | ...#.....#......#....#..##..... 84 | ##..#...#...##.#.....#.#......# 85 | ..#...##.#.......#.#......#.##. 86 | ......#.......#.#...........#.. 87 | ..........#.....##............# 88 | #........#...#..#.......###.##. 89 | .##...........#.#........#.#.#. 90 | ...#..##...#.#....#####.#...... 91 | .....##...###...#..#.##...####. 92 | ...#....#.....#..#.......#..... 93 | #....#....#...#..#..#.######..# 94 | #.###...........#......#...#..# 95 | .#.#.#.#..#....#....#...##.#... 96 | .#..#.........#.#....###...#... 97 | ......#..##.##..........#....## 98 | .....#......##....##.....#...#. 99 | .#...#.#.#....##....#..#....#.# 100 | ..................#..###.#..##. 101 | ..#.........#......#....#..###. 102 | #.#.....#..#..#....###..###.... 103 | ..##..##.#..##........##...##.. 104 | ##..#........##..###..#.....#.# 105 | ..#..###..#......#....#...#...# 106 | #..#.#..............##.#..#.#.. 107 | .....####....#...####.....#.#.. 108 | .....#....##.#......###........ 109 | ##.##...#.#.#.#.......#....##.. 110 | .#......#...#.#....#..##.#.##.# 111 | #.#.##.#.#......#..##........## 112 | ...##.....#.....#...#..###...#. 113 | ........###.....#.....#...##..# 114 | .....#.##.##......#.#....#...#. 115 | .#....##.......#..#.####....... 116 | .#..#....#..........#......#.#. 117 | .#.##.##.....###.#.#........... 118 | .........#......#..##.......... 119 | ....#...##.#.#.#..#.#.........# 120 | ..#.....#.##...#..#..#.###....# 121 | ...#.##......#.....##....#..... 122 | ###............#.#....#...#.... 123 | .......#.....#..#.#.#....#..#.# 124 | ...#......#.#..##..#....#...#.# 125 | ............##........##..##... 126 | ..#..#.##..#......###..#....... 127 | ........#.........#............ 128 | ..#...#.#########.#...##..###.. 129 | #....#......#.......#.#.....#.. 130 | #.#..#....###.###....#...#.#... 131 | #...###.#.#.......#.##......#.. 132 | .................#...#.#.#..... 133 | ##....#...#........#....#.#..#. 134 | ......#.....#...#..........#.#. 135 | ##..........#...#..........#.## 136 | ..#.#.##.#....#.#......#...##.. 137 | .....#.......#..#.....#........ 138 | #.##.#..##..#.......##......... 139 | ....#......#..#..#.#...#....... 140 | ...#....#................###... 141 | .##.....#.#....#.#..........##. 142 | ...#..#....#.##.##......#...... 143 | ..#.#....#.......#.#..##....... 144 | ....#.....#..........##.#.##### 145 | #.....................##..#..#. 146 | .###..#.##.......##.#...#..#... 147 | ...###.......#..#...#......#..# 148 | #..#...#.#..#.#..#..#.##....... 149 | #...##.......#..#..#.##..###... 150 | ......#....#.#.#........#.##..# 151 | ..##..#....#....#..#.#..#...... 152 | ..##.#...#.#######..#...#.....# 153 | ..#....#..#.........#..##...... 154 | ...#....#.#......#..#..#.#..... 155 | #..#....#........#.#..##....### 156 | #....#..##......##.##.....#.### 157 | ...#.#..........#..#.#.#.#.##.. 158 | ......##..#.#..#.#....#....#... 159 | ##....#....#..#..#.##......#... 160 | ....#.#..##.#.#...###....##.#.. 161 | ...#.......##..#.......#...#... 162 | ......##.......#..##.....#...#. 163 | ...#.#...#...........#...#..... 164 | .#....#...#......##.##..###..#. 165 | .#..........#...#...#...##.##.. 166 | .....###..#.....#..##....#.#### 167 | ..#.###..#..##..##.....#.#..... 168 | .............#.###...##.#.....# 169 | ....###.......###.#.....#..#.#. 170 | ........##.#.........#.....###. 171 | .....###.#..#.....#...#..#..... 172 | .#....#..##.#..#.#....#.......# 173 | ........#......#.#..#.#..#...## 174 | ...#.##.##......#.............. 175 | .#.....##.#.....#..#......##... 176 | #..#..#.....#.....#.....###.... 177 | .##...........#..#.##.....#.... 178 | ..#.#......#.#...#.##.#..#...## 179 | ...#..........#.....#.......... 180 | #.#.#.#.#...#....#...#.....##.. 181 | #......##...#...#..........#.#. 182 | ....##........#.#.............. 183 | #..#.#.#..#........##......#.## 184 | ........####...##.#.....#...... 185 | ....#........#.#..#..##..#.#... 186 | .#.....#..###...#..#.....#..#.. 187 | #......###.#..#....#..#.#...... 188 | ....#.....##.##..#...#.#..##.#. 189 | ..##..#...#.#......#....#...#.# 190 | #..##...##..#...###...#..#..... 191 | .......#.....#...........##.... 192 | #..##....#........#....##..#.#. 193 | .#........#..##...###.#..#..... 194 | .#.#....#..##...#...##.#..###.. 195 | #.........#.......#.....#.#.... 196 | #..#.....#.#.###.#..#......#... 197 | ....#..#.#....#..##..###....### 198 | ###.##.#.#..#...........#.#.#.. 199 | ..##.#.......#......#..##....#. 200 | .....#.#.#.......##.......#...# 201 | ...........#.##....##.##....#.# 202 | ...#.......#..#.##..#......#..# 203 | #.#.#...#......##.#...........# 204 | ##........#...........###.#..#. 205 | ..........#.#.#....#.#..##.#.#. 206 | ...#.#.#....#..........#..#.... 207 | #.#....###.#.#..#.......###...# 208 | .#....#......#.#.#..#..#....... 209 | ......##.............#....#.#.# 210 | .#..........#.........#.##..... 211 | ##....#....##....#..#.......#.. 212 | #.##.##.#..#..#.....#..#.##.#.. 213 | .#..#.......##..#.....##.##.... 214 | .......#..........#.#.##..#.##. 215 | ....#.....#.#...##....##....... 216 | .......#.........#...##....##.# 217 | #.....#......#..........#...#.. 218 | ...#.#.......#.#..#....###..#.. 219 | .....#.#.#.........#........... 220 | .#..###.#.#........#.#......... 221 | .........#..#......##...##....# 222 | ...###..#.....##.....#.###....# 223 | .##...#...#........###.#..#.... 224 | .##........#..#.###.######.##.# 225 | ##.#...#.#....#..##.#....##.... 226 | .......##.....##.#..###.#...... 227 | ..##...##........#.......#....# 228 | #..##...#.####...###......#...# 229 | .##.....#.##.#.#.....###.#..##. 230 | ..###....#.#.###.#....#........ 231 | ....#..###..#...#....#..#..#.#. 232 | #.#.##....##...##.......#...... 233 | .........#...#....#..#......... 234 | .............#...#..##.#....... 235 | ...#.##.......#...#.#..##.##... 236 | .####.#.##..#.#......#.##...#.# 237 | .#..#.#.....#.................# 238 | ..#.##..###....#...#......####. 239 | ..##..##...........#....#...#.. 240 | ....#...#...#...#.......#....#. 241 | #.#...###...#...#.#...#....##.# 242 | ......#...#.#.......#.....#...# 243 | ....##...#.#.#....#....#.#....# 244 | .....#.....#...##..#...#....##. 245 | #.....#....#......##.##....#... 246 | ...#.#....#...#....#.#....##..# 247 | ...#.#..#...##....###..#....... 248 | ...##......###...###.#...#..#.. 249 | ##.......#.......###.......#..# 250 | ..##.##..###.#............#...# 251 | #.....##..#..##....##..#....... 252 | ......#.#...#......#.....#..... 253 | #...........#....#..##.##.#.... 254 | .......#..#......#...#....#...# 255 | .#...##...........#......#...#. 256 | #........#....##...###.#....#.. 257 | .....#.......##.........#.##... 258 | .#.###..#....#..##.#..#.#..#... 259 | #.......#.##.#.#....#.#..#....# 260 | ###.....#.#.......#..#......#.# 261 | #..#.#.......#.#..##..##.#.#... 262 | #..#.#.#.###........#.....#...# 263 | #.#.#..#..##.....#...........#. 264 | ..#.#..#.....#...#...#...##.... 265 | ...#.##......#...##.#...#.#.#.# 266 | #..#.#.#.#.......####.......... 267 | ..#......#.#......##.###.....## 268 | ..#...##..#.........##....#.##. 269 | ##.##.##.#.#.....#..........##. 270 | .#.....###.#..#....#..#.###...# 271 | #...##.......###....#.#..#..... 272 | ..#....##.........##.........## 273 | ......#....#.##.......#........ 274 | ..#.#.#..#...#...#...##.#...#.. 275 | ......#..##.#.#.#...##...#.#.## 276 | #..#...##.#.....#...#.##....... 277 | ..#..#.........##.#...#.##...## 278 | ##.##.#....#.......#.##..#..... 279 | .....##...##.##...##.........## 280 | #......#...#.......#...#...#... 281 | ...##...........#...#..#....... 282 | .#.##.#..#........#....#....... 283 | #.#...#..#......##...#.#.##.... 284 | ##........####..#.#...#.#.##.## 285 | #..#.#.##......##.#.#..#....... 286 | .....#.........#..#.####....#.. 287 | ......##..#....#...#.#....#.... 288 | #...##........#.........#.....# 289 | .#.#...#.#.#..#............##.# 290 | .#..#....#....#.....#...#.....# 291 | ..###...#..#.....#.##.###...#.# 292 | .#.###..#..#...#.#...#.#......# 293 | #...#####......###........##... 294 | .....#.....#..#.#....#..##..... 295 | ....##...#.#.##.#####...#....#. 296 | .#.#.........##.#.......#..##.. 297 | .#...#.#...#...#....#.#...##.#. 298 | .##...#..#.#..#......#.#.#..##. 299 | ..#.....#..#.....##.....#...... 300 | ..#........#..##...#.......###. 301 | .#....#.......#....#....#..#... 302 | ....#......#.#.#.........#..... 303 | ..##...#.#.#...#.#........#.... 304 | .#.....####...##.#..#...##..... 305 | ...#.....#...#...#....#....#... 306 | .........#..#.#.....#..#.#..#.. 307 | .........##...........#.......# 308 | ......#..#.....##...#.##.#..... 309 | .#......##........##...#.#.##.. 310 | .....#.#..##...........#..#..#. 311 | ...#.......#...#.#..#.##..#.##. 312 | ...#.......#.....#.#...#.##.#.. 313 | #.....#.............##.#..####. 314 | .#...#......#...##.#....#.#.... 315 | .##..##.##....#.#.....#.......# 316 | ...#...#....#....##.#..#....##. 317 | ..............##....#.......#.# 318 | .#.#.#...##..#..#...###.#..#... 319 | .#.#...#.#..#.#..#...######..#. 320 | ........#......#.#..#.#....#... 321 | ..###.....###.#.##....#...##... 322 | .##.#.....#.......##.......#... 323 | ..#..##...#..........#.#....#.# -------------------------------------------------------------------------------- /04.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "io/ioutil" 6 | "os" 7 | "regexp" 8 | "strconv" 9 | "strings" 10 | ) 11 | 12 | type Passport map[string]string 13 | 14 | func parsePassports(data string) []Passport { 15 | var passports []Passport 16 | for _, s := range strings.Split(data, "\n\n") { 17 | passport := make(Passport) 18 | for _, field := range strings.Fields(s) { 19 | split := strings.SplitN(field, ":", 2) 20 | passport[split[0]] = split[1] 21 | } 22 | passports = append(passports, passport) 23 | } 24 | return passports 25 | } 26 | 27 | func part1(passports []Passport) int { 28 | required := []string{"byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"} 29 | result := len(passports) 30 | for _, p := range passports { 31 | for _, k := range required { 32 | if _, ok := p[k]; !ok { 33 | result-- 34 | break 35 | } 36 | } 37 | } 38 | return result 39 | } 40 | 41 | func part2(passports []Passport) int { 42 | type Validator struct { 43 | Key string 44 | Regexp *regexp.Regexp 45 | Func func([]string) bool 46 | } 47 | 48 | re := func(str string) *regexp.Regexp { 49 | return regexp.MustCompile(str) 50 | } 51 | 52 | parseInt := func(s string) int { 53 | x, _ := strconv.ParseInt(s, 0, 0) 54 | return int(x) 55 | } 56 | 57 | validators := []Validator{ 58 | {"byr", re(`(\d{4})`), func(m []string) bool { 59 | year := parseInt(m[1]) 60 | return year >= 1920 && year <= 2002 61 | }}, 62 | {"iyr", re(`(\d{4})`), func(m []string) bool { 63 | year := parseInt(m[1]) 64 | return year >= 2010 && year <= 2020 65 | }}, 66 | {"eyr", re(`(\d{4})`), func(m []string) bool { 67 | year := parseInt(m[1]) 68 | return year >= 2020 && year <= 2030 69 | }}, 70 | {"hgt", re(`(\d+)(cm|in)`), func(m []string) bool { 71 | height := parseInt(m[1]) 72 | units := m[2] 73 | if units == "cm" { 74 | return height >= 150 && height <= 193 75 | } 76 | return height >= 59 && height <= 76 77 | }}, 78 | {"hcl", re(`(#[0-9a-f]{6})`), func(m []string) bool { 79 | return true 80 | }}, 81 | {"ecl", re(`(amb|blu|brn|gry|grn|hzl|oth)`), func(m []string) bool { 82 | return true 83 | }}, 84 | {"pid", re(`(\d{9})`), func(m []string) bool { 85 | return true 86 | }}, 87 | } 88 | 89 | result := len(passports) 90 | for _, p := range passports { 91 | for _, v := range validators { 92 | value := p[v.Key] 93 | m := v.Regexp.FindStringSubmatch(value) 94 | if len(m) == 0 || len(m[0]) != len(value) || !v.Func(m) { 95 | result-- 96 | break 97 | } 98 | } 99 | } 100 | return result 101 | } 102 | 103 | func main() { 104 | bytes, _ := ioutil.ReadAll(os.Stdin) 105 | passports := parsePassports(string(bytes)) 106 | fmt.Println(part1(passports)) 107 | fmt.Println(part2(passports)) 108 | } 109 | -------------------------------------------------------------------------------- /04.py: -------------------------------------------------------------------------------- 1 | import fileinput 2 | import re 3 | 4 | passports = [x.split() for x in ''.join(fileinput.input()).split('\n\n')] 5 | passports = [dict(x.split(':') for x in passport) for passport in passports] 6 | 7 | # part 1 8 | required = set(['byr', 'iyr', 'eyr', 'hgt', 'hcl', 'ecl', 'pid']) 9 | print(sum(set(passport) >= required for passport in passports)) 10 | 11 | # part 2 12 | validators = { 13 | 'byr': (r'(\d{4})$', lambda x: 1920 <= int(x) <= 2002), 14 | 'iyr': (r'(\d{4})$', lambda x: 2010 <= int(x) <= 2020), 15 | 'eyr': (r'(\d{4})$', lambda x: 2020 <= int(x) <= 2030), 16 | 'hgt': (r'(\d+)(cm|in)$', lambda x, u: 150 <= int(x) <= 193 if u == 'cm' else 59 <= int(x) <= 76), 17 | 'hcl': (r'(#[0-9a-f]{6})$', lambda x: True), 18 | 'ecl': (r'(amb|blu|brn|gry|grn|hzl|oth)$', lambda x: True), 19 | 'pid': (r'(\d{9})$', lambda x: True), 20 | } 21 | 22 | print(sum(all((m := re.match(pattern, passport.get(key, ''))) and func(*m.groups()) 23 | for key, (pattern, func) in validators.items()) for passport in passports)) 24 | -------------------------------------------------------------------------------- /05.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bufio" 5 | "fmt" 6 | "os" 7 | "sort" 8 | "strconv" 9 | "strings" 10 | ) 11 | 12 | func main() { 13 | var ids []int 14 | r := strings.NewReplacer("F", "0", "B", "1", "L", "0", "R", "1") 15 | scanner := bufio.NewScanner(os.Stdin) 16 | for scanner.Scan() { 17 | id, _ := strconv.ParseInt(r.Replace(scanner.Text()), 2, 0) 18 | ids = append(ids, int(id)) 19 | } 20 | sort.Ints(ids) 21 | 22 | // part 1 23 | fmt.Println(ids[len(ids)-1]) 24 | 25 | // part 2 26 | for i := 1; i < len(ids); i++ { 27 | if ids[i]-ids[i-1] == 2 { 28 | fmt.Println(ids[i] - 1) 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /05.golf.py: -------------------------------------------------------------------------------- 1 | import fileinput 2 | 3 | ids = set(sum(('FBLR'.index(x[9-i])&1)<= 0 and ny >= 0 and nx < w and ny < h: 7 | if grid[ny][nx] == '#': 8 | return 1 9 | if grid[ny][nx] == 'L': 10 | return 0 11 | if one: 12 | break 13 | nx += dx 14 | ny += dy 15 | return 0 16 | 17 | def step(grid, one): 18 | result = [list(row) for row in grid] 19 | w = len(grid[0]) 20 | h = len(grid) 21 | limit = 4 if one else 5 22 | changed = False 23 | for y in range(h): 24 | for x in range(w): 25 | n = sum(scan(grid, x, y, w, h, dx, dy, one) 26 | for dy in [-1, 0, 1] for dx in [-1, 0, 1] if dx or dy) 27 | if grid[y][x] == 'L' and n == 0: 28 | result[y][x] = '#' 29 | changed = True 30 | if grid[y][x] == '#' and n >= limit: 31 | result[y][x] = 'L' 32 | changed = True 33 | return result, changed 34 | 35 | def run(grid, one): 36 | grid = [list(row) for row in grid] 37 | while True: 38 | grid, changed = step(grid, one) 39 | if not changed: 40 | return sum(x == '#' for row in grid for x in row) 41 | 42 | grid = [list(line.strip()) for line in fileinput.input()] 43 | print(run(grid, True)) 44 | print(run(grid, False)) 45 | -------------------------------------------------------------------------------- /11.txt: -------------------------------------------------------------------------------- 1 | LLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLL.LLLLLL.LLLLLLLL.LLLLL.LLLLLLLL..LLLLLLLLL 2 | LLLLLLLLL.LLLL.LLLLL.L.LLLLLLL.LLLLLLLLL.LLLLLL.L.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL 3 | LLLLLLLLL..LLL.LLLLL.LLLLLLLLL.LLLLLLLL..LLLLLLLL..LLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL.LLL.L.LLLLLLLLL 4 | LLLLLLLLL.LLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLL...LLLLL.LLLLLLLLL.L 5 | LLLLLLLLL.LLLLLLLLLL.LLLLLLL.L.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLL.L.LLL.L.LLLL.LLLL 6 | LLLLLLLLLLLLLLLLLLLLLLLLLLL.LL.LLLLLLLLLLL.LLLLLL.LLLLLL.LLLLLL.LLLL.LLL..LLLLLL.LLLLLLL.LLLLLLLLL 7 | LLLLLLLLLLLLLLLLLLLL.LLL.LLLLL.LLLLLLLLL.LLLL.LLLLLL..L..LLLLLLLLLLLL.LL.LLLLLLLLLLLLLLL.LLLLLL.LL 8 | L....L.....L..L...................L.....L..L..L..L...LL....LL....L...........L.L.L..LL.L..LL..L... 9 | LLLLLLLLL.LL.L.LLLLL.LLLLLLLLLLLLLLLLL.L.LLLLLLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLL..LLLLLL.LLLLLLLLL 10 | LLLLLL.LL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLL.LLLLLL.LLLLL.LL..LLLLLLLLLLLLLL.LL.LLLLLL 11 | LLLLLLL.L.L.LLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLL..LLLLLLLLLLLLLLL..LL.LLLL. 12 | LLLL.LLLL.LLLL.LLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLL.LL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL 13 | L..L........L....LL.......L.......L.L..LLL.LL..L.LL.L..L.LLL..L.....L.L.......LLLL..........L.L... 14 | LLLLLLLLL.LLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL 15 | LLLLLLL.L.LLLLLLLLLL.LLL.LLLLL.LLLLLLLLL.LLLLLLLL.LLLLL.LLL.LLL.LLL.LLLL.LLLLLLLLLL.LLL..LLL.LLLLL 16 | LLLLLLLLLLLLLL.LLLLL.L.LLLLLLL.LLLLLLLLL.LL.LLLLLLLLLLLL.LLLLLL.LLL.LLLL.LLLLLL..LLLLLLLLLLLLLLLLL 17 | LLLLLLL.LLLLLL.LLLLL.LLLLL.LLLLLLLL.LLLL.LLLLLLLL.LLLLLL.LLLL.L.LLLLLLL..LLLLLLLLLLLLLLLLLLLLLLLLL 18 | LLLLLLLLL.LLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLL.LLL.L 19 | LL.L.LL.L.LLLLLL.LLLLLLL..LLLL.LLLLLLLLL.LLLLLLLL.LL.LLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL 20 | LLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLL.L.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LL.LLLLL.LLLLLLLLL 21 | LLLLLLLLL.LLLL.L.LLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LL.LLLLLLL.L.LLLLLLL 22 | LLLLLLLLLLLLLL.LLL.L.LLLLLLLLL.LLLLLLLLL.LLLLLLL..LLL.LL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL 23 | L.LLL..L.L..LL.LL......L..LLLL.L..LL...L......LL.LL.LL.L.LLL.L..........L....L..L..L....L....L..LL 24 | .LLLLLLLL..LLL.LL.L..LLLLLLLLL..LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLL 25 | LLLLLLLLL.LLLL.LLLLL.L.LLLLLLL.LLL.LLL.L.LLLLLLLLLLLLLLLLLLLLLL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL 26 | LLLLLL.LLLLLLL.LLLLLLLLLLLLLLL.LLLLL.LLL.LL.LLLLL.LLLLLL.LLLLLL.LL.LLLLL.LLLLLLL..LLLLLL..LLLLL.LL 27 | LLLLLLLLL.LLLL..LLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLLLL.LLLLLLLLLLLLLL..L 28 | LLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLL.LLLLLLLL..LLLLLL.LLLLLLL.LL.LLLLLL 29 | LLLLLL.LL.LLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLL..L.LLLL.LL.LLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL 30 | .......L........LL.L...L......L...LL.....LL..LLL..L........LLLL.LL.LLLLL...L.LLL.LL..LL.LL...L.... 31 | LLLLLLLLL.LLLL..LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLL.LL.LLLLLL.LLLLLLLL.L.LLLLL.LLLLLLL.LLLLLLLLL 32 | LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL 33 | LLLLL.LLL.L.LLLLLLLL.LLLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLLLLL..LLLLLL.LLLLL.LLLLLLLLLLL 34 | L.LLLLLLL.L.LLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLL..LLL.LLLLLLLLLLLLLLL.LLLLLLLL. 35 | .LLLLLLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLL.LL.LLLLLLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL 36 | ...LL..L..L....L.....L...L.............LL....LLLL.L....L....L.....LL..LL.L....LLL.L..LLL.L.LL...LL 37 | LLLLLL.LL..LLL.LLLLLL.LLL.LLL..LL.LLLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL 38 | LLLLLLLLL.LLLL.LLLLLLLLL.LLLLL.L.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL 39 | LLLLLLLLL.LLLL.LL.LL.LLLLLLLLLLLLLLLLLLL.LLLLLLL.LL.LLL..LL.LLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL 40 | LLLLLLL.L.LLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL 41 | LLLLLLLLL.L.LL.LLLLL.LLLLLLLLL.LLLLLLLLL..LLLLLL.LLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL 42 | ..LL..L.LLLL..L....L.....LLL...LL....L...LL...LLLL......L.........LLLL...LLLL.L..L..LL.L.LL....L.. 43 | .LLLLL.L..LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLL.LLLLLLLLLLLLL.L.LLLLLLL.LLLLLLL.LLLLLLLLL 44 | .L.LL.LLL.LLLL.LLLLL.LLLLLLLLL.LL.LLLLLL.LLLLLLL...LLLLL.LLLLLL..LLLLLLL.LLLLLLL.LLLLLLL.L.LLLLLLL 45 | LLLLLLLLL.L..L.LL.LL.LLLLLLLLLLLLLLLLLLL.LLLLLL.L.LLLLLLLLLLLLL.LLLLL.LLLLLLLLLL.LLLLLLL.LLLLLLLLL 46 | LLLLLLLLL.LLLL.LLLLL.LLL.LLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLL..L.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.L 47 | LLLLLLLLLLLLL.LLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL 48 | LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLL..LLLLL..LLLLLLLLL 49 | LLLLLLLLL.LLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLL.LLLLL.LLLLLLLLLL.LLLLLLL.LLLLLLLLL 50 | LLLLLLLLL.LLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LL.LLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLLLL.LLLLLLLLLLLLLLLLL 51 | .......L.L.....LLLLL.L.L.L.L...L.L..L...L.......L....L....L.......L..LL........L..LL..L........... 52 | LLL.LLLLL.LLLL.LLLLLLLLL..LLLLLLLLLLLLLLLLLLLLLL..LL.LLL.LLLLLL.L..LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL 53 | LLLLL.LLL.LL.L.LLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLL.LLL.LLLLLLLLLLLL.LLL.LLLLLLLLLLLLL 54 | LL.LLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL 55 | LLLLLLLLL.LLLL.LLLLLLLLLL.LLLL.LLLLLLLLL.L.LLLLLLLLLLLLL.LLLL.L.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL 56 | LLLLLLLLLLLLLL.LL.LL.LLLLLLLLL..LLL.LLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLL.LLLLLLL.LLL.LLLLLLLLL.LLLLLLL 57 | .L..LLL........L.LLL.L....L...LL....LLL.L.L.......LLL....LL..L.....LL.LLL.L.LLL..LL.L...L...L..LLL 58 | LLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL 59 | .LLLLLLLLLLLLL.LLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLL.L.LLLLLLL.LL.LLLL.LLLLLLLLL 60 | LLLLLLLLL.LLLL.LLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL..LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL 61 | LL.LLLLLL.LLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLL..LLLLLL.LLLLL.LL.L.LLLLLLLLLLLLL.LLLLLLLLL 62 | ......L....L.........L.LL..L.....LL.L.LL.....L....L..L..............L...L.LL.LL..LL........L..L..L 63 | LLLLLLLLL.L.LL.LLLLL..LLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLL..LLLLL.L.LLLLLL.LLLLLLL.LL.LLLL.LLLLLLLLL 64 | LLLLLLLLL.LLLL.LL.LL.LLLLLLLLL.LLLLLLLLL.LL.LLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLL.L 65 | LLLLLLL.L.LLLL..LLLLLLLLLL.LLL.LLLLLLLLL..L.LLLLL.LLLLLLLLLLLLL.LLLLLLL..L.LLLLL.LLLLLLL.LLLLLLLLL 66 | LLLLLL.LL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.L 67 | ...LLL........L..L...L.L.LL.LL.....L...L......LL.L..LLLL....LL....L.L.L..L.L.L...L...L.L........L. 68 | LLLLLLLLL.LLLL..LLLL.LLLLLLLLL.LLLLLL.LL.LLL.LLLL.LLLLLL.LLLLLL.L.LLLLLL.LLLLLLL.LLLLLLLLLLLLL.LLL 69 | LLLLLLLLLL.LLL.LLLLLLLLLLLLLLLLL.LLLLLLL.LLL.LLL..LL.LLLLLLLLLL..LLLLLLL.LLLL.LL.LLLLLL...LL.LLLLL 70 | LL.LLLLLL.LLLLLLLLLL.LLLLLLL.L.LLLLLLLLL..LLLLLLL.LLLLLL.LLLLLL.LLLL.L.L.LLLLL.LLL.LLLLL.LLLLLLLLL 71 | LLL.LLLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLL...LLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL 72 | ....L.LL.L......L....LL...L.L.L...L..L........L.L.L......LL...L.....LL..L......LL..........L..L... 73 | LLLLLLLLL..LLLLLLLLLLLLLLLLLLLLLLLL..LLL.LLLLLLLL.LLLLL..LLLLLL.LLLLLLLL.LLLL.LL.LLLLLLL.LLLLLLLLL 74 | LLL.LLLLL.LLLL.LL.LL.LLLLLLLL.LLLLLLLLLL.LLL.L.LL.LL.LLL.LLLLLL.LLLLLLLL.LLLLLLL.L.LLLL..LLLLLLLLL 75 | LLLLLLLLL.LLLL..LLLL.LLLLLLLLL.LLLLLLLLL.LL.LLLLLLLLLLL..LLLLLLLLLLLLLLL.LLLLLL..LLLLLLL.LLLLLLLLL 76 | LLLLLLL.L.LLLL.LL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL..LLLLLL..L.LL.LL.LLLLLLL.LLLL.LL.L.LLLLLLL 77 | ........LL....L.L.LL.L..L.....L...L..L.LL...LLLL.L.....L...L...L..L...L...L.L...LL..L.L.L....LLL.. 78 | LLLLLLLLL.LLLLLLLL.LLLLLLLLLLL..LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLL.LLL.LLLLL.L.LLLLLLLLL 79 | LLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLL.L.L.LL.L.LLLLLLLLLLLLLLL.L.LLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLL 80 | LLLLL.LLLLLLL..LLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLL...LLLL.LLLLLL.LLLLLLLL..LLLLLL.LLLLLLLLLLLLLLLLL 81 | LLLL.LLLL.LLLL.LLL.L.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LLLL.LL.L 82 | LLLLLLL...LLLL.LLLLL.LLL.LLLLL.LLLLLLLLL.LLLLLL.L.LLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLL.LLLLLLLLL.LLL 83 | LLLLLLL.LLLLLL.LLLLL.LLLLL.LLLLLLLLLLLL.LL.LLLLLL.LLL.LLLLLLLLL..LLLL..LLLLL.LLL.LL.LLLL.LLLLLLLLL 84 | LLLLLLLLLLLLLL.LL.LL.LLLLLLLLL.LLLLLLLLL.LLLLLL.L.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.L 85 | L.L.....L......LL....L.L...L..LL..LLLL.L.L....L.L.LL..LL....LL.LL...L..LL..LLL.LLL.L..L..L........ 86 | LLLLLLLLL.LLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.L.LLLL.LLLLLLLLLL 87 | LLLLLLLLL.LLLL.LLL.LLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.L 88 | LLLLLLLLL.LLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL 89 | LLLLLLLLL.LLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL 90 | LLLLLLLLLLLLLL.LLLLL.LL.LLLLLL.LLLLLLLLL.LLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLL 91 | LLL.LLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.L.LLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LL.LLLLLL 92 | LLLLLLLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.L.LLLLL.LLLLLLL.LLLLLL..LLLLLLLLLLLLLLLLLLLLLLL.LLLLL...L 93 | LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLL..LLLLLLLLLLLLLLL.LL.LLLLLLLLLLLL.LLLLLLLLL 94 | LLLLLLLLLLLLLLLLLLLL.LLL.LLLLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLL..LLLL.LL.LL.LLLL.LLLLL.L.LLLLLLLLL 95 | LL.LLLLLL.LLLL.LLLLL.LLLLLLL.L..LLLLLLLL.LLLL..LLLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLL 96 | LLLLLLLLL.LLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.L.LLLLL.LLLLLLLLL 97 | .LLL.LLLL.LLLL.L.LLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LL.LLL.LLLLLLLL.LLLLLLL.LLLLLLL..LLLLLLLL 98 | LLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL -------------------------------------------------------------------------------- /12.py: -------------------------------------------------------------------------------- 1 | from math import * 2 | import fileinput 3 | 4 | def part1(commands): 5 | x = y = a = 0 6 | for command, value in commands: 7 | if command == 'N': 8 | y += value 9 | if command == 'S': 10 | y -= value 11 | if command == 'E': 12 | x += value 13 | if command == 'W': 14 | x -= value 15 | if command == 'L': 16 | a += value 17 | if command == 'R': 18 | a -= value 19 | if command == 'F': 20 | x += int(cos(radians(a))) * value 21 | y += int(sin(radians(a))) * value 22 | return abs(x) + abs(y) 23 | 24 | def part2(commands): 25 | x = y = 0 26 | dx, dy = 10, 1 27 | for command, value in commands: 28 | if command == 'N': 29 | dy += value 30 | if command == 'S': 31 | dy -= value 32 | if command == 'E': 33 | dx += value 34 | if command == 'W': 35 | dx -= value 36 | if command == 'L': 37 | c = int(cos(radians(value))) 38 | s = int(sin(radians(value))) 39 | dx, dy = c * dx - s * dy, s * dx + c * dy 40 | if command == 'R': 41 | c = int(cos(radians(-value))) 42 | s = int(sin(radians(-value))) 43 | dx, dy = c * dx - s * dy, s * dx + c * dy 44 | if command == 'F': 45 | x += dx * value 46 | y += dy * value 47 | return abs(x) + abs(y) 48 | 49 | commands = [(x[0], int(x[1:])) for x in fileinput.input()] 50 | print(part1(commands)) 51 | print(part2(commands)) 52 | -------------------------------------------------------------------------------- /12.txt: -------------------------------------------------------------------------------- 1 | R90 2 | W5 3 | R90 4 | F3 5 | E4 6 | L90 7 | N5 8 | F100 9 | W1 10 | R180 11 | F11 12 | S1 13 | E4 14 | F75 15 | N4 16 | W1 17 | F66 18 | N3 19 | L90 20 | F2 21 | R90 22 | E1 23 | S3 24 | F84 25 | L90 26 | N1 27 | R90 28 | F49 29 | S1 30 | R90 31 | E2 32 | R90 33 | N1 34 | L90 35 | S1 36 | R90 37 | F100 38 | E4 39 | R90 40 | N3 41 | W1 42 | L180 43 | E4 44 | F30 45 | N5 46 | F40 47 | R270 48 | E4 49 | L90 50 | F94 51 | L90 52 | E3 53 | F61 54 | S4 55 | F78 56 | S2 57 | R180 58 | W2 59 | F14 60 | L90 61 | F100 62 | L90 63 | F15 64 | E4 65 | L90 66 | F77 67 | S2 68 | F58 69 | R90 70 | E2 71 | F41 72 | N4 73 | R180 74 | S2 75 | F91 76 | S3 77 | F52 78 | W4 79 | S3 80 | F73 81 | S4 82 | F50 83 | W3 84 | L90 85 | F70 86 | N5 87 | N2 88 | L90 89 | F100 90 | W1 91 | R90 92 | N4 93 | E1 94 | R90 95 | F63 96 | L90 97 | W4 98 | F30 99 | N3 100 | L90 101 | F76 102 | R90 103 | W1 104 | N4 105 | R180 106 | F20 107 | S4 108 | F8 109 | R90 110 | F47 111 | W2 112 | L180 113 | W2 114 | F75 115 | F56 116 | L90 117 | F35 118 | R90 119 | S2 120 | L90 121 | F1 122 | W3 123 | F44 124 | L90 125 | S2 126 | F93 127 | E1 128 | N5 129 | F83 130 | F28 131 | S1 132 | R90 133 | N4 134 | W2 135 | E4 136 | F48 137 | N3 138 | F65 139 | E1 140 | R180 141 | W4 142 | S1 143 | W5 144 | S3 145 | F18 146 | E3 147 | S3 148 | R90 149 | W5 150 | R180 151 | W2 152 | R90 153 | F71 154 | W2 155 | R90 156 | S4 157 | L180 158 | N4 159 | W3 160 | S5 161 | F12 162 | L90 163 | F83 164 | E5 165 | W2 166 | N3 167 | E1 168 | S4 169 | F95 170 | R90 171 | F77 172 | L270 173 | N2 174 | W4 175 | F45 176 | W5 177 | R90 178 | W5 179 | N1 180 | R90 181 | E2 182 | F5 183 | L270 184 | E5 185 | F79 186 | L90 187 | F57 188 | R90 189 | E5 190 | F46 191 | N5 192 | F30 193 | E3 194 | N4 195 | W2 196 | F100 197 | E3 198 | S5 199 | W5 200 | F34 201 | E4 202 | S3 203 | F30 204 | S4 205 | L90 206 | S2 207 | F51 208 | W5 209 | F41 210 | E5 211 | N1 212 | R90 213 | S4 214 | F97 215 | L180 216 | S1 217 | F38 218 | N3 219 | E3 220 | R90 221 | S5 222 | F59 223 | L270 224 | W2 225 | F71 226 | L90 227 | N3 228 | F36 229 | L90 230 | S1 231 | F24 232 | S1 233 | R90 234 | F56 235 | S3 236 | F53 237 | E1 238 | E3 239 | F78 240 | R180 241 | N2 242 | E4 243 | R90 244 | E1 245 | S2 246 | W3 247 | S3 248 | F64 249 | W1 250 | R180 251 | F73 252 | F92 253 | S5 254 | R180 255 | W4 256 | N5 257 | E2 258 | R270 259 | E5 260 | N2 261 | E3 262 | S3 263 | R90 264 | S4 265 | W2 266 | N4 267 | E5 268 | L180 269 | F6 270 | R90 271 | W2 272 | N1 273 | L90 274 | F16 275 | N4 276 | R90 277 | F65 278 | R90 279 | N3 280 | L90 281 | W5 282 | R90 283 | N1 284 | F41 285 | W2 286 | S1 287 | W3 288 | F69 289 | W5 290 | N4 291 | F71 292 | W4 293 | R90 294 | F94 295 | W1 296 | F30 297 | W2 298 | N2 299 | F65 300 | R90 301 | N4 302 | R90 303 | E1 304 | L180 305 | E2 306 | L180 307 | S4 308 | R90 309 | E4 310 | R90 311 | E5 312 | S3 313 | F73 314 | N4 315 | W4 316 | S2 317 | E4 318 | L90 319 | N4 320 | F100 321 | S4 322 | L90 323 | E3 324 | N3 325 | R90 326 | N1 327 | W4 328 | S3 329 | S5 330 | F46 331 | N5 332 | R180 333 | F75 334 | S5 335 | L90 336 | F42 337 | L90 338 | L90 339 | W2 340 | F67 341 | W2 342 | W3 343 | E3 344 | L90 345 | W3 346 | F72 347 | N3 348 | W2 349 | L90 350 | N4 351 | F12 352 | W2 353 | F20 354 | W2 355 | F5 356 | N5 357 | W5 358 | L180 359 | W2 360 | F45 361 | W4 362 | L90 363 | E3 364 | L90 365 | S2 366 | F69 367 | R90 368 | W3 369 | R180 370 | N5 371 | E3 372 | F8 373 | S5 374 | R90 375 | S5 376 | F64 377 | R90 378 | W4 379 | F46 380 | R90 381 | W3 382 | N1 383 | F6 384 | N4 385 | R90 386 | F38 387 | F5 388 | E5 389 | N4 390 | R90 391 | W1 392 | F66 393 | R270 394 | W3 395 | R90 396 | W5 397 | R90 398 | W2 399 | S4 400 | W2 401 | R270 402 | E5 403 | R90 404 | S5 405 | R90 406 | S1 407 | L90 408 | N2 409 | W5 410 | S3 411 | W3 412 | L90 413 | E2 414 | L90 415 | F51 416 | R90 417 | L90 418 | N3 419 | W4 420 | N1 421 | W4 422 | W4 423 | L90 424 | F7 425 | S4 426 | E1 427 | S1 428 | R90 429 | F3 430 | E4 431 | F73 432 | W4 433 | L90 434 | W4 435 | F4 436 | R90 437 | E5 438 | S2 439 | E3 440 | L90 441 | F77 442 | W3 443 | L90 444 | S5 445 | W4 446 | S3 447 | E4 448 | R270 449 | S5 450 | F99 451 | E4 452 | E5 453 | L90 454 | N2 455 | F58 456 | R90 457 | E2 458 | N1 459 | W4 460 | F85 461 | W4 462 | N2 463 | E3 464 | L90 465 | E4 466 | R90 467 | N4 468 | E3 469 | F64 470 | W5 471 | S5 472 | F89 473 | F29 474 | L90 475 | F80 476 | N1 477 | L90 478 | W4 479 | S5 480 | F76 481 | E5 482 | F83 483 | E2 484 | F60 485 | W3 486 | N4 487 | W1 488 | R90 489 | F25 490 | W5 491 | S3 492 | W5 493 | L180 494 | E4 495 | F79 496 | S1 497 | W5 498 | F42 499 | W3 500 | F6 501 | E5 502 | L90 503 | S3 504 | L90 505 | N2 506 | L270 507 | F80 508 | W3 509 | L180 510 | E4 511 | N2 512 | F87 513 | W5 514 | W5 515 | R90 516 | L90 517 | W3 518 | R180 519 | F69 520 | L90 521 | F9 522 | E4 523 | F37 524 | L90 525 | S3 526 | F50 527 | L90 528 | W1 529 | F70 530 | N5 531 | L90 532 | W4 533 | N2 534 | W5 535 | F19 536 | N4 537 | W2 538 | N1 539 | W4 540 | R90 541 | F56 542 | W1 543 | L90 544 | E4 545 | R90 546 | S5 547 | F2 548 | L90 549 | N2 550 | F77 551 | E1 552 | L270 553 | F31 554 | W1 555 | N4 556 | L90 557 | W2 558 | L180 559 | W1 560 | S2 561 | E3 562 | F93 563 | N5 564 | E4 565 | F39 566 | S4 567 | W3 568 | L90 569 | N1 570 | R90 571 | S2 572 | F11 573 | F95 574 | E3 575 | S4 576 | W4 577 | R90 578 | F56 579 | N3 580 | F16 581 | L270 582 | E2 583 | S3 584 | F56 585 | W4 586 | N1 587 | E1 588 | N5 589 | R90 590 | F86 591 | N5 592 | R90 593 | S1 594 | S4 595 | L90 596 | E2 597 | N1 598 | F28 599 | E5 600 | R180 601 | F93 602 | L90 603 | F84 604 | E5 605 | R180 606 | E4 607 | F25 608 | L90 609 | E5 610 | N2 611 | R270 612 | F13 613 | N4 614 | F91 615 | E3 616 | F7 617 | S1 618 | W5 619 | W1 620 | F67 621 | S4 622 | W5 623 | R90 624 | L180 625 | E4 626 | S2 627 | R90 628 | S2 629 | F45 630 | N4 631 | E3 632 | N4 633 | F53 634 | N3 635 | E3 636 | S4 637 | R90 638 | S1 639 | F52 640 | N2 641 | S5 642 | E2 643 | N3 644 | F1 645 | L180 646 | N3 647 | E2 648 | F31 649 | S2 650 | S5 651 | N2 652 | F5 653 | W4 654 | R90 655 | R90 656 | W1 657 | F34 658 | W2 659 | L90 660 | E2 661 | R180 662 | N5 663 | W2 664 | R180 665 | N2 666 | S2 667 | N3 668 | F48 669 | S2 670 | L90 671 | F81 672 | N2 673 | F16 674 | W4 675 | F40 676 | L90 677 | N3 678 | L180 679 | N2 680 | L90 681 | E5 682 | F8 683 | F6 684 | R90 685 | S3 686 | W5 687 | W1 688 | R90 689 | F18 690 | S3 691 | L90 692 | F19 693 | R90 694 | F46 695 | F37 696 | R90 697 | N3 698 | W4 699 | E3 700 | F28 701 | E3 702 | N5 703 | L90 704 | S4 705 | E1 706 | F28 707 | L90 708 | N5 709 | R180 710 | N1 711 | L90 712 | E3 713 | S1 714 | R180 715 | F32 716 | R90 717 | N4 718 | F22 719 | L90 720 | S5 721 | E4 722 | R90 723 | F70 724 | W4 725 | F39 726 | S4 727 | L90 728 | N1 729 | L90 730 | F6 731 | L90 732 | F92 733 | L90 734 | N5 735 | L90 736 | L90 737 | N5 738 | E2 739 | L180 740 | E5 741 | R90 742 | F95 743 | N4 744 | E1 745 | F77 746 | N3 747 | R180 748 | S2 749 | W2 750 | F71 751 | F59 752 | N3 753 | F10 754 | E4 755 | L90 756 | N5 757 | F9 758 | R180 759 | W1 760 | S5 761 | W5 762 | F71 763 | E1 764 | F35 765 | R90 766 | F45 767 | N1 768 | F54 -------------------------------------------------------------------------------- /13.py: -------------------------------------------------------------------------------- 1 | import fileinput 2 | import math 3 | 4 | lines = list(fileinput.input()) 5 | t0 = int(lines[0]) 6 | rules = [(i, int(x)) for i, x in 7 | enumerate(lines[1].split(',')) if x.isdigit()] 8 | 9 | # part 1 10 | print(math.prod(min((x - t0 % x, x) 11 | for x in [rule[1] for rule in rules]))) 12 | 13 | # part 2 14 | t, dt = 0, 1 15 | for i in range(1, len(rules) + 1): 16 | u = 0 17 | while True: 18 | if all((t + a) % b == 0 for a, b in rules[:i]): 19 | if u: 20 | t, dt = u, t - u 21 | break 22 | u = t 23 | t += dt 24 | print(t) 25 | -------------------------------------------------------------------------------- /13.txt: -------------------------------------------------------------------------------- 1 | 1000390 2 | 13,x,x,41,x,x,x,x,x,x,x,x,x,997,x,x,x,x,x,x,x,23,x,x,x,x,x,x,x,x,x,x,19,x,x,x,x,x,x,x,x,x,29,x,619,x,x,x,x,x,37,x,x,x,x,x,x,x,x,x,x,17 -------------------------------------------------------------------------------- /14.py: -------------------------------------------------------------------------------- 1 | import fileinput 2 | import re 3 | 4 | def parse_mask(mask, ch): 5 | return sum(1 << 35-i for i, c in enumerate(mask) if c == ch) 6 | 7 | def part1(lines): 8 | mem = {} 9 | for line in lines: 10 | if line.startswith('mask'): 11 | mask = line.split()[-1] 12 | mask0 = parse_mask(mask, '0') 13 | mask1 = parse_mask(mask, '1') 14 | else: 15 | address, value = map(int, re.findall(r'\d+', line)) 16 | mem[address] = value & ~mask0 | mask1 17 | return sum(mem.values()) 18 | 19 | def part2(lines): 20 | mem = {} 21 | for line in lines: 22 | if line.startswith('mask'): 23 | mask = list(line.split()[-1]) 24 | n = mask.count('X') 25 | floating = parse_mask(mask, 'X') 26 | indices = [i for i, x in enumerate(mask) if x == 'X'] 27 | masks0 = [] 28 | masks1 = [] 29 | for k in range(1 << n): 30 | b = bin(k | (1 << n))[3:] 31 | for i, j in enumerate(indices): 32 | mask[j] = b[i] 33 | masks0.append(parse_mask(mask, '0') & floating) 34 | masks1.append(parse_mask(mask, '1')) 35 | else: 36 | address, value = map(int, re.findall(r'\d+', line)) 37 | for mask0, mask1 in zip(masks0, masks1): 38 | mem[address & ~mask0 | mask1] = value 39 | return sum(mem.values()) 40 | 41 | lines = list(fileinput.input()) 42 | print(part1(lines)) 43 | print(part2(lines)) 44 | -------------------------------------------------------------------------------- /14.txt: -------------------------------------------------------------------------------- 1 | mask = 1110X1110XXX101X0011010X110X10X0110X 2 | mem[40257] = 51331021 3 | mem[18433] = 464024066 4 | mem[9993] = 463909 5 | mask = 11X011010X110X101X011X1X010X10100001 6 | mem[54152] = 692939 7 | mem[31079] = 22525259 8 | mem[33597] = 474240 9 | mem[3881] = 919507 10 | mem[24651] = 48975360 11 | mem[14815] = 1554 12 | mem[17731] = 1337580 13 | mask = X0X0111111000000100101100X000X10X001 14 | mem[56856] = 474071 15 | mem[3724] = 29660 16 | mem[18229] = 189 17 | mem[34570] = 419796001 18 | mem[11355] = 65374715 19 | mem[37999] = 522634 20 | mask = 1111X0111XX00000111X1010X1101XX01110 21 | mem[3262] = 99770791 22 | mem[4906] = 11370 23 | mem[12532] = 1083912 24 | mask = 10110101101X1X00X1111010001001010X10 25 | mem[46252] = 84993342 26 | mem[5286] = 1013690 27 | mask = 11X001110111101X001101XX100110001010 28 | mem[55055] = 516 29 | mem[38350] = 615 30 | mem[51960] = 2038 31 | mem[61990] = 957107 32 | mem[24357] = 8172 33 | mask = 1XXX1111X101001X011X000X110110001X01 34 | mem[57990] = 3734 35 | mem[50349] = 101222011 36 | mem[45511] = 42986512 37 | mem[40272] = 403 38 | mem[54329] = 1626458 39 | mem[26816] = 448210757 40 | mask = 11101111011000X01X1XX100X0XXX010X001 41 | mem[51488] = 333041 42 | mem[30893] = 3258 43 | mem[31999] = 14972408 44 | mem[48851] = 74906 45 | mem[22619] = 3442368 46 | mask = 0X000X11X10XXX101011010X001111111011 47 | mem[6850] = 1224301 48 | mem[48485] = 34534000 49 | mem[24614] = 1055775 50 | mask = 0100X11101X100X0X11100XX110011101100 51 | mem[18755] = 100409700 52 | mem[31397] = 114132362 53 | mask = 1110111111000X011XX1X10011X001011001 54 | mem[25234] = 575 55 | mem[54990] = 110437 56 | mem[5738] = 872 57 | mem[37430] = 206977297 58 | mem[40257] = 767384 59 | mem[478] = 5752 60 | mask = 111001110111101X001101X1100110X010X1 61 | mem[21231] = 2835725 62 | mem[14092] = 1259011 63 | mem[23506] = 3099 64 | mask = 1110001X1111001X1101101XXX100X0010XX 65 | mem[37900] = 79419475 66 | mem[37628] = 125826 67 | mem[11380] = 624 68 | mem[36032] = 284016390 69 | mem[47266] = 767 70 | mask = XX10X1101101XXX0111110011100X111110X 71 | mem[48427] = 18603 72 | mem[19559] = 124107997 73 | mem[49782] = 29154 74 | mem[3724] = 136805 75 | mem[49580] = 148450462 76 | mem[54342] = 180288875 77 | mask = 110011110101X01001X10XX11X1XX111X011 78 | mem[49856] = 445359 79 | mem[7226] = 4303932 80 | mem[62181] = 12485531 81 | mem[45386] = 1037 82 | mask = X1X01111X1010010XX11X1000100XX1000X1 83 | mem[32337] = 31771 84 | mem[55567] = 1438485 85 | mem[49504] = 452407 86 | mem[15890] = 64458173 87 | mem[9930] = 43490551 88 | mask = 101X1111111X00101X110X100100XX111101 89 | mem[11172] = 30476781 90 | mem[16705] = 10356 91 | mem[9799] = 3517752 92 | mem[35121] = 991958953 93 | mem[12861] = 13640943 94 | mem[15424] = 98158 95 | mask = X110011X010XX01100X100010X1XX0001101 96 | mem[31621] = 456005334 97 | mem[57990] = 5145 98 | mem[7067] = 127283 99 | mem[57106] = 322139 100 | mem[49968] = 2140844 101 | mask = 1X1001X1X01X10110XX101XX010X00000100 102 | mem[42602] = 128159 103 | mem[26816] = 7253653 104 | mem[26531] = 42978 105 | mem[7592] = 249896576 106 | mem[7956] = 1315 107 | mask = 111011X1X11100X011X1010101XXX0XX0010 108 | mem[52446] = 1677086 109 | mem[44919] = 1499581 110 | mem[34842] = 5043767 111 | mem[24471] = 579304892 112 | mem[4380] = 1934 113 | mem[44081] = 2818 114 | mask = X1101X0X110X00X111X001001100111X0010 115 | mem[44457] = 10924 116 | mem[61114] = 41913513 117 | mem[25625] = 1074 118 | mem[53821] = 4293765 119 | mem[21864] = 895125 120 | mem[18764] = 24202 121 | mask = X111011X0110XX0X1011110111000011000X 122 | mem[28782] = 3396 123 | mem[51935] = 250016 124 | mem[29096] = 1633 125 | mask = 100011111X0X000X1011101X00001100X011 126 | mem[50213] = 21062 127 | mem[17583] = 17889 128 | mem[6214] = 755665 129 | mem[41630] = 554432 130 | mem[36640] = 21683065 131 | mem[9993] = 663 132 | mask = 10X0111111X00010X0X1000X0000101X1000 133 | mem[31206] = 1563 134 | mem[31999] = 893563867 135 | mem[25234] = 16239 136 | mem[16826] = 1185 137 | mem[6325] = 308015 138 | mask = 111000X11101001X11X1010000101XXX0010 139 | mem[714] = 174841 140 | mem[47336] = 1080 141 | mem[48590] = 5902057 142 | mask = 111011110X1100001101101111X10101X1X1 143 | mem[11741] = 285199 144 | mem[32864] = 794118 145 | mem[50294] = 3086 146 | mem[21244] = 13500488 147 | mem[52937] = 668328 148 | mem[25942] = 14773413 149 | mask = X11001111X10000011X101X0111010000X01 150 | mem[55993] = 227666987 151 | mem[54990] = 29299 152 | mem[10848] = 14517154 153 | mem[26412] = 920115307 154 | mask = 1X0X11111100001XX00100X01X0010111101 155 | mem[14992] = 62272953 156 | mem[48256] = 5676 157 | mem[19361] = 168138195 158 | mem[144] = 986 159 | mem[36032] = 911 160 | mask = 1X10001111110X1X110X10X1X01X1010X001 161 | mem[9960] = 4200 162 | mem[8832] = 1841117 163 | mask = 111X111101X00X101X11010000111111X001 164 | mem[32864] = 15880 165 | mem[9966] = 7278514 166 | mem[46710] = 1818748 167 | mem[1863] = 13021558 168 | mask = 1110001111X1001011X11001101000XX0XXX 169 | mem[63705] = 3162416 170 | mem[45211] = 686629227 171 | mem[26397] = 17094 172 | mem[9999] = 783527 173 | mem[25355] = 2865745 174 | mem[37999] = 982 175 | mask = XXX01111110000XX10X10100010XX1X01001 176 | mem[36032] = 1405160 177 | mem[25234] = 10488275 178 | mem[56856] = 9235 179 | mem[62886] = 10583974 180 | mask = 01000111X10X00X11011X0X11010111XX00X 181 | mem[9960] = 108631252 182 | mem[20641] = 236021 183 | mem[54181] = 898590 184 | mem[47206] = 357135433 185 | mask = 0X00X11111010010111X0000011001110X01 186 | mem[34160] = 168879 187 | mem[31424] = 28869180 188 | mem[24916] = 10670389 189 | mem[738] = 352 190 | mem[47762] = 8844766 191 | mask = 111011X10110X010X011X00000001100XXXX 192 | mem[22643] = 52619618 193 | mem[26725] = 18104217 194 | mem[51488] = 348349 195 | mask = 1X1011110XXX00101111100000110000X10X 196 | mem[56604] = 38442 197 | mem[64943] = 178378 198 | mem[14699] = 13770627 199 | mask = 11X01111001010X01011100000010X10X010 200 | mem[17095] = 9031632 201 | mem[21925] = 157279 202 | mem[16803] = 28186944 203 | mask = 010XX11XX1X0001X10X11101X00111011X01 204 | mem[18863] = 1188008 205 | mem[5968] = 795 206 | mem[43052] = 2990150 207 | mem[38515] = 747 208 | mem[44368] = 496 209 | mem[45434] = 2077409 210 | mask = 0X10111X111100111X1X000XXX00X01X1010 211 | mem[13059] = 23890054 212 | mem[51572] = 29407 213 | mem[39964] = 4094674 214 | mem[59053] = 5346433 215 | mask = 1110011111X100X011011X11111110X11100 216 | mem[1791] = 12339300 217 | mem[51641] = 105572 218 | mem[22529] = 1649 219 | mem[29570] = 930208 220 | mask = 11101111X1XX00101X111000XX000X10X0X1 221 | mem[19744] = 1667 222 | mem[18167] = 556 223 | mem[52216] = 39333 224 | mem[8118] = 28457779 225 | mem[14409] = 7493808 226 | mem[32337] = 34018 227 | mask = 0110X1111X010X10001X1110011X0010001X 228 | mem[40] = 27424 229 | mem[6244] = 41469 230 | mem[6612] = 214 231 | mem[36981] = 34852720 232 | mem[35860] = 74811624 233 | mem[44120] = 82357013 234 | mem[5999] = 395 235 | mask = X1X0111111000001XX11X1000XX001000010 236 | mem[12392] = 8235335 237 | mem[52538] = 236135318 238 | mem[7227] = 6809 239 | mask = 111011X10110X010111100001X00X00000X1 240 | mem[13662] = 270146 241 | mem[49569] = 11401458 242 | mem[49782] = 12256 243 | mask = X11X11110X10X000101111XXXX0100100001 244 | mem[63774] = 25139 245 | mem[47309] = 107486126 246 | mem[39140] = 884 247 | mem[35267] = 2032 248 | mem[16513] = 3724990 249 | mem[47901] = 120378235 250 | mem[47121] = 574 251 | mask = 1100X1X100110110XX010111110111101111 252 | mem[21716] = 53071834 253 | mem[9997] = 343 254 | mem[34175] = 109609 255 | mem[22643] = 59660540 256 | mask = 011X1X10111X001111X100X1011010100001 257 | mem[2872] = 4637 258 | mem[7429] = 13346151 259 | mem[21514] = 521995 260 | mask = 0111X1X1X11010001011X10011000X11110X 261 | mem[34817] = 34195656 262 | mem[59139] = 1538904 263 | mem[33597] = 7322219 264 | mem[43471] = 2053 265 | mem[31759] = 352 266 | mem[24649] = 393907 267 | mask = 0010X1111X10001010X100001X010011111X 268 | mem[53821] = 389983024 269 | mem[30685] = 681448 270 | mem[14409] = 8810596 271 | mem[58403] = 202202 272 | mem[59589] = 11132409 273 | mem[36376] = 1035668 274 | mem[10107] = 282 275 | mask = 1X00110101X1001010011010X0100000X001 276 | mem[35009] = 1137976 277 | mem[30376] = 893048407 278 | mem[44428] = 1634 279 | mask = X01X11111111001X111X10X111X00X1111X0 280 | mem[3088] = 1335 281 | mem[57928] = 2122936 282 | mem[14992] = 1850 283 | mem[50886] = 596 284 | mem[20951] = 1834738 285 | mask = X11111X1X0X000001X11XX1010X10X000001 286 | mem[46309] = 1344734 287 | mem[57393] = 7607663 288 | mem[64140] = 412481329 289 | mem[31937] = 4156010 290 | mask = 01000XX11100XX1110X10X00X011X11010X0 291 | mem[21092] = 188978 292 | mem[58601] = 747 293 | mask = 11101XX11100X001100001000X0000X11X10 294 | mem[49580] = 681666 295 | mem[28396] = 6693 296 | mem[21446] = 2871 297 | mem[8409] = 129741145 298 | mem[26851] = 64088468 299 | mask = 1X101111X111X001101010X001000000XX11 300 | mem[50617] = 2893221 301 | mem[44352] = 351080 302 | mem[6973] = 74704635 303 | mem[35215] = 58274979 304 | mem[34986] = 204485850 305 | mem[46431] = 483390728 306 | mask = 11101X11011100101101X00X010010X0X100 307 | mem[21875] = 106030145 308 | mem[18755] = 2197864 309 | mem[21518] = 110524 310 | mask = 101001011101X0001111XX01X000010X10X1 311 | mem[3866] = 10698 312 | mem[25215] = 23678 313 | mem[16705] = 8210939 314 | mem[40472] = 1601 315 | mem[43847] = 4262784 316 | mem[20280] = 845863570 317 | mask = X110XX1XX101001011X101X01000X00100X1 318 | mem[57100] = 7125772 319 | mem[64179] = 73893 320 | mem[54526] = 3175087 321 | mem[62001] = 1973479 322 | mask = 11X0111XXX00001010111X00X00X0XX01011 323 | mem[54845] = 10595 324 | mem[31178] = 10986515 325 | mem[16074] = 765117 326 | mem[39388] = 548 327 | mem[16713] = 2599663 328 | mask = 0100X111110100XX1X11X1X1001000110XX1 329 | mem[21508] = 3155 330 | mem[28193] = 144849 331 | mem[8918] = 5192 332 | mem[610] = 1144170 333 | mem[61348] = 102390786 334 | mem[43515] = 27343 335 | mem[63705] = 10436512 336 | mask = X100X11101000011101XXXX1101001XX0X01 337 | mem[47313] = 28073 338 | mem[33901] = 90318443 339 | mem[64222] = 7293 340 | mask = X110111XX11X00011X1X101X0100000XX001 341 | mem[24490] = 2682 342 | mem[9264] = 627919 343 | mem[1411] = 8120967 344 | mem[17130] = 1272496 345 | mem[2438] = 30859917 346 | mask = 110XXX111101X0X00X11100X010X011001X1 347 | mem[6973] = 19850171 348 | mem[51470] = 67939742 349 | mask = 10100111110100XX111100XX1X01X0010110 350 | mem[11147] = 30 351 | mem[22117] = 3508 352 | mem[32551] = 29083435 353 | mask = 101001XX1101X0001111X0010X01XXX11X01 354 | mem[18544] = 482715873 355 | mem[56829] = 24246491 356 | mem[19107] = 39530 357 | mem[11939] = 361324 358 | mem[64069] = 3257668 359 | mem[37976] = 2801177 360 | mask = X1101101X1110X10X001101X10X0110001X1 361 | mem[41961] = 94719 362 | mem[5528] = 319045708 363 | mem[31759] = 597770 364 | mem[3298] = 54756 365 | mem[39780] = 454394346 366 | mask = 11101111X1X1X010111101001X101011XX0X 367 | mem[6325] = 54296774 368 | mem[53884] = 2248 369 | mem[41087] = 315232205 370 | mem[17418] = 227971462 371 | mem[46081] = 5766 372 | mask = 1010XX00X1011000X1110X0X000110XX1100 373 | mem[36022] = 2440 374 | mem[309] = 11100855 375 | mem[40840] = 113562551 376 | mem[51488] = 1410 377 | mem[38724] = 80445305 378 | mem[46414] = 693 379 | mask = 100011111X010011X11100X01001XX0X1001 380 | mem[6850] = 1658 381 | mem[27296] = 2089 382 | mem[34000] = 227145532 383 | mem[36309] = 6512 384 | mem[8049] = 41857993 385 | mem[3603] = 2183079 386 | mem[9019] = 583919731 387 | mask = 11XX1XX1110000011X0XX1101100X101101X 388 | mem[42218] = 3195265 389 | mem[24649] = 20411584 390 | mask = 1110111X0101X0100011000011000X00X001 391 | mem[21925] = 945752010 392 | mem[26816] = 463236906 393 | mem[8118] = 75 394 | mem[7382] = 3470 395 | mem[24647] = 65907 396 | mem[34226] = 703 397 | mask = X11011111101X01011111011XX0000101001 398 | mem[54526] = 523463 399 | mem[12392] = 240399435 400 | mask = X01011111110001011111XX00XX00011X001 401 | mem[29635] = 370994023 402 | mem[1064] = 1593105 403 | mem[39783] = 4929783 404 | mem[7721] = 3697 405 | mem[19747] = 911509249 406 | mem[12181] = 8022 407 | mem[9277] = 269282378 408 | mask = 1100111XXX0X000110X1X0001100010010X1 409 | mem[62185] = 768934 410 | mem[8118] = 238 411 | mem[16448] = 67217 412 | mem[1286] = 2768751 413 | mask = 11X001X11110X0001111X01010X0X0000XX0 414 | mem[26659] = 4857903 415 | mem[15890] = 41829451 416 | mem[61153] = 1745 417 | mem[33685] = 1322893 418 | mem[58844] = 22060038 419 | mask = 11X0X111011100X011011111XXX00011001X 420 | mem[41057] = 504 421 | mem[9775] = 90755012 422 | mem[35694] = 1327 423 | mem[14023] = 5965 424 | mem[46660] = 15962 425 | mem[45618] = 93484 426 | mask = X01111111X11001011100X01X000X0XXX01X 427 | mem[41817] = 30341471 428 | mem[40062] = 2045 429 | mem[20631] = 3206 430 | mem[57953] = 99 431 | mask = X11011X101X11000111100011101X0001110 432 | mem[53840] = 154298805 433 | mem[46322] = 653989 434 | mem[36288] = 427196 435 | mem[50550] = 54235668 436 | mem[61463] = 9653 437 | mem[58758] = 8531442 438 | mem[25942] = 187891326 439 | mask = 1X1011111100001010X1X00000000X1XX001 440 | mem[24145] = 670 441 | mem[39140] = 8027405 442 | mask = 01X01110X11000111111100X001100101X1X 443 | mem[1858] = 465546026 444 | mem[53156] = 33616871 445 | mem[34303] = 3814644 446 | mem[9993] = 424038168 447 | mem[18379] = 105249 448 | mask = 1110111X0111001X111101010X11X00X1010 449 | mem[37628] = 1729777 450 | mem[14716] = 37020621 451 | mem[40472] = 633 452 | mask = 1110111XX11X000X1111001X01000011X00X 453 | mem[32816] = 22945 454 | mem[58409] = 4261203 455 | mask = 0110111111110001110X0X1XX111X01110X1 456 | mem[25234] = 1845 457 | mem[11313] = 26080 458 | mem[9420] = 894744 459 | mem[55530] = 854 460 | mask = 011011101X11001111X100X00011X0010100 461 | mem[11839] = 96131 462 | mem[53757] = 1408 463 | mem[44034] = 27236 464 | mem[2385] = 383509 465 | mask = 111111110XX000001X110X0X00010000XX1X 466 | mem[32942] = 18689 467 | mem[45731] = 632528 468 | mem[51515] = 65228710 469 | mem[7190] = 512188 470 | mem[55271] = 109657287 471 | mask = X1101X1111110000111X0X0001001110X010 472 | mem[31454] = 53024958 473 | mem[39884] = 1067 474 | mem[45511] = 12320135 475 | mem[49866] = 122369 476 | mem[57038] = 27967196 477 | mem[29561] = 2925457 478 | mask = 1X1XXXX11X10X0001111101101101000011X 479 | mem[5666] = 246869 480 | mem[16826] = 4819818 481 | mem[9708] = 56613002 482 | mem[19527] = 979537 483 | mem[46710] = 1863 484 | mem[24930] = 9732123 485 | mask = 0010X11111XX00101X110X0011100X01X000 486 | mem[54809] = 7602 487 | mem[46221] = 1952 488 | mem[18345] = 3892597 489 | mem[5738] = 9611 490 | mem[53884] = 2050573 491 | mem[35694] = 1819 492 | mem[52446] = 1143 493 | mask = 01001111110100XX0XXX010000001010XX01 494 | mem[7226] = 7110 495 | mem[58560] = 9302 496 | mem[47854] = 13408926 497 | mem[50530] = 115326557 498 | mask = 00101111111000101111000X010X001X00X0 499 | mem[46080] = 88122926 500 | mem[36726] = 990065 501 | mem[6612] = 244727289 502 | mem[3724] = 7537840 503 | mem[41817] = 244009305 504 | mem[42763] = 100935344 505 | mask = 11111X110010X0001X1111000X1000111101 506 | mem[29093] = 3116673 507 | mem[17213] = 576 508 | mem[42218] = 742524 509 | mask = 00101X101X010010111X11X1110001X10X1X 510 | mem[18167] = 5096 511 | mem[18013] = 110009 512 | mem[12532] = 548 513 | mem[58899] = 72440595 514 | mask = 00111111X111X0111110X1011X1101111001 515 | mem[12181] = 417885 516 | mem[28523] = 561 517 | mem[63924] = 785190 518 | mem[31937] = 27019144 519 | mem[569] = 149095763 520 | mem[54809] = 2678 521 | mem[14355] = 15451 522 | mask = 10101X11X1000X1X100111011001X1101001 523 | mem[29525] = 27635 524 | mem[38648] = 286224 525 | mem[40257] = 33000302 526 | mem[2385] = 87334 527 | mask = 100011X1110000X1X0010X10X10001011011 528 | mem[10671] = 752653692 529 | mem[29096] = 28346 530 | mem[64943] = 5823968 531 | mem[8985] = 1725 532 | mem[14409] = 432068 533 | mask = 11101X11XX11X00011110X0111X11X001X10 534 | mem[35782] = 26162 535 | mem[18167] = 265539 536 | mem[53514] = 17777350 537 | mask = 0110111X111X00X111X100000111X0100XXX 538 | mem[11289] = 25199 539 | mem[21966] = 1577738 540 | mem[33100] = 7214029 541 | mem[14371] = 225814 542 | mask = 1110X111111000X011X11X1XX0XX0010X000 543 | mem[54809] = 164605380 544 | mem[38947] = 1624427 545 | mem[63150] = 221584 546 | mask = 11101111XX0110X0X01101X010XX101X1X00 547 | mem[28523] = 622707 548 | mem[8072] = 227741 549 | mem[6611] = 15393 550 | mem[2600] = 386986740 551 | mask = 110010X111010X10X1110001X11001110101 552 | mem[46256] = 1543619 553 | mem[58524] = 128793487 554 | mem[39996] = 2787 -------------------------------------------------------------------------------- /15.py: -------------------------------------------------------------------------------- 1 | import fileinput 2 | 3 | def run(numbers, iterations): 4 | last = {} 5 | for i in range(iterations): 6 | x = numbers[i] if i < len(numbers) else delta 7 | delta = i - last.get(x, i) 8 | last[x] = i 9 | return x 10 | 11 | numbers = list(map(int, next(fileinput.input()).split(','))) 12 | print(run(numbers, 2020)) 13 | print(run(numbers, 30000000)) 14 | -------------------------------------------------------------------------------- /15.txt: -------------------------------------------------------------------------------- 1 | 16,11,15,0,1,7 -------------------------------------------------------------------------------- /16.py: -------------------------------------------------------------------------------- 1 | import fileinput 2 | import math 3 | import re 4 | 5 | def parse(lines): 6 | rules = {} 7 | tickets = [] 8 | for line in lines: 9 | numbers = list(map(int, re.findall(r'\d+', line))) 10 | if '-' in line: 11 | rules[line.split(':')[0]] = [tuple(numbers[i:i+2]) 12 | for i in range(0, len(numbers), 2)] 13 | elif numbers: 14 | tickets.append(numbers) 15 | return rules, tickets 16 | 17 | def invalid_numbers(rules, ticket): 18 | return [number for number in ticket 19 | if not any(r[0] <= number <= r[1] 20 | for rule in rules.values() for r in rule)] 21 | 22 | def rules_for_index(rules, tickets, index): 23 | result = [] 24 | values = [ticket[index] for ticket in tickets] 25 | for name, rule in rules.items(): 26 | if all(any(r[0] <= value <= r[1] for r in rule) for value in values): 27 | result.append(name) 28 | return result 29 | 30 | def part1(rules, tickets): 31 | return sum(sum(invalid_numbers(rules, ticket)) 32 | for ticket in tickets) 33 | 34 | def part2(rules, tickets): 35 | tickets = [x for x in tickets if not invalid_numbers(rules, x)] 36 | index_options = [rules_for_index(rules, tickets, index) 37 | for index in range(len(tickets[0]))] 38 | done = False 39 | mapping = {} 40 | while not done: 41 | done = True 42 | for index, options in enumerate(index_options): 43 | if len(options) == 1: 44 | done = False 45 | name = options[0] 46 | mapping[name] = index 47 | for options in index_options: 48 | if name in options: 49 | options.remove(name) 50 | return math.prod(tickets[0][i] 51 | for k, i in mapping.items() if k.startswith('departure')) 52 | 53 | rules, tickets = parse(fileinput.input()) 54 | print(part1(rules, tickets)) 55 | print(part2(rules, tickets)) 56 | -------------------------------------------------------------------------------- /16.txt: -------------------------------------------------------------------------------- 1 | departure location: 29-458 or 484-956 2 | departure station: 40-723 or 738-960 3 | departure platform: 30-759 or 784-956 4 | departure track: 37-608 or 623-964 5 | departure date: 31-664 or 685-950 6 | departure time: 27-498 or 508-959 7 | arrival location: 36-245 or 269-961 8 | arrival station: 35-808 or 814-973 9 | arrival platform: 40-831 or 856-951 10 | arrival track: 36-857 or 875-971 11 | class: 43-161 or 167-963 12 | duration: 25-75 or 91-966 13 | price: 37-708 or 724-972 14 | route: 39-370 or 396-971 15 | row: 47-280 or 299-949 16 | seat: 41-105 or 125-952 17 | train: 43-351 or 359-966 18 | type: 34-575 or 586-965 19 | wagon: 27-397 or 420-953 20 | zone: 48-206 or 226-965 21 | 22 | your ticket: 23 | 61,151,59,101,173,71,103,167,127,157,137,73,181,97,179,149,131,139,67,53 24 | 25 | nearby tickets: 26 | 136,368,517,218,187,318,185,172,146,646,804,747,816,625,695,701,420,588,167,302 27 | 144,452,191,495,196,652,878,605,607,61,932,897,539,82,456,806,587,595,153,168 28 | 517,981,569,738,886,608,935,882,943,627,884,644,228,698,640,53,748,570,880,322 29 | 65,428,312,692,61,465,626,312,644,645,539,189,485,182,310,555,442,493,550,275 30 | 701,547,434,796,278,451,179,397,233,645,741,512,442,800,693,213,188,429,654,707 31 | 898,573,456,132,190,898,705,447,875,160,688,592,627,520,434,81,517,634,240,185 32 | 155,433,198,917,513,425,143,149,421,131,815,13,69,887,928,451,497,923,623,347 33 | 908,896,430,539,532,406,439,75,857,134,589,631,552,541,633,933,522,557,807,917 34 | 367,397,712,343,276,195,334,131,137,881,884,912,197,548,817,744,54,226,457,899 35 | 340,453,916,915,430,487,816,543,485,712,703,899,638,756,431,649,364,925,238,815 36 | 525,70,427,894,279,430,792,365,278,946,624,568,371,61,453,595,324,947,598,104 37 | 986,444,243,741,822,745,484,878,457,486,937,368,746,652,126,589,907,317,828,741 38 | 171,830,687,65,815,368,508,799,71,230,560,595,364,303,312,757,112,274,597,881 39 | 917,135,661,130,898,699,618,58,206,73,149,488,458,818,69,803,572,328,888,75 40 | 270,133,228,458,519,56,425,450,277,750,365,538,591,522,925,201,533,982,857,190 41 | 810,599,315,529,515,898,857,605,92,438,629,533,899,491,360,603,537,458,542,597 42 | 307,128,930,489,156,323,924,900,309,216,101,127,312,647,605,491,237,523,746,875 43 | 632,660,660,701,700,106,169,144,341,625,432,196,799,880,808,944,443,200,341,750 44 | 349,881,943,793,541,772,643,171,540,572,647,55,882,569,934,365,944,199,278,568 45 | 703,755,639,929,140,196,897,235,342,79,360,370,302,314,818,786,565,535,186,444 46 | 936,458,393,624,509,563,540,830,788,902,200,628,896,917,795,95,496,332,941,308 47 | 154,234,305,793,927,947,632,661,367,271,273,205,527,638,151,547,285,806,186,328 48 | 641,530,616,660,626,274,368,171,280,149,269,456,658,336,306,194,659,102,318,149 49 | 322,72,125,138,550,365,688,280,442,303,491,509,136,696,996,235,202,704,334,913 50 | 640,571,170,700,803,650,592,545,421,703,600,638,590,242,316,203,3,531,906,233 51 | 424,899,571,333,226,66,159,698,326,330,62,662,140,191,933,742,755,478,349,99 52 | 645,790,316,205,637,935,187,700,565,485,746,947,130,188,436,726,311,827,309,58 53 | 153,200,307,361,169,634,608,312,228,163,313,654,520,511,527,705,300,173,306,433 54 | 125,56,770,177,237,447,425,55,557,192,275,652,160,568,495,508,525,100,487,588 55 | 877,457,275,799,205,889,890,304,568,893,237,825,597,202,911,175,917,164,337,822 56 | 312,306,427,893,562,326,904,931,703,693,946,71,181,631,328,566,552,190,750,709 57 | 91,137,910,193,277,702,142,457,562,335,228,568,672,195,349,139,759,754,946,57 58 | 548,892,303,808,883,514,69,705,942,615,128,822,514,366,54,934,554,420,433,926 59 | 306,518,931,549,652,792,282,808,157,752,60,857,341,104,632,202,806,98,336,940 60 | 144,991,568,185,756,367,893,695,784,631,901,797,607,69,545,696,369,944,948,641 61 | 60,542,350,690,178,793,273,322,688,321,719,433,592,67,518,808,449,758,180,447 62 | 901,740,339,828,898,913,895,284,93,794,789,894,529,238,75,439,519,797,54,890 63 | 301,314,556,624,202,207,161,277,140,138,330,740,908,553,190,432,99,532,789,54 64 | 534,67,160,994,129,272,550,599,657,630,786,556,626,319,245,692,64,948,397,532 65 | 518,545,351,652,920,142,105,706,185,167,268,549,540,184,140,347,597,830,653,753 66 | 275,75,743,916,512,918,162,805,150,798,797,178,67,935,603,300,94,494,491,452 67 | 555,322,542,648,363,787,747,747,909,245,305,203,455,758,920,110,349,150,451,315 68 | 640,309,891,542,541,519,69,720,699,435,799,131,699,686,948,541,520,703,529,696 69 | 918,924,201,345,458,359,821,535,528,431,164,93,563,497,657,187,606,102,325,897 70 | 154,877,828,160,346,675,144,300,304,174,605,708,437,831,934,234,234,911,550,793 71 | 428,128,570,341,530,891,303,184,366,752,485,573,156,277,335,104,217,202,174,149 72 | 500,558,336,927,881,135,640,440,931,242,648,304,338,235,895,232,126,61,308,551 73 | 201,899,52,447,175,624,677,518,519,915,343,788,429,664,647,233,420,276,655,490 74 | 396,884,892,744,877,186,988,203,639,103,143,181,900,510,346,556,631,788,742,177 75 | 630,534,685,517,134,590,908,627,370,525,541,907,320,807,302,186,706,340,815,247 76 | 791,490,78,232,73,273,890,589,543,271,655,169,180,530,441,137,629,918,278,920 77 | 814,0,436,661,362,458,497,787,72,318,900,341,190,130,897,896,487,602,95,904 78 | 918,179,141,508,886,99,307,894,686,634,641,318,546,232,563,165,543,885,705,929 79 | 652,807,144,143,642,265,420,887,55,51,157,513,748,169,420,427,651,692,880,937 80 | 318,565,305,929,754,587,318,308,306,825,568,457,72,218,146,805,160,342,269,70 81 | 555,688,323,557,816,651,229,491,237,795,694,517,931,827,629,586,150,229,108,663 82 | 907,230,149,455,109,536,910,601,801,548,346,942,159,125,158,59,74,174,446,496 83 | 396,756,177,597,157,940,802,337,122,623,795,938,883,746,397,227,741,70,900,55 84 | 536,159,803,195,336,426,228,888,434,911,887,753,888,735,309,185,876,920,799,623 85 | 280,920,396,155,202,367,656,454,454,875,324,24,240,562,885,821,493,519,702,142 86 | 491,199,150,134,433,186,949,200,101,97,546,152,706,788,337,56,760,366,145,857 87 | 644,528,644,422,752,165,351,593,549,347,941,243,244,512,757,537,99,626,905,804 88 | 631,901,747,424,904,510,206,99,594,820,180,910,357,171,231,488,59,328,805,656 89 | 229,923,194,517,656,364,74,485,99,804,943,190,946,343,573,751,392,819,420,236 90 | 616,823,922,633,149,746,565,558,322,593,319,897,695,496,914,568,552,511,94,587 91 | 119,568,129,320,302,305,804,554,232,647,303,194,923,891,915,744,485,551,540,68 92 | 74,336,432,197,715,923,914,527,278,660,910,53,692,452,422,513,568,531,650,944 93 | 787,604,243,646,429,56,73,546,553,883,170,883,432,200,634,701,920,22,54,896 94 | 318,271,875,590,360,445,177,63,999,154,746,637,535,329,92,892,949,204,442,435 95 | 51,558,155,421,441,325,920,568,820,300,804,537,544,423,74,231,91,616,245,312 96 | 659,652,941,431,349,351,50,662,520,646,305,642,96,490,350,697,671,637,495,797 97 | 776,131,949,887,272,457,910,642,940,425,702,176,746,510,271,245,885,928,886,562 98 | 313,420,594,938,946,571,193,999,938,534,161,100,607,136,101,894,934,595,561,590 99 | 269,745,143,347,305,593,722,69,487,662,60,137,569,240,653,71,590,891,648,632 100 | 542,623,629,806,515,178,898,230,496,143,748,509,485,604,518,445,918,981,818,626 101 | 706,303,536,635,196,190,642,884,300,55,179,920,813,634,520,328,796,189,560,101 102 | 239,542,116,685,104,801,759,52,567,436,322,745,628,487,687,520,203,856,191,641 103 | 332,748,664,896,929,593,740,881,318,654,427,148,7,235,939,205,422,348,128,800 104 | 919,553,103,430,426,727,437,663,368,368,795,103,912,751,933,922,361,492,231,516 105 | 231,586,567,204,101,574,762,167,567,567,161,568,317,934,603,510,68,655,892,907 106 | 491,273,431,135,161,192,930,484,167,361,396,197,247,830,938,454,939,363,605,931 107 | 339,888,500,830,328,630,629,750,273,300,279,603,562,103,57,277,127,342,309,306 108 | 733,68,884,341,650,602,804,656,307,891,551,789,201,485,185,488,69,188,183,600 109 | 525,601,168,649,235,519,922,453,130,193,87,105,529,943,799,880,898,788,320,56 110 | 822,164,814,195,519,700,546,896,595,94,916,492,457,745,491,919,597,278,67,894 111 | 703,310,529,551,898,564,857,924,915,538,530,61,529,788,920,819,730,314,493,699 112 | 497,337,168,443,698,502,911,496,700,800,814,905,422,62,493,202,881,820,430,891 113 | 185,794,689,155,191,797,131,103,163,91,897,602,902,154,520,927,686,447,364,277 114 | 927,607,746,440,322,752,202,596,427,101,194,22,346,630,127,128,752,947,561,508 115 | 159,513,441,763,644,856,146,698,527,595,239,439,178,918,142,600,149,494,820,552 116 | 343,557,340,70,452,655,381,883,785,137,130,908,496,653,877,894,940,791,151,433 117 | 169,586,177,757,332,717,367,540,826,536,815,750,542,800,520,792,831,364,324,902 118 | 935,516,687,946,99,337,447,625,936,422,351,518,79,661,149,826,184,457,73,434 119 | 744,289,881,568,484,703,640,334,520,917,828,133,199,328,304,137,345,370,560,439 120 | 804,487,367,273,67,239,739,587,892,697,158,508,929,143,523,909,418,637,184,135 121 | 297,627,931,235,828,324,941,586,703,520,934,634,423,439,941,158,67,180,883,902 122 | 432,155,443,557,254,311,340,450,807,239,277,243,628,817,789,689,591,554,696,517 123 | 307,73,278,429,881,197,328,792,900,918,882,332,105,740,58,758,933,195,92,81 124 | 697,759,167,816,537,430,875,444,790,943,498,649,144,525,655,359,463,909,324,573 125 | 370,883,875,67,428,97,206,143,518,124,920,513,439,201,918,179,791,176,650,641 126 | 792,63,139,564,738,520,175,520,365,591,694,932,631,249,887,438,103,946,174,98 127 | 945,909,559,597,605,270,928,692,881,149,366,571,703,754,784,744,572,898,495,162 128 | 754,316,191,157,704,153,111,551,883,535,362,800,925,130,929,949,425,686,91,923 129 | 551,440,753,714,104,749,691,445,143,340,427,555,277,167,758,606,300,305,314,302 130 | 433,604,649,372,751,889,568,305,654,160,194,536,921,930,573,337,230,552,303,817 131 | 568,926,140,332,144,183,724,924,313,935,132,935,795,535,798,823,146,201,591,233 132 | 351,605,724,662,56,704,443,562,896,787,347,234,793,816,494,561,659,898,552,454 133 | 857,893,188,127,184,93,562,795,125,490,54,243,361,943,276,348,988,818,103,540 134 | 308,787,793,232,426,273,704,397,740,907,830,311,126,100,985,542,628,636,157,485 135 | 650,551,594,909,534,514,277,554,745,432,569,494,582,230,590,922,750,562,126,311 136 | 814,904,444,204,821,160,492,205,324,489,792,912,699,454,828,341,983,275,830,187 137 | 637,924,804,175,948,515,211,604,624,827,746,820,798,742,485,451,785,488,184,100 138 | 153,208,199,827,200,56,530,185,655,821,177,700,148,170,535,337,707,900,343,521 139 | 192,878,310,319,922,133,898,368,794,804,898,96,311,622,787,894,564,690,589,942 140 | 242,899,820,143,58,623,811,52,661,342,702,562,878,146,538,510,307,206,795,900 141 | 928,893,947,827,895,161,275,266,99,338,882,930,227,445,129,50,192,626,337,906 142 | 756,554,564,101,96,287,198,800,192,92,798,639,687,878,932,321,785,694,153,631 143 | 789,743,557,565,915,188,481,740,538,422,159,625,70,270,660,143,139,695,523,701 144 | 437,657,397,336,698,592,329,175,452,913,492,816,492,478,313,923,915,181,819,645 145 | 926,248,489,490,180,526,273,91,819,515,742,875,65,875,62,307,439,930,701,442 146 | 787,892,816,592,332,299,331,786,151,547,161,755,798,95,572,235,499,567,644,311 147 | 754,125,490,559,71,553,514,279,397,437,929,5,204,327,228,132,234,340,560,633 148 | 913,87,426,522,242,240,184,193,708,750,510,558,697,103,151,651,625,332,948,571 149 | 300,427,555,241,423,949,59,230,339,590,685,806,647,914,100,630,544,213,71,100 150 | 755,343,926,350,822,445,943,693,932,200,905,97,129,664,159,916,251,450,557,589 151 | 698,54,529,201,71,55,693,187,488,24,607,915,456,448,179,489,454,160,876,545 152 | 437,756,54,565,445,901,194,206,945,821,349,59,696,496,902,532,166,160,633,150 153 | 101,177,158,698,165,928,572,364,60,545,547,554,706,350,319,200,95,97,327,697 154 | 51,68,223,67,883,827,533,432,949,643,497,906,519,66,312,593,188,97,635,66 155 | 306,98,918,128,664,184,428,140,181,492,758,325,291,922,590,441,231,878,562,789 156 | 468,541,235,433,334,946,192,97,449,940,168,61,495,155,560,639,657,825,587,948 157 | 451,541,754,99,586,534,692,19,132,758,441,366,929,531,420,690,633,876,178,532 158 | 553,331,320,193,887,433,104,817,241,374,91,700,708,498,269,708,151,269,635,739 159 | 630,824,178,166,829,645,68,339,397,747,103,132,857,243,596,204,690,97,898,335 160 | 550,741,634,426,58,381,934,363,456,895,345,487,898,703,99,906,528,498,635,360 161 | 907,934,498,698,793,810,691,275,423,238,313,438,575,425,141,563,322,884,135,201 162 | 14,330,588,105,146,173,309,897,59,176,334,891,785,656,492,315,571,426,104,795 163 | 153,876,887,321,657,931,855,510,362,333,556,92,64,591,180,641,54,179,931,910 164 | 361,328,275,565,359,532,894,133,61,567,701,632,470,67,509,806,626,747,911,271 165 | 2,198,322,698,608,447,817,454,532,68,888,540,690,447,434,921,949,705,946,97 166 | 182,361,485,348,368,922,52,799,433,187,298,369,238,168,693,797,156,631,200,936 167 | 754,553,559,545,685,191,490,634,589,539,392,879,128,105,701,509,549,815,511,687 168 | 882,564,261,156,564,655,455,908,739,359,137,516,485,426,904,933,597,307,349,660 169 | 419,896,64,802,443,543,804,300,746,914,793,593,426,314,489,803,929,743,275,59 170 | 171,636,681,93,927,315,520,587,168,694,50,130,333,441,795,628,702,202,68,920 171 | 139,738,164,895,128,344,806,653,438,887,136,939,351,458,361,239,746,102,510,594 172 | 921,911,367,799,548,897,51,122,366,934,929,229,625,157,685,945,130,513,916,367 173 | 947,195,626,827,707,535,439,700,707,326,657,455,109,179,147,450,599,96,690,159 174 | 438,95,521,520,937,226,794,364,522,127,883,645,424,423,524,704,312,917,1,344 175 | 947,635,455,738,814,740,422,450,793,138,519,988,232,947,792,64,426,65,663,428 176 | 840,367,447,188,909,333,130,245,927,241,73,315,574,173,229,325,273,508,878,689 177 | 882,143,361,90,309,447,909,929,330,234,509,363,743,50,931,756,336,603,516,332 178 | 129,829,154,143,646,350,105,155,524,443,171,65,338,345,336,742,302,644,982,688 179 | 575,739,805,347,944,747,308,509,686,569,928,203,757,92,436,912,822,281,205,808 180 | 744,710,565,141,237,67,694,569,147,434,664,949,700,528,820,623,337,597,68,340 181 | 719,185,486,550,369,316,831,175,420,632,490,629,899,364,912,485,923,657,61,646 182 | 885,276,511,745,789,313,400,545,573,708,687,650,72,692,876,625,202,823,750,608 183 | 74,930,695,875,635,608,335,658,642,689,227,657,743,16,896,142,944,795,167,525 184 | 423,831,603,795,452,351,794,238,857,97,606,360,735,426,426,895,931,336,514,315 185 | 902,227,487,754,520,177,98,191,316,332,745,738,502,645,828,240,148,826,703,541 186 | 136,173,317,265,640,348,653,894,75,686,563,125,949,443,641,183,634,104,650,334 187 | 191,628,943,661,808,657,645,160,316,148,316,637,166,606,652,344,277,943,565,448 188 | 370,949,693,569,147,938,204,926,796,700,880,437,328,891,172,308,5,100,635,145 189 | 498,304,533,453,446,52,184,310,634,527,933,59,405,913,650,624,545,521,59,446 190 | 451,14,454,313,143,799,643,784,485,690,651,58,565,938,330,742,300,756,193,556 191 | 799,103,882,650,785,603,820,317,636,453,111,593,626,902,630,795,638,928,534,527 192 | 303,134,527,820,145,127,548,825,200,232,801,573,594,598,920,456,925,723,593,341 193 | 829,540,461,605,702,534,785,237,587,155,635,143,176,489,930,205,126,705,228,320 194 | 915,144,484,559,142,804,158,76,237,335,921,660,531,370,194,457,891,660,627,508 195 | 426,239,910,745,557,805,435,154,431,795,528,856,989,539,206,346,659,231,182,326 196 | 54,893,815,195,567,142,940,452,628,638,533,319,936,760,547,425,569,695,749,818 197 | 663,157,244,699,323,129,489,510,93,100,143,821,72,543,549,172,335,648,165,228 198 | 597,426,936,829,799,315,787,148,98,259,913,497,200,326,344,641,276,278,201,822 199 | 250,941,689,157,312,639,631,588,572,902,632,334,311,226,921,522,647,240,566,820 200 | 746,928,535,791,342,51,931,167,637,935,155,655,848,831,926,342,881,882,126,136 201 | 437,792,745,628,556,69,91,893,161,436,64,877,186,436,533,679,423,184,552,170 202 | 147,192,755,556,570,199,181,642,103,128,125,549,593,741,934,202,984,435,101,308 203 | 275,948,568,340,538,947,338,156,541,487,334,336,219,561,738,365,530,188,624,422 204 | 531,397,664,617,908,57,93,171,149,364,598,148,875,818,199,823,455,128,328,820 205 | 193,489,794,169,159,365,76,803,75,484,915,634,276,330,229,421,156,98,587,456 206 | 324,159,6,66,237,458,489,167,887,155,530,934,321,53,226,97,748,605,359,179 207 | 744,596,339,431,759,453,889,456,441,130,12,485,927,877,498,561,746,545,457,300 208 | 944,194,517,587,426,489,129,96,136,885,801,788,554,157,457,538,615,154,527,428 209 | 628,485,820,803,883,203,888,599,204,794,784,564,245,692,606,288,327,906,434,146 210 | 510,314,660,644,698,568,262,351,359,513,946,361,657,607,56,310,351,884,624,498 211 | 798,928,439,531,555,159,4,331,742,75,931,790,532,822,425,792,144,196,305,902 212 | 786,751,749,893,808,91,190,445,944,877,921,887,686,165,97,820,135,234,337,662 213 | 829,925,635,819,559,748,205,594,803,71,791,319,449,937,203,132,71,386,62,520 214 | 892,226,631,900,803,172,203,305,495,397,143,175,328,194,72,171,588,130,722,320 215 | 301,518,630,913,143,548,226,132,184,448,304,229,662,231,608,763,245,906,828,437 216 | 453,273,189,550,269,600,441,703,125,299,631,759,436,321,882,125,644,263,815,426 217 | 787,879,590,455,154,203,74,95,334,359,559,314,552,319,513,454,24,299,364,656 218 | 429,437,322,739,827,230,168,197,708,701,186,441,749,312,635,856,445,777,902,635 219 | 946,4,831,146,508,326,450,206,492,662,69,98,897,650,658,547,333,889,197,129 220 | 300,917,642,791,661,825,306,450,278,237,940,943,188,158,138,713,630,946,550,817 221 | 511,340,588,630,545,554,359,443,269,824,325,639,752,829,128,423,493,936,787,123 222 | 928,92,807,754,161,280,317,337,877,493,299,546,940,802,820,877,716,143,707,902 223 | 207,424,789,178,179,552,707,785,275,233,455,598,887,68,921,641,522,754,432,738 224 | 514,116,60,191,534,633,598,427,327,369,341,54,130,599,347,572,707,337,102,232 225 | 807,530,347,364,543,330,695,93,901,190,333,603,615,57,648,697,449,320,592,822 226 | 878,696,303,298,892,366,697,234,754,186,443,572,488,188,172,700,443,935,927,183 227 | 495,147,901,788,647,197,171,925,745,919,701,941,73,568,542,390,429,912,529,131 228 | 800,696,330,793,655,914,59,180,447,816,50,321,806,917,58,51,78,900,430,881 229 | 166,808,924,185,139,428,64,888,659,151,519,336,277,194,91,484,875,488,526,363 230 | 875,172,904,364,919,794,926,236,915,816,816,135,909,118,595,750,530,925,656,193 231 | 807,379,919,57,440,741,931,426,307,757,487,940,487,362,485,195,226,623,323,493 232 | 206,789,424,130,573,831,355,945,60,658,790,368,931,944,548,534,757,942,341,486 233 | 948,280,664,190,126,560,436,885,571,893,550,785,68,281,159,889,881,312,942,705 234 | 557,542,818,697,913,351,635,130,801,930,66,946,351,230,170,260,508,93,438,903 235 | 890,570,314,658,785,245,882,510,325,636,929,322,337,710,923,451,303,550,187,458 236 | 891,790,943,449,689,549,519,588,2,443,304,160,556,240,553,75,320,275,436,572 237 | 56,946,556,623,142,930,875,318,686,285,454,562,637,935,152,902,496,704,97,917 238 | 637,102,294,643,179,522,493,442,546,453,884,185,351,652,178,206,129,341,931,168 239 | 522,626,821,308,198,547,637,792,984,827,693,456,596,330,73,204,646,234,698,149 240 | 198,327,324,564,815,904,947,702,798,70,203,758,233,129,647,96,880,269,2,904 241 | 682,420,455,944,928,168,368,943,947,273,940,556,552,424,924,135,346,324,56,561 242 | 508,101,190,526,934,622,945,925,341,159,586,549,180,703,437,820,65,368,635,396 243 | 748,787,876,487,158,589,169,653,905,334,631,637,329,270,338,615,625,324,238,228 244 | 183,803,751,563,206,204,320,876,13,949,594,647,568,317,750,628,877,155,546,880 245 | 90,818,606,509,636,172,59,599,818,498,435,229,234,801,904,168,802,315,567,458 246 | 522,327,105,857,186,641,131,234,821,154,817,887,718,608,232,140,566,598,804,485 247 | 645,744,827,913,103,602,229,525,569,187,544,163,370,793,450,925,245,510,68,738 248 | 932,365,93,115,147,237,654,137,50,913,485,92,458,787,342,174,898,58,817,910 249 | 315,488,205,645,638,699,235,364,663,74,687,597,771,749,896,631,139,532,897,550 250 | 145,130,336,914,322,76,492,338,359,798,536,64,361,509,917,370,95,586,934,935 251 | 525,544,796,226,96,572,367,916,652,71,634,745,161,998,591,942,547,344,227,626 252 | 794,806,486,897,231,361,808,739,183,370,227,192,69,136,560,439,887,109,269,331 253 | 496,928,270,550,800,179,788,646,197,789,906,511,640,550,904,227,592,81,895,92 254 | 396,334,738,230,104,929,502,137,302,440,927,175,449,169,304,451,421,559,901,513 255 | 899,187,303,161,608,545,638,160,496,537,338,426,516,374,66,303,650,430,453,758 256 | 95,991,554,932,943,95,740,276,323,190,856,697,888,270,498,595,600,786,149,454 257 | 384,155,54,630,181,230,645,58,540,745,548,520,430,935,155,755,171,571,592,892 258 | 892,695,529,937,330,605,60,901,520,539,553,330,205,588,538,472,689,753,934,423 259 | 53,195,67,817,21,625,543,912,368,945,509,183,425,486,367,922,156,829,755,793 260 | 271,337,271,229,827,947,313,163,548,278,823,186,687,747,59,328,149,897,926,892 -------------------------------------------------------------------------------- /17.py: -------------------------------------------------------------------------------- 1 | from itertools import * 2 | import fileinput 3 | 4 | def step(cells, dim): 5 | result = set() 6 | bounds = lambda cells, i: range( 7 | min(p[i] for p in cells) - 1, 8 | max(p[i] for p in cells) + 2) 9 | ranges = [bounds(cells, i) for i in range(dim)] 10 | for p in product(*ranges): 11 | n = 0 12 | for d in product([-1, 0, 1], repeat=dim): 13 | q = tuple(pp + dd for pp, dd in zip(p, d)) 14 | n += q != p and q in cells 15 | if p in cells: 16 | if n == 2 or n == 3: 17 | result.add(p) 18 | else: 19 | if n == 3: 20 | result.add(p) 21 | return result 22 | 23 | def run(cells, dim): 24 | pad = (0,) * (dim - 2) 25 | cells = set(p + pad for p in cells) 26 | for i in range(6): 27 | cells = step(cells, dim) 28 | return len(cells) 29 | 30 | cells = set((x, y) 31 | for y, line in enumerate(fileinput.input()) 32 | for x, c in enumerate(line) if c == '#') 33 | 34 | print(run(cells, 3)) 35 | print(run(cells, 4)) 36 | -------------------------------------------------------------------------------- /17.txt: -------------------------------------------------------------------------------- 1 | .##..#.# 2 | ##.#...# 3 | ##.#.##. 4 | ..#..### 5 | ####.#.. 6 | ...##..# 7 | #.#####. 8 | #.#.##.# -------------------------------------------------------------------------------- /18.py: -------------------------------------------------------------------------------- 1 | import fileinput 2 | import ply.lex as lex 3 | import ply.yacc as yacc 4 | 5 | tokens = ['LPAREN', 'RPAREN', 'ADD', 'MUL', 'NUMBER'] 6 | 7 | t_LPAREN = r'\(' 8 | t_RPAREN = r'\)' 9 | t_ADD = r'\+' 10 | t_MUL = r'\*' 11 | t_ignore = ' \n' 12 | 13 | def t_NUMBER(t): 14 | r'\d+' 15 | t.value = int(t.value) 16 | return t 17 | 18 | # part 1 19 | precedence = [('left', 'ADD', 'MUL')] 20 | 21 | # part 2 (comment out to run part 1) 22 | precedence = [('left', 'MUL'), ('left', 'ADD')] 23 | 24 | def p_expression_binary_op(t): 25 | '''expression : expression ADD expression 26 | | expression MUL expression''' 27 | if t[2] == '+': 28 | t[0] = t[1] + t[3] 29 | else: 30 | t[0] = t[1] * t[3] 31 | 32 | def p_expression_paren(t): 33 | 'expression : LPAREN expression RPAREN' 34 | t[0] = t[2] 35 | 36 | def p_expression_number(t): 37 | 'expression : NUMBER' 38 | t[0] = t[1] 39 | 40 | lexer = lex.lex(errorlog=lex.NullLogger()) 41 | parser = yacc.yacc(debug=False, write_tables=False, errorlog=yacc.NullLogger()) 42 | 43 | def parse(text): 44 | return parser.parse(text, lexer=lexer) 45 | 46 | lines = list(fileinput.input()) 47 | print(sum(parse(line) for line in lines)) 48 | -------------------------------------------------------------------------------- /18.txt: -------------------------------------------------------------------------------- 1 | 5 + 6 * 9 + 5 + 5 + (7 * 2) 2 | 2 + (3 + 7 + 7) * 5 + 9 + (5 + (4 + 5 + 3 + 6) + 8 * 5 + (7 + 4 + 7 + 6 + 9) + 9) 3 | (5 * 4 + 7 + 4 + 8) + 9 * ((5 * 4) + 2 + (6 + 2 + 8 + 7 + 4 + 5)) * 5 4 | 4 * ((4 + 9 + 3 * 3 * 5) * 3 + 2 + 2 * (9 * 2 + 3)) + 5 * ((8 * 3 * 6) + 9 * 4 + (5 + 4 * 7 + 7)) * 7 * (9 + 2 * 2) 5 | 5 * 6 + ((8 + 9) * 5 * 9 + 4 + (9 + 3 * 9)) 6 | (3 * (3 + 3) * 9 + (6 + 9 * 8) + 5) + 5 7 | 6 * (9 * 6 * 9) 8 | 4 * 3 + (9 + (8 * 2 * 3 * 4) * (6 * 8 + 5 + 3 + 4)) + (3 + 7 + (7 * 6 + 2) * 6 + (4 + 6 + 5) * (3 + 7)) + 6 * (8 * 6 + 7 * 8 * 9 + 2) 9 | 5 * (2 + 3 * 4 + 3 + (4 * 4 + 3)) 10 | 9 * 2 * (5 * (8 * 7 * 3)) 11 | (6 * 9) * 6 + 7 * 8 + 5 12 | 5 * 4 * 9 + 6 * 9 * (4 * 7 * 2 * 3 + 6) 13 | 3 + 9 14 | 2 + 6 * 7 * (8 * 3 * 5 + 7 * (7 * 8 * 6)) * 3 15 | 5 + 6 + (8 * 4 * 7 + 2 + 4 * 5) * (3 * 9 + 3 + (3 * 2)) * 9 16 | 4 + 7 * 7 * 2 * (2 * 6 + (9 + 4 + 8)) 17 | 4 + 4 * (7 * (5 + 3 + 8 * 6) + 9 + (4 * 7 + 9 + 3 + 4) + 6) + 5 18 | 5 * (4 + 8 * (8 * 5 + 5 * 6 + 2) * (9 * 4 * 3)) + 6 + 5 19 | 3 * ((3 + 5 * 7) + 8 * 2 * 5) + 5 + (3 + 7 * (5 * 9 + 3 + 7 + 7) * 2) 20 | 2 + (5 * 7 + 9) + 2 + 2 21 | ((3 * 9 + 6) + 7 + 7 + 8 * 6) + 5 + 5 + 9 22 | (8 + 3 * 6) * 7 + 2 23 | 9 + (9 * 7 + 7 * 4 * 7 * (6 * 7 * 3)) + 3 24 | (3 + 7 + 7) + (5 + (2 * 9 * 3 * 2 * 5 * 3) + 7 * 5) + (7 + 9 + (2 + 7 * 7 * 7)) + (3 + 4) + 5 + (9 + (7 * 8 * 3 + 2 + 3 + 7) + 7) 25 | 2 + 4 * (8 * 2 * (8 + 8 * 8 * 3 + 3 + 8) * 2) * 8 * 3 26 | 9 + 4 * (5 + 7 * 4) + 2 * (3 + (9 + 3 * 7 + 5 + 5 + 6) + 4 * 7 + 5) 27 | 5 + ((4 * 3 * 5) + (2 * 4 + 2 + 9) + 5 + 6 * 9 * 3) + 2 + 2 28 | ((6 * 8 + 8 + 2) * 4) + 5 + 3 + 4 * 4 + 9 29 | 7 * (9 + 7 + 4 * 6) + 5 * 6 30 | (7 + 7 * (7 + 8)) + 7 + 7 31 | 9 * (5 + (7 * 6 * 9 + 5 * 3 * 3) * 2 * 4 * (5 + 8 * 8 + 4 * 9) + 3) + 2 + 6 * 4 + (9 + 7 + 2 + 4) 32 | 4 + (7 * 6 + 5 + 7) + 8 + 8 * 4 33 | 4 + (3 + 3 + 7 * 6 + 3) + (6 * (6 + 8 * 2 + 9 * 4) + 4) + 3 34 | ((7 * 7) + 4 + 6 + (6 * 4 * 4 * 9 * 5 * 2)) * ((6 + 8 + 9 * 6) + (4 + 5 + 9 * 3) + (3 + 9) + 8) 35 | (7 + 7 + 6 + 6 * (2 + 2 * 7 * 9)) * 4 * 6 + 3 * (3 * (5 * 3 * 3 * 3 + 3) * (3 + 7 * 9) + 8 * 6 + 8) + 8 36 | (6 * 9 + 8 * 4 + 6) + 8 * 6 37 | 8 + 2 * (9 * 2 * 7 + 9 * 8) + 2 * 3 38 | ((7 + 7 + 8) + 6 * 7 * (6 + 3 * 7 + 7 * 9 * 4)) + 7 * 7 + 5 + 3 39 | 7 * 2 + (8 * 8) * 8 * 5 * (5 * 2 * 2) 40 | (8 * 7 + 9) * 2 + 6 * 8 * 2 * 2 41 | 9 + ((9 + 9 + 2 * 4 * 4 + 6) + 8 + (3 + 3 + 5 + 6 + 9) * 7) + 8 + 5 + 4 * 7 42 | 4 + 7 * (5 * 4 + 7 * 7 + 6) 43 | (6 * 4 + 2) * 8 44 | 3 * 7 * 8 + (5 * 9 + 2 + 2 + 4) 45 | (3 + (2 * 6) * 5 * 3 * 3 * 5) + (5 * 6 * 7) 46 | 8 * 2 * 7 + (6 + 6 * (5 + 7)) * 8 47 | (2 + 8) + (9 + 9 * 5 + 2 * 8 + 7) + 7 + 9 + 6 + 3 48 | 2 + ((4 * 7 + 5 + 6) + 2) 49 | 4 + 4 * (3 * 7 * 4 * 6 + 3) * (8 + 5 + 5 * 6 + 6 + 7) 50 | 9 * (9 * 9 + 6) * 8 + 7 + 9 * 7 51 | (7 + (5 * 8 + 2 + 2) * (8 * 3 * 4 * 3 + 4 + 2)) + (8 + 6 * (2 * 3)) + (7 + 6) + ((9 * 6 * 9 + 8) + 5 * 6 + 9) + 8 * 3 52 | (9 * 5 * 7 + (9 + 5) + (2 + 5 + 9 + 2 * 6 + 8)) * (7 + 6 + 3 + 4) + 8 + (2 * 8 + 7) * 2 53 | ((5 * 6 + 2 + 3 * 9 + 5) + 4 + 8) * 7 + (3 * 7 * 2 * 4 + 3) 54 | 4 + 2 * (3 * 5 * 3 + 4) 55 | (2 * 3 + (4 * 4 * 5) + (2 + 7) * 8 + 2) * 3 56 | 5 + ((7 + 7) + (6 + 6) + 2 * 3) + 4 * ((9 * 2) * 3 + 3 + (4 + 8 * 7 + 3 * 6) * 6) 57 | ((3 * 2 * 5) + 4 + 4 * 8) * (2 * (7 + 9 + 4 + 6)) + 7 * (9 + (9 + 6 * 4 + 6 + 2 * 4) * 3) 58 | 4 * 3 * (9 + (8 + 5 + 6)) + 7 * 4 * ((4 + 2) * 9 + 6 * (5 + 4) * 6) 59 | 4 + (7 + 7 * 6 + 3 * 9) * ((4 + 2 * 4 + 4 + 9 + 7) * 5 * 9 * (3 + 7 + 4 * 4) + (4 * 8 * 7)) + 3 60 | (2 + (5 * 8 + 3) * 9 + 5) * 9 * 7 + (6 + 2 * 8 * 2) 61 | 9 * (8 + 8 + (4 + 4 + 2 + 7)) + 6 * 5 62 | 6 * 9 + 2 * (8 * 5 * 5) * (2 + 4) 63 | 3 * 3 + 4 64 | 3 + 3 * ((4 * 4 * 4) + (2 * 5 * 9 * 4 + 4) * 9) * 9 * 5 65 | (3 + (5 + 7) + 4 + 4 * (4 * 2) + 3) + (3 + 6) 66 | 6 * ((5 + 6 * 4 + 9 + 4 * 9) * (2 + 8)) * 6 + 8 * 6 67 | 8 * ((2 * 3) + 9) + 2 * 6 68 | 5 * (3 * 7 + (7 + 9 * 3 + 8 * 4) + 9 + 5) * 4 69 | 4 * (5 + 2 + 3 * 2 + 4 + 9) * 4 * (2 + 6 * 2 * (4 + 9) * (8 + 6 + 4 * 4 + 7)) + 5 70 | 7 * ((7 * 8 + 2 + 4 + 7) + 9 + 7 * 7 + 5) + 2 + 9 + 3 * 3 71 | (7 + 2 * 2 + (9 * 6 * 4)) * 8 * 9 72 | 4 * (5 + 5 * 2 * (4 * 7) + (9 + 9 + 6 * 6 + 8 + 9) + 2) + 6 + 2 73 | 2 + 6 + (7 + 9 * (3 * 4 * 3 * 5 * 7) + 7 + (7 + 5) + 2) + 5 * (7 + 9) + 9 74 | 9 * (3 * (7 + 5) * 8 + 6) * 9 * 2 75 | 2 * ((2 * 9 + 7) * 3 + (2 + 4 * 8) + 6 * 6) 76 | 2 * 7 * ((6 + 7 * 5 * 3) + 9) + 9 + (8 * 8 * (9 * 2 + 2 + 3 + 3) + 2) * 2 77 | ((8 + 7 * 5) * (2 + 7) * (7 * 8 * 9) * 6 * 2 + 5) + 8 + 6 78 | (7 + 3 + 5 + 6 + (7 * 9) + 2) * 5 * 7 + (2 + 5 * 3) + 8 + 4 79 | ((5 + 6 * 8) + 4 * (5 + 6 + 5 * 4) + (5 + 8) + (5 * 6)) * 3 * (4 + 5 + 6 * 5 * 5 * 2) + 3 + (3 * 8 * (3 * 6) + 8 * (6 * 2 * 2 * 3 * 9 * 9) * 7) + 2 80 | 3 * 3 * (9 * 2 + 7 + 9 * 5 * 7) * 9 * 3 81 | 9 + 4 + (5 + 7 * 5) 82 | 8 + (6 + 4 * 5 + 8 * 4) * 6 + (8 + (6 * 6 * 8 + 3 * 9) * 8) + 4 + 3 83 | (8 + 4 * 3 * 4 * (6 + 5) + 9) + 3 + 5 * 9 + 7 84 | (8 + 6 * 8 * 3) * 2 * 7 + 6 * (9 + 2) 85 | 7 * 7 + (5 + 9 * 6) + 7 + (7 + (7 * 8 + 5 * 3 * 5 * 4) * (9 * 7)) + 5 86 | 7 * 8 87 | 5 * 6 * 4 + (3 + 4 * 6 * 6) + 3 88 | 8 + ((4 + 2 * 6 + 2) + (7 * 9 + 9 + 7 * 6)) 89 | 6 + (6 * 8 + 6 + 5 + 6) * 5 * 9 90 | 7 * ((8 * 6 + 3 * 7 * 9 + 2) * 4 + 5) * 8 91 | 2 + 5 + (8 * 8 + 4 + 8) + 2 92 | 4 + 3 + 7 + 5 * 8 93 | 6 * 4 * (6 + 8 + (8 * 4 + 9) + 4 * (7 * 6 * 4) + 3) 94 | 6 + 8 + (4 * (5 * 4) * 4 + (2 * 3)) * 4 + 3 * (2 * 9 * 5 * 4 * (8 + 3 * 3 + 8 * 7 + 9)) 95 | 5 + (7 * 3 * 6 + 3 * 2) * ((7 * 3 + 5 + 8) + (9 + 8 + 5 * 4 * 7)) + ((5 + 4 * 3) + 4 * 7) + 2 * (8 * (8 + 7 * 7 + 3 * 6) * 4 * 7 * 4 * 3) 96 | 9 * (6 * 4 * 2 + (7 + 9 + 7 * 2) + 3 + (5 * 7 + 4)) + 6 * 2 97 | (5 * 2 + 7 * 2) + 9 * (3 * 4 * (5 * 2) + 4) * 4 98 | (2 * (6 + 9 + 4 + 3) * (9 * 6) * 2) * 8 * 5 * 5 + 6 99 | 3 * 9 + 9 + 9 * (9 + (8 * 2 * 7 + 3 * 8 + 3)) + 3 100 | 8 * 3 * 2 + (7 + (3 * 2 * 2)) * (2 * (2 * 4 * 4) * 8) 101 | 3 + (9 * (7 + 9) + 6 * (3 + 4 + 5 + 5 * 2 + 9)) * (6 + 4 + (6 + 5 * 6 + 6 * 5) + 2 + 2 * 6) 102 | ((7 * 3 * 3) + 7 + (3 * 4 + 5 * 4 + 7)) + 8 * 3 * 9 * ((7 * 3) + 8 + 7) * 9 103 | ((2 * 3 + 2 + 9 + 4) + (9 * 2 * 4) * (6 * 5 + 9 * 2 * 7 + 7) * 7 * 9) * 6 * 4 * 5 + 7 104 | 9 * 2 * 2 + 2 + (3 + 3 + 6 * 2) 105 | (7 * 6 * 6) * 2 + 9 + 8 * (7 + 3 + 8 * 7 + (4 + 5 + 3) + 8) + 9 106 | 2 + 6 + 9 * 3 * (6 * 4 + 9 * 5 + 2) 107 | 5 * (5 * 2 + 6 + 8 * 8 + 7) + 9 * 5 + 9 * 3 108 | 9 * (8 + 9 + 8 + (9 * 6)) 109 | (4 + 8 * 8 * 6 + 4) + 7 110 | 2 + (8 * (4 * 2 + 6 + 2 + 3 + 6) + 4 * (7 + 4) + 6 * 2) + 8 * 5 * 6 * 8 111 | ((5 * 7 * 9 * 5 * 8 * 3) * 5) + 5 * 2 * 3 * 7 + 5 112 | 8 + 4 + 8 + 7 113 | 3 + 3 114 | 9 + ((4 + 7 + 8) + 3) + 8 + 9 * 5 * (6 * 5) 115 | (2 + 2) + 9 + 8 + 5 + 6 + 7 116 | 3 + 8 * (7 * 5) + 9 117 | 5 + (5 + (8 + 3 * 3 + 9 * 7 + 3)) * ((9 * 5 * 8 + 2 + 2 * 7) * 4 * 6 + 4 + 6 * 9) 118 | (6 + 5 + 6 * (9 * 2) * 6 * (4 * 5 + 8 * 9)) + 6 119 | 2 * 4 + ((9 * 2 + 6 + 8) + 4 * (5 + 3 * 3 + 7 * 9 * 6) * (6 + 6 + 4 * 3 * 8) + 7) * 5 120 | (6 + 4 * 2 * (8 + 3 + 4 * 4 * 5)) * ((4 * 2 * 5 + 9) * 8 + 3 * 7 * 8) + 7 121 | ((5 * 6) + (2 * 2 * 8)) * (3 * 4 * 2 * 3) * 6 + 5 + 7 122 | 2 * 2 + ((5 + 6 * 7 + 5 * 8) * 7 * 7 * 4 + 8) + 6 123 | 2 + (7 * 4 * 7 + 8 + (8 + 5 + 4 * 9)) * 8 * 2 * 6 124 | 8 * 4 * ((2 * 8 * 9) * 9) * 8 + (8 + 2) + 9 125 | (5 * 9 * (8 + 7 * 3 + 9) * (4 * 6 + 5) * (7 + 2 * 6 + 5 * 2 * 2) * 4) + 5 + ((7 * 6 * 8) * 9 + 8) 126 | 2 * 7 * (9 + (5 * 2 + 9) + 5 + 4 * 3 + 8) * 6 + (8 + 4 * 9 * 4 * 8 + 4) * ((9 + 6 + 2 * 4 * 8 + 3) * 7 * 8) 127 | (8 + 3 * 7 + 7 + 5 + 7) + (6 + 8 * 3 + 8 + 7 + 6) + (5 + 6 * 7 + 6 * 2 * 7) * 6 + 3 128 | 8 * 5 + 7 + 5 + (2 + 4 * 5 + 2 * 5 * 8) 129 | 3 + (8 * 5) + 4 * 2 + 7 + (6 * 7 * 8 * (4 * 5 * 5) + 2 + (4 * 8)) 130 | 5 * (7 * 5 * (5 * 4 * 5) + 4 + 4) 131 | 5 * 9 132 | (5 * 9 + 5 * 4) + 4 133 | 3 + 8 + 9 * (5 + 9 + 9 * 8) * (3 + 3 + 4 + 6 * 3 + 9) * 3 134 | (7 * 9 + 6 + (4 + 7 + 7 + 7) * 3) + 3 + 2 * 3 + 8 * 5 135 | 6 + 6 * 6 + 8 * 9 * 6 136 | (8 + 6 * 5 * 4 * 4 + 3) * (8 + 6) 137 | 2 + 9 * 2 + 3 * ((9 * 3 * 3 + 8 * 4 * 9) * 3 + 7 + 6 + (2 + 6) * 6) 138 | (5 * 6 + (2 * 3) + (6 + 8 * 6 * 9 + 7) + 6) + 8 * 3 + ((2 * 4) + 6 * (2 * 8) + (3 * 8 + 3) * 3) * 7 139 | 4 + (2 + (8 * 5 + 5 * 9 * 7 + 5)) * 4 * 4 * 7 * 9 140 | 7 + 8 + 6 * (8 + 3 + (9 * 2) + 8 + 8) + (4 + 2) 141 | (9 + 4) + (3 * 4) * 6 142 | ((8 * 5) * 3 + 4) * 3 * 7 143 | 8 * ((8 + 5 + 7 * 6 + 2) * 7 + 5 + 4 * (2 + 3 + 6 + 6)) * 3 * 5 * ((3 * 5) * 2) 144 | 7 + 4 + 9 * (3 + 9 * 2 * 8 + (9 * 3)) + 9 145 | ((8 * 8 * 3 + 9 * 4 + 7) + 8 * 7 + 6) + 5 146 | 7 * 8 * 7 + 4 * (6 * 5 + 6) * 8 147 | 3 * (8 * (4 + 8 + 4 + 9)) + 3 + (8 + (8 + 8 + 5 * 6) + 5) * 8 * 7 148 | 9 + 4 + 9 * (7 + 9 + 2) 149 | 4 * 9 * 3 + 3 * (3 + (7 * 2 * 7 * 7)) 150 | (8 * (3 * 8 + 9 * 4 + 2 * 8)) * (2 + (5 * 3 * 6 * 5 + 3 * 4) + 8 + 2) 151 | 6 + 7 * 9 * (7 * 3 * (8 + 2 * 9 * 3) * (4 + 7) * 9) 152 | 7 + 3 + (6 + 3 + 9 + 6 + (4 * 9 * 5 + 7 * 9 + 7)) 153 | 3 * 6 + (5 * 7 * (9 + 6 * 8 + 8 * 8 * 5) + 5) 154 | 4 * ((4 * 9 * 5 * 2) * 8) * (4 * (5 * 6 * 3 * 2) + 2) * 6 + 3 + 4 155 | 9 + (6 + 4 + (8 + 7 + 9 * 3 * 6 * 8) * 6) + (2 * 8) + 5 156 | 9 + 9 + 8 * 9 + 9 + 4 157 | ((7 * 6 + 3 * 9) * 6 + 9 * (8 + 6 + 4 * 6 + 4 + 5) * (4 * 6 + 6 * 7 + 5 + 2) + 4) + 7 + 3 * 5 158 | ((3 + 4 + 4 + 4 * 2) * 8 + 6 + 6 * (7 + 8 + 4)) + 5 * 6 + 7 + 3 159 | (9 + 8 * (7 * 9 * 3 + 5 * 6) * 7 * 9 * 3) * 4 * 7 * (9 * 9) + 5 + (5 * 2 * 7) 160 | 8 + 3 * 9 161 | (4 * 6 + 3 + (2 + 7 + 5 * 3) + (4 + 9 + 6 * 5 + 4)) + (7 + 2 * 4 + 3 * 8 * 7) + 9 + 2 + 6 162 | 9 + 9 * (2 * 8 * (3 + 3 * 4 * 2)) * 3 163 | 6 + (2 + (4 * 3 + 8 + 5 * 3) + 8 + 2 * 6 + (8 + 4)) * 9 + 8 * 4 164 | (2 * 4 * (2 * 5 + 8 + 6) + (6 + 5 + 7 * 6 + 3 + 3) * 6 + 4) * 6 * 7 * 2 * 6 165 | 6 * (9 + 8 + 2 * (4 * 5 + 5 * 9 * 2 + 7) * 4 * 5) * 3 * 6 + 8 166 | 2 + 8 + 8 * (4 * (2 * 6 + 8 + 2 + 4 * 4)) * 7 + 6 167 | ((8 * 6 + 2) + (4 * 5 + 6 + 2 + 3 + 9)) + (3 + 7) * 2 + 2 168 | 7 + (4 * 8 * 7) * 8 + (2 * 2 * 3 * 4) + (2 + 7 + 9) 169 | (5 * 5 * (6 * 6 * 8 + 7) * 6) + 8 * (7 * (8 * 6 * 7)) * 6 * 5 170 | 3 * 3 * (2 * 6) + 3 + (4 + 5 * 2 + 7 + 8 * 9) * 4 171 | 6 * 8 * 6 + 4 * (5 * 2 * 6 + 4 + (7 + 9) + 7) + 3 172 | (8 * 7 * 3 * 6) * (7 + 7 + (7 * 2) + 8 * 3) + 7 173 | 5 * (2 * 8 * 4 + 2 + 9) 174 | 4 + 5 * 3 175 | 3 + (5 * 8 * 6) * (8 * 5 * 5 * (3 * 7 * 5 + 6) + 6 + 2) + 2 * 5 + 4 176 | 4 + 2 * (5 * 5 * 2) + (7 * 3 + 5 + 3 * 8) 177 | (4 + 7 + 4 + (6 + 7 + 7)) * (4 * 2 * 2 + (8 * 8 * 6 * 6 + 3)) * (8 + 8 * 5 * 2 * 8) 178 | 5 + 2 * (2 * 4) * (2 * 6) + 4 179 | 6 + 5 * (8 + 4) * 4 + 8 + 7 180 | 4 * 3 + 7 * 4 * 5 + ((5 * 6 + 9 + 5) + 6 * (7 + 2 + 6 + 4) * 8 + (6 * 9 * 9) + 7) 181 | 4 + ((9 * 8 * 2 * 8 + 8) + 5 * 3) * 8 * 2 + (5 + (2 + 7 + 3 * 4 * 8 + 2) + 4) + 8 182 | 8 * (6 * 9) * 9 * ((5 * 2 + 2 + 8 * 2 + 3) + 9 * 8 * 7 * 3 + 8) + 6 183 | 7 + (6 * 5 * 2 + 4 * 5 + (5 * 7 + 8 * 6 + 8)) + 2 + 8 184 | (8 * 6 * 3 * (2 + 4 * 6 + 2) * (5 + 9)) + 3 * 6 * (7 * 9) 185 | (4 + (2 + 6 * 6 + 4 * 9 * 9)) * ((2 * 7 * 3 * 9) + (6 * 5 + 8 + 5 + 9) * 8 + 5 + 4 + 5) + (9 + 8 * 8 * 5 * 5 + (9 * 6 * 5)) * 9 186 | 9 * ((7 * 7) + 7 * 9 + 7 + 2) + 5 + 5 + 6 187 | 5 + 7 + (2 + 4 + 8) * 3 + 3 188 | 8 + (9 * (3 * 8 + 8 + 9) * (7 * 8 * 2 + 3 * 2 * 2) * 3 * 6 + 7) + 9 + 7 + 5 + 5 189 | (7 + 8 * 7) + 7 * ((5 + 4 * 9) * 7 + 6 + 6 + 7 + (3 + 9 * 6 * 3 + 3)) * 5 + 5 190 | (4 + 4 + 4 * 4 + 4 * 7) * 4 * ((3 * 4 * 6) + 5 + 2) + 6 191 | 6 + (2 + 4 + 2 + 4) * 2 192 | 6 + ((4 + 4 * 4 + 3 + 8) * 4 * 4 + 6) * 7 * 3 * 4 193 | 6 * 5 + 2 + 7 + 8 * 6 194 | 9 * 2 + (5 + 8 + 6 * 3 * 9 * 5) * 5 195 | 8 * 7 + 5 196 | (8 * 8 * (7 + 8 + 4) * 8 * 2) + 3 * 4 197 | 3 + ((9 * 7 * 4 * 3 + 4) + 8 + (3 * 4 * 7) * 5 + (3 * 5 + 7 + 2) + (4 + 9 + 9)) * 3 + 7 198 | (3 + 6) * 3 + 6 * (7 * 8 + (7 + 9 * 4) + 6) + 8 199 | 9 + (2 + 8 + 3 * 9 * 4) + (8 * 9) + 7 + 2 + 2 200 | 4 * ((9 * 3) + 2) 201 | 7 + (7 + (9 * 3)) 202 | 6 * 4 + 5 * (4 + (4 + 5 + 4 + 9 + 3 * 2) + 9 + (6 * 2 * 4 * 6 * 8) + 3) + 9 * (6 + 5 + 9) 203 | 4 * 6 * (3 * 6 * (3 * 5 * 4 + 9)) * ((3 + 6 + 4) + (7 * 2 * 5 * 9 + 4 + 4)) 204 | ((9 * 4 + 8 + 6 * 3 + 6) * 8 + 8 + 2 * 6 * (6 + 5 * 4)) * 5 + 6 + ((9 * 8 * 4) + 9 + 8 + 9 * 2 * 6) + 8 205 | 7 + 8 * ((2 * 7) + 9 * 8 + 8 + 9) + 9 206 | (9 + 2 * 6 * (8 + 5 + 8 + 5) * 7) * (6 + 9 * 6 + 8 * 9 * 7) 207 | (7 + 5 + 8 * 4 + 8 + 5) + 5 * (3 * 2 + 7 + 5 + 8) * 9 * 6 * 8 208 | 7 * 2 * 3 + 6 + (8 * (3 * 6) + 6 + (6 + 4 * 9 + 5 * 7 + 9)) 209 | 7 * (6 * (5 * 7) * 8 + 5) * (2 * 5 + 7 * 3 * 3) * 7 * 3 * (7 * 2 * 8) 210 | 9 * 2 + 8 * (7 * 4 * 8 * 2 + 4 * (9 + 2 + 6)) + 2 + 7 211 | 4 + (3 + 8 * 9 + 7) + 2 * 8 * 6 + (7 * 8) 212 | (3 * (2 + 6 * 2 + 9 * 5) * 9) + 4 + 2 * 7 213 | 4 * 4 + 8 * 3 + 7 214 | (2 * 8 * (2 * 3 * 5 * 9 * 6 + 7) * 4 * 6 * 8) + 3 215 | 2 * (9 * 7 + 5 + 4 + (3 + 7 + 6 + 8 + 5)) * 8 * (3 * 7 + 7) + 9 216 | 8 + 9 + 7 * 9 217 | ((3 * 2 * 5 * 6 * 7) + 6) * (3 * 9 * 4 * 4 + 6) * 2 + 8 218 | (4 + 3) * (3 * 9 * 4) + 5 219 | 8 + 2 * 6 + 6 220 | (8 + 4 * 3 + 3) * (8 * (7 + 6 + 6) + 7 + (9 + 9 * 5)) * 8 + 2 221 | 8 * 4 + 2 * 6 + 9 + ((7 * 5 + 5) + 2) 222 | (6 + 9 + 8) + ((4 * 3 + 9 * 6 + 3) * 3 + 3 * 4 * (5 + 5 + 6)) * 6 + 9 + 7 * (6 + 8 + 5 * 5) 223 | (6 + 9 + (5 + 2) * (9 * 4 * 5 + 9 + 3 + 9) + 3) * 8 + 8 * 7 + 3 224 | (9 * 6 + 9 * 7) + (5 * (7 + 6 * 7 + 2) + (6 + 8 + 9 + 4) + 2 * 4) + (2 + 6 + 4 + 7) 225 | 4 + ((2 * 5 * 7 + 8 + 7 + 7) * 6 + (6 * 2 * 2 * 9) + 8) * 4 * 3 + 3 * 5 226 | 5 + (8 + 8 * 2) + 3 + 5 + (7 * 8 * 9 + 2) * 2 227 | ((5 + 7 * 7 * 6) * 9 * 2) * 3 * 2 + 9 + 7 * (6 + 4 + 6 + (5 * 8 * 2 + 8 + 2) + 9 * 7) 228 | 7 * (2 + 3 + (5 * 9 + 8 * 9 * 5 + 4) + 4 * 8) 229 | (8 * 7 + 8 + 8) + 7 + (4 * 7) + 4 + 8 230 | 6 + 6 + 4 * 8 231 | 6 + 5 + 9 + 4 + 5 * (8 + 5 + 2 + 4 + 9 + 7) 232 | (2 * 9 + 3 + 7) * 9 * 7 + 8 + 9 233 | (2 + 7 * 3) + 7 + 8 * 4 234 | 9 + (5 * 2) + 6 + 8 + ((5 + 2) + 7) 235 | 8 * 9 * 6 * (9 + 9 + 4 * 8 + 7 * 5) + 7 236 | ((3 * 9 + 6) * 2 + 2 + 6 * 6 * 6) + 4 237 | 4 * 4 * 7 + 5 * 8 + 2 238 | 9 * (3 + (3 + 7 + 6 * 3 * 8)) 239 | 6 * 6 * 9 * (3 * (5 + 9 * 9) * 8 + 9 * 8 + 2) + 4 240 | (3 * 9 * 4 * 8) + 5 + (9 * 5 * 5) + 7 + 2 * 4 241 | 5 * 8 * 4 * (5 * 6 * 8) * 3 * (2 + 2) 242 | (8 + 6 + 3) + 7 + (5 + 9 * (9 + 7 + 4) * (2 * 5 * 6 * 8) + 4) * 5 + (9 * (5 + 6 + 6) * 8) 243 | 7 + 2 * 4 + 7 * 3 244 | 2 * 7 * 2 * (4 + 6 * (4 + 7) * 9 + (9 * 4 + 9 + 4)) 245 | (8 + 6 * 4 + 9 * 7 + (7 * 9 + 5)) + 2 + 2 246 | 3 + 2 * 3 + (2 + 6 + 6 + (8 * 9 + 4 + 9 + 8 + 9)) * (2 + 4 + 7 * 3 + 6 * 2) 247 | 5 * 7 * ((7 + 9 * 8 * 7) + 8 + 9) * 5 * 7 * 2 248 | 3 * (6 * 5) * 2 * 6 249 | 6 * (4 * (2 * 2 + 2 + 3 + 7) * 7 + 9 * 6) + 3 + 6 250 | 8 * 6 + (9 + 7) + 4 + ((4 * 2 + 9 * 2) + (5 * 5) + (7 + 5 + 6) * (5 * 5 * 8 + 8 * 5 * 5) + 6) + 4 251 | 8 + 9 * 3 * 9 + ((9 + 3 + 8) + (8 + 8 + 3 * 3) * 2 * 3 * (4 * 9) * (6 * 6 + 9 + 3 + 4)) 252 | 5 * 3 * (6 * (9 + 5 * 8) * 9) 253 | 9 * (9 * 4 + 4 + 7) + (6 * 4 * 6) * (3 * 8 * 3 + 4) 254 | (9 + 7 + 6 + 8 * 3) * 7 + (2 + 7) + (2 + 7 * (5 * 3 + 9) + (6 + 8 * 4 + 4 + 2 * 5)) 255 | 9 * ((8 * 5 * 5 + 5) * (2 + 7) * 9 + (4 + 5 + 3 + 2 * 5) + 2 + 5) + 9 * 4 256 | 6 + ((2 * 6 * 8) * 3 * 4 + 3 + 7) + 8 + 2 + 7 + 3 257 | 4 + (8 * 9 + 7 + 6) * (7 * 7 + 6 + 2 * (6 * 6 * 4 * 6 * 9) * 8) + 2 258 | (9 * (8 + 9 + 5 + 8) + 7 * 6 * (9 * 3 + 5 + 3 + 2)) + (2 + (2 + 4 * 5) + 6 * (6 * 3 + 7 + 7) + 2) + 7 + 8 + 6 259 | 3 + 5 + 5 * 5 + ((6 * 7 + 9 + 4 * 2) * 6 * 8 + 6) 260 | (2 + 8) * 3 + 7 * 6 261 | 4 + 5 + (8 * (5 * 8 + 4) * 9 + (6 * 6) + (5 + 7)) + 2 262 | 6 * 7 + 5 + (9 * 2 + 2 * 7 * 4) * 2 + 2 263 | 3 * (3 + (3 + 9) + 3 + 9 + 3) + 6 * 8 + 5 * 4 264 | 8 + ((8 * 6 + 5 * 6) + 7 + 3 * 8 + 9 * (2 + 6 + 3 + 8 + 6)) 265 | 5 * 8 + (7 + (9 + 3 + 3) * 6 * 4) + 9 266 | 2 + 4 + 5 * 2 * 9 * (4 + 9 * 3) 267 | 2 * 6 + (4 * 7 + 6) + 9 + 9 + 4 268 | (7 * 9 * 4 + 3) + 9 + 6 * (7 + 6 * 8) + 9 269 | 6 + (4 + (3 + 3 + 6 + 2) + (4 + 9 * 7 + 4 + 8) * 5 * 5) + 4 270 | 4 * 7 + (2 + 2) 271 | (3 + 2 * 8 * 8 + 3 + 3) + 5 + 7 * 5 272 | (2 * 5 + (8 * 6 + 2 + 4 + 4 + 8)) * 2 * (8 + 8 * 5) + (2 + 9 * (9 * 3) * (6 * 7 + 7) * 2 + 4) * 6 273 | 5 + 2 * 9 * 8 + 5 * ((7 * 8 + 3 * 6) + 2 * 6 + 2) 274 | 7 * 2 + (8 * 5) * 7 + (2 + 2 + 4) 275 | 5 * 6 + 8 * ((2 + 3 + 6 + 8 * 8) * 8 + 5) 276 | 4 + 4 * 4 + (7 * 4) 277 | (7 * 3 * 4 * 8) + 3 * 2 + 8 + 2 + 3 278 | 2 * 8 + (2 * 4 * 6 + 8) + 2 * 7 279 | (5 + (7 + 5) + 6 + (7 + 7 + 7 * 8 + 5 + 4) + (8 * 8)) + 8 * (7 * 9 + 8) * 6 + 3 * (9 + 6 * 3) 280 | 9 * 9 + ((6 + 4 + 6 * 6) + 9 + 6) * (8 + 4 + 4 * (3 * 3 + 8) * 3 * 9) + 6 * 2 281 | (9 + (8 * 7 + 4 * 5 + 8 + 9)) * ((2 + 8 * 2 + 2) * 8 + 2) * 9 + (2 + 9) + (2 * 4 * (3 + 4 * 3 + 7 * 4 * 7)) 282 | 2 * 6 * 3 * 7 * (4 + 6 + 8) 283 | 5 * 8 + (6 * 5 * 5 + 9 * (9 * 2 * 2 * 5 + 5 * 4)) + 4 * 2 + 8 284 | (9 + 7 + 5) + 2 + 9 + 2 + (6 * 9 * 9) 285 | 9 + ((7 * 4) + 9 + (3 * 5)) * 8 * 6 * 6 * (3 + 3 + (8 * 9) + 7) 286 | 5 + 4 + 3 + 3 * 9 * 5 287 | 6 + 6 + ((5 + 4 + 6 + 9 * 5 + 4) * (8 * 9 * 8) + 3 + (8 + 2 * 4 + 4 + 3)) + 9 288 | 3 + 5 * 4 * 3 * (5 * 3) + 9 289 | 2 * 5 * 3 + 6 * (8 + (5 * 4 + 4 * 7 * 6 + 8) + 4 * 7) * 6 290 | 2 * ((3 * 2) + 7 * 9 + 7 + 8 * 6) * (9 + 8) * 8 * 8 291 | 3 * ((7 * 6 + 9) + (8 * 9 + 9 + 2 + 3)) * 5 + 2 + (3 * (6 * 6 + 7 * 9 + 8 * 9)) 292 | 3 * 3 + (8 + (8 * 6 * 9 * 8 + 5 + 3) + 5 * 2 * 5 + 7) 293 | 3 + (6 + 5 * (4 * 2) + 8 * 3 + 6) 294 | 7 + 7 + 7 * 6 + 3 * ((2 + 5 + 4 * 9 + 2 * 9) * 5 * (8 * 4) + (9 + 5 * 8 + 8 + 6) * 4 * 5) 295 | 9 + (6 + 6 * (7 * 4 + 2 * 8 * 5)) 296 | (7 + (5 + 3 + 5 + 6 * 5)) * 8 + 9 * 8 + 5 297 | (6 * 2 * 7) * (3 + 3 * 7 + (8 * 3 + 7 * 4 + 5)) + 7 * 3 + 4 + 2 298 | 4 * 9 * 3 + (3 * (3 + 4) * 3) * (2 * 5) + (4 + 4 * 2 * 4 * 7) 299 | (8 + (6 * 7 + 5 * 3) + 5 * 4 + 7 * 8) * 3 + (6 * 9 + 7) 300 | 5 * 6 * 5 + 4 * 9 + (3 + 3 + 8 + 4) 301 | (6 + 4 + 7 * 8) + 5 * 4 * 9 302 | 8 + (7 + 5 * 4 + 8 + 9 * 6) * 8 + 4 303 | 3 + 6 * 8 + 3 + (3 * 3 + 2 * 9) * 8 304 | 7 + 6 * 4 + 4 305 | 9 + 3 + ((2 + 8 * 5 * 5 + 2) * (8 * 7 + 7 * 3)) 306 | 9 * 9 * (6 + (2 * 9 + 4 * 8 + 6) * 2 + 5) + (7 * 3 * 7 * 4) 307 | 4 * ((5 * 2 + 9) + 9) * 2 * 3 + (2 + (4 + 4 * 7) * 2 + 6) 308 | 3 + 6 + (8 * 7 * (7 * 8) + 3) + 5 309 | (6 + (9 + 8 + 3 * 8 + 8 + 7) * (4 * 3 + 4 * 3) * 6 + (9 * 8 * 2)) * (6 * 5 + 4 * 4) * 6 310 | ((9 * 3 + 3 * 5 * 9) * 3 * 2 * 5 * 4 + 9) + 2 * 5 + 5 * 8 * 6 311 | 7 * 9 + 4 * ((3 + 7 + 2) + (8 + 7 + 9 * 8 * 6 * 2)) 312 | (5 * (3 + 5) * 3 * (3 + 6 + 3 + 4) + 8 + 9) + 9 + 6 * 4 313 | 3 + 9 * (3 + (4 + 7) + 2 + 3 + 7) * 8 * 6 314 | (5 * 7 + 4 + 7 + (5 + 4 * 4 * 6 + 6)) + (9 + 3 + 2 + 2) + ((3 + 2 + 9 + 7 * 2 * 3) + 8 * 2 * 2 + 9 * 3) 315 | 3 + 7 + ((5 * 7) + 7 + 3 * (7 + 5 + 8) + (9 + 8 * 8) + 7) 316 | 5 * ((5 + 8 * 3 * 7) + 2 * 7 * 5 + (4 + 8 + 3) + 3) 317 | (3 + 9 + 4) * ((3 * 6) + 5 * 7 * 6) 318 | 8 * 7 319 | (5 * (2 + 9 + 4) + 8 * (8 + 7 * 7 + 5) + 6 * (2 + 4 * 7)) * 8 + 9 320 | (4 + (3 + 7 * 4 * 2 * 7 + 8)) * 9 * 6 321 | 6 + 7 + 9 * (9 * 2 * 6) * 6 + 2 322 | 7 * 5 + (5 * 3 + 9 * 6 + (9 * 5 * 2 * 3) + 7) 323 | 3 * 5 + 7 + 2 + 3 * ((8 + 5 * 2 * 6 * 5) * (4 + 4 + 7 * 9 + 8 * 4) + (2 * 9 + 2 * 2 + 8)) 324 | (9 + 7 * 9 * 2) + 8 * 6 325 | (9 * (7 + 8 + 9 + 5 + 5) * 2) * 3 + 5 + (7 * (6 * 8 + 9 * 4 * 4 + 8) + 6 + 6 * (9 + 8 + 4 + 6)) + 2 326 | (3 * 9) + 4 * 9 327 | 4 + 7 * ((8 * 2 * 6 + 8 + 7 * 2) * 2) 328 | 2 * (6 + 3) + 4 + 7 * 4 329 | (2 * 8 + 9) + (2 + 6) + (4 * 6) 330 | 7 * 2 + 9 + 7 * 3 + ((5 * 5 * 3) + 3 * 8 * 6 + 2 + 7) 331 | ((2 + 6) + (7 * 4 * 8 * 7 * 3) * (2 + 8 * 4) * 5 + 6 * 2) * (4 + 7 + 2 + 8 * (3 + 8) * 8) + (7 + 8 + 3 + 3) + 9 + 4 332 | (3 * 4 * (9 + 4 + 6 * 7) + 2 + 2 + 8) + 4 + 6 333 | (4 * (4 * 3 + 2 + 9) * 4) + 2 * 6 * 3 + 8 + 5 334 | (3 + 9 + 7) * 8 + 9 + (4 * (7 + 7 + 8 + 7) * 8 * 3 + 5) 335 | 5 * 2 * (5 + 9 + 6 + (6 + 6) * 2 + 7) 336 | 7 * 7 + (2 + 2 * 5 * 6 + 2) + 4 337 | 8 * (2 + (9 * 2 + 2 + 7 + 7)) + 8 + 7 + 5 + 7 338 | (5 + (9 * 8 * 3) * (2 * 2 + 8 + 8 * 5) + 7 * 3 + (8 + 9 + 2 + 6 + 3 + 7)) * 9 339 | (4 + 8 + 9) + (6 + 3 * 4 * (4 + 2 + 4 * 2 + 8 + 2) + 8 * 3) + 5 340 | 6 + 3 + 2 + (2 + 6 + 7 + 2 + (7 + 3 * 9 + 3 * 5)) 341 | 4 + 7 * 2 + 8 * 2 342 | 7 * 6 + 4 343 | (2 * (5 * 3) * 9 * 3) * (3 + 7 + 6 * 5) * 4 * 9 344 | 3 + 9 * 2 + (8 * 4 + 8 * (3 + 3 + 2 * 3) + (9 + 5 * 8 * 6)) 345 | 8 * (8 * 2 + 4 * 4 * 6) * 9 + 5 + 4 346 | 2 + 8 + (4 * 7 + (2 * 9 * 2 + 4 * 5 + 7) * 9 * 8 * 3) * 5 + 7 * 3 347 | 8 * 5 + 7 * 5 + (7 * (5 + 8) * 5 * (3 * 7 * 2 * 3 + 2)) + 5 348 | 8 * (2 * (5 + 3 * 6)) + 2 * ((7 * 6 * 7 + 2 * 2) + 8) * 6 349 | ((9 + 8 + 7 * 6 * 7 * 9) + (9 + 6 * 4 + 9 * 4 + 2) * (6 + 4 + 6 + 9 * 4)) * 7 * 8 * ((8 * 4 * 9 * 5 + 6 * 6) + 7 * 3 * 3 * (2 + 4 * 4)) 350 | 4 + (8 * 7 * (9 + 6 * 8 + 8) * 7 * 4) + 2 * ((4 * 4 + 7 * 9 * 8 + 3) + 7 + 3 * 9 * 3) + 6 351 | 6 + ((5 * 2 + 9 + 9 + 7 * 7) * (2 + 9 + 6 * 8) + 9) * 3 352 | (6 + 6 + 9 * (8 * 5 * 3 + 3 + 2) * 8) * 5 + 8 * (3 + 6 + 8 * 9 + (5 + 3 + 7)) * 5 353 | 8 * ((8 + 3 + 5) + 5 * 4 * 6) * ((7 * 3 * 2 * 7 + 8 + 8) * 7 + 9 * 5 + 2) * 8 354 | 9 * ((6 + 3 + 3) + 4 * 3) + 6 355 | 9 + ((9 * 8 + 3 + 5 + 6 + 3) * (7 * 5 * 6 + 5 + 6) * 5 + 8) * 4 + 8 + 6 356 | 2 * 4 * 2 * (8 + (7 * 5) + 8 * 3) * 7 357 | 8 + (6 * 8) * 9 * 2 + 3 * 7 358 | (4 * 3 * 2 + 8) * (8 + (5 * 2 * 7) + 5 + (6 + 8 * 4 * 9 + 5 + 5) * 4) * 2 * 3 * 2 + 5 359 | 9 + 5 * 9 + (3 + 4) + (5 * 6 + 5) 360 | 9 * 9 * ((9 * 9) * 5 * 6 + 4 + 3) + 8 + 8 + (4 + 4 * 4 * (3 * 7 + 7 + 9 + 5 * 3)) 361 | 9 + (3 * 2) + 2 362 | ((3 + 7 + 5 * 8) + 3 * 5 + 2 + 2) * (5 + 7 + 5) * (2 * 3 + 8 + 8 * (9 * 3 + 6 + 7 * 7)) 363 | ((8 + 3 + 2) * 9) * 5 * 9 * 8 * 3 + 8 364 | 2 + 8 + 4 + 2 * 2 365 | (8 * 9) + 9 366 | 6 + (4 * 8) 367 | (5 + 9 * 7) * 9 + ((9 + 9) + 6 + 3 + 8) * (9 + 9 * (6 + 9)) 368 | ((6 * 6 + 8 * 6) + 2 * (6 * 6) * (3 * 9 + 7 + 9 * 8) + 3) * (8 * (2 + 7 + 9 * 8) * 2) + 4 + 7 * 6 369 | 7 * (7 * 3 * 9 + 7) + (4 * 9 + (5 + 3 + 5) * 7) + (5 + 3 * 3 + 2) * 2 370 | (6 * (2 * 7 * 3)) + 5 371 | 8 * ((7 * 4 * 4 * 3) * 3 * 5 + 6 + (2 * 5 + 5 + 2 * 8) * 9) -------------------------------------------------------------------------------- /19.py: -------------------------------------------------------------------------------- 1 | import fileinput 2 | import re 3 | 4 | class Eq: 5 | def __init__(self, ch): 6 | self.ch = ch 7 | def resolve(self, rules): 8 | pass 9 | def match(self, xs): 10 | return [x[1:] for x in xs 11 | if len(x) > 0 and x[0] == self.ch] 12 | 13 | class Or: 14 | def __init__(self, a, b): 15 | self.a = a 16 | self.b = b 17 | def resolve(self, rules): 18 | self.a.resolve(rules) 19 | self.b.resolve(rules) 20 | def match(self, xs): 21 | return self.a.match(xs) + self.b.match(xs) 22 | 23 | class Seq: 24 | def __init__(self, items): 25 | self.items = items 26 | def resolve(self, rules): 27 | self.items = [rules[x] for x in self.items] 28 | def match(self, xs): 29 | rest = [] 30 | for x in xs: 31 | x = [x] 32 | for item in self.items: 33 | x = item.match(x) 34 | if not x: 35 | break 36 | else: 37 | rest.extend(x) 38 | return rest 39 | 40 | def parse(s): 41 | s = s.strip() 42 | if '"' in s: 43 | return Eq(s[1:-1]) 44 | if '|' in s: 45 | return Or(*map(parse, s.split('|'))) 46 | return Seq(list(map(int, re.findall(r'\d+', s)))) 47 | 48 | def run(s, two): 49 | header, footer = [x.split('\n') for x in lines.split('\n\n')] 50 | rules = {} 51 | for line in header: 52 | key, rest = line.split(':') 53 | rules[int(key)] = parse(rest) 54 | if two: 55 | rules[8] = parse('42 | 42 8') 56 | rules[11] = parse('42 31 | 42 11 31') 57 | for rule in rules.values(): 58 | rule.resolve(rules) 59 | return sum('' in rules[0].match([message]) for message in footer) 60 | 61 | lines = ''.join(fileinput.input()) 62 | print(run(lines, False)) 63 | print(run(lines, True)) 64 | -------------------------------------------------------------------------------- /19.txt: -------------------------------------------------------------------------------- 1 | 29: 116 82 | 119 24 2 | 45: 116 69 | 119 124 3 | 24: 119 116 4 | 79: 102 119 | 117 116 5 | 52: 94 119 | 25 116 6 | 116: "a" 7 | 60: 48 116 | 27 119 8 | 39: 119 41 | 116 132 9 | 14: 119 119 10 | 80: 116 116 | 119 134 11 | 46: 119 14 | 116 61 12 | 129: 30 116 | 61 119 13 | 133: 119 2 | 116 122 14 | 68: 119 3 | 116 33 15 | 105: 119 47 | 116 104 16 | 107: 62 119 | 50 116 17 | 76: 119 100 | 116 127 18 | 125: 119 111 | 116 86 19 | 74: 24 119 | 61 116 20 | 128: 119 76 | 116 99 21 | 59: 87 119 | 7 116 22 | 88: 62 116 | 50 119 23 | 103: 119 97 | 116 118 24 | 17: 116 119 | 119 116 25 | 32: 116 134 | 119 116 26 | 56: 119 106 | 116 60 27 | 71: 115 119 | 10 116 28 | 4: 119 118 | 116 61 29 | 132: 119 17 | 116 97 30 | 12: 67 116 | 78 119 31 | 70: 119 24 | 116 30 32 | 83: 17 116 | 30 119 33 | 90: 116 105 | 119 12 34 | 84: 119 87 | 116 14 35 | 134: 116 | 119 36 | 119: "b" 37 | 49: 4 119 | 132 116 38 | 50: 134 119 | 119 116 39 | 99: 119 21 | 116 46 40 | 48: 61 119 | 32 116 41 | 54: 119 85 | 116 58 42 | 122: 116 7 | 119 82 43 | 53: 123 119 | 91 116 44 | 75: 43 119 | 79 116 45 | 66: 116 52 | 119 93 46 | 13: 97 119 | 14 116 47 | 23: 82 119 | 7 116 48 | 95: 90 116 | 28 119 49 | 98: 119 32 | 116 50 50 | 118: 134 134 51 | 2: 116 97 | 119 82 52 | 62: 119 116 | 119 119 53 | 89: 73 116 | 108 119 54 | 96: 24 116 | 17 119 55 | 131: 116 110 | 119 15 56 | 123: 64 116 | 98 119 57 | 78: 81 116 | 15 119 58 | 0: 8 11 59 | 87: 116 119 60 | 18: 116 24 61 | 41: 119 62 | 116 30 62 | 28: 9 116 | 128 119 63 | 33: 24 116 | 97 119 64 | 58: 107 116 | 84 119 65 | 20: 116 130 | 119 45 66 | 109: 116 5 | 119 112 67 | 55: 118 116 | 17 119 68 | 11: 42 31 69 | 30: 116 119 | 116 116 70 | 104: 36 116 | 57 119 71 | 67: 101 119 | 29 116 72 | 106: 46 119 | 38 116 73 | 10: 49 119 | 44 116 74 | 121: 116 103 | 119 96 75 | 111: 116 97 | 119 50 76 | 92: 116 61 | 119 80 77 | 35: 116 37 | 119 107 78 | 26: 119 32 | 116 62 79 | 64: 119 118 | 116 97 80 | 86: 17 116 | 82 119 81 | 130: 119 19 | 116 66 82 | 25: 116 50 83 | 110: 87 116 | 118 119 84 | 61: 116 116 85 | 1: 116 56 | 119 65 86 | 40: 116 118 | 119 61 87 | 22: 116 17 | 119 24 88 | 63: 119 68 | 116 6 89 | 94: 119 24 | 116 14 90 | 100: 119 24 | 116 80 91 | 3: 14 119 | 30 116 92 | 81: 24 119 | 80 116 93 | 126: 30 116 | 17 119 94 | 7: 116 116 | 119 116 95 | 44: 40 119 | 92 116 96 | 16: 116 18 | 119 88 97 | 102: 116 17 | 119 7 98 | 51: 1 119 | 71 116 99 | 5: 119 54 | 116 53 100 | 124: 119 72 | 116 39 101 | 108: 50 119 | 118 116 102 | 65: 119 77 | 116 16 103 | 114: 116 61 | 119 62 104 | 15: 118 119 | 50 116 105 | 19: 116 133 | 119 121 106 | 21: 50 119 | 61 116 107 | 101: 82 119 | 24 116 108 | 31: 95 119 | 51 116 109 | 115: 34 119 | 131 116 110 | 117: 7 119 | 24 116 111 | 27: 17 119 | 32 116 112 | 6: 119 120 | 116 127 113 | 85: 116 55 | 119 94 114 | 93: 119 64 | 116 74 115 | 69: 116 125 | 119 113 116 | 47: 70 119 | 114 116 117 | 42: 109 119 | 20 116 118 | 72: 119 114 | 116 64 119 | 82: 134 119 | 116 116 120 | 9: 35 119 | 89 116 121 | 112: 116 75 | 119 63 122 | 36: 119 32 | 116 87 123 | 57: 119 87 | 116 50 124 | 38: 119 24 | 116 61 125 | 77: 22 119 | 13 116 126 | 91: 73 116 | 92 119 127 | 8: 42 128 | 113: 59 116 | 129 119 129 | 97: 116 119 | 119 119 130 | 73: 97 119 | 30 116 131 | 37: 62 119 | 24 116 132 | 120: 119 61 | 116 61 133 | 34: 126 119 | 83 116 134 | 127: 116 30 | 119 14 135 | 43: 23 116 | 26 119 136 | 137 | babaaaabbbaaaabbbaaaaaba 138 | bababbaababaabbbabbaabaa 139 | aabbbbaaaaaabbbbaababaab 140 | bbaabbaabbaaaaabbbbbababbbaaabbababaaaababbbbaab 141 | baaaabaabaabbbbbbbbbaaba 142 | bbaabbaabbbbbbbbabbbabbbbbbabbbbaaabaabb 143 | babbaaaaaabaaaaabaabbabbbaabaaaababbbaaa 144 | aababbbbbbbbaaaabbabbaabaabbbaaaaababbaa 145 | bbbbbbbbbbbbaaababbaabbbbbbbbaaa 146 | bbbabbbbbbbabbaaaaaaabababaaaaab 147 | baababbbabbbabbbbaaabbbb 148 | baabbbbaaaabaabbabbbbbaa 149 | bbbabaabbaaaabbabaababaa 150 | aaaabaaaabababbbaabaabbbababaaaa 151 | baababaabbaababbbbbbaabb 152 | abababbababbababbbbabaaabbaababb 153 | abbaababaaaabaaabaaaaaab 154 | ababababababababbabaababbaabaabababbabbbbbabbabbbaabbaab 155 | aabbababbaaaaabaabaaaabb 156 | bbaaaaabaabbaabbaababaaa 157 | aaabbaaaaababbabaababaaabbbbabbababbbbbb 158 | bbbbbbbbabbababbabaaaaab 159 | bbabbaabbbbababbbabbbabaaabaaaabbabbbbaabbbababb 160 | aaabbaabbaaaabbabaabbbbaababababbabbbaabbaaaaaaaababbbaa 161 | baaabbbabaaaabaabaababbbbbaaaaabbaaaabab 162 | bbbbaaabbbbabbaaaabbabbaabbaaaabaaaaabaaaabaaaab 163 | ababaaabababaaabbbaaaabbbaaabbbabbbbaaba 164 | bbabbbbaaabaabbbbaaabbbabbaaaababbbbababbbaababb 165 | aaabbabbabbbabbbaabbbaabbbabbbaaaaabaaba 166 | baabbbbabaaaabaababbaaaabbbaababaaabaaaa 167 | ababbbbbaabbbabbbabaaabaaabbabbaaababbbbaaabaabbaaaababa 168 | aaaaabababbaababaaaaaabb 169 | abbabbabaabbbbabbabaaaaaababaaababbababaabababbbabababaa 170 | abaabbbbbbbbbbaababbabbbbababaababaaaaba 171 | abaabaabbbaaaababaaaabbb 172 | aabbaababbbaabbbabbaabaaabaabbabbbaabbba 173 | baabbbaaabbbbbababbabbbaaaabaabb 174 | aabbbbabbaabbabbababbababaabaaaaabbbaaab 175 | aaababbbbabbbabbaabbbabbaabababbabbbaaaabaababaa 176 | abbaaaaaabbaabababaabababaaaabab 177 | bbabbbaabaabbabaaabababbbaaaabaaababbbbbababbbaababbbaba 178 | babaabbaababbabaababbbababbaabbbaaaababbabbaabbabbaaaaaa 179 | abaabaaababaaababbbbbabaabbaaaaabbbabbbaabbbaabaaabaabba 180 | abaabaaabaaabbababaaaaab 181 | aaaabbbaabbbabbbbaababababababbbabaabababaaaabbababbbaba 182 | bbbabaaabbbbaaaaaaabbaaa 183 | abaabbaaabbbabaabbbaaaab 184 | aabababbabaabaabbbbbbbbbbbabbaba 185 | baabbababaabbabbaabaabba 186 | aabababbaaabbababaaabbabbabbabba 187 | abbabbbabaaaaabababaaabbbbbaababbabbbbbb 188 | baabbbbaabbaabaabaaabbbaabbabbbbabbbbabb 189 | aabbbabbababbaaaaabbabbaaaabaaab 190 | ababbaaabbbabbbaabaaaaaababbbbbb 191 | bbbabaabababbbabbbbbababbbababbb 192 | aabbbaabaabaaaaabbabbaaa 193 | aabaabbbbbaabbaabbaabaab 194 | bbabbbaaababbabaaaaababa 195 | bbbabbaabbabbbaabbababba 196 | bbbaaabaabababbbbbbbbbbaaaabbabbaababaaaaababaaaaababaaa 197 | abababbbbbbabbbbbaabbbab 198 | bbaaaaabaaaaabababbbbbba 199 | bbabaaaabbbbbbbbaaabbabaaabbbbbbabbbabaa 200 | aabbbbaaabaaabaaaababaaa 201 | ababababaabbbabaaababaab 202 | abbaaaaabababbaabbbaabbaaaabbbba 203 | bbbbababaaaabbaabbbbbaba 204 | ababbaabbbabbaabbbbbaaababbaaaabaabbabbaababbbbabaabaaab 205 | aabbbbaaaaaabbbbbbbbbbab 206 | aaaabaaaaaabbbbbbbbabbab 207 | babaaabbabbababbbbbababb 208 | abaabbbabbaaabbaaabbbbbb 209 | baaabbbabbbbaaaabbababbb 210 | abbaaaababbaabbbaaaaaaabaaaaaaabbbbbabababbbaaaa 211 | bbbaabaaaabbbbbbabbbaaabbaaaaaaa 212 | abbabaabbaaabaababaabaabbbbbaabb 213 | aaababbbabbaabaaabababbabbabaaabbbaabbba 214 | babaabbababaaabbabaabaaaabbbabaa 215 | bbaaabbabaaaabbaaaaaaaabbabbaaaaababaabb 216 | ababaabaababbbabababbaaaaaababba 217 | baabbbbaaabbababbaaababbbabbabbbbbaabaaa 218 | babbaaaaabbaaaababbbbbba 219 | bbbabaabaababbbbabaabaababaabaabbaabbaabbbabababbbbbbbab 220 | aaabbabaabbaabababaabaaabaaaabaabaaabaaabbaabbaaaaabaabbaabaabaa 221 | ababbaabbabaababbbbbbbbabaaabaababaabbaa 222 | bbaaaaabaabbbbbaababaabaaabbbaabbbabbabaaaaaabbbaaaabaab 223 | aaaaabaaaabbbabbbaabaabb 224 | aabbabbabababaababbbbabaaabbbbabbaabbbaababbbbba 225 | baaabbbabbbbababbbbabaaaaabbbbaabaaabaabaababbba 226 | abaaabbbbabbaaaabbabaaaabababaabbabaabaabaabaaaa 227 | abaaabaaaaabaaabababbbbaaabbbbbb 228 | abaabbaabaabbaabaababbab 229 | abaaaaaaabbaaaaababbabbbbbababbaabbabbbb 230 | bbbaaabaababaaabbaaababbabaabbbaaaabaaba 231 | babbabaaaababbabbbbabbbbbabbbbbabbaaabaababbbabbabbbaaaaaabababaaaaaabab 232 | aaabbabaabbaabbbbaaaabbb 233 | babaabbabbabbaabbaabababaabbbabbbbbbbaaababbaaba 234 | bbabbaabababaabaababbbabaaaaaaabbbbbbbaaabaababb 235 | aaaabaaaabbbbababaaaabbabbbbbbbbaababababaabaabb 236 | abaaabaaaabaaabbaabaabbbbaabbbab 237 | aaaaabaaaaababbbababaaaa 238 | aabbabbbaabbbbaaaabbbbaabbabbaabababbbbb 239 | aaabbbbabaaaabbbbbababbb 240 | abaaaaaabaababbbabaabbbaababbaabbbabbabaaaaabaab 241 | aabaaaaabbabaaaabaaaabbaaabbbbababaaaaba 242 | baaabaabaaabbabaabbaabaabbaaabaa 243 | bbabbbbabbbabaaaaaaababa 244 | aaaabaaababbabbbaaababab 245 | baabbbbbababbaabbbbbbbbabaababbbbbbababaabbaaabb 246 | baabbbbbaabbbabbabaabbbbabaaabba 247 | bbabaaabababbababbbbbbbbbabaaaaababaabab 248 | baaaabaaaaabaaabbbbbabbb 249 | babbabbbbbbbbbbbababababababaaababbbabbaaaaabbababaaabbb 250 | aaabbaabaabbbaaababbaaab 251 | aabbbabbbaaabaaaabbbabaa 252 | aabbbbaabbabaabaabaaaaab 253 | bbbaabbbabbababaababbbababaaaaaaaaaaabbb 254 | bababbaaababbaabbbbbbbbbaaaabbbbabaabbbaababababaababbabaabbbbbb 255 | aabbbaaaababababaaaabaaabaabbaaa 256 | ababbbbbbbbbbbbbabbbabbaababaabaabaaababbabababbbbbaaabbbbbbbaaaaabbbbab 257 | abbaaaaabbabbaababbaabbbbabaaaabbabbbaba 258 | babbabbbabbaabbababbbbba 259 | abbaabbbaabbabbbbbaabbaabbbaaabbbbbaabab 260 | ababaabbaaabbabbbbaaababbbaaabbabaaaaaab 261 | bbbababaaaaaaaabababababbababbba 262 | aaabbbbbbbbabaabbababbaababbababaabaabaa 263 | babaaaabbbaabbbbababbbbb 264 | bbbaabbbbabbabbbabbbbbabaaaabbaaaaaaaabaaabaaaab 265 | bbaabbbbbaabaabaaaaabbaaaabbabbaaaabaaabbbaabbbbabbbbabbbbbbbbabbbbaaaab 266 | baababbbabbabbabbababbba 267 | ababbabababaabbbababbbabaababaab 268 | baabababbbabaaabbaaabaaaaabbbabbabbbabbbbabaabaaaaaaabbaaaabaaaabbbaabaa 269 | abaabbbbaaaabaaaabbabbbaabbbabab 270 | aaaaabababbbabbbabbaaabaabbbababbbababbb 271 | bababbaaaababbbbababaaababbbabab 272 | bbbbbbbbbbbabbaaabaabaaaabbabababbbababb 273 | abbaababbbbaaabaaabbbbbaaabbbaaabbabaabbabbbbbbb 274 | abbaaaababbbbaaaabbabaabbaaaaaababbbabaa 275 | aabbbaabababbaabbbaababaabbbbabb 276 | babababaaabbbbbaabbababaabbbabbbbabbbaaabbbbaabbbbababba 277 | ababbaabbbaaaaababbaaabb 278 | aabbaabbaabbabbbbbbbaaabbbbbbbbaabaabbbaaaababbaabababaaaaabaabbababbabbaabbaaaa 279 | ababbbabbbabaaababbbabab 280 | bbaabbaaabbababbaabbbbaaabbbbaaaaaabaaabbabbaaabbbbbaababbbbaabaaaaabaab 281 | baaaabaabbbaabbaaaaaaaba 282 | baababbbbbbabbbabbbabbaabaaababbabbaaabaaabaaaab 283 | aabaaaaaabbabbbabaaaabab 284 | abbaaabaaabbaabababaababbbbbaababbbaaabb 285 | aabbbabbababbbbabababababbbbbaba 286 | aaabbabbbababaabbabaabbabababbaabbabbbbb 287 | abbbbbabbaabbbabbababaaabbbbbababbbbaaaaaabaaabbbabaabbbbbbabaaaabbabbbabbabaaaa 288 | aabbaababbaaaaabaaabbbba 289 | aabaabbbabbbabbaabbabbaa 290 | bbaaaaababababbbababbbababbbabbbabbbaaabbaaaaaaabaabaaab 291 | babababaabbaabbabbbaabbbbaaabbbb 292 | babaaaaababaabbbbabaababbbabbaabbbaabbaabbabbbaaaaaabbabbbbbaabb 293 | aaababbbabbaabaaaaabbabaaaaaabbbbbbabbab 294 | aabbababaabbbaaabbbabaabbbaababaaabaabbbababbabb 295 | babbaaaabaaaabbabaabbbbaaabbaabaabababaa 296 | abababbaaababbbbbaabbabaabbbbabb 297 | bbbabaabababaababbbbbbaa 298 | bbbbabababbbbaaabbaaaabaaaaabbbabbbbbabb 299 | aabaabbbbbabaaaabbaaaabbababaabbaaababba 300 | babaaaabbbbbbbaababaabbabbbabababbbbaaba 301 | ababababaabbbbbabbaaabbb 302 | babbabbbbbbabaaabbababbb 303 | babbbabbababaaababaaaaab 304 | abaabbbbabbaabababbbaaaa 305 | bbbabaabbaaababbabbaababbaaaaabaaabbabaabbbbbaaa 306 | aababbaaababaabbaaabbbabbababbaaaabaaaaabbababbaabbaaabbbabaabba 307 | bbabaabaaabaaabbbabaabba 308 | aabbbaabaababbbbbaababbababbbbbbbaaabbbb 309 | aaabbababbaababaaabbbbaababbbbaaabbbaabb 310 | babaabbbababbbabbbbbbbbbbbabbaabaaababba 311 | bbabaaabbbaabaaaaababbba 312 | baaababbabbaabbabaaabbabaabbabaa 313 | bbabaaaaaaabbabababaaabaaabbaabbababbaababbabbabbababbabbbababba 314 | baaabbbbaaaaabaabababababbaababbbbabbbababaaabbbabbaabbb 315 | bbbabaaaaabababbaaabbaabbaabaaabaabbabaa 316 | bbaaaabaaaabaabbaaabaabbabbbbbbabbababbaaabbaaabbaabbaab 317 | babbaaaaaaabbaabbbbbabaa 318 | bbaabbaaabbbbbabaaaababb 319 | aabbbbbabbbababababbbabbbaaabbbabaabbaabaaababba 320 | abaaaabaabbabaaaaaaabbabbbbaababbabaabbbbbbaaababbababab 321 | abbbbaaaaaaabbaabaabaababaabaabaabbbabbaaabbabaabbaababb 322 | bbbbbbaabbaababababaaabbbbabbaaa 323 | babaaabbbaaaaabaabaabaaabbbbbbbabbbbbabb 324 | aaabbaabbbabbaabbbbabbbbaababababbbbbaaa 325 | bbbabaabababbbabbaaabbabbaabbabbabbaaababbbbbaabaaabbbbabbbaaabbbabbbaab 326 | ababbbbabaabababbbabaaaabbbaabbabbababaabbababba 327 | bbabaaaaaaabbabbbabbaabb 328 | ababaababbbbbbbaaaabaaba 329 | bbbabbbbaaaababbbbaaaaaa 330 | bbbababaaabaababbbbabbbbaabababbbabbababbaaaaaaaaaabbbaabaaabbaa 331 | abaabaabbbaaaababbaaabaa 332 | babbabbbbabaababaaaaabaaaaaabaaaabbaaaabaabaabba 333 | bababbbbaabbaababbabbaabbaababbaabbbaabbaaabbbaa 334 | bbbbbbaabbaaaabbabaabaaaaababaab 335 | bbaabaabbaaaaabbababaabbbbbabbaababbaaaababbaabbaabaabaabbabbaabbbababab 336 | bbbabbbabbaabbaabaaabbaa 337 | bbbabbbabaaaabaaabbbbbbb 338 | aabbbabababbaaaaabababbbabbbaaab 339 | baaababbabbbabbbbbaabbbbbbbaabab 340 | aaaabbaaababbaabbbababaa 341 | bbaaaabbbaaababbabbbbabb 342 | babaaabaababababaabbabbaaaabaabbabaaaaab 343 | baaabaabababaabaaaabaaabaabaabaa 344 | abbababbbbbbababbaababbabbaabbbaabbabbbb 345 | aaaaaaabaabaababbbabbbbababaaaaabbbaabab 346 | baabbbbbabaabababbaababaababbbabababaabbabbbbbba 347 | aabbabbaabbaaaaaabbbaaaa 348 | aaaabbbbbaabababbabbabbbababbbbb 349 | babaababbbaabbbbabbaaababaabababbaaabbbbababaabb 350 | babbababbaaaaabaaabaaabbababbaab 351 | bbaabbaaaabbbbabaaabbbbbbaaababa 352 | abbbabbabaabaababaabababbbbbbbaaababbabbbbabbaaa 353 | aabaaaaaaabbaabbaabbaaab 354 | aabaaaaabaaaaabbaaaabbab 355 | ababaabaabbbbaaabbbbaabb 356 | abbaabbbbbbbaaabbaabbbbbbbaabbaaabaabaaaabaaabaabbbbbabbbbababbb 357 | babaabbabaabaabaabbaabbabaaabbaa 358 | bbaabababababbbbbbaabbab 359 | aabbbbaababaaabaaaaaabba 360 | aaabbbbbabaababaabaabaababbabaabbaaaaaaa 361 | bbaababaaaabaaabaabbabababababbbabbaaaabaaaaaaaaaabaabaaaabbaaabbaaabbaa 362 | aabbbbbaaabaaabbbbbaabaa 363 | abbbaabbaaabbabaabbbababaaaaabbaabaabaabbbbaababababaabaaabaabbabbaabbbbbbbbbbabbabbaaaa 364 | baaabaaaabbaabbaabababbbaabaaabbabbaabbaabbababaaaababab 365 | aaaaaaabbbabbbaaababbbabaaabbbaa 366 | baaaaabaabaabababbbaabbb 367 | aababbbbbbaaaabbaabbbbabaaaabbbabbbbabbb 368 | baaaabaabbbabaaaaabaaaba 369 | bbbaaabaababaaababbbabaa 370 | bbaaaabbbbbaaabaaabbbaaaaaabbabbbbbbbaab 371 | baaaabaabaabbabaaaabbbbbaaaabaaababbaaaabababbbabaabbbabbababbab 372 | ababbbaabbabaabaabaabbbbababbaababbababbabbaaabbabbaaaaaabaabbaaabbaaaaaaabaabbb 373 | ababaaabbaabbabaabaabbbbabaaabaaaababbab 374 | baaabaabbabbaaaabbbbbbaabbbbaabb 375 | bbabaaaaaaabbbbbabbabbbaabbaaababbababba 376 | bbbbaaaaabbaababbabbbaaa 377 | bbbbbbbbaababbbbaababaab 378 | aaaaabaabbabbbaabbabaaaaababbababbaaaababaabaabaaaaabbab 379 | babaaaaababbbabbbbaabbaaabbbaaab 380 | bbaaaababbbaabbabaaabbbb 381 | baabbabbbbaabbbbaabbbbbb 382 | aabbaababbaabbbbbaaababbaabaaaba 383 | aaaabbbaababbaabaaabbbaa 384 | bbbaabbbbabbababbaabbabaaabaabbabbabbaaa 385 | abaababaabaaabaaaabaabababaaaaaaababaaabbabababb 386 | bababababaaaaabbaaaaababbbbabbbabababaabbabbbaab 387 | abbaabbbaabaababababbbbb 388 | babaaaabababbababbaaaababaaaaababbbbbbbabbbaaabbaaabaaaa 389 | aabbaabbbabaaaaabaabaaab 390 | aabbbaabbabbabbbbaaababa 391 | baaaaabbabbaababbaabbabbaaabbbaaabaabbab 392 | ababaababbaabbaaabbbbabaaaaabbaaaababbabbbabbaba 393 | aaaaabaaaabbbabbaabbaaaa 394 | abbaaabababaabbaabaaaaab 395 | abaaabaaaabbbababbbbbaaa 396 | bbbbbbaabababbaabbbbbbaababbbaab 397 | bababaabbaababbbbaabbababbbaaabababbaaaaaaabbbab 398 | bbbbaabaaaabababbaabbbab 399 | abaabbbbaabaaaaaabbaaabababbbbbbaaaaaaaa 400 | abbaabbaaaaabbbbbabaaabababbbbba 401 | aabbaabbababababbaaababbabbabbabaabaaaba 402 | bbaaaabbababbbabaabbbbbababbbbaaaaabaaaa 403 | abababbaababbbbaaababbbbababaaaabbbaaaab 404 | abbabbababbaaaababbaabbbbabbbbbb 405 | abbbbbababaabbbabbaaaaabaaaaabbb 406 | abbaabbbbaaabbabbabbabbbabbabbbaaabbababbbbbabaabaababaa 407 | aabbbaaabaabababbababbbbabbbbbaa 408 | bbbaabbbaabbbaaabbaaaaabbaabaabaaaababbbabbabbbaaabbaaaa 409 | baaaabbabaabbabbaaaabbbaaaaaabaabbaaaaabbabbbbba 410 | aabbabababababbababababaababbbbababbaaba 411 | ababbbbaabbabbbabaaaabab 412 | aababaaaaaaabbabbabbaaba 413 | bbaaaaabbabaabbaaaaabbaa 414 | aabaaaaabaaabbbaaaabbabababbbbbb 415 | abbababbaabbbaaababbababaaaaababbbaabbbbbabaaaaaabaaaabb 416 | baababbaabbaaaababbabaaa 417 | abaaaaaababbbabbaabbbbaabbbabbaaabbabbbaabbbbbabaaabaaaabbaabaabaaabbaaabbbaababbaababaa 418 | bbbabbbbabbbabbabaabbababbaabaaaaabaaaab 419 | abbaabbbbbabbbbabaaabbaa 420 | bbbaabbaabbabaabaaabaaba 421 | babbabababababbabababaaa 422 | abababbbbbbabbbbababbbaa 423 | aaababbbabbaaaaaaababaab 424 | aaaabbaabaaaabaabbbababababaaabaabbabaabababbabb 425 | ababbbabbaaabbabbbaaaaaa 426 | abbaaabaaababbbaaabababbbbbbbabb 427 | bbbbbbbaababababababbabaabaabbaa 428 | abababbbbaababbbaabbbabbbbabbaba 429 | baabababaabbbaabbabaaabbbaabaaaaabbbbbbb 430 | aabbbbaababaaababaaababa 431 | bbabbbaababaaabbabbbbbaa 432 | ababbbababbbbaaabbbaabaa 433 | baaaabaaabababbbaaababba 434 | bbbabbbababaaaabaababaaa 435 | babbabbbaaabaaabbbabaabaaaaaabbb 436 | ababaaababbaabaaaabbbbbaabbbbaaaaaabaabaaaaabbab 437 | bbbabaaababbaaaababbababaaaaabbabbbbbaba 438 | babaabbabaabbabaaababbbbababababbaabbbaaaaabaaba 439 | baabbbbaaabaababaaaabaaaaaaabaab 440 | abbbabbaababbaaaaabbaabababbbabbaababbabbbbabbaaabbaaaabbbbbbabb 441 | bbaabbbbaaababbbbaaabaaabaaabbbaabbbbaabbaabbabbabababababbbbbaababbabbbaaaababb 442 | abbaabbabbbabbbaaabbabbaaaabaaabaabaaaba 443 | bbbabaabaabaabbbbabbaaba 444 | abbababbbbabaabababaabaa 445 | aabbbabbbbabaaabbabababbbbbaabaaabaababbbbbabbaa 446 | babaabbaababbaaaaaaabababbbbabaa 447 | abbabaabbbbbbbbbbaabbbbbabababbaaababbba 448 | ababaababbaabbaabbaaaaabbaaaabaaabbbbaabaaabaabb 449 | bbabbbaabbaabbaabaabbbbabaabbaaa 450 | abaabbbbaabbaabbbbbabaaaabbaaabababbbaba 451 | bbaaaabbbabbbbabbbbbabbababbbbbaabbbabab 452 | ababbbbabbabaabababbbbab 453 | abababbaaaabbabbaaaabbbb 454 | abaabbbaabbaaaaabababaabbaaaaabababbbbaabaaaaaab 455 | abbaaaaaababbaabbbbbbaaa 456 | bbbabaabbabaabbbababababbaabbaababababaa 457 | abbabbabbaabbbbaabbaabbabbbbbbababbbbaab 458 | bbbbbbbababababaaabaabaa 459 | bbabbbbabaabbababbababaa 460 | abababaabbababbbbbabbabaabbbaaabaaaabbbabaaaaaabababaabbabbabaabaaabbabb 461 | bbaaaabbbababbbbaaabaaabbaabbbaabbbaabbabbbaaaaababbbbabbabbaabb 462 | aabbbbabaaaabbbabaababab 463 | babaabbabbabaabaaaaaaaabbbaababb 464 | aabbbaabbabaaabbaaabaaabbabbaabb 465 | aabaaabbbbabaaaabbbabbaaababbbabbbbbbbbabaabaaaa 466 | ababaabaabbaabaaabbababbababaabbabaaaabaaabaabaaaaabbbaa 467 | babaaaaaaabbbaabbabaabbbbbaaaabbababaaaabbbaabab 468 | babababaaaaaababbbabbaabababaaabbabbbbba 469 | abbbbaaaababbaaaababbbbb 470 | abababbaaaaaaaabbaaabaabaaababab 471 | aabbbabbbbbaabbbaaababab 472 | aabbbbabbbaabbbbaababbbbbbbaabaa 473 | bbaabbaababaaaaabbaaaaaa 474 | bababbaaabaabbaabbbbbabbbbabaabaababaaaabbbabbbabbabbbbaaaaaabbabaabbabaabaaaaabbbbabbbb 475 | bbbaabbabbabbbbaaaababba 476 | bababbaaaaabaaabbbbbbabb 477 | ababbaabbaaaabbaabbaabbbbaaaabbb 478 | babaabbababaaaaababbaabb 479 | aaabbbbbbbabbbaabbbbbaaa 480 | abaabaaaabbaababbaabaabb 481 | aabbabbbbabaaabbabbabbbabbabbbbabbbabaabaababaab 482 | abaabaabbababaababbbbbaa 483 | aababbbbbbaaaaaaabbaaaaaaabababaababaaaaaababbababbbbabababaabab 484 | abbabbababbbbaaabaaabaabaaabbbba 485 | aababbbbbbbabaabaabbaaaa 486 | aabbbaabbaabbabbbaaababaaabababaabbaaaababaaababaabbbabbbbbbaababbaababb 487 | aabbaabbbaabbababbabaabaabbbabbabaaaaaaa 488 | babaaabbaabbbbaaaabbbbabaaababbaabaaabba 489 | babaaababbaababaabaaabbb 490 | bbabaaaaababbaaaaababbbbbaaaaaab 491 | aaaabbbbbbaaabbababbaaba 492 | abbaabbaaabbbaabbbbaabab 493 | abaabbbaaabbbaaabbababababbbbbbb 494 | bbabbaababbaabbabbabbbbb 495 | abbaabababababbaaabbaaab 496 | aaaaaaabaabababbabbaababbabbabbbbabababbbbbbbabbaaaaaaaa 497 | abaabbbbbbbaabbaababbabb 498 | baabaababbabaababaabaaaabbabbabbabbbbaab 499 | bababbaaaaaabbbaaaabbabbaababbaa 500 | babaaaaaaabaaaaaaababababababbab 501 | bbaababaaabbbaababbaabbbaabbaababaaaaabaabaababb 502 | aabaabbbbaabbababbaabbbbabaaabaabbabbbaaabbbaabb 503 | abaabbbbbaaabbbababbbabbbbaaaabbbaabaabbbbaabaaa 504 | aabaaaaaaabababbbbbbbaba 505 | abbaababababbaabbbbaabbbababaaaababbbaab 506 | bbaaabbababaabbbaababaaa 507 | abbbabbbaabbabbabababababbaaabaa 508 | baabbbbabbabbbaabbaaaaababaaaabb 509 | abaabbbaaabbabababbbbbabbbbabaaabbbabbbaaababbaa 510 | aabaababbabaaabbbbabbbaaaabbbbbbaababaab 511 | abbaaabbaababbabbbbaaaabbbbabbab 512 | aaabbabaaabbbaaaabaaabaaaaabbbbbaaaabbbbaabbaaaa 513 | babbbabbabaabaabaabaaaaaababbabababaabbbaaababbaababbbbb 514 | aaaabbaabbbabbbaabbbaabb 515 | aabababbabbabbbabbbbaaabbbbbaabb 516 | aabaaabbabababbbaabbbaaaaababbbbaaaaabaaaaabaabb 517 | aabbababababbaaabaabbaaabbbaaaaababbbaabbababaaaabaabbaabbbabaab 518 | bbbabaabaabbbaaaababababbbaabaaa 519 | bbbbbbaaaaabbabaabbbabaa 520 | aaaaabbbababbbaabaaaabbbabaaababaaababbbaaaabaaa 521 | aabbbabbabbbbabaaaabbbbbababbbababbbbababbbbbaba 522 | ababaaabbbabaaababababbbabbabbaa 523 | abbaabbababaaaabbabaaaaabbabbbbaaaabaaaaabaaabba 524 | abbaababaabaaabbbbbbabaa 525 | aaabaaabaaabaaabaaaabaaabbbbaaaaaabbababbbbaabaabbbbaaba 526 | ababaabaabaababaaaabbaababbbaaba 527 | aabbbbabbbaaaabaabaabaabbbaabbab 528 | aabbbbaababaabbababbbaba 529 | aaabbaabababbbabbbbbaaabbbaabaababaabbaa 530 | babababaababbbabbaababbabbaaabaaabaaaaab 531 | aaaabbbaaabbaabbaaaaabba 532 | bbaaabaababaaaaabbbaabbbbabaaabbaaabbbbaaabbbabbbbbbabbb 533 | abbbabbbbababbaabbaabababbbbbaba 534 | babbaaaaabababbbbaabababbbbaabab 535 | baaabaaaababaaabaababbbbababababbabaaabaabaaaabaaaabaaaa 536 | baaabbababbbbbabbabaabbabaaababbbbbbbbbbabbabbbbaaaababa 537 | ababbaabaaabbabbabbabbbb 538 | aabbababaaaababbbbabbbbb 539 | babaaababbabaaaababaababbbaaabbababaaabaabbbbabb 540 | bbaaabbbabaaaabbbaaaaaab 541 | aabaaaaabbaaaabbabbaaababbaabbbbbaabbbaaaaaaabba 542 | baabababaabababbaaaaaaaa 543 | abbbaabaaabbaabbbaabbbbabaaabbbbbaaaaabaaababbbaabbababb 544 | aaabbabbbababaabaabbaabaabbabbbaaabbbaaabbabaaaaaababbbaaababbabbaabbaaabbabaabb 545 | ababaaabbbabaaaabaabbbaababaabbbbbaaaabbbabaabbbabbbbbbabbaabbabaaababbabbbbaabb 546 | bbbbbbbbbaabaabababbbaaa 547 | bbaabbaaabbabbbababbabaa 548 | abbaabaabbbbabbabbbaabababbbabaaabbbbabbbbbabaabbbabbbbabaaaabbbbabbababaababbba 549 | aaabaaaaabababbaabaaababaababbabababbbaaaabbaaaabbabaabaaababbaababbabbabbaaaaba 550 | aabababbabaabbbbbbbbaabb 551 | babaabbbbaabbababaaabaaaaabaaabbaababbaa 552 | aaabbbbbaaaabaaaababbbbabaabaaaaaaaabaab 553 | aabbaabbaabababababbbbba 554 | abbbabbabaabbabbbaaaabab 555 | bbabaaaabbbababababaabababbaababbaaaababbabababbabaabbab 556 | babaabbbaabaabbbabaabbbaaaababbbbabbaaababbbaabaabaaaaab 557 | aabbaabaabbaabaaaabbbbaabbaabaaa 558 | aaabbaababbaaaaaabbbbababaaaabbbabaabbab 559 | bbaabbbbabaababaababbaabbaaabbbaaaaabaaaabbabbbb 560 | baaaabaabbabbbbaaaabbabbbababbbbbbababab 561 | ababbaababbaabaaabaabaababaaaabbaaababab 562 | bbbbaaaaaabbbbabbaabaaab 563 | aabbbabababbabbbaababaaa 564 | baaababbbaababbaabaaabaaaabbabbabbababbb 565 | aabaababbabaaaabbabaaabaaaaaaabababbbbaa 566 | abbabbabaabaaaaaaaaabbbbbaabaabaaabbaabbabaaabbaaabaaaababaaabbaabaaabbb 567 | baababbabaabaababaaaaaab 568 | baaaabaaaaaababbabbabbbabbabaabb 569 | bbaaabbaabaabaaaabbababaaabbbbabbabbbbaa 570 | abababbaababbbbababababababababaabaaabba 571 | aabaabababbaabbabbababbb 572 | aabbbbabbabaababaaababab 573 | bbabbbbbbaabbbbaabbbbabbabaaaababaabbbbb -------------------------------------------------------------------------------- /20.py: -------------------------------------------------------------------------------- 1 | import fileinput 2 | import numpy as np 3 | 4 | PATTERN = [ 5 | '..................#.', 6 | '#....##....##....###', 7 | '.#..#..#..#..#..#...', 8 | ] 9 | 10 | def parse_lines(lines): 11 | return np.array([[int(bool(c == '#')) 12 | for c in row] for row in lines]) 13 | 14 | def parse_tile(s): 15 | lines = s.strip().split('\n') 16 | tile_id = int(lines[0][5:-1]) 17 | tile = parse_lines(lines[1:]) 18 | return tile_id, tile 19 | 20 | def array_mask(a): 21 | return sum(1 << i for i, x in enumerate(a) if x) 22 | 23 | def tile_mask(tile): 24 | t = array_mask(tile[0,:]) 25 | r = array_mask(tile[:,-1]) 26 | b = array_mask(tile[-1,:]) 27 | l = array_mask(tile[:,0]) 28 | return (t, r, b, l) 29 | 30 | def rotations(a): 31 | result = [] 32 | for j in range(2): 33 | for i in range(4): 34 | result.append(a) 35 | a = np.rot90(a) 36 | a = a.T 37 | return result 38 | 39 | def valid_placements(tile_masks, placed_masks, used_tiles, x, y): 40 | result = [] # [(tile_id, tile_mask)] 41 | t = placed_masks.get((x, y - 1)) 42 | r = placed_masks.get((x + 1, y)) 43 | b = placed_masks.get((x, y + 1)) 44 | l = placed_masks.get((x - 1, y)) 45 | need = (t and t[2], r and r[3], b and b[0], l and l[1]) 46 | for tile_id, masks in tile_masks.items(): 47 | if tile_id in used_tiles: 48 | continue 49 | for mask in masks: 50 | if all(need[i] is None or need[i] == mask[i] for i in range(4)): 51 | result.append((tile_id, mask)) 52 | return result 53 | 54 | def stitch(tiles, placed_tiles, placed_masks): 55 | x0, y0, x1, y1 = bounds(placed_tiles) 56 | w, h = x1 - x0 + 1, y1 - y0 + 1 57 | th, tw = tiles[placed_tiles[(x0, y0)]].shape 58 | th, tw = th - 2, tw - 2 59 | a = np.zeros((h * th, w * tw)) 60 | for j in range(h): 61 | for i in range(w): 62 | x, y = x0 + i, y0 + j 63 | tile_id = placed_tiles[(x, y)] 64 | mask = placed_masks[(x, y)] 65 | for tile in rotations(tiles[tile_id]): 66 | if tile_mask(tile) == mask: 67 | break 68 | a[j*th:j*th+th,i*tw:i*tw+tw] = tile[1:-1,1:-1] 69 | return a 70 | 71 | def bounds(positions): 72 | x0 = min(x for x, y in positions) 73 | y0 = min(y for x, y in positions) 74 | x1 = max(x for x, y in positions) 75 | y1 = max(y for x, y in positions) 76 | return x0, y0, x1, y1 77 | 78 | def count_pattern(im, pattern): 79 | count = 0 80 | h, w = im.shape 81 | ph, pw = pattern.shape 82 | for y in range(h - ph + 1): 83 | for x in range(w - pw + 1): 84 | sub = im[y:y+ph,x:x+pw] 85 | if np.all(sub[pattern > 0] == 1): 86 | count += 1 87 | return count 88 | 89 | def run(tiles): 90 | tile_masks = {} 91 | for tile_id, tile in tiles.items(): 92 | tile_masks[tile_id] = [tile_mask(a) for a in rotations(tile)] 93 | 94 | placed_tiles = {} # (x, y) => tile_id 95 | placed_masks = {} # (x, y) => (t, r, b, l) 96 | used_tiles = set() # {tile_id} 97 | 98 | placed_tiles[(0, 0)] = tile_id 99 | placed_masks[(0, 0)] = tile_masks[tile_id][0] 100 | used_tiles.add(tile_id) 101 | 102 | queue = [(0, 0)] 103 | while queue: 104 | x, y = queue.pop() 105 | neighbors = [(x, y - 1), (x + 1, y), (x, y + 1), (x - 1, y)] 106 | for nx, ny in neighbors: 107 | if (nx, ny) in placed_tiles: 108 | continue 109 | valid = valid_placements( 110 | tile_masks, placed_masks, used_tiles, nx, ny) 111 | if not valid: 112 | continue 113 | tile_id, mask = valid[0] 114 | placed_tiles[(nx, ny)] = tile_id 115 | placed_masks[(nx, ny)] = mask 116 | used_tiles.add(tile_id) 117 | queue.append((nx, ny)) 118 | 119 | # part 1 120 | x0, y0, x1, y1 = bounds(placed_tiles) 121 | print(placed_tiles[(x0, y0)] 122 | * placed_tiles[(x1, y0)] 123 | * placed_tiles[(x0, y1)] 124 | * placed_tiles[(x1, y1)]) 125 | 126 | # part 2 127 | im = stitch(tiles, placed_tiles, placed_masks) 128 | pattern = parse_lines(PATTERN) 129 | count = max(count_pattern(im, pattern) for im in rotations(im)) 130 | print(np.count_nonzero(im) - count * np.count_nonzero(pattern)) 131 | 132 | tiles = {} # tile_id => array 133 | for s in ''.join(fileinput.input()).split('\n\n'): 134 | tile_id, tile = parse_tile(s) 135 | tiles[tile_id] = tile 136 | 137 | run(tiles) 138 | -------------------------------------------------------------------------------- /21.py: -------------------------------------------------------------------------------- 1 | from collections import defaultdict 2 | import fileinput 3 | import re 4 | 5 | foods = [] 6 | allergen_foods = defaultdict(list) 7 | for line in fileinput.input(): 8 | tokens = re.findall(r'\w+', line) 9 | i = tokens.index('contains') 10 | ingredients = set(tokens[:i]) 11 | allergens = set(tokens[i+1:]) 12 | foods.append((ingredients, allergens)) 13 | for allergen in allergens: 14 | allergen_foods[allergen].append(ingredients) 15 | 16 | candidates = {} 17 | for allergen, ingredients in allergen_foods.items(): 18 | candidates[allergen] = set.intersection(*ingredients) 19 | 20 | ingredient_allergen = {} 21 | while True: 22 | for allergen, ingredients in candidates.items(): 23 | if len(ingredients) == 1: 24 | ingredient = ingredients.pop() 25 | ingredient_allergen[ingredient] = allergen 26 | for ingredients in candidates.values(): 27 | ingredients.discard(ingredient) 28 | break 29 | else: 30 | break 31 | 32 | print(sum(ingredient not in ingredient_allergen 33 | for ingredients, _ in foods for ingredient in ingredients)) 34 | 35 | print(','.join(x[0] for x in 36 | sorted(ingredient_allergen.items(), key=lambda x: x[1]))) 37 | -------------------------------------------------------------------------------- /21.txt: -------------------------------------------------------------------------------- 1 | rlpkdv qjm kxhh tzqf cqtmst jdcc tvbppb vtxf zkshp gstsgf lxjkr bbgjn zqzmzl znmhcfmc zbhf llpfvs xkthpt szqr njtvrpc sbzllf tfqsb fgdn vgj kndt vkcf crgmxg nccmqg rzl qmst jdlvgvp xhnk pthkfzr lbgl kxsll qdrcnt cndz xpdqxtrh srsl qxptn fzhhqp kskjbx tnrmchc tsqpn jncgc pbjgn jhddxv dmrfb zmnpsx zbqrfb nrl ddgd hmhqq dtbfb mntxnf grgjkz kxjszsfm pkvhv dsqdcl jsbpht dtphdp jrlvrx gbzml ffc htnmftg fkxl dmx vndmsf sfp nvmpqzd zbvflpl drmssh vvgz bsdjq pnqdpt qltkhqt tzgkm lnhx rcl kvlx mxvjf prbcss mdxq zvthr cltx rcqb sqr fjcrzgq jxdms jbjnx sphfb (contains peanuts) 2 | kjflc jxbzxd cfn djqrsd jngvsq vgssk xkthpt xhnk pbqgcl bcbsh dmpnpc qlmtgt sdtsq cqstff ngqdpq zmnpsx kxhh mbfb fgdn bcfhrtlx rpjlrl kqzdmd jxdms mntxnf kndt rzrb pkknz fr klqj jbjnx ccsm cltx ztjqx crgmxg znmhcfmc xrlvd rcqb nrl rtdhc ztmqrbvb tfqsb vxltmm hsbgl lknk lqqbz tsqpn sqr qmst qjvvcvz zkqmd xnqfx skjn tsktk tzqf kfzm bfbcl kvlx slzdx vvgz krhfmd rkdrk sphfb hzkcvk (contains dairy, sesame) 3 | cvkmvd xhnk fkxl pbqgcl rzrb vtxf cqtmst dmx ztjqx zqzmzl gdffb ddgd rpjlrl pthkfzr qjvvcvz cctgq ccsm vndmsf qqtnt kxhh fgdn vgj fmlc fjqns lcktf xbbcn xskcmdk kndt xggvd nrl ngqdpq qdhfqx txjxng lbgl pkknz szqr dtbfb xkthpt bcbsh lxjkr cfn rlpkdv rcqb xmctlnjx cltx kqzdmd vxltmm vbbxd zkr hzkcvk rtdhc jxfz jncgc qmst mfcf ppphm qjm xrlvd lqqbz fccp xxf vkcf zvthr pnqdpt skjn zvsgzv lhvcd crxd kvlx ckrf pzvx jxbzxd ktsnqg xvtbk tsqpn mdxq zkqmd ptnpb pbjgn dtphdp kqpcn jfbds dkjjpmt vjj vllhf tvbppb kschtq fjcrzgq nvmpqzd hmhqq (contains nuts, sesame) 4 | klqj cndz pjkkm tcgmz prbcss lknk djqrsd zqzmzl qjvvcvz sdtsq fftkllp rcqb hllqx gstsgf dmpnpc mbfb tfqsb cltx cvkmvd nrzc dq kskjbx vndmsf lhvcd jrlvrx jhddxv znmhcfmc mfcf bfbcl kndt tsqpn cqstff bcfhrtlx vvgz fkxl vtxf hcqs ckrf fjcrzgq nrl crxd ztmqrbvb zkshp ppphm bbgjn zvthr crrh xskcmdk jncgc crgmxg hzkcvk jngvsq llghzs (contains peanuts, dairy) 5 | qxplxtp txjxng qlmtgt jdcc tsktk zvbpd tsqpn mntxnf rzl ppphm tzqf rzrb vqmdd qqtnt cltx rcqb xhnk kndt pkknz dmpnpc jrlvrx nrl kschtq pzvx cvkmvd lhvcd klqj fr xqlvq cfn tfqsb ptnpb kskjbx fgdn dmrfb qdhfqx szqr nvmpqzd qjvvcvz djqrsd zbhf lknk kxsll pkvhv fkxl gvpd qjm vvgz pttq hsbgl mzhp kqzdmd jhddxv tcgmz fccp spthcff sqr bfbcl zkshp dmx hxgbnc htnmftg lcktf vgj dkjjpmt kxhh (contains fish, eggs) 6 | qmst xmctlnjx xrlvd krhfmd sdtsq dtbfb zbvflpl vgssk lknk tsqpn crrh kqzdmd bnjq nrzc xxf gtvk cltx ffc lqqbz rcl fkxl fchtgm pkknz zmnpsx qjvvcvz ktsnqg slzdx nrl bbgjn xhnk crgmxg xbbcn ckrf sfp zbhf rkdrk cqtmst jncgc txjxng qqtnt kskjbx mdxq pttq bcfhrtlx hzkcvk sbzllf kvlx pbqgcl nccmqg jfbds rcqb mzhp dnxhx xggvd kqpcn hllqx ndn crxd fgdn hjkvk xskcmdk tsktk djqrsd cvkmvd jdcc mntxnf tvbppb krg zkshp nvmpqzd qxplxtp zqzmzl vtxf llghzs (contains nuts, eggs, wheat) 7 | qxptn bsdjq rcqb kqpcn mxvjf xpdqxtrh cvkmvd bcfhrtlx mntxnf qdrcnt kqzdmd kxjszsfm xhnk xmctlnjx tvbppb nrl cxtgtz dmx tfqsb jbjnx cltx kjflc qlmtgt bbgjn dsqdcl dmrfb mzhp llghzs prbcss djqrsd qjvvcvz pttq szqr hsbgl jhddxv gtvk kndt crxd njtvrpc dnxhx krhfmd tcgmz fjcrzgq sqr xrlvd jncgc zqzmzl (contains fish) 8 | tsqpn pbqgcl tsktk lbgl xxf qdrcnt chtpkf pkknz hxgbnc djqrsd drmssh kskjbx qxptn zkshp nrzc rcqb fr xhnk hllqx cxtgtz rzl vndmsf pbjgn xkthpt zvsgzv ptnpb pjkkm tfqsb cqstff hjkvk vxltmm gdffb cltx krg nrl nvmpqzd xggvd zkqmd vqmdd slzdx qjvvcvz fftkllp kvlx hmhqq cndz tvbppb dnxhx ztjqx (contains fish) 9 | hmhqq vqmdd zzmvlnq kndt xhnk ktsnqg ckrf tsqpn nrl vkcf hcqs jdcc kjflc spthcff tfqsb xggvd vtxf dmrfb tvbppb fftkllp mdxq mfcf qdrcnt vjj pzvx jxdms xxf hllqx jsbpht sfp rtdhc zqzmzl qsddtb jrlvrx zbqrfb cltx klqj fkxl qjvvcvz drmssh kxhh nhqz txjxng bsdjq crrh chtpkf zkr fjqns mntxnf kschtq hzkcvk bfbcl crxd znmhcfmc zkshp jbjnx zbvflpl skjn tnrmchc hjkvk qdhfqx qqtnt llpfvs tzgkm nhgmnc ddgd kxsll kskjbx rkdrk gtvk dsqdcl gdffb dkjjpmt vxltmm jxfz qxptn gzbs qjm (contains peanuts, nuts, sesame) 10 | chtpkf nrl jngvsq rcqb zkshp vbbxd jsbpht gbzml jxbzxd bcfhrtlx tvbppb pttq fmlc qxplxtp srsl crxd drmssh vgssk cltx mxvjf xmctlnjx sbzllf pjkkm tzqf gtvk xskcmdk tsktk kxjszsfm mntxnf lcktf lxjkr vgj jxdms kvlx jrlvrx nhgmnc szqr zqzmzl qsddtb vndmsf lbgl pbjgn zkqmd vxltmm rzrb tfqsb zzmvlnq qdhfqx fftkllp znmhcfmc hsbgl kjflc kskjbx vtxf xhnk hcqs tsqpn cqtmst kqzdmd vllhf fccp sqr qltkhqt xvtbk gdffb htnmftg dmpnpc vkcf lhvcd krg xxf fchtgm vqmdd cfn kxsll gvpd rcl fr nhqz (contains peanuts) 11 | xmctlnjx tvbppb jfbds zvbpd dq hcqs zbhf vvgz qdrcnt dmpnpc ddgd nhgmnc kqpcn rpjlrl fzhhqp qqtnt rkdrk sbzllf znmhcfmc njtvrpc bsdjq lcktf xhnk zvsgzv bcbsh cndz bnjq mzhp jncgc nrl vtxf chtpkf dmx ndn fkxl nccmqg cqstff drmssh hsbgl zvthr xvtbk zzmvlnq tsqpn gbzml kxjszsfm vqmdd rtdhc vgj mxvjf hzkcvk vxltmm xqlvq dtphdp crgmxg cxtgtz sdtsq ckrf rcqb cltx cfn vjj llghzs xbbcn srsl xkthpt fgdn gtvk hxgbnc zbvflpl pzvx zmnpsx kqzdmd lhvcd qjvvcvz tfqsb pkknz lqqbz (contains shellfish) 12 | vxltmm kqzdmd szqr xhc zbhf bcfhrtlx ccsm kfzm cltx qdhfqx ptnpb jxfz xbbcn jdlvgvp kxjszsfm zbqrfb nrl xrlvd ngqdpq rzl dsqdcl jbjnx xggvd crxd zqzmzl hjkvk pbqgcl znmhcfmc xhnk sfp tfqsb flrxh ndn tcgmz sdtsq kschtq vgssk jfbds ffc kvlx tsqpn vtxf fzhhqp klqj gstsgf mxvjf tvbppb lhvcd kndt qltkhqt grgjkz bnjq qhps fchtgm qmst zvsgzv fccp pttq zkqmd lcktf mbfb rlpkdv rpjlrl zvbpd jrlvrx skjn pthkfzr qxptn llpfvs dtphdp kxhh htnmftg vkcf qjvvcvz rkdrk (contains fish) 13 | tzgkm zbhf qxptn cvkmvd gbzml sdtsq xhnk jdlvgvp dnxhx tvbppb tfqsb nrl zmnpsx fchtgm rcqb xmctlnjx hllqx pbqgcl drmssh bcbsh prbcss fccp htnmftg gzbs kqpcn qlmtgt tsqpn pjkkm cqtmst djqrsd txjxng tcgmz kskjbx spthcff rlpkdv vqmdd slzdx cqstff sbzllf zbqrfb zqzmzl xhc jfbds cltx sqr dkjjpmt hjkvk mdxq nhqz rtdhc dsqdcl szqr xskcmdk (contains peanuts, sesame) 14 | zqzmzl sbzllf lxjkr spthcff xqlvq fkxl xbbcn skjn cqstff nvmpqzd cctgq dmx tnrmchc dmrfb qltkhqt pttq nrl llpfvs kjflc cndz qjvvcvz vndmsf kxhh tzgkm tzqf rkdrk ppphm cfn zbqrfb bcbsh gzbs zvbpd fchtgm ptnpb dsqdcl jxbzxd jsbpht pzvx hsbgl nhgmnc nrzc dtphdp jxfz zbhf nhqz jxdms sphfb pkknz cltx xnqfx mfcf xmctlnjx zbvflpl gtvk fmlc xvtbk hmhqq xggvd lqqbz tsqpn tfqsb fccp zkr xhnk zvsgzv cxtgtz slzdx bbgjn mdxq hllqx hjkvk fgdn qxptn zkqmd xrlvd bcfhrtlx (contains shellfish, wheat, eggs) 15 | zqzmzl qdhfqx sbzllf spthcff tvbppb rcqb ffc kxhh fmlc hzkcvk rzrb mdxq sphfb ztjqx xrlvd jbjnx szqr zvsgzv dmx tfqsb vllhf jncgc zvthr zkr lhvcd krg ndn vndmsf zkshp nhgmnc zvbpd txjxng mntxnf cltx xskcmdk rlpkdv xkthpt bcfhrtlx qmst xggvd pttq llghzs lcktf xhnk qhps xnqfx fr ccsm llpfvs lnhx mzhp nccmqg jfbds pbjgn ddgd lqqbz qjvvcvz sdtsq rzl fchtgm sfp fkxl tsqpn cqtmst xmctlnjx mbfb htnmftg qsddtb pkknz flrxh kxjszsfm dsqdcl (contains shellfish, eggs) 16 | vkcf jxfz rcqb dnxhx dtphdp zbvflpl pbqgcl cndz jrlvrx vllhf szqr mxvjf gbzml zzmvlnq xhnk xrlvd lbgl hllqx mzhp bfbcl qdrcnt hcqs xmctlnjx lqqbz gtvk qjvvcvz ppphm zbhf fftkllp fgdn lcktf zvsgzv srsl llpfvs krg tsqpn grgjkz kskjbx bcfhrtlx chtpkf jngvsq gstsgf bsdjq xskcmdk zmnpsx zqzmzl xvtbk tzqf vjj vqmdd nrl ckrf jbjnx tsktk tvbppb gvpd hxgbnc qxptn fccp pzvx ptnpb drmssh zkshp kschtq cltx njtvrpc xbbcn pkknz rcl jdcc llghzs fr slzdx rtdhc nccmqg tcgmz znmhcfmc zkr jsbpht zvbpd qqtnt rlpkdv bbgjn jxbzxd kjflc xhc cfn lnhx zbqrfb (contains wheat, dairy, sesame) 17 | zbqrfb kjflc kqpcn vllhf jngvsq dmpnpc chtpkf pkknz ccsm vxltmm mdxq cltx gvpd hsbgl kfzm qdrcnt pttq zmnpsx kschtq ppphm tsqpn pkvhv rcl cvkmvd txjxng tnrmchc ndn lnhx zbvflpl skjn fr crxd rpjlrl rcqb jdlvgvp kndt vgj vkcf fzhhqp grgjkz fmlc slzdx zkshp zvbpd fccp hjkvk zkqmd rzl hllqx dnxhx nrl qmst bnjq ztmqrbvb zqzmzl xkthpt pbjgn njtvrpc jbjnx cndz cqtmst kxjszsfm bcfhrtlx qjvvcvz hmhqq lknk jrlvrx xhnk tsktk cxtgtz (contains nuts) 18 | fgdn sqr krhfmd qjvvcvz crrh qqtnt qsddtb nhgmnc vjj gbzml zqzmzl xxf tzgkm qhps lcktf ptnpb znmhcfmc pttq rcqb rtdhc cxtgtz szqr xqlvq djqrsd ztmqrbvb hmhqq pkknz tsqpn xhnk cltx mfcf kndt lxjkr tfqsb vkcf zkshp mdxq cndz vbbxd qltkhqt xhc cctgq bbgjn kjflc dsqdcl qxplxtp rkdrk zvbpd xpdqxtrh qjm qlmtgt htnmftg jrlvrx fzhhqp ndn zvsgzv sfp nccmqg mntxnf kschtq jsbpht hzkcvk vndmsf fchtgm xnqfx lhvcd bnjq sphfb (contains sesame, dairy, nuts) 19 | bbgjn gvpd ptnpb dtbfb pjkkm ccsm vkcf qltkhqt ppphm krhfmd xmctlnjx fmlc zkshp tfqsb lcktf rcqb qjm xpdqxtrh qjvvcvz znmhcfmc djqrsd spthcff jxdms pbjgn jxbzxd cqstff zqzmzl zvsgzv tcgmz jdlvgvp bsdjq ngqdpq cltx mfcf kxjszsfm xhnk xkthpt vvgz kfzm jhddxv dnxhx kqzdmd xggvd tvbppb crgmxg jrlvrx slzdx vqmdd srsl vbbxd pbqgcl xskcmdk mdxq kndt hsbgl gdffb tsqpn lknk bcbsh hcqs (contains shellfish, eggs) 20 | cqtmst jdcc vbbxd lqqbz qdhfqx vgssk rlpkdv tzgkm nrzc kxsll kqzdmd cltx ztmqrbvb fzhhqp bnjq pkvhv vtxf zvsgzv slzdx zbqrfb flrxh klqj xxf xkthpt tsqpn jxdms gzbs fchtgm ccsm xhnk lknk llpfvs kxjszsfm prbcss tfqsb nrl crgmxg vllhf zqzmzl kjflc hxgbnc vjj lnhx ngqdpq sfp ddgd gvpd rpjlrl pnqdpt qmst znmhcfmc kndt zbvflpl njtvrpc qjvvcvz (contains nuts, eggs) 21 | vjj kskjbx kndt lxjkr lhvcd jsbpht hmhqq jbjnx mbfb pthkfzr pzvx vllhf zkshp ddgd bfbcl fgdn cltx bnjq qlmtgt mntxnf zvsgzv jrlvrx vgj kfzm xhc vvgz pkknz crgmxg ndn bbgjn hsbgl zmnpsx xhnk sbzllf bcbsh fkxl crrh sqr jxfz bcfhrtlx nvmpqzd tsktk xggvd hxgbnc krg cndz fzhhqp qhps htnmftg lnhx rcqb xbbcn crxd rzrb sphfb dtphdp rcl pkvhv vndmsf ptnpb cqtmst cxtgtz ckrf fccp cfn tfqsb gdffb ffc tsqpn kschtq nccmqg slzdx zqzmzl mxvjf nhqz vbbxd mfcf klqj zbhf prbcss gstsgf drmssh qdhfqx nhgmnc nrl (contains sesame, shellfish) 22 | ztjqx rpjlrl zvthr gdffb fjcrzgq jsbpht fgdn zvsgzv cxtgtz klqj cqtmst dtphdp jdlvgvp kndt ccsm rtdhc jncgc qdhfqx tsqpn zkshp dmrfb rkdrk nrzc znmhcfmc vndmsf jxbzxd llghzs hxgbnc kschtq dsqdcl kvlx lhvcd rzl skjn zvbpd djqrsd tfqsb ngqdpq jxdms pttq crrh kqpcn fccp ppphm nvmpqzd sdtsq qjm qltkhqt zzmvlnq rcqb qqtnt tzqf zqzmzl pnqdpt crxd pjkkm jdcc ztmqrbvb crgmxg zbqrfb zkr xhc mntxnf lqqbz mfcf qhps cltx vtxf qjvvcvz jxfz hsbgl sphfb sbzllf qxptn cctgq xmctlnjx sfp jhddxv xhnk kqzdmd xnqfx kxjszsfm kjflc mbfb ptnpb kxsll grgjkz lcktf (contains wheat, eggs, peanuts) 23 | kskjbx fkxl szqr vxltmm ndn nccmqg lhvcd qdrcnt rzrb kvlx hsbgl tnrmchc cvkmvd vtxf pbjgn ccsm vqmdd rkdrk tsqpn ztmqrbvb lxjkr hjkvk pzvx pjkkm txjxng xhnk zkqmd htnmftg dmpnpc kqzdmd rpjlrl xpdqxtrh sbzllf crrh fccp vgj fmlc dnxhx dtphdp nrl fjqns fr vgssk vjj zqzmzl rcqb mbfb bcfhrtlx sphfb qsddtb kqpcn qdhfqx qmst xvtbk cndz qjvvcvz xmctlnjx cltx pbqgcl grgjkz gzbs rzl zbqrfb jncgc qhps nhgmnc fchtgm fgdn sqr (contains eggs, nuts) 24 | mxvjf lknk tsqpn tfqsb fjcrzgq qlmtgt hcqs jngvsq qltkhqt lnhx znmhcfmc sdtsq zbvflpl jxfz dnxhx drmssh rtdhc grgjkz ztjqx nrzc vtxf ktsnqg vgj krg nhgmnc bcfhrtlx lhvcd rcqb zvbpd ddgd cqstff djqrsd zkr crgmxg rkdrk xhnk dtbfb kskjbx llpfvs rzl hllqx hjkvk pthkfzr rzrb gvpd xkthpt ffc zbqrfb kvlx qmst ngqdpq cltx zqzmzl pzvx dmpnpc jxdms klqj xggvd vqmdd flrxh gbzml pbqgcl pkknz htnmftg ccsm nrl sfp srsl cqtmst cfn kqzdmd zkqmd vjj (contains shellfish, wheat, eggs) 25 | fzhhqp bsdjq znmhcfmc gbzml fftkllp zkr mntxnf rpjlrl bcbsh rzrb drmssh pkknz sbzllf llpfvs pnqdpt jxbzxd bfbcl spthcff qxplxtp kxjszsfm xhnk cqstff srsl zvsgzv mbfb htnmftg mzhp pjkkm krhfmd kjflc vgj vvgz rkdrk nrl crgmxg dsqdcl cltx pkvhv vllhf qjvvcvz gzbs zqzmzl tvbppb szqr kschtq rcqb vgssk djqrsd xmctlnjx kfzm jdlvgvp txjxng tsqpn kqzdmd xggvd tnrmchc xskcmdk hsbgl fjqns rtdhc (contains sesame) 26 | slzdx gvpd zkr hxgbnc bnjq jxdms bcfhrtlx pttq tfqsb dnxhx rcqb znmhcfmc nccmqg rcl zqzmzl qjvvcvz tsktk cndz xskcmdk ztmqrbvb vxltmm dq mntxnf zkqmd jdcc zbvflpl xqlvq zbhf ffc srsl prbcss gstsgf sphfb nhgmnc kxhh jfbds cltx ndn qdrcnt dkjjpmt skjn flrxh dmpnpc tsqpn pthkfzr cqtmst ckrf nvmpqzd kjflc kxjszsfm xhnk mdxq qxplxtp kqpcn jsbpht vndmsf hllqx cqstff kskjbx fzhhqp (contains peanuts, dairy) 27 | kqpcn ztmqrbvb qdrcnt zqzmzl jbjnx rpjlrl rlpkdv szqr kvlx slzdx fgdn rtdhc vndmsf qmst kschtq htnmftg jncgc bsdjq pthkfzr vgssk bcfhrtlx ffc hsbgl ndn tfqsb sbzllf nccmqg fftkllp qjvvcvz txjxng vjj bbgjn mfcf xbbcn cfn gdffb znmhcfmc sfp lcktf gstsgf dmpnpc xqlvq jfbds jdlvgvp zkqmd jrlvrx zvsgzv zzmvlnq njtvrpc nrl fr fccp xhnk vvgz pbjgn sdtsq zkr dtphdp pttq ccsm krhfmd xxf fjcrzgq nhqz lbgl xpdqxtrh dmrfb xmctlnjx mxvjf lnhx ddgd skjn lqqbz mntxnf klqj xhc zbvflpl tsqpn kjflc xskcmdk kxsll rcqb qqtnt rzrb (contains nuts) 28 | qjm znmhcfmc zqzmzl htnmftg zbqrfb cltx mbfb kschtq bfbcl cndz cqtmst jfbds nrl ztmqrbvb llghzs cctgq xxf kxsll jncgc qjvvcvz kfzm mdxq ngqdpq kxjszsfm grgjkz nccmqg tsqpn tzgkm nhqz xggvd vvgz fjcrzgq ckrf sqr tfqsb krhfmd pkvhv fftkllp lbgl fmlc zbhf xhc tvbppb xhnk sphfb qltkhqt fccp rkdrk jrlvrx pkknz nrzc kvlx dnxhx dsqdcl xnqfx lknk zkqmd zkr drmssh pthkfzr gtvk sfp (contains peanuts, fish) 29 | pbjgn hsbgl zvthr pthkfzr cqstff qjvvcvz jxfz jsbpht fccp gstsgf cxtgtz rlpkdv rzl pkknz ckrf mxvjf bsdjq fjcrzgq vndmsf klqj tvbppb bcbsh tfqsb htnmftg nvmpqzd zbhf drmssh xhc xhnk kxjszsfm flrxh ddgd rkdrk tzqf cctgq lqqbz fchtgm lcktf qlmtgt nrl txjxng tsktk qxplxtp rcqb nhgmnc mntxnf pttq tsqpn vkcf qdhfqx cfn jngvsq zqzmzl ffc hcqs sbzllf (contains wheat, sesame) 30 | hllqx sphfb tzqf nrl sqr ndn sfp xkthpt gzbs bfbcl lcktf kndt fzhhqp qqtnt bcbsh rlpkdv zzmvlnq cltx qxplxtp tsqpn bnjq xhnk zqzmzl rpjlrl pbjgn prbcss kjflc zbhf tfqsb bsdjq rzrb dnxhx nrzc pbqgcl rcl mzhp ktsnqg zmnpsx fr kvlx xnqfx xskcmdk kxsll fjqns dtphdp vkcf mbfb ptnpb rcqb hjkvk zkr hmhqq kskjbx kxjszsfm jfbds (contains wheat, sesame, dairy) 31 | cfn pzvx vqmdd tfqsb zqzmzl txjxng vkcf fzhhqp dtphdp xhnk vjj kxsll xhc vgj mntxnf sphfb pkknz zbhf tsqpn flrxh xvtbk lknk dmpnpc lcktf tnrmchc hxgbnc tzgkm dq qxptn srsl kschtq crrh rcqb klqj gzbs nhgmnc dkjjpmt tsktk llpfvs zkr jsbpht qqtnt sqr fkxl gbzml szqr pkvhv ccsm nvmpqzd cxtgtz bcbsh qdrcnt zvsgzv cltx dsqdcl qlmtgt vxltmm skjn sbzllf tcgmz vtxf qjvvcvz xpdqxtrh ngqdpq dnxhx pbqgcl bbgjn fftkllp ztjqx hzkcvk rlpkdv bcfhrtlx zkqmd tzqf (contains eggs) 32 | dmpnpc fgdn pkvhv mntxnf kschtq jxfz tcgmz fjcrzgq qxptn cfn bnjq xpdqxtrh rcqb drmssh gtvk qxplxtp gdffb dkjjpmt jngvsq prbcss tzqf xkthpt fkxl lxjkr qjm nhqz gbzml sqr pzvx nrl qqtnt xhnk nhgmnc vxltmm zkshp dnxhx xxf jbjnx vvgz sphfb ppphm cltx dsqdcl jsbpht rzl dtphdp dmx qlmtgt jxbzxd pttq njtvrpc zqzmzl vbbxd skjn lbgl cqtmst hxgbnc qjvvcvz kxhh pjkkm bsdjq hsbgl fccp gstsgf qhps cvkmvd xvtbk kfzm ndn kvlx sdtsq ffc gvpd bbgjn lnhx gzbs kqpcn spthcff hllqx fftkllp jfbds kxjszsfm pbjgn tfqsb rzrb (contains shellfish, fish, wheat) 33 | lcktf njtvrpc jhddxv xhnk kndt drmssh tsqpn pbjgn kxsll cfn mbfb vgssk ppphm zbvflpl nrl zkshp pttq znmhcfmc fftkllp hmhqq slzdx cqtmst sfp lknk jdcc cvkmvd crgmxg pjkkm qdrcnt qxptn jxfz vqmdd xpdqxtrh qhps kqpcn tsktk qdhfqx ztjqx lqqbz xkthpt vbbxd lxjkr ffc dq lnhx htnmftg pkknz cqstff tnrmchc rtdhc pkvhv tfqsb jsbpht fjqns grgjkz hzkcvk bsdjq cltx djqrsd lbgl jncgc mzhp pnqdpt jxdms spthcff vndmsf fjcrzgq xbbcn fchtgm bfbcl rzrb rpjlrl nrzc qqtnt zqzmzl klqj xxf qjvvcvz xqlvq (contains fish, nuts, wheat) 34 | mdxq vxltmm vbbxd spthcff txjxng rpjlrl dsqdcl bsdjq dmx nrzc lbgl tnrmchc xnqfx cvkmvd pnqdpt cndz ptnpb sphfb jbjnx bbgjn mntxnf qdhfqx hjkvk pbqgcl pbjgn bcbsh nhqz kvlx hcqs pkvhv gbzml qsddtb fjqns grgjkz kschtq vgssk jrlvrx gtvk kxjszsfm crrh xskcmdk kqzdmd hmhqq qjvvcvz zvsgzv kskjbx vvgz cltx xvtbk lnhx rcqb tsqpn jxfz zkr ppphm jncgc gstsgf cfn fkxl vndmsf pjkkm tfqsb nvmpqzd qltkhqt kndt zqzmzl ztjqx ndn dq htnmftg qdrcnt drmssh fgdn vqmdd klqj nrl (contains nuts, dairy, shellfish) 35 | qdhfqx pzvx hcqs jsbpht zbhf xhnk ckrf zvsgzv cqtmst jbjnx xkthpt tvbppb rlpkdv spthcff hllqx fjqns bsdjq nrzc kndt pjkkm nhqz cvkmvd bcfhrtlx klqj zmnpsx sfp rtdhc qmst mbfb rcl srsl fmlc qsddtb bnjq tfqsb kskjbx xmctlnjx pthkfzr cqstff njtvrpc qjm dkjjpmt rzrb fjcrzgq lqqbz vjj hxgbnc xbbcn xhc qjvvcvz ztjqx tsqpn cltx tcgmz dq ztmqrbvb qdrcnt htnmftg cxtgtz lknk xvtbk djqrsd qlmtgt tzgkm rcqb ffc hzkcvk vbbxd llpfvs skjn pbqgcl dtbfb nhgmnc nrl ndn jfbds jncgc pnqdpt txjxng pbjgn qxptn drmssh jxfz crgmxg (contains sesame, peanuts) 36 | xkthpt ckrf qqtnt rtdhc vtxf jngvsq cltx jbjnx tsktk pkvhv qhps dtphdp hxgbnc rcqb dkjjpmt qltkhqt crxd slzdx cndz nrl vvgz ptnpb pzvx jxfz xhc ndn vndmsf rzrb vgj xskcmdk zzmvlnq hsbgl ddgd gzbs zvsgzv tfqsb fr jhddxv qjvvcvz sphfb tsqpn rcl grgjkz gvpd sbzllf cqtmst xbbcn kndt djqrsd xmctlnjx kskjbx zqzmzl mxvjf zbqrfb fkxl kxjszsfm krhfmd dmrfb cctgq (contains eggs, shellfish) 37 | hsbgl ndn ztmqrbvb kskjbx xvtbk ngqdpq hllqx tfqsb dq crgmxg qjm pnqdpt jfbds zvsgzv pttq zmnpsx spthcff qxplxtp xnqfx qdrcnt vxltmm vqmdd txjxng lqqbz nrl cltx qjvvcvz zbvflpl nhgmnc qqtnt tnrmchc pkvhv bcbsh jncgc ddgd jxdms jhddxv cqstff zvthr bcfhrtlx pbqgcl kjflc tcgmz jrlvrx xhnk vkcf ccsm lxjkr llghzs hjkvk dnxhx vndmsf xpdqxtrh vtxf vgj sqr krhfmd zkr fccp jxfz ckrf jxbzxd pkknz krg sphfb nccmqg ktsnqg mdxq kxsll zqzmzl tsqpn (contains wheat, peanuts) 38 | fchtgm qjm crrh bnjq rlpkdv lnhx zvthr rpjlrl zkr zvbpd xqlvq fmlc jbjnx pkknz kfzm zqzmzl cctgq hmhqq bcbsh jsbpht tsktk jhddxv rcl fkxl xggvd kskjbx qxptn grgjkz rzl tsqpn xhc klqj kxjszsfm xnqfx tzgkm dmx lhvcd ckrf xpdqxtrh hllqx tnrmchc fjcrzgq pbjgn rcqb kqpcn lqqbz vxltmm ccsm nrl mntxnf jxbzxd vkcf nhqz djqrsd cltx sfp cqstff rtdhc qmst zbhf cndz mdxq cxtgtz kqzdmd vgssk xskcmdk spthcff fftkllp mzhp szqr lxjkr qsddtb sqr tfqsb qjvvcvz xxf dmpnpc ptnpb xkthpt ndn qdrcnt znmhcfmc (contains shellfish) 39 | xskcmdk mzhp jxbzxd jdcc pnqdpt qdhfqx zkqmd fr pbqgcl kskjbx zqzmzl vkcf mfcf cvkmvd nrl zbvflpl krg jfbds tvbppb qxptn nccmqg rlpkdv xvtbk nvmpqzd krhfmd pbjgn xggvd tfqsb tsqpn mbfb fftkllp skjn crrh vxltmm kqzdmd tsktk prbcss cltx dkjjpmt zbqrfb cqtmst ktsnqg fgdn hmhqq rcqb llpfvs tcgmz sphfb jrlvrx djqrsd lhvcd jncgc llghzs mntxnf rtdhc jsbpht bfbcl sbzllf jdlvgvp drmssh xpdqxtrh kschtq vjj zkr bnjq vtxf gbzml dsqdcl vgj xhnk (contains fish, peanuts) 40 | jfbds tfqsb vgj chtpkf rcqb ckrf dmx jncgc lcktf qdhfqx nrl qjvvcvz nhgmnc rzl zvbpd pkvhv jhddxv cqstff bcfhrtlx spthcff vtxf bcbsh kskjbx lknk htnmftg cqtmst rlpkdv gstsgf mbfb dtbfb gzbs xpdqxtrh fjcrzgq vqmdd hcqs dtphdp zbqrfb xhnk zqzmzl tsqpn hjkvk gdffb nhqz (contains dairy, sesame) 41 | tfqsb qxplxtp qdhfqx cqstff nrzc zkr jrlvrx cxtgtz tzgkm rtdhc tsqpn rcqb spthcff vgj cqtmst jncgc bcfhrtlx cvkmvd qsddtb nhqz fgdn qhps ptnpb pthkfzr xnqfx xxf fzhhqp htnmftg ckrf sdtsq llpfvs xhnk cfn slzdx dkjjpmt hmhqq bsdjq krg zqzmzl vjj pbjgn chtpkf rpjlrl cltx rcl qjvvcvz cctgq (contains peanuts, shellfish, wheat) 42 | tzgkm htnmftg qjvvcvz pnqdpt tfqsb hzkcvk rcqb mfcf grgjkz jxbzxd kfzm xkthpt klqj vkcf qlmtgt kqpcn zvbpd jsbpht zvthr dtbfb crxd jxfz xhnk pttq crrh jxdms pbqgcl cqstff gtvk nrl kskjbx bbgjn hcqs fzhhqp dtphdp qxplxtp dsqdcl zkshp mdxq fjqns nvmpqzd fgdn kjflc xpdqxtrh qjm ndn zqzmzl hsbgl qxptn skjn cltx pzvx fjcrzgq xrlvd ktsnqg (contains nuts, eggs) 43 | tsqpn ckrf ztjqx znmhcfmc rcqb nccmqg dsqdcl rtdhc pbjgn hmhqq ptnpb xrlvd mxvjf vbbxd pjkkm ngqdpq xskcmdk tzqf sqr xxf zmnpsx kqzdmd tfqsb dtphdp krhfmd lknk vxltmm dq spthcff nrl qmst drmssh zvthr htnmftg xhnk jncgc xbbcn bsdjq hzkcvk xmctlnjx qjm hllqx jxdms kfzm cxtgtz hcqs vqmdd tcgmz fmlc vgj slzdx kskjbx zqzmzl njtvrpc cltx zbvflpl gbzml gstsgf kschtq jbjnx (contains sesame) -------------------------------------------------------------------------------- /22.py: -------------------------------------------------------------------------------- 1 | import fileinput 2 | import re 3 | 4 | def score(deck): 5 | return sum(v * (len(deck) - i) 6 | for i, v in enumerate(deck)) 7 | 8 | def play(p1, p2): 9 | p1 = list(p1) 10 | p2 = list(p2) 11 | while p1 and p2: 12 | c1 = p1.pop(0) 13 | c2 = p2.pop(0) 14 | if c1 > c2: 15 | p1.extend([c1, c2]) 16 | else: 17 | p2.extend([c2, c1]) 18 | return p1, p2 19 | 20 | def play_recursive(p1, p2): 21 | p1 = list(p1) 22 | p2 = list(p2) 23 | memo = set() 24 | while p1 and p2: 25 | key = (tuple(p1), tuple(p2)) 26 | if key in memo: 27 | return 1, p1, p2 28 | memo.add(key) 29 | c1 = p1.pop(0) 30 | c2 = p2.pop(0) 31 | if len(p1) >= c1 and len(p2) >= c2: 32 | winner = play_recursive(p1[:c1], p2[:c2])[0] 33 | else: 34 | winner = 1 if c1 > c2 else 2 35 | if winner == 1: 36 | p1.extend([c1, c2]) 37 | else: 38 | p2.extend([c2, c1]) 39 | return winner, p1, p2 40 | 41 | def part1(p1, p2): 42 | p1, p2 = play(p1, p2) 43 | print(max(score(p1), score(p2))) 44 | 45 | def part2(p1, p2): 46 | _, p1, p2 = play_recursive(p1, p2) 47 | print(max(score(p1), score(p2))) 48 | 49 | numbers = list(map(int, re.findall(r'\d+', 50 | ''.join(fileinput.input())))) 51 | p1 = numbers[:len(numbers)//2][1:] 52 | p2 = numbers[len(numbers)//2:][1:] 53 | part1(p1, p2) 54 | part2(p1, p2) 55 | -------------------------------------------------------------------------------- /22.txt: -------------------------------------------------------------------------------- 1 | Player 1: 2 | 41 3 | 26 4 | 29 5 | 11 6 | 50 7 | 38 8 | 42 9 | 20 10 | 13 11 | 9 12 | 40 13 | 43 14 | 10 15 | 24 16 | 35 17 | 30 18 | 23 19 | 15 20 | 31 21 | 48 22 | 27 23 | 44 24 | 16 25 | 12 26 | 14 27 | 28 | Player 2: 29 | 18 30 | 6 31 | 32 32 | 37 33 | 25 34 | 21 35 | 33 36 | 28 37 | 7 38 | 8 39 | 45 40 | 46 41 | 49 42 | 5 43 | 19 44 | 2 45 | 39 46 | 4 47 | 17 48 | 3 49 | 22 50 | 1 51 | 34 52 | 36 53 | 47 -------------------------------------------------------------------------------- /23.py: -------------------------------------------------------------------------------- 1 | import fileinput 2 | 3 | class Node: 4 | def __init__(self, value, prev=None): 5 | self.value = value 6 | self.next = None 7 | if prev: 8 | prev.next = self 9 | 10 | def destination(wrap, *cups): 11 | value = cups[0] 12 | while value in cups: 13 | value = (value - 2) % wrap + 1 14 | return value 15 | 16 | values = list(map(int, ''.join(fileinput.input()))) 17 | # values = values + list(range(10, 1000001)) 18 | 19 | N = len(values) 20 | T = [0] * (N + 1) 21 | for i in range(N): 22 | j = (i + 1) % N 23 | T[values[i]] = values[j] 24 | 25 | hi = max(values) 26 | lookup = {} 27 | first = node = Node(values[0]) 28 | lookup[node.value] = node 29 | for value in values[1:]: 30 | node = Node(value, node) 31 | lookup[node.value] = node 32 | node.next = first 33 | 34 | node = first 35 | for i in range(100): 36 | dest = lookup[destination( 37 | hi, node.value, node.next.value, node.next.next.value, node.next.next.next.value)] 38 | last = node.next.next.next 39 | tmp = dest.next 40 | dest.next = node.next 41 | node.next = last.next 42 | last.next = tmp 43 | node = node.next 44 | 45 | node = lookup[1].next 46 | while node != lookup[1]: 47 | print(node.value, end='') 48 | node = node.next 49 | print() 50 | 51 | one = lookup[1] 52 | print(one.next.value * one.next.next.value) 53 | -------------------------------------------------------------------------------- /23.txt: -------------------------------------------------------------------------------- 1 | 784235916 -------------------------------------------------------------------------------- /24.py: -------------------------------------------------------------------------------- 1 | import fileinput 2 | 3 | DIRS = { 4 | 'e': (1, 0), 'se': (0, 1), 'sw': (-1, 1), 5 | 'w': (-1, 0), 'nw': (0, -1), 'ne': (1, -1), 6 | } 7 | 8 | def follow(line): 9 | q = r = 0 10 | while line: 11 | if line[0] in DIRS: 12 | key, line = line[0], line[1:] 13 | else: 14 | key, line = line[:2], line[2:] 15 | dq, dr = DIRS[key] 16 | q, r = q + dq, r + dr 17 | return (q, r) 18 | 19 | def neighbors(p): 20 | return {(p[0] + dq, p[1] + dr) 21 | for dq, dr in DIRS.values()} 22 | 23 | def step(cells): 24 | result = set() 25 | check = set.union(*[neighbors(p) for p in cells]) 26 | for p in check: 27 | n = len(cells & neighbors(p)) 28 | if p in cells: 29 | if n == 1 or n == 2: 30 | result.add(p) 31 | else: 32 | if n == 2: 33 | result.add(p) 34 | return result 35 | 36 | def part1(lines): 37 | cells = set() 38 | for line in lines: 39 | cells ^= {follow(line.strip())} 40 | return cells 41 | 42 | def part2(lines): 43 | cells = part1(lines) 44 | for i in range(100): 45 | cells = step(cells) 46 | return cells 47 | 48 | lines = list(fileinput.input()) 49 | print(len(part1(lines))) 50 | print(len(part2(lines))) 51 | -------------------------------------------------------------------------------- /24.txt: -------------------------------------------------------------------------------- 1 | seseseseseswsesesenwseseseswenweeese 2 | nwneneseswneneweeneneeeeneeneene 3 | swswseswswswswswseseeswswswswseswsesww 4 | nwsenwnenenwnwnwewnwnwnwnwnwnwwnwnwnw 5 | sesewseesesenwnewewwnewseeseseswsene 6 | eneneneeewswnenewsenenwnwnenewnene 7 | neneneswseseeeswsw 8 | newneeeeneeeeeeeene 9 | wnwwwswwwnwewnwwsewenwwwwnww 10 | swewswswseseseswseewseseseneswnewwsesw 11 | nwswnwsenwnenwwnwnwnwwnwwnwnwnwwnwnwnw 12 | swwwwwnewwwwswswwwwwwseswsww 13 | wwwewwwwswwwwwwwwwswsw 14 | wnwnwnwnwnwnewwnwwnwnwnwsewswwnwww 15 | sweswnwwwnwwnwnwnwseenwnwnwnwnenwnwnw 16 | nenwwwsewnenwwwwwwnwwnwwswnwnww 17 | eeneeesweeesenwneneeeenweeeene 18 | enwwswnwwnwnweswnwnwseswnwnwnwsewnenenw 19 | nwnwnwnwnwswnwnwnwnwnwnwnwnwnesenwnwnwnenw 20 | nwswwsewswwwwww 21 | sesweseeneeswnweeseweseswsesenwnw 22 | sewswwnwneeswswnewswswswwwwnwswwse 23 | enwnwswnwnenwnenwswneneneneneswnwsewnenwnw 24 | nwnenwnwsenwnwnwnwnwwwnwnwnwnwnwnwnwnw 25 | seesesesesesewsesesesesesesesesesesesene 26 | swneneseswsewswwsenesesewswwnewswseswne 27 | swnwswsenesewneswswnwswsewewswseswnene 28 | wwswwseseswwnwnww 29 | esewnwseseswnweseesenwswseesesesee 30 | seeneneneseenenwsweeeeeeeewe 31 | seseswseswsewseseswsweseswseseswswsese 32 | swneeneeneseneweesewne 33 | nenenenenenenenenenenwnenwsenenenenenene 34 | neneneswneneneneneneswnenenenwenwnenene 35 | wewwewwwnwswswnwewwwwwwwsw 36 | seseseenwsweeeesenweneeeseewse 37 | neneneneenenenenwnenenenewnewnwnwnesenw 38 | nwnwnwwewwseswnesewnwswwseswenene 39 | wwswswswswswwswswsweswswsw 40 | nwnewnwwsenwnwnwnwwnwwnwsenwwwnwwsenw 41 | swweeenwseeseseeenwweseeseseeese 42 | nwnwnwnenwnwnenwwnwnwnwnwnwnwnwnwnwnwe 43 | nwnwnwnwnenwnenenenwenwnwnwnwswnwswnwnw 44 | wwwswwewwwwwwwwwnwwwwwsw 45 | neneneneneeneeneenenenesw 46 | nwswneeneeneseweneeweneneswnwswneswse 47 | seeswwenwneeneeeneeswneeswsenwe 48 | weewwwwwswwwnewwwwnwwwsww 49 | wneseewneweswneneneneneneeswnenesene 50 | swnwenwenwseswneswewnwwnwwsenwnwe 51 | wsewnenenenenenenenenenwnesesenenenene 52 | nenwneneneeneneneswnenenewneenenenenene 53 | eswswswwswnwwswswsweswnwswswswwswe 54 | seeseseseseeeswsewnwneseseesesesese 55 | eseenwseseesweeeeseeweeeesee 56 | eenewneeneneeneeneeswneneneswsene 57 | nwnwsenwnenwnwnwnwnwnwswnwnwnenwnwnwnwnwne 58 | wnwwnweeseswnwnwsweesenewnwnwnwnw 59 | nesweneenenwnwneneswneneseewene 60 | nenenenenenenenenenenwsenenenwneneneeswnenw 61 | swswsweswseswswseswseswswswnwnwsenwswsee 62 | wwnewwwwwsewwewsewnwswwnwnew 63 | swswswseswswswswswseswswsewsweswseswsw 64 | eeneenesweeeeeeeeeneenweee 65 | nwwwwwwnewnwwwwswwww 66 | nenwnwneeneswnwnwnwswnenenwnewswnwswnw 67 | eseseenwsesesesesewsesesesesesesesesese 68 | wwnwwnwwnwenwwnwnwnwnwnwnwsenwswnw 69 | sesewseseeeneewesenwseeseenesee 70 | seeesewsesewwneeeeeseeeeenenw 71 | wswswswswswswwswwwswewwwswwwsw 72 | eswwswswwwwswswseswwwnewwwwwwsw 73 | weseswseeswneseswwsewswseeewnenwsw 74 | nwnwnwnwnwnwenenwnwenwnenwnwenwnwwswsw 75 | senwnenweesesewwesweeeseneneew 76 | nwwnenenenwneeneneneswneneswwsewseene 77 | wswwwewswwewsw 78 | eswneeeeeeeeswneeneeeneenwe 79 | nwseeswnwsesweseseseseseeneswneseseese 80 | eeseesenweeee 81 | senwnwsenwnenwnwnewnenwnwsenenwnwnwswnw 82 | neenwsesewnwnewnwnenesenenwnewseswnene 83 | eweeenwesweeeeeeeseeswneee 84 | eeeswnweeeeneeeeeweeeeee 85 | nwnwnenenenwneneswnwnwnenenenwnenwnesenw 86 | eeweeeeeseseeeeeeeeeee 87 | wswswwsenwwnwneewesewswwnewnew 88 | nenesenesenwnenenwswwnwnenenenenenenee 89 | nenenwenwnwnwnwswnenwneneswnwne 90 | wwswswswwswwwneswwnewww 91 | enwnenwnwwnwnwnweswnwnwnwnwnwswnwnwnene 92 | seseswswswseseswseseseswsesenwseswseswe 93 | newnenwseneeeneneswnenenenenenenwseenee 94 | eeswseeswsesenweeenwsewsee 95 | wnwnwenwnwwnwnwnwwnwnwwnwnwnwwnwnw 96 | nwnwnwnwnenwnwnwnwnwnwewnwnwsenw 97 | swswnwsweswswswswswswswswswseswswswsw 98 | swswwswswswwswswswswswwswwswswweesw 99 | swswswesweswnwswwsenwseswswewnwswswswne 100 | wwwnwwwwewwwwwwwwwwew 101 | wwnwwwwwnwwwwwnwwnwsewnenwnw 102 | nwnwnenwnwnwenwnwswesenwnwswseneneww 103 | newseseesewseweenesesweneewswe 104 | wenwwewswnwwnwnwwwnwenenwsw 105 | neeeeneneneeeenwneswswneswneenesw 106 | seeseseseseswseseeseneseseswnwnwsesewese 107 | eeeeweneeenweenenweeesesesesw 108 | eswnenwneeneenesenenwneseneenwswnenenew 109 | nenwnwwnwnwnwnwenwnwnwnwswnwneneneenw 110 | nwnwnwnwnwnenwnwneenenwnwnwwnenwnenenw 111 | eeeseeeeeeeseweeeewsee 112 | wnwwnwwnwwwwwwnwsenenwnwwwnwww 113 | eseseneesesewnwesweneneswsenweewsw 114 | nwnwnwenwnwwnwnwnwswnweenwnwnwnwnwnww 115 | nenenenwswnenwnenenenwneenenenesenenenene 116 | neeswnwnenenenenenenwneneneneneneeneswne 117 | swseenenwneeneeeeseneenwnenenenee 118 | neswnwnenenenenwnwnwseewnwnenwnwnenene 119 | senwseswsweseseseseswsesenwnwseseneseenw 120 | eneeneneeneswswewneneeswneenwnenw 121 | neenwwneswswsesenesewwsesesesenwwe 122 | seseneseewseseeesewseseseswnwsesene 123 | sesenesesesesesewswseeeseseseeesese 124 | wnenenwnenesenenenenenwneneewnenwsesenw 125 | sesesesesesesenwseseneseseseseseswseswsese 126 | sweswneswswswswswswswswswswswswwswwswsw 127 | nwsweswnwnweseneswsesenewnenwswneenew 128 | neeneneenesweeseenenenewneesweeene 129 | neneeenewwseewneseeeseneenwee 130 | seseseseseeeeeeeseweeseseese 131 | enwswneeeneeseneeneeweeeeenesew 132 | eswswswswswswwnwseseswseeswnwseswswsw 133 | nwewswswwswswswnesewseswswnesweswsee 134 | nwnwenwnwwsenwnwnwnenwnenenwnenwnwnwnwsw 135 | eneneneneneneenenewneneneeneneneene 136 | nwnwnenwnenenwnenwsenwnwnwnwnenenewnwswnenw 137 | wwwnwwswnenewswwseswwwnenewsew 138 | ewwswneenenenwswwnwewenenenewese 139 | nwenwnwnwneseseswnwnwnwswswwneswnwnenwne 140 | nenwenwsenwnwneswnwswnenenwnewnwnwenwnw 141 | wnwnwenwnwwnwnweneswnwnwnwswnwnwnwnwnw 142 | eneeswneenewneenenenewsenwnenee 143 | enwnwnwnwnwnesenwnewnwne 144 | nwwnwwnwnweenwsenenwwwsenwwwswne 145 | wwwnwsweewneswweeswweswsewnw 146 | swseeswwneswseswwswseneswnwswswswwswswsw 147 | enewenweswsesesesewswneeenwwwse 148 | senwnenwnwnwnwnwnwnwnwnwnwnwnwnwnwwnwnw 149 | wsewnenesenwenwswnwnenwswnwnwnwwenwe 150 | wnwwnewwnewwnwnwsewnwnwsweswww 151 | seswswseseseeswnwnwsenweeswnwseswsesese 152 | nwnwwnwneseweenenwnwnenwswneeswseswne 153 | swnwnwswswswswswswswseswseeseseswswsese 154 | nenwnenenwsenenenewnwnwnwnwnenenesenenw 155 | swnwwwwesewweewnwwesenwnwnwnw 156 | swwswseneswwneswsenenenwswneseswswsenenesw 157 | nenenenenenwenesenenenenewnenwnwnenenwne 158 | swnwwswwwswswwswwswwwwseeswsww 159 | eseseseeseseseweseseseseseweee 160 | swsweswswswseswweswnenwswenwwswswne 161 | nwnwnwnwnwnwnesenwnwnwnenenwnenenwnwnene 162 | neswwwwwnewwewseweswwwswww 163 | seseswseneseeseswnwseswseswseswseseswse 164 | sweeeeeweseeeeenwenw 165 | swnwnweewwnwsenwsenwwnewswnenwnwsw 166 | eweeeneenwwseneneswnesewnwseesenwne 167 | swswswswnewwwswswsewwwnwwswweswsw 168 | nwnesenenwewsenwwneseseneswnenenesenw 169 | ewnwenenwseseeneweeesewsw 170 | eeeenwenenweeenweseeneseeseee 171 | esenwseesesesesesweee 172 | sesesenwseswnwswsenwseseenesewsewnwnw 173 | wnwwwwwwnwswwwwewwwwwwww 174 | nwnwsenwnwnwnewnwnwnwnwnwnwwenwnwnwnw 175 | wsewwswwneswwswswwnewswswwwnese 176 | nwnwnwnenenenwnwnwenwwnenwnwnwnwnenenw 177 | nwnwnwnwewnwwnwnwwnwnwwnwnwnwenwnw 178 | wswwswswsewnwswwswsewwwswwswnew 179 | eeewseeeeseneeweeeeeeee 180 | nenenenenenenenenenenenenenenenenenenesw 181 | nwnwnwnwenwnwnwnwneswnwnwnwseenwswwnw 182 | senenwswnenenenwnenewnesene 183 | seswseseeneseneseseeseseseeseseswese 184 | nenwswnwnwsenenwsenwnwsenwnwneswnwwnwenwnw 185 | eeweseneseseseseseeeseeese 186 | swewnwwswwswswwwwwwnwwsewww 187 | swneneneneneeswwnewswseneswneneenenenene 188 | eenwneeneneeseswseneenwnenenenene 189 | sewswsweswseswseenwsenenesese 190 | seswseseswseseseseseseswseseseswseseenw 191 | sweeeeeeeneeseeeseseeee 192 | seweneeswnwneeeeneneenewnesenwne 193 | swwswewwnwnwwnwwewwwwwwnwnwwnw 194 | neneneneneneneswneneneneneneneeneneswnene 195 | wwwnweesenwnewnwswnwnwnwwnwnwnwww 196 | wswnwnwnenwweswewwswswwsewswwsw 197 | sewseseseeeeneseeeeeeeeesee 198 | senenewneseenwneneneneeswnenenwnewnene 199 | neneneeeseneenwneneenwneseneswneeeww 200 | swswswswswswswswswwswswswswsweswswsesw 201 | neswwwswwswwwwewswswewsewswwnw 202 | neneneesweeneneneneneewnenenwnenenene 203 | eswswnenenewneseneneeswnewneesenenene 204 | nwnwnwnwnwnwnwwnwwwnwnwnwswnwwswenwne 205 | seeseesenwswnwesweseneneeeseeeee 206 | eeeeneneneneeneneewneeeseene 207 | seswwswswswswsweswwnwsweswswswswnenw 208 | wwwwneseswwwnwswsewswwswwwswsww 209 | wswnwswswswsesewwwwwswwswwneww 210 | wseswswewswswswswseswewswseswswesw 211 | swnweswwwwswswswswwswww 212 | wswwswwswwswswwnewwsenwwwwswew 213 | neseneenewswwesweneseese 214 | wwwsenwswsewnwnwesweenwwswwnwww 215 | wswnewswsewnwswwswswnewswswswswswwsew 216 | swwswwneseswswswww 217 | neneswnweseenwswneenenweeeeneenee 218 | eenenenwseewseesewswseeeeseeew 219 | enewnwwnwwnwwseneswwwwswnwwsenwnwne 220 | eweseewseeseneneseeseeseenwwsese 221 | neswwswenwwwwwnesewswneswwswsesw 222 | nwnenwnwnenwnwnwnwnwnwnwnwswenenwnenwnw 223 | swnenwnwnenwnenenwnwnwnwnwnwneewsenwnenwne 224 | nwneenwnwnenwnwnwnenwnenwnwnwnewnw 225 | swswseswswswswswswswnwseswswswneswsenwsesw 226 | nwnwnwnenwnenenwnwnwnwnenwswnenwnwnwnenw 227 | nwwnenwnwnwnenwnwsenwnwnwnenenwnwnenwne 228 | neeseewwswseenenw 229 | swwseswswswneseswswswesesenwswneswsesw 230 | newnwwwnwnwwwnwsenwwnwwwesenwnwnw 231 | eswseseswwswseneswsesesesesesenwsesesese 232 | eeeeeeeeeeenweeeeseeee 233 | eesenesewseseeseeeseseeeeseesese 234 | wnwnwnwnwnwenwswnwwnwnwnwnwwwswnwnwnew 235 | nenenwnwnwwesesenwwswnwnewswswswenw 236 | eeseeenwnwswswewnwsweneeenwsenee 237 | eseenwsesweseweeseeseseeswsesene 238 | sesewseneseswsesesesesesesese 239 | nwnenwnwnwnenwswnwenwnewnwnenenwswneene 240 | wwwwwswwwnwwwwwewwwwwww 241 | eseesewseeeseseseeseesesesenesesee 242 | swswewwewwewsw 243 | swseswnwswseeswseswswswswswswswseseswswse 244 | wnwnwwwewwwwwwwswnwnwsenenwww 245 | swswswswswswswseseneswswswswswswswswsww 246 | wenwwewwwswsweswswsenwwswwneew 247 | nwnwneeneswneneneewneswnwneneswnwswnw 248 | wsewswnwnwnwwenwnwnwnwnwnwnwewnwnesw 249 | swswswswswneseswswswswnenwse 250 | eswnenenwseswseseswseseseswseswneseswnw 251 | enenwnwsenwnwnwwneswnenwnwnwnwnwnwenw 252 | sewsesenesewewseseseseseneweseseewse 253 | sesewseswseseswseseseseseswswswseswsenese 254 | neesenenenwneneenenesewneeneeewnw 255 | senenenesenenewwneneenwneneneeenenene 256 | wwwwwnwwwwwnewsewwwwwww 257 | swseswwswswswnwswneene 258 | sesesesesenenwsewseswnesenwwsenenwsewne 259 | nwwwwwwewwww 260 | neneeneeeeswnenenesenwneeneneenenew 261 | eweeeeeeeseneeeeeeewee 262 | newnwnenwnwwwwwswwswwwnwwnwwwnw 263 | nenwnwenwnenwnenenwnenenwnwsenwnwnenew 264 | wswseenenwnwwneswnenwwnenenenenenee 265 | swswnwsweseseswswswseseswswswseswswseenw 266 | seseswswnwseseswwnwsweseseseseseeseswe 267 | nwnwnwwwnwwnwwwnewwwnwsesewnwwnw 268 | swswseweeswswswsewswswnwwwnwenenwsww 269 | eswswesesesesenweseseseseneneseewsenese 270 | wnwenwwwwnewwwwnwnwwwwsw 271 | seeeenwswwsenwsesenwswneswswwwswe 272 | nenesewwwswswswnwswswnewswsw 273 | neseneseswseeseseewswwsewswsenwswswsw 274 | eeseeeseweeneeeeeeeeesesee 275 | sesweenenenweeseeswesweseeeneww 276 | nwnwnenwnenwwswswnwwwse 277 | nenenwswneneesewenenwesenwnenenesene 278 | eesewnwseeneeeeeneseesewwnwe 279 | swenesesenesenenewwnwnenenenesw 280 | swswswswswswswswnwswswswswswswsweswswswsw 281 | eseneswseseseseseseswswsesenw 282 | swsweswswsesenwswswnewswswswswswswnwswsw 283 | wwwneswwswwwneswwsewwswwwwsw 284 | nwnwnwwnwnwnwwnwnwnwnwnwnwenwnwnwwnw 285 | wswwswwwewswswswneswswwwswwwwsw 286 | nenwnenwneenwnenwnenwnwswwnenenwnwnenwnw 287 | seeseseeseeseseweeewnenesw 288 | senwnwnwnwnwnwnenwnwnwnwnwnwnwwwnwsenw 289 | enenesenenwwesewee 290 | swnwswnwneseenenenwswnwnewnenwwnwneesene 291 | swswswseswswswswswswswswswseswswwseesw 292 | swwswnwwwwwwswwewe 293 | wswenewnesesenwswseswseeneneenenwnenwe 294 | wwnwswswewswewww 295 | seseesesesesewsenwseneseseeseseeeww 296 | swseswswswswswseswswseswseswsenwseswswse 297 | wnwwwwwsenwnwweswnwnwsenwewwsw 298 | nenwnwewswnenenenenwnwswnwnwnenenenenwnw 299 | wnwwnwnwnwenwseswnwswenwwwnwwnww 300 | neenwnwswnwneneneenenenwsewneswnwnenwnw 301 | wwswswwwwwwwswwwwnewswnewww 302 | wsenwswsweswewneenweswsenwneneese 303 | swseswnwseseswseseswseswswswseseswseenwse 304 | seswswseneswsesesweseseswseswneswnwwswsese 305 | nenwenwwnwneswnwenwnwnw 306 | neswewnwnwswneenwsenwswnwnenenwnwenenw 307 | eswswnwnwnenwwnwnwswnwnwwnenwnwnwsenw 308 | nwnwnenenwnwnenwswnwnwnwnwnwnenwnwnw 309 | wwwswwwswwwwweneeeswwwwne 310 | eeeenenwneneneneeneeswneeneweee 311 | nwnwnwnwsenwswnwnwnwnwnenwnwnwnwnwnenwnww 312 | swsesesesesesesesesewesesewseseseseseswne 313 | seseeeseeeweeeeeesesewsesee 314 | seswneseswneswsenwenewwsenwsenweswswene 315 | swswswswswswswswswswswswsweeswnwsesww 316 | swwswswswswneswswwswswswwswwwsw 317 | swnwseswswswswswwswswwswswswswswswswsw 318 | nwnenwnenenwswneneneneswnwneenenwnwnenwnene 319 | nwnwwnwnwwsenenwnwnwnwnwwnwwsenwsenw 320 | seseeesesesesesesesenewseeewsewse 321 | swswswenwneneeeenwneenwnwsenene 322 | seseswsewesesesesewseswsenweenwsese 323 | eweeeeesweeenweeeeseee 324 | eseswseswsenwswseswseswswswsw 325 | ewnwwnewnwwnewnwswswnwsenwwnwwwwe 326 | esesenweseseseseswseseseneseseesesenwse 327 | wsweswswwweswwwswswswwwewwswnw 328 | nwnenwnwnwneenenenwnwwnwnwnwnenwwene 329 | seewsweesenwnwwsee 330 | swneswwwswnwenwewswnenwwswseewswswe 331 | eeeeeeeeeeeeseeenwee 332 | sesweeeeseenwenw 333 | wswswswwswwnewseenwswnewswswswswwsw 334 | seswseswneswnwnenwse 335 | senenwswswsenwswseswsenwneeseseswseswse 336 | nwswswswseswneswswseswseseseeswsenesesw 337 | weweswwwswnwwwseswwwnewwnwwsw 338 | neeneeneswneeeeeeneneeneenweene 339 | nwnesenesenwseesewseseseseswesenwew 340 | sesesesesenwnweswweseeeswseneeese 341 | wnwwwewswwwwswewwswwwwnwwww 342 | wswwwswswewwnwwswswswwwswwswww 343 | eeeeeseseeeeneeweeseeenwee 344 | seeeeseeeseeeeeeesesesenwee 345 | seesesenwwswseseneseseswseseseseseseswsese 346 | newwwwswwswwwswwswweswswswsww 347 | nenwnwswnwnwnwnenwnwnwnenenenenwnwnenenw 348 | wwsewwsenwwnenewwnewsenww 349 | swswswswswswswswseseswneseswswswswseswenwnw 350 | seesenwnenewseseswswswwnwseseesesesese 351 | enweseneeneeseeneeeseeweewwee 352 | eeweeeeeeesesenewnwseseesesese 353 | wswsenesesenesesewseenwswswnenwswnwenenw 354 | eswseswesesenwewswwnewnenweswsese 355 | nenwnwneswnwnwnwnenenwnenenwnwnwnwswnwne 356 | nwnenesenenwwneewnwnwnwwnwnwnwnwsenw 357 | seswseswswseseswswneswswswswswswswswsw 358 | nenwneneenenenwswnenwneswneenwneswnenenene 359 | seswswseseswseseswseseneswswseswswseswse 360 | swswseswnenwswswseswswswswseswseswswswswsw 361 | wswwswswwneswswwsweswswswwswsw 362 | nenenesenenwnesenesenenewnwnenwnwnwswsenw 363 | wneenenwnenesesenewnwswnwenwneswnene 364 | sewenwwwwwwseenwnwnwwwnwswwnwne 365 | ewwneeneneeseeesewneneewnewne 366 | nenenesenesenwwneneswnwnweneswswsenwne 367 | weseeeeseeeneneweseseswsewwnw 368 | nwwwswwswsesewswnwswswswwnweswswe 369 | weswwwewwnwwswwwnwseewwwnw 370 | seswswseswseeseswswnwsewseswswnewswswe 371 | sesenwswesenwswseseseseseswswswswswswswsw 372 | wnwnwesewsesewwswnwnwwewnewwnee 373 | seseeseswwswswseswsw 374 | swwnwenwseneswwneenwnewnwnesewswnesee 375 | nwwnwnwnwsenwnwnewnwnwnw 376 | esesewneseeeeeeesee 377 | senwnesewnwnwnenwwswnwwnenesenwnwsww 378 | seswsewswswesewseseseseseneswswsesesw 379 | neseseswwenewswswswnwswsewsesesenesw 380 | senesenwnwswsesewseseswswseseseseswsee 381 | enenenenewneeeneneneneenenenesenenene 382 | wwwwnwnwnwwnwnwnwewwwnw 383 | wnwenwnwnwnwswnwsenwseswwenweenwnwsw 384 | nwnwnwnwenwnwnwnenewnwnwnenwnwnwnwnwnw 385 | seseseenwswnwswswswswseseswneneseswswwsw 386 | neeenwnenwwwnewnenenwnwnesenenenenw 387 | swsenwwnwseneesweswseneneeeneenwwswse 388 | eeeeeseneneeeneneneneeneweesenwe 389 | ewseeswneewenenweeeweneneeeene 390 | swswswswswseneswwswswseswseseseswseswsee 391 | eeeseseseseseseesenwseeeseseseswsese 392 | nwnenenenenewnenwnenenwneswseenenenenenenw 393 | swsesweseswswsenwswseseswswseseswswnwse 394 | senenenewenenenenenenenewnenenesene 395 | nesewseneswwsweseswneseseseswnesese 396 | nwnwnwnwnwwsenwesenwnwnwnwnwnwnwsenwnwnw 397 | nenwnwwnwnwnwnwnenwnwneenenenenenene 398 | wswwsenwwswswwewnww 399 | wwwnewwswwwwwwsewwwwwswww 400 | wswseseneswewseneswswnwswswsenesenwswe 401 | wnwnwenwwnwnwwswswwwnwnwwsweenwnwnw 402 | wswweswwwswnwswswwwwseewswswwnw 403 | swswwwwnwswsweswwswwswswswswswwsww 404 | neseneneeweneneeneneneneneneneeswnenw 405 | nwswswswswswswswswswsesw 406 | nwnwnenwnwnwswnwnwesenwnwnwnwswnwnwswnenw 407 | neswwswseswseneswswseswswswswswswseswswse 408 | swseswsweswswseseswseseswswswswswswnwsw 409 | swsweswesweneeneswneenwneneneneene 410 | seseseseseswsenwseseseseswsese 411 | swwswwewwnewwneswwswwwnewww 412 | neneeeneneeseenenweeee 413 | enwwwswnwnwnewswswwnwwweeseww 414 | nwneeenenenenesenweseeneeweneswsw 415 | nenenewneneneneneneneeenenenenenenene 416 | seeseseseseneseeeseswenwnweseswnwseee 417 | swneswseswseswsesenewsesenesewenesw 418 | nwnwwwwwnwwewwnwwwwwwsenwnw 419 | swswswwsewswswwswnwwsweswnwswwwww 420 | seswseseswseswneseseenwseswwsw 421 | newnewesewwswsewnw 422 | weseesesewneseseseesenesesesesesewse 423 | eeeeseeeeeneeeenenewe 424 | wswwseswseneswswswswnesweseswnwswswswe 425 | eweeseeeeeeneneeeseeseeseswese 426 | nweenwwnwnwwnwenwnwnwnwwwswwswnwse 427 | wwwnenwnwswwnwwwwwnwnwnwwnwwnenwse 428 | enenenenenewnwnesweseewenenesenee 429 | esewswnwenwwnwnwnwnwnwnwswnwwwwse 430 | eeweneswenenweswnesweneneeneee 431 | wseneeseeesewnwswswnenesewneswee 432 | swneeenenenenenwnenenenenenenenewnesene 433 | nwswswswwswseswswswswnwswswsewwswswsw 434 | neenwnwnwnenwnwnwnwnwnwnenwnww 435 | eeeswenweeeseeeeeseseeeee 436 | swseswswswseseswseswneseseswswswsese 437 | nenwnenenwnwnenenenwswnenwnenwnewnwenene 438 | nwnwseseseswswseswswseswsweswswswseseseswse 439 | swnewwwwswwwwsww 440 | seseseswsweswswswswseswseseswseswswsww 441 | nwnenewnenwnwnenwnwnenenenenenesenenenwnw 442 | nwenwnenwnwsenenesenwnwswnesenwneew 443 | swwswwseswswswswwenenenwsene 444 | swswsweseseseseswseswswseswnwswnwseswsenw 445 | wsesenewnewnwwwnwsewnwsewwwnwww 446 | sewswnenesewswenwsenwswneseeneseswsw 447 | swwnwswnwwnwsenwnwwwnwwenenwwnwew 448 | seseseeseswneeseseswesesesesenwswwne 449 | neneeeesenenwnenweeneswneeweseeene 450 | swwswswswsewwwswwnenweweewsewnwsw 451 | seeswseswseseseswseseseseseseswwswnese 452 | esweseseseseseeseseseeeseseseeseenw 453 | wswwswwswswswnwswswswswew 454 | nwnwnwnwnwnwnwnwnweenwwnwnenwsenwnwswnw 455 | eeenwnenewneeeneeeneeeeswneneee 456 | nwwnwwnesesweswswswwseseneeswsweewsw 457 | neweneneeneneneweneneesenenenenenene 458 | nwwnweswnwnwswewnwewenwewwwnw 459 | seswsesesenwwseswneseseseeseseswse 460 | wnwwwnwwwwnwwwewwwwwwww 461 | enwseseseseswswsesesesesesesesesesesesesw 462 | wnwnwwnwnwewnwwwnwwnwwwswnw 463 | eseswseenwneenewnwnwesewnweswswsw 464 | neseswwswwwswswneeswwnweswseswnwesw 465 | seeseseseeenweseeseseeseeswseeese 466 | nwseeseseweseseseeseseeesewnwsesese 467 | swswswseswnwseseswswnwnwsweswseseswswsesw 468 | wweenwswwnwwwwnwnwnwwnwswnwwne 469 | senwwwnewwwwwwswwnwwnwsewwese 470 | swswswswswswswswwswneswswswswseswswswsw 471 | wswswswswswwswwwsweewwswswswswswsw 472 | neneneneeewseneneneneneeneneneeswne 473 | swswneswnwswswswswseswnwswswswwswesese 474 | swwwwwwswsewwwwwenewwwww 475 | nwswwwnwswnewsenwesenwenwnwnwesene 476 | nenewwwnenwweswswwwseswswswwew 477 | seneseseseswswseseswsesesew 478 | swsenwweswwwnewnwnwenwseswsenwswesene 479 | nwnwnwnwnwnenenwnwnwnwnwnenwnenwnwnwnwse 480 | swswswnwswswseswswsweswsweseswswswsewsw 481 | wwswseseseseswweswseeswseswneswswse 482 | sweseswswsesewseseseswsenwneswnesesesese 483 | nenenwnwnwnesenenwnwnenwnweswnenwnwnene 484 | eseneesesenesewsw 485 | seseseseswswsesesesesesewnwseseswswsenwne 486 | sweenenenweeneenene 487 | swwesweneenweeeeese 488 | wseseswseeseseswseneseswnwswseswwswseswse 489 | nwseseeseseeseeseeeenwewwewe 490 | wswswwseswswwswswswswwwwswnenwwsewsw 491 | seswswnwswseswswswswneswnewsweswnwnwse 492 | seswseseseswseseswsenwswsesesesesesesesw 493 | nwsenenwseenwnenenwneswnwnwnww 494 | nenwwwnwnwwwsewwwnwwnwwnwnwswnwne 495 | eeeenesweenenweeene 496 | eseweswseeesesesesenwwnenwsweeeese 497 | ewwwwwwwsewwwwwwnwnwnwnwww 498 | seswseseswseesesesesesewneswseseswswsw 499 | wwwwwwnwwwwwewwwwswwweww 500 | newnewsewswsewenwnwwswneswewesw 501 | eneswneswsweeenwswnwswnwnwswswswsw 502 | sesenweseeseeeeeeee 503 | swswenwnwnwwenwwswsewneewseeswsesw 504 | wneswwwnewwneswwseswwswswwwnew 505 | swwwswwsewseseneswnwneswwwwnwww 506 | eswnwswnwneenwneneseneseswneneneenenenw 507 | senewnwnwsweneswseeneseeewewswneswe 508 | swnwseseenewnenwnewne 509 | neneneneseeneeneneewneneneee 510 | nwnwnwwnwnwwwwnwnwwnwnwwnwwsenww 511 | swwneeneswswseswwsweneswwsenwswswswsw 512 | neneswnwnenewenwnenenwsenwnenenwnwnw 513 | seeeseseeeseeeesewsesee 514 | wsewswwsewwswnesewwnwwwenenenwnw 515 | esenweseeeseeeeseeeseeesweenw 516 | enweeseseenwsesenweseseswnwse 517 | eewneewwneeneeneneneseneneenene 518 | sesesenwneswwswswneseseseswswswseseswsene 519 | weesenewnwswswswnweswswseswsww 520 | seseseeseswseeseseseseseseswsenenwseese 521 | nwwewswwsenwnwsenwnenwnwnwenenwsenesw 522 | seeeeswenweseeeswneswswenwswnwwne 523 | swswsenwseenwsenwnenesewnwwene 524 | eeeeeenweeeeeneseseeeewsese 525 | nwenwwnwnwnwwnwswwwnwwnwwnwnwwwe 526 | nwsenenesenwneeneswnwwnwneseewsewse 527 | swwsenwnenwnwnwsenewsenwsenenwewnenese 528 | wwwwewwnwwwwwwww 529 | neneneneneeneenwneneeneneneeneswnene 530 | senesesesesesesenesesesesesesesesewsesw 531 | enwwswwnewswenewsewsenew 532 | nenesenwwseneneseneneneswnenenenewwnenenw 533 | eeeeeeeesweeeeeseeeeneenw 534 | nwnwwnewesewswsweewwwswneesene 535 | seseeseseeeseewseseeseseseneseee 536 | swenwnenwnwsesewswswnwnwenwnwnwnwene 537 | weswnwswswseseeeswneeeswenweenene 538 | swseswseswsenwseseseseswswswseswsesesw 539 | eseneeswnwswwneseene 540 | swswnwswswswswnwwwswnesesewswwsesw 541 | eeweewsenweeeeeesenwsee 542 | seneseswswweswswsesewseesw 543 | weeeeseeseseeeeseeeseseseee 544 | nwsenwswnwnwnwnwewnwwnwnwnwnwwnwwew 545 | enwnwswseseeneswseswswnwseswswsese 546 | neswnwnenenwnenwnenenenenwnenenenenenenw 547 | wswswswswnwswswswswswswsweswswswswwwsw 548 | eeeneneeeeeneeesweweeeene 549 | eneswnwneweneesw 550 | wwwesewswswwwswwnwwwwwswwsw 551 | nwnwnwswnenwnwnenwnenenesenwnwnwnwnwnwnw 552 | eeseeweswseeeeeeeseesenesenw 553 | eweeeneneeeneeseeeeneeeneene 554 | neseseseneseesenwsewsenwseseseseswsesesw 555 | swswenwnewnwwwsenwweewsenwweww 556 | neswswswswswswwswswswnwswswswswsweneswswsw -------------------------------------------------------------------------------- /25.py: -------------------------------------------------------------------------------- 1 | import fileinput 2 | 3 | def loops(key): 4 | i = 0 5 | x = 1 6 | while True: 7 | i += 1 8 | x = (x * 7) % 20201227 9 | if x == key: 10 | return i 11 | 12 | def transform(number, iterations): 13 | x = 1 14 | for i in range(iterations): 15 | x = (x * number) % 20201227 16 | return x 17 | 18 | keys = list(map(int, fileinput.input())) 19 | print(transform(keys[1], loops(keys[0]))) 20 | -------------------------------------------------------------------------------- /25.txt: -------------------------------------------------------------------------------- 1 | 1614360 2 | 7734663 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Advent of Code 2020 2 | 3 | My solutions for [Advent of Code 2020](https://adventofcode.com/). 4 | 5 | > Advent of Code is an Advent calendar of small programming puzzles for a variety of skill sets and skill levels that can be solved in any programming language you like. People use them as a speed contest, interview prep, company training, university coursework, practice problems, or to challenge each other. 6 | 7 | ### Python 8 | 9 | To run the Python solutions, provide the file input as a command line argument. 10 | 11 | python 01.py 01.txt 12 | 13 | ### Go 14 | 15 | To run the Go solutions, redirect the file input to stdin. 16 | 17 | go run 01.go < 01.txt 18 | --------------------------------------------------------------------------------