--- /dev/null
+#!/bin/bash
+
+set -u
+set -e
+
+# these wires should give 6
+#wire_1=(R8 U5 L5 D3)
+#wire_2=(U7 R6 D4 L4)
+
+# these wires should get 159
+#wire_1=(R75 D30 R83 U83 L12 D49 R71 U7 L72)
+#wire_2=(U62 R66 U55 R34 D71 R55 D58 R83)
+
+# these wires should get 135
+#wire_1=(R98 U47 R26 D63 R33 U87 L62 D20 R33 U53 R51)
+#wire_2=(U98 R91 D20 R16 D67 R40 U7 R15 U6 R7)
+
+# read in data from file instead
+exec 3<input.txt
+IFS="," read -u 3 -a wire_1
+IFS="," read -u 3 -a wire_2
+
+trace_wire() {
+ local -n w=$1
+ local -n b=$2
+ local -n c=$3
+ wire_number=$4
+ cur_vert=0
+ cur_horz=0
+ moved=0
+ last_replace_char="-"
+
+ for operation in "${w[@]}"; do
+ direction=${operation:0:1}
+ amount=${operation:1}
+ case $direction in
+ U)
+ operator=+
+ ;;
+ D)
+ operator=-
+ ;;
+ L)
+ operator=-
+ ;;
+ R)
+ operator=+
+ ;;
+ esac
+
+ case $direction in
+ U|D)
+ for (( moved=1; moved <= $amount; moved++ )); do
+ cur_vert=$((cur_vert${operator}1))
+ if [ ${b[$cur_horz,$cur_vert]+a} ] && [ $wire_number -eq 2 ]; then
+ if [ ${b[$cur_horz,$cur_vert]} -eq 1 ]; then
+ c+=($cur_horz,$cur_vert)
+ b[$cur_horz,$cur_vert]=3
+ fi
+ continue
+ fi
+ b[$cur_horz,$cur_vert]=$wire_number
+ done
+ ;;
+ L|R)
+ for (( moved=1; moved <= $amount; moved++ )); do
+ cur_horz=$((cur_horz${operator}1))
+ if [ ${b[$cur_horz,$cur_vert]+a} ] && [ $wire_number -eq 2 ]; then
+ if [ ${b[$cur_horz,$cur_vert]} -eq 1 ]; then
+ c+=($cur_horz,$cur_vert)
+ b[$cur_horz,$cur_vert]=3
+ fi
+ continue
+ fi
+ b[$cur_horz,$cur_vert]=$wire_number
+ done
+ ;;
+ esac
+ done
+}
+
+declare -A board
+declare -a cross_wires
+echo "Tracing first wire"
+trace_wire wire_1 board cross_wires 1
+echo "Tracing second wire"
+trace_wire wire_2 board cross_wires 2
+
+echo "Wires cross at:"
+min_distance=-1
+for cross in "${cross_wires[@]}"; do
+ echo " $cross"
+ horz=${cross%,*}
+ horz=${horz//-/}
+ vert=${cross#*,}
+ vert=${vert//-/}
+ distance=$((horz+$vert))
+ if [ $min_distance -lt 0 ] || [ $min_distance -gt $distance ]; then
+ min_distance=$distance
+ fi
+done
+
+echo Min distance: $min_distance