Day 15
[advent-of-code-2019.git] / day10 / common.sh
1 declare -A asteroids
2 declare __asteroids_grid_height
3 declare __asteroids_grid_width
4
5 get_grid_height() {
6     echo $__asteroids_grid_height
7 }
8
9 get_grid_width() {
10     echo $__asteroids_grid_width
11 }
12
13 read_file() {
14     filename="$1"
15
16     if [ ! -e "$filename" ]; then
17         echo "Couldn't find file: $filename"
18         exit 2
19     fi
20
21     exec 3<"$filename"
22     unset asteroids
23     declare -g -A asteroids
24
25     __asteroids_grid_height=0
26     __asteroids_grid_width=0
27
28     while read -u 3 line; do
29         __asteroids_grid_width=${#line}
30         for (( a=0; a<${#line}; a++ )); do
31             char=${line:$a:1}
32             if [ "${char}" == "#" ]; then
33                 asteroids[$a,$__asteroids_grid_height]=0
34             fi
35         done
36         __asteroids_grid_height=$((__asteroids_grid_height+1))
37     done
38 }
39
40 get_vector() {
41     local x1=$1
42     local y1=$2
43     local x2=$3
44     local y2=$4
45
46     x_diff=$(($x2 - $x1))
47     y_diff=$(($y2 - $y1))
48
49     echo "$x_diff,$y_diff"
50 }
51
52 get_asteroids_vector() {
53     local a1=$1
54     local a2=$2
55
56     local x1=${a1%,*}
57     local y1=${a1#*,}
58     local x2=${a2%,*}
59     local y2=${a2%*,}
60
61     get_vector $x1 $y1 $x2 $y2
62 }
63
64 get_angle() {
65     local a1=$1
66     local a2=$2
67
68     local vector=$(get_asteroids_vector $a1 $a2)
69     local move_x=${vector%,*}
70     local move_y=${vector#*,}
71
72     val="$(calc -p 'round(((90 + ((180/pi()) * atan2('$move_y','$move_x'))) % 360) * 100000000) / 100000000')"
73     echo "$val"
74 }
75
76 get_closest_asteroid() {
77     local asteroids=$1
78
79     local IFS="|"
80     local min_dist=-1
81     local nearest_asteroid=
82     local x=0
83     local y=0
84
85     for asteroid in $asteroids; do
86         vector=$(get_asteroids_vector $our_asteroid $asteroid)
87         x=${vector%,*}
88         y=${vector#*,}
89         # use absolute numbers for length calculation!
90         x=${x#-}
91         y=${y#-}
92
93         distance=$((x+y))
94         if [ $distance -lt $min_dist -o $min_dist -eq -1 ]; then
95             min_dist=$distance
96             nearest_asteroid=$asteroid
97         fi
98     done
99
100     echo $nearest_asteroid
101 }
102
103 remove_asteroid_from_string() {
104     local asteroids=$1
105     local asteroid=$2
106     local new_asteroids=
107     local a
108
109     local IFS="|"
110     local seperator=""
111
112     for a in $asteroids; do
113         if [ "$a" != "$asteroid" ]; then
114             new_asteroids+="${seperator}$a"
115         fi
116         if [ "x$new_asteroids" != "x" ]; then
117             seperator="|"
118         fi
119     done
120
121     echo "$new_asteroids"
122 }
123
124 get_angles_list() {
125     local -n __asteroid_angles=$1
126     printf "%s\n" "${!__asteroid_angles[@]}" | sort -g
127 }
128