|
6 | 6 | year=2025 |
7 | 7 | day=04 |
8 | 8 |
|
9 | | -declare -a grid |
10 | | -H=0 |
11 | | -W=0 |
| 9 | +declare -A grid |
12 | 10 |
|
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++)) |
35 | 29 | done |
36 | 30 | done |
37 | | - for row in "${ans_removable[@]}"; do |
38 | | - echo "$row" |
39 | | - done |
| 31 | + ((cnt < 5 )) && return 0 || return 1 |
40 | 32 | } |
41 | 33 |
|
42 | 34 | 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" |
48 | 46 | return 0 |
49 | 47 | } |
50 | 48 |
|
51 | 49 | part2() { |
52 | | - mapfile -t grid < "$@" |
53 | | - H=${#grid[@]} |
54 | | - W=${#grid[0]} |
| 50 | + _debug "part 2" |
| 51 | + read_grid "$1" |
55 | 52 | local -i ans=0 |
56 | 53 | 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 |
67 | 61 | done |
68 | | - _debug "updated grid" |
| 62 | + ((cnt == 0)) && break |
| 63 | + ((ans += cnt)) |
69 | 64 | done |
| 65 | + _debug "part 2 done" |
70 | 66 | echo "$ans" |
71 | 67 | return 0 |
72 | 68 | } |
|
0 commit comments