--- /dev/null
+#!/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]}"))