Skip to content

Commit 1c5b290

Browse files
author
Leo Developer
authored
leodev, day 06 (vlang#61)
1 parent 0294e37 commit 1c5b290

5 files changed

Lines changed: 245 additions & 0 deletions

File tree

2024/06/.gitkeep

Whitespace-only changes.

2024/06/leodev.v

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
import os
2+
3+
const direction_vectors = [
4+
[-1, 0]!,
5+
[0, 1]!,
6+
[1, 0]!,
7+
[0, -1]!,
8+
]!
9+
10+
fn main() {
11+
lines := os.read_lines('map.input')!
12+
13+
size_y := lines.len
14+
size_x := lines[0].len
15+
16+
mut obstructed := []bool{len: size_y * size_x}
17+
18+
mut guard_y := 0
19+
mut guard_x := 0
20+
mut guard_direction := Direction.up
21+
22+
for y, line in lines {
23+
for x, ch in line {
24+
match ch {
25+
`^` {
26+
guard_y = y
27+
guard_x = x
28+
}
29+
`#` {
30+
obstructed[y * size_y + x] = true
31+
}
32+
else {}
33+
}
34+
}
35+
}
36+
37+
mut traverser := Traverser{
38+
obstructed: obstructed
39+
head: true
40+
size_y: size_y
41+
size_x: size_x
42+
traversed: []Direction{len: size_y * size_x, init: Direction.blank}
43+
guard_y: guard_y
44+
guard_x: guard_x
45+
guard_direction: guard_direction
46+
loops: []bool{len: size_y * size_x}
47+
}
48+
traverser.run()
49+
traverser.print()
50+
51+
travelled := traverser.traversed.count(it != .blank)
52+
println('part1: ${travelled}')
53+
obstructions := traverser.loops.count(it)
54+
println('part2: ${obstructions}')
55+
}
56+
57+
struct Traverser {
58+
head bool
59+
size_y int
60+
size_x int
61+
mut:
62+
obstructed []bool
63+
traversed []Direction
64+
guard_y int
65+
guard_x int
66+
guard_direction Direction
67+
loops []bool
68+
}
69+
70+
fn (mut t Traverser) run() bool {
71+
mut steps := 0
72+
for t.in_bounds(t.guard_y, t.guard_x) {
73+
if t.head {
74+
println('guard at (${t.guard_y}|${t.guard_x}); moving ${t.guard_direction}')
75+
}
76+
steps++
77+
if steps > t.size_y * t.size_x * 10 {
78+
return true
79+
}
80+
t.traversed[t.guard_y * t.size_y + t.guard_x] = t.guard_direction
81+
82+
next_y := t.guard_y + direction_vectors[t.guard_direction][0]
83+
next_x := t.guard_x + direction_vectors[t.guard_direction][1]
84+
85+
if t.in_bounds(next_y, next_x) && t.obstructed[next_y * t.size_y + next_x] {
86+
t.guard_direction = unsafe {
87+
Direction((int(t.guard_direction) + 1) % 4)
88+
}
89+
} else {
90+
if t.head && t.in_bounds(next_y, next_x)
91+
&& t.traversed[next_y * t.size_y + next_x] == .blank {
92+
mut cloned := t.clone()
93+
cloned.traversed[t.guard_y * t.size_y + t.guard_x] = .blank
94+
cloned.obstructed[next_y * t.size_y + next_x] = true
95+
if cloned.run() {
96+
println('obstruction at (${next_y}|${next_x}) worked')
97+
t.loops[next_y * t.size_y + next_x] = true
98+
// cloned.print()
99+
}
100+
}
101+
102+
t.guard_y = next_y
103+
t.guard_x = next_x
104+
}
105+
}
106+
107+
return false
108+
}
109+
110+
fn (t Traverser) in_bounds(y int, x int) bool {
111+
return y >= 0 && y < t.size_y && x >= 0 && x < t.size_x
112+
}
113+
114+
fn (t Traverser) print() {
115+
for y in 0 .. t.size_y {
116+
for x in 0 .. t.size_x {
117+
match t.traversed[y * t.size_y + x] {
118+
.up {
119+
print('^')
120+
}
121+
.right {
122+
print('>')
123+
}
124+
.down {
125+
print('v')
126+
}
127+
.left {
128+
print('<')
129+
}
130+
else {
131+
if t.obstructed[y * t.size_y + x] {
132+
print('#')
133+
} else {
134+
print('.')
135+
}
136+
}
137+
}
138+
}
139+
print('\n')
140+
}
141+
}
142+
143+
fn (t Traverser) clone() Traverser {
144+
return Traverser{
145+
head: false
146+
size_y: t.size_y
147+
size_x: t.size_x
148+
obstructed: t.obstructed.clone()
149+
traversed: t.traversed.clone()
150+
guard_y: t.guard_y
151+
guard_x: t.guard_x
152+
guard_direction: t.guard_direction
153+
}
154+
}
155+
156+
enum Direction {
157+
up
158+
right
159+
down
160+
left
161+
blank
162+
}

2024/06/map.input

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
....#.....
2+
.........#
3+
..........
4+
..#.......
5+
.......#..
6+
..........
7+
.#..^.....
8+
........#.
9+
#.........
10+
......#...

known/2024/06/.gitkeep

Whitespace-only changes.

known/2024/06/leodev.out

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
guard at (6|4); moving up
2+
guard at (5|4); moving up
3+
guard at (4|4); moving up
4+
guard at (3|4); moving up
5+
guard at (2|4); moving up
6+
guard at (1|4); moving up
7+
guard at (1|4); moving right
8+
guard at (1|5); moving right
9+
guard at (1|6); moving right
10+
guard at (1|7); moving right
11+
guard at (1|8); moving right
12+
guard at (1|8); moving down
13+
guard at (2|8); moving down
14+
guard at (3|8); moving down
15+
guard at (4|8); moving down
16+
guard at (5|8); moving down
17+
guard at (6|8); moving down
18+
guard at (6|8); moving left
19+
guard at (6|7); moving left
20+
guard at (6|6); moving left
21+
guard at (6|5); moving left
22+
guard at (6|4); moving left
23+
obstruction at (6|3) worked
24+
guard at (6|3); moving left
25+
guard at (6|2); moving left
26+
guard at (6|2); moving up
27+
guard at (5|2); moving up
28+
guard at (4|2); moving up
29+
guard at (4|2); moving right
30+
guard at (4|3); moving right
31+
guard at (4|4); moving right
32+
guard at (4|5); moving right
33+
guard at (4|6); moving right
34+
guard at (4|6); moving down
35+
guard at (5|6); moving down
36+
guard at (6|6); moving down
37+
obstruction at (7|6) worked
38+
guard at (7|6); moving down
39+
guard at (8|6); moving down
40+
guard at (8|6); moving left
41+
guard at (8|5); moving left
42+
guard at (8|4); moving left
43+
obstruction at (8|3) worked
44+
guard at (8|3); moving left
45+
guard at (8|2); moving left
46+
obstruction at (8|1) worked
47+
guard at (8|1); moving left
48+
guard at (8|1); moving up
49+
guard at (7|1); moving up
50+
guard at (7|1); moving right
51+
guard at (7|2); moving right
52+
guard at (7|3); moving right
53+
guard at (7|4); moving right
54+
guard at (7|5); moving right
55+
guard at (7|6); moving right
56+
obstruction at (7|7) worked
57+
guard at (7|7); moving right
58+
guard at (7|7); moving down
59+
guard at (8|7); moving down
60+
obstruction at (9|7) worked
61+
guard at (9|7); moving down
62+
....#.....
63+
....>>>>v#
64+
....^...v.
65+
..#.^...v.
66+
..>>>>v#v.
67+
..^.^.v.v.
68+
.#^<<<v<<.
69+
.>>>>>>v#.
70+
#^<<<<<v..
71+
......#v..
72+
part1: 41
73+
part2: 6

0 commit comments

Comments
 (0)