Skip to content

Commit eed148e

Browse files
committed
AoC 2025 Day 4 - bash - faster
1 parent d4bfc35 commit eed148e

File tree

1 file changed

+43
-47
lines changed

1 file changed

+43
-47
lines changed

src/main/bash/AoC2025_04.sh

Lines changed: 43 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -6,67 +6,63 @@
66
year=2025
77
day=04
88

9-
declare -a grid
10-
H=0
11-
W=0
9+
declare -A grid
1210

13-
find_removable() {
14-
local -a ans_removable=()
15-
for ((r = 0; r < H; r++)); do
16-
for ((c = 0; c < W; c++)); do
17-
if [ "${grid[r]:c:1}" = '@' ]; then
18-
local -i cnt=0
19-
for dr in {-1,0,1}; do
20-
for dc in {-1,0,1}; do
21-
local -i rr=$((r + dr))
22-
local -i cc=$((c + dc))
23-
((rr == r && cc == c)) && continue
24-
((rr < 0 || rr >= H)) && continue
25-
((cc < 0 || cc >= W)) && continue
26-
if [ "${grid[rr]:cc:1}" = '@' ]; then
27-
((cnt++))
28-
fi
29-
done
30-
done
31-
if [ "$cnt" -lt 4 ]; then
32-
ans_removable+=("$r:$c")
33-
fi
34-
fi
11+
read_grid() {
12+
local -i r=0
13+
while read -r row || [ -n "$row" ]; do
14+
for ((c = 0; c < ${#row}; c++)); do
15+
[ "${row:c:1}" = '@' ] && grid[$r:$c]='@'
16+
done
17+
((r++))
18+
done < "$1"
19+
}
20+
21+
is_removable() {
22+
local k="$1"
23+
local -i r="${k%%:*}"
24+
local -i c="${k:${#r}+1}"
25+
local -i cnt=0
26+
for dr in {-1,0,1}; do
27+
for dc in {-1,0,1}; do
28+
[ -n "${grid[$((r+dr)):$((c+dc))]}" ] && ((cnt++))
3529
done
3630
done
37-
for row in "${ans_removable[@]}"; do
38-
echo "$row"
39-
done
31+
((cnt < 5 )) && return 0 || return 1
4032
}
4133

4234
part1() {
43-
mapfile -t grid < "$@"
44-
H=${#grid[@]}
45-
W=${#grid[0]}
46-
mapfile -t removable < <(find_removable)
47-
echo "${#removable[@]}"
35+
_debug "part 1"
36+
read_grid "$1"
37+
_debug "${#grid[@]} rolls"
38+
local -i ans=0;
39+
for k in "${!grid[@]}"; do
40+
if is_removable "$k"; then
41+
((ans++))
42+
fi
43+
done
44+
echo "$ans"
45+
_debug "part 1 done"
4846
return 0
4947
}
5048

5149
part2() {
52-
mapfile -t grid < "$@"
53-
H=${#grid[@]}
54-
W=${#grid[0]}
50+
_debug "part 2"
51+
read_grid "$1"
5552
local -i ans=0
5653
while true; do
57-
mapfile -t removable < <(find_removable)
58-
((${#removable[@]} == 0)) && break
59-
((ans += ${#removable[@]}))
60-
_debug "${#removable[@]}"
61-
for rem in "${removable[@]}"; do
62-
IFS=':' read -ra rc <<< "$rem"
63-
r="${rc[0]}"
64-
c="${rc[1]}"
65-
row="${grid[r]:0:c}.${grid[r]:c+1}"
66-
grid[r]="$row"
54+
_debug "${#grid[@]} rolls"
55+
local -i cnt=0;
56+
for k in "${!grid[@]}"; do
57+
if is_removable "$k"; then
58+
((cnt++))
59+
unset "grid[$k]"
60+
fi
6761
done
68-
_debug "updated grid"
62+
((cnt == 0)) && break
63+
((ans += cnt))
6964
done
65+
_debug "part 2 done"
7066
echo "$ans"
7167
return 0
7268
}

0 commit comments

Comments
 (0)