Skip to content

Commit d13ebb5

Browse files
committed
AoC 2025 Day 4 - bash
1 parent 4584f77 commit d13ebb5

File tree

1 file changed

+95
-0
lines changed

1 file changed

+95
-0
lines changed

src/main/bash/AoC2025_04.sh

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
#!/bin/bash
2+
#
3+
# Advent of Code 2025 Day 4
4+
#
5+
6+
year=2025
7+
day=04
8+
9+
declare -a grid
10+
H=0
11+
W=0
12+
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
35+
done
36+
done
37+
for row in "${ans_removable[@]}"; do
38+
echo "$row"
39+
done
40+
}
41+
42+
part1() {
43+
mapfile -t grid < "$@"
44+
H=${#grid[@]}
45+
W=${#grid[0]}
46+
mapfile -t removable < <(find_removable)
47+
echo "${#removable[@]}"
48+
return 0
49+
}
50+
51+
part2() {
52+
mapfile -t grid < "$@"
53+
H=${#grid[@]}
54+
W=${#grid[0]}
55+
local -i ans=0
56+
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"
67+
done
68+
_debug "updated grid"
69+
done
70+
echo "$ans"
71+
return 0
72+
}
73+
74+
tests() {
75+
# shellcheck disable=SC2034
76+
{
77+
sample=(
78+
"..@@.@@@@."
79+
"@@@.@.@.@@"
80+
"@@@@@.@.@@"
81+
"@.@@@@..@."
82+
"@@.@@@@.@@"
83+
".@@@@@@@.@"
84+
".@.@.@.@@@"
85+
"@.@@@.@@@@"
86+
".@@@@@@@@."
87+
"@.@.@@@.@."
88+
)
89+
}
90+
91+
TEST part1 sample 13
92+
TEST part2 sample 43
93+
}
94+
95+
source "$(dirname "$0")/aoc_main.sh"

0 commit comments

Comments
 (0)