Skip to content

Commit 56737cf

Browse files
authored
2023/03 (#27)
* 2023/03 * format
1 parent 1707bdd commit 56737cf

File tree

2 files changed

+89
-0
lines changed

2 files changed

+89
-0
lines changed

2023/03/leodev.v

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import os { read_lines }
2+
3+
fn main() {
4+
inputs := read_lines('schematic.input')!
5+
println(part1(inputs))
6+
println(part2(inputs))
7+
}
8+
9+
fn part1(inputs []string) int {
10+
mut sum := 0
11+
for x, input in inputs {
12+
mut number := 0
13+
mut found := false
14+
for y, letter in input {
15+
if letter >= `0` && letter <= `9` {
16+
number = number * 10 + letter - u8(`0`)
17+
if !found {
18+
for dx in -1 .. 2 {
19+
for dy in -1 .. 2 {
20+
if x + dx >= 0 && x + dx < inputs.len && y + dy >= 0
21+
&& y + dy < input.len {
22+
dl := inputs[x + dx][y + dy]
23+
if dl != `.` && (dl < `0` || dl > `9`) {
24+
found = true
25+
}
26+
}
27+
}
28+
}
29+
}
30+
} else {
31+
if found {
32+
sum += number
33+
}
34+
number = 0
35+
found = false
36+
}
37+
}
38+
if number > 0 && found {
39+
sum += number
40+
}
41+
}
42+
return sum
43+
}
44+
45+
fn part2(inputs []string) int {
46+
mut sum := 0
47+
for x, input in inputs {
48+
for y, letter in input {
49+
if letter != `*` {
50+
continue
51+
}
52+
mut numbers := []int{}
53+
for dx in -1 .. 2 {
54+
for dy in -1 .. 2 {
55+
if x + dx >= 0 && x + dx < inputs.len && y + dy >= 0 && y + dy < input.len {
56+
if number := try_read_number(inputs, x + dx, y + dy) {
57+
numbers << number
58+
if dy > -1 || (inputs[x + dx][y] >= `0` && inputs[x + dx][y] <= `9`) {
59+
break
60+
}
61+
}
62+
}
63+
}
64+
}
65+
if numbers.len >= 2 {
66+
sum += numbers[0] * numbers[1]
67+
}
68+
}
69+
}
70+
return sum
71+
}
72+
73+
fn try_read_number(inputs []string, x int, y int) ?int {
74+
if inputs[x][y] < `0` || inputs[x][y] > `9` {
75+
return none
76+
}
77+
mut my := y
78+
for my > 0 && inputs[x][my - 1] >= `0` && inputs[x][my - 1] <= `9` {
79+
my--
80+
}
81+
mut number := 0
82+
for my < inputs[x].len && inputs[x][my] >= `0` && inputs[x][my] <= `9` {
83+
number = number * 10 + inputs[x][my] - u8(`0`)
84+
my++
85+
}
86+
return number
87+
}

known_outputs/2023/03/leodev.out

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
4361
2+
467835

0 commit comments

Comments
 (0)