-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsolution.nim
120 lines (107 loc) · 2.35 KB
/
solution.nim
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
import std/[
algorithm,
bitops,
json,
math,
re,
sequtils,
sets,
strformat,
strutils,
tables,
sugar,
]
proc step(grid: var seq[seq[bool]]): seq[seq[bool]] =
let (rows, cols) = (grid.len, grid[0].len)
result = newSeqWith(rows, newSeq[bool](cols))
for r in 0 ..< rows:
for c in 0 ..< cols:
var s = 0
for dr in -1 .. 1:
for dc in -1 .. 1:
if (dr, dc) == (0, 0): continue
let (nr, nc) = (r + dr, c + dc)
if nr notin 0 ..< rows or nc notin 0 ..< cols: continue
if grid[nr][nc]: s += 1
if grid[r][c]:
result[r][c] = s in [2, 3]
else:
result[r][c] = s == 3
proc countOn(grid: var seq[seq[bool]]): int =
for row in grid:
result += row.countIt(it)
proc parse(input: string): seq[seq[bool]] =
for line in input.split("\n"):
result.add line.mapIt(it == '#')
proc `$`(grid: var seq[seq[bool]]): string =
grid.map(line => line.mapIt(if it: "#" else: ".").join & "\n").join
when defined(test):
var grid = parse("""
.#.#.#
...##.
#....#
..#...
#.#..#
####..
""".strip)
doAssert grid.countOn == 15
grid = grid.step
echo grid
doAssert grid.countOn == 11
grid = grid.step
echo grid
doAssert grid.countOn == 8
grid = grid.step
echo grid
doAssert grid.countOn == 4
grid = grid.step
echo grid
doAssert grid.countOn == 4
proc part1(input: string): int =
var grid = input.parse
for _ in 0 ..< 100:
grid = grid.step
grid.countOn
proc turnOnCorners(grid: var seq[seq[bool]]) =
grid[0][0] = true
grid[0][^1] = true
grid[^1][0] = true
grid[^1][^1] = true
proc step2(grid: var seq[seq[bool]]): seq[seq[bool]] =
result = grid.step
result.turnOnCorners
when defined(test):
grid = parse("""
##.#.#
...##.
#....#
..#...
#.#..#
####.#
""".strip)
doAssert grid.countOn == 17
grid = grid.step2
echo grid
doAssert grid.countOn == 18
grid = grid.step2
echo grid
doAssert grid.countOn == 18
grid = grid.step2
echo grid
doAssert grid.countOn == 18
grid = grid.step2
echo grid
doAssert grid.countOn == 14
grid = grid.step2
echo grid
doAssert grid.countOn == 17
proc part2(input: string): int =
var grid = input.parse
grid.turnOnCorners
for _ in 0 ..< 100:
grid = grid.step2
grid.countOn
when isMainModule and not defined(test):
let input = readAll(stdin).strip
echo part1(input)
echo part2(input)