-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAoC2021_13.sh
executable file
Β·124 lines (113 loc) Β· 2.68 KB
/
AoC2021_13.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/bin/bash
#
# Advent of Code 2021 Day 13
#
year=2021
day=13
ON="$(printf "%b" '\u2592')"
OFF=" "
declare -A points=()
solve() {
local -i part="$1"; shift
while read -r line || [ -n "$line" ]; do
if [[ "$line" =~ ([0-9]+),([0-9]+) ]]; then
local -i x="${BASH_REMATCH[1]}"
local -i y="${BASH_REMATCH[2]}"
points["$x,$y"]="$ON"
continue
fi
if [[ "$line" =~ 'fold along '([xy])=([0-9]+) ]]; then
local axis="${BASH_REMATCH[1]}"
local -i amount="${BASH_REMATCH[2]}"
for k in "${!points[@]}"; do
local -i x="${k%,*}"
local -i y="${k#*,}"
if [ "$axis" = "x" ] && [ "$x" -gt "$amount" ]; then
local new_k="$((x - 2 * (x - amount))),$y"
elif [ "$axis" = "y" ] && [ "$y" -gt "$amount" ]; then
local new_k="$x,$((y - 2 * (y - amount)))"
else
continue
fi
points["$new_k"]="$ON"
unset "points[""$k""]"
done
[ "$part" -eq 1 ] && break
fi
done < "$1"
return 0
}
part1() {
points=()
solve 1 "$@"
echo "${#points[@]}"
return 0
}
solve2() {
points=()
solve 2 "$@"
local -i max_x=-999999999999999999
local -i max_y=-999999999999999999
for k in "${!points[@]}"; do
local -i x="${k%,*}"
local -i y="${k#*,}"
[ "$x" -gt "$max_x" ] && max_x="$x"
[ "$y" -gt "$max_y" ] && max_y="$y"
done
local -a grid=()
for ((y = 0; y <= max_y; y++)); do
local row=""
for ((x = 0; x <= max_x + 1; x++)); do
if [ -n "${points["$x,$y"]}" ]; then
row+="$ON"
else
row+="$OFF"
fi
done
grid+=("$row")
done
for row in "${grid[@]}"; do
echo "$row"
done
return 0
}
source "$(dirname "$0")/aoc_ocr.sh"
part2() {
mapfile -t grid < <(solve2 "$@")
for row in "${grid[@]}"; do
_debug "$row"
done
ocr_convert6 "$ON" "$OFF" "${grid[@]}"
return 0
}
tests() {
# shellcheck disable=SC2034
{
sample=(
"6,10"
"0,14"
"9,10"
"0,3"
"10,4"
"4,11"
"6,0"
"6,12"
"4,1"
"0,13"
"10,12"
"3,4"
"3,0"
"8,4"
"1,10"
"2,14"
"8,10"
"9,0"
""
"fold along y=7"
"fold along x=5"
)
}
TEST part1 sample 17
TEST solve2 sample $'βββββ \nβ β \nβ β \nβ β \nβββββ '
}
source "$(dirname "$0")/aoc_main.sh"