+get_angle() {
+ local a1=$1
+ local a2=$2
+
+ local vector=$(get_asteroids_vector $a1 $a2)
+ local move_x=${vector%,*}
+ local move_y=${vector#*,}
+
+ val="$(calc -p 'round(((90 + ((180/pi()) * atan2('$move_y','$move_x'))) % 360) * 100000000) / 100000000')"
+ echo "$val"
+}
+
+get_closest_asteroid() {
+ local asteroids=$1
+
+ local IFS="|"
+ local min_dist=-1
+ local nearest_asteroid=
+ local x=0
+ local y=0
+
+ for asteroid in $asteroids; do
+ vector=$(get_asteroids_vector $our_asteroid $asteroid)
+ x=${vector%,*}
+ y=${vector#*,}
+ # use absolute numbers for length calculation!
+ x=${x#-}
+ y=${y#-}
+
+ distance=$((x+y))
+ if [ $distance -lt $min_dist -o $min_dist -eq -1 ]; then
+ min_dist=$distance
+ nearest_asteroid=$asteroid
+ fi
+ done
+
+ echo $nearest_asteroid
+}
+
+remove_asteroid_from_string() {
+ local asteroids=$1
+ local asteroid=$2
+ local new_asteroids=
+ local a
+
+ local IFS="|"
+ local seperator=""
+
+ for a in $asteroids; do
+ if [ "$a" != "$asteroid" ]; then
+ new_asteroids+="${seperator}$a"
+ fi
+ if [ "x$new_asteroids" != "x" ]; then
+ seperator="|"
+ fi
+ done
+
+ echo "$new_asteroids"
+}
+
+get_angles_list() {
+ local -n __asteroid_angles=$1
+ printf "%s\n" "${!__asteroid_angles[@]}" | sort -g
+}