Day 14
[advent-of-code-2021.git] / day14 / poly.sh
diff --git a/day14/poly.sh b/day14/poly.sh
new file mode 100755 (executable)
index 0000000..b617a80
--- /dev/null
@@ -0,0 +1,84 @@
+#!/bin/bash
+
+set -u
+
+filename="${1:-example.txt}"
+exec 3<"$filename"
+
+read -u 3 template
+
+read -u 3 blank
+
+declare -A inserts=()
+
+declare -a results=($template)
+
+while read -u 3 poly; do
+    left="${poly% -> *}"
+    right="${poly#* -> }"
+    inserts[$left]="$right"
+done
+
+for (( a=1; a<=10; a++ )); do
+    cur_string="${results[$(($a-1))]}"
+    for (( b=0; b<$((${#cur_string} - 1)); b++ )); do
+        lookup="${cur_string:$b:2}"
+        if [ $b -eq 0 ]; then
+            results[$a]="${lookup:0:1}${inserts[$lookup]}"
+        else
+            results[$a]+="${lookup:0:1}${inserts[$lookup]}"
+        fi
+    done
+    results[$a]+="${cur_string: -1:1}"
+done
+
+declare -A counts
+
+do_counts() {
+    local string="$1"
+    counts=()
+
+    for (( a=0; a<${#string}; a++ )); do
+        char=${string:$a:1}
+        if [ "${counts[$char]+abc}" ]; then
+            ((counts[$char]+=1))
+        else
+            counts[$char]=1
+        fi
+    done
+}
+
+get_highest_lowest() {
+    local -n __results="$1"
+    lowest_count=-1
+    lowest_letter=""
+    highest_count=-1
+    highest_letter=""
+    for key in "${!counts[@]}"; do
+        if [ $lowest_count -eq -1 ]; then
+            lowest_count=${counts[$key]}
+            lowest_letter=$key
+        elif [ ${counts[$key]} -lt $lowest_count ]; then
+            lowest_count=${counts[$key]}
+            lowest_letter=$key
+        fi
+        if [ $highest_count -eq -1 ]; then
+            highest_count=${counts[$key]}
+            highest_letter=$key
+        elif [ ${counts[$key]} -gt $highest_count ]; then
+            highest_count=${counts[$key]}
+            highest_letter=$key
+        fi
+    done
+
+    __results[$lowest_count]=$lowest_letter
+    __results[$highest_count]=$highest_letter
+}
+
+do_counts "${results[-1]}"
+declare -a result_counts=()
+get_highest_lowest result_counts
+
+declare -a temp=( "${!result_counts[@]}" )
+echo -n "Part 1: Difference between highest and lowest count: "
+echo $(("${temp[1]}" - "${temp[0]}"))