My Advent of Code solutions in Python. kevinyap.ca/2019/12/going-fast-in-advent-of-code/
advent-of-code python
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add 2017/21

+173
+63
2017/day21.py
··· 1 + import fileinput 2 + from utils import new_table 3 + 4 + 5 + def lit_pixels(grid): 6 + return sum(sum(c == '#' for c in row) for row in grid) 7 + 8 + 9 + GRID = [ 10 + ['.', '#', '.'], 11 + ['.', '.', '#'], 12 + ['#', '#', '#'], 13 + ] 14 + 15 + RULES = {} 16 + 17 + for line in fileinput.input(): 18 + rule_in, rule_out = line.split(' => ') 19 + 20 + # Build all rule rotations and reflections 21 + grid = [list(x) for x in rule_in.split('/')] 22 + n = 2 if rule_in.count('/') == 1 else 3 23 + 24 + for _ in range(4): 25 + norm = ''.join(''.join(p) for p in grid) 26 + refl = ''.join(''.join(p[::-1]) for p in grid) 27 + RULES[norm] = RULES[refl] = rule_out.replace('/', '') 28 + 29 + rotated = new_table(None, width=n, height=n) 30 + 31 + for y in range(n): 32 + for x in range(n): 33 + rotated[y][x] = grid[n - x - 1][y] 34 + 35 + grid = rotated 36 + 37 + for i in range(18): 38 + size = len(GRID[0]) 39 + d = 2 if size % 2 == 0 else 3 40 + 41 + new_size = (size // d) * (d + 1) 42 + new_grid = new_table(None, width=new_size, height=new_size) 43 + 44 + for y in range(size // d): 45 + for x in range(size // d): 46 + # Build the string representation of each 2x2 or 3x3 subgrid 47 + subgrid = '' 48 + 49 + for k in range(d): 50 + subgrid += ''.join(GRID[y*d + k][x*d:(x+1)*d]) 51 + 52 + # Lookup the corresponding rule and populate the new grid 53 + out = RULES[subgrid] 54 + for ny in range(d+1): 55 + for nx in range(d+1): 56 + new_grid[y*(d+1) + ny][x*(d+1) + nx] = out[ny*(d+1) + nx] 57 + 58 + GRID = new_grid 59 + 60 + if i == 4: 61 + print "Lit pixels after 5 iterations:", lit_pixels(GRID) 62 + 63 + print "Lit pixels after 18 iterations:", lit_pixels(GRID)
+108
2017/inputs/21.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 + ###/###/### => ##../.###/###./#..#
+2
2017/outputs/21.txt
··· 1 + 205 2 + 3389823