-
Notifications
You must be signed in to change notification settings - Fork 0
/
22.jl
116 lines (113 loc) · 3.12 KB
/
22.jl
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
open("22.txt") do f
M = fill(' ', 200, 150)
for r ∈ 1:200
l = collect(readline(f))
M[r,eachindex(l)] = l
end
@assert readline(f) == ""
path = readline(f)
function next(r, c, dir)
dirs = [(0, 1), (1, 0), (0, -1), (-1, 0)]
dr, dc = dirs[dir]
nr, nc = r, c
while true
nr, nc = mod1(nr+dr,200), mod1(nc+dc,150)
M[nr, nc] != ' ' && return nr, nc, dir
end
end
function next2(r, c, dir)
dirs = [(0, 1), (1, 0), (0, -1), (-1, 0)]
if r∈1:50 && c==51 && dir==3
nr = 151-r
nc = 1
ndir = 1
elseif r∈101:150 && c==1 && dir==3
nr = 151-r
nc = 51
ndir = 1
elseif r==1 && c∈51:100 && dir==4
nr = 100+c
nc = 1
ndir = 1
elseif r∈151:200 && c==1 && dir==3
nr = 1
nc = r-100
ndir = 2
elseif r==1 && c∈101:150 && dir==4
nr = 200
nc = c-100
ndir = 4
elseif r==200 && c∈1:50 && dir==2
nr = 1
nc = c+100
ndir = 2
elseif r∈1:50 && c==150 && dir==1
nr = 151-r
nc = 100
ndir = 3
elseif r∈101:150 && c==100 && dir==1
nr = 151-r
nc = 150
ndir = 3
elseif r==50 && c∈101:150 && dir==2
nr = c-50
nc = 100
ndir = 3
elseif r∈51:100 && c==100 && dir==1
nr = 50
nc = r+50
ndir = 4
elseif r∈51:100 && c==51 && dir==3
nr = 101
nc = r-50
ndir = 2
elseif r==101 && c∈1:50 && dir==4
nr = c+50
nc = 51
ndir = 1
elseif r==150 && c∈51:100 && dir==2
nr = c+100
nc = 50
ndir = 3
elseif r∈151:200 && c==50 && dir==1
nr = 150
nc = r-100
ndir = 4
else
nr, nc = dirs[dir] .+ (r, c)
ndir = dir
end
return nr, nc, ndir
end
function password(path, flat)
r, c = (1, 51)
path = collect(path)
dir = 1
while !isempty(path)
if path[1]=='R'
dir = mod1(dir+1, 4)
popfirst!(path)
elseif path[1]=='L'
dir = mod1(dir-1, 4)
popfirst!(path)
else
n = ""
while !isempty(path) && isdigit(path[1])
n *= popfirst!(path)
end
n = parse(Int, n)
for _ ∈ 1:n
nr, nc, ndir = flat ? next(r, c, dir) : next2(r, c, dir)
if M[nr, nc]=='.'
r, c, dir = nr, nc, ndir
elseif M[nr, nc]=='#'
break
end
end
end
end
return 1000*r + 4*c + dir-1
end
println("Part 1: ", password(path, true))
println("Part 2: ", password(path, false))
end