-
Notifications
You must be signed in to change notification settings - Fork 0
/
Day10.jl
200 lines (190 loc) · 5.28 KB
/
Day10.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
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
#%% Load and read Data
File = open("Day10.txt","r")
Data = read(File, String)
close(File)
Lines = split(Data, "\r\n")
Lines = deleteat!(Lines, findall(x->x == "", Lines))
#%% Part 1
StartCoord = (0,0)
nlines = length(Lines)
ncols = length(Lines[1])
flag = false
for i in 1:nlines
if flag == true
break
end
for j in 1:nlines
if Lines[i][j] == 'S'
StartCoord = (i, j)
flag = true
break
end
end
end
StartCoord = (59, 52)
Steps = Dict()
Steps[0] = StartCoord
FirstStep = (0, 0)
LastStep = (0,0)
(x, y) = StartCoord
if Lines[x-1][y] in "F|7"
FirstStep = (x-1, y)
if Lines[x+1][y] in "J|L"
LastStep = (x+1, y)
elseif Lines[x][y-1] in "F-L"
LastStep = (x, y-1)
elseif Lines[x][y+1] in "J-7"
LastStep = (x, y+1)
end
elseif Lines[x+1][y] in "J|L"
FirstStep = (x+1, y)
if Lines[x-1][y] in "F|7"
LastStep = (x-1, y)
elseif Lines[x][y-1] in "F-L"
LastStep = (x, y-1)
elseif Lines[x][y+1] in "J-7"
LastStep = (x, y+1)
end
elseif Lines[x][y-1] in "F-L"
FirstStep = (x, y-1)
if Lines[x-1][y] in "F|7"
LastStep = (x-1, y)
elseif Lines[x+1][y] in "J|L"
LastStep = (x+1, y)
elseif Lines[x][y+1] in "J-7"
LastStep = (x, y+1)
end
elseif Lines[x][y+1] in "J-7"
FirstStep = (x, y+1)
if Lines[x-1][y] in "F|7"
LastStep = (x-1, y)
elseif Lines[x+1][y] in "J|L"
LastStep = (x+1, y)
elseif Lines[x][y-1] in "F-L"
LastStep = (x, y-1)
end
end
Nmax = nlines*ncols
Steps[1] = FirstStep
Steps[Nmax+1] = LastStep
function NextStep(start, prec)
(x, y) = start
CurrendSymb = string(Lines[x][y])
(a, b) = prec
if x-1 == a #arrivo da nord
if CurrendSymb == "J" #vado ad ovest
FirstStep = (x, y-1)
elseif CurrendSymb == "L" #vado ad est
FirstStep = (x, y+1)
elseif CurrendSymb == "|" #vado a sud
FirstStep = (x+1, y)
end
elseif x+1 == a #arrivo da sud
if CurrendSymb == "F" #vado ad est
FirstStep = (x, y+1)
elseif CurrendSymb == "7" #vado ad ovest
FirstStep = (x, y-1)
elseif CurrendSymb == "|" #vado a nord
FirstStep = (x-1, y)
end
elseif y-1 == b #vengo da ovest
if CurrendSymb == "J" #vado a nord
FirstStep = (x-1, y)
elseif CurrendSymb == "-" #vado ad est
FirstStep = (x, y+1)
elseif CurrendSymb == "7" #vado a sud
FirstStep = (x+1, y)
end
elseif y+1 == b #vengo da est
if CurrendSymb == "-" #vado ad ovest
FirstStep = (x, y-1)
elseif CurrendSymb == "L" #vado a nord
FirstStep = (x-1, y)
elseif CurrendSymb == "F" #vado a sud
FirstStep = (x+1, y)
end
else
println("Attenzione, qualcosa è andato storto nel punto ($x, $y)")
FirstStep = false
end
return FirstStep
end
newStep = FirstStep
lastnewStep = StartCoord
behindStep = LastStep
lastbehindStep = StartCoord
lenAvanti = 2
lenIndietro = 2
while newStep != behindStep
global newStep, lastnewStep
global behindStep, lastbehindStep
global lenAvanti, lenIndietro
#println(newStep, " ", lastnewStep)
#println(behindStep, " ", lastbehindStep)
newStep2 = NextStep(newStep, lastnewStep)
lastnewStep = newStep
newStep = newStep2
Steps[lenAvanti] = newStep
lenAvanti += 1
if newStep == behindStep
break
else
#println("nel ciclo if:", behindStep, " ", lastbehindStep)
behindStep2 = NextStep(behindStep, lastbehindStep)
lastbehindStep = behindStep
behindStep = behindStep2
Steps[Nmax+lenIndietro] = behindStep
lenIndietro += 1
end
end
lenAvanti += -1
lenIndietro += -1
println("Per andare da S al punto più lontano, che ha coordinate $newStep, ci vogliono
$lenAvanti passi in avanti e $lenIndietro passi all'indietro")
#%% Part 2
Circ = []
for k in values(Steps)
(i, j) = k
global Circ
Circ = append!(Circ, [k])
end
InnerCount = 0
In = false
OpenLine = "0"
PrintData = ""
for i in 1:nlines
for j in 1:ncols
global InnerCount, In, Lines
if (i, j) in Circ
#println(i, " ", j)
Sym = string(Lines[i][j])
PrintData = PrintData*Sym
if (Sym == "F") || (Sym == "L")
OpenLine = Sym
elseif Sym == "7"
if OpenLine == "F"
continue
elseif OpenLine == "L"
In = !In
end
elseif Sym == "J"
if OpenLine == "L"
continue
elseif OpenLine == "F"
In = !In
end
elseif Sym == "|"
In = !In
end
elseif In
PrintData = PrintData*"1"
InnerCount += 1
else
PrintData = PrintData*"."
end
if j == ncols
PrintData = PrintData*"\n"
end
end
end
println("Il totale dei punti interni è $InnerCount")