#!/bin/bash rules=() n_step=40 declare -A polymer declare -A occurences read line occurences[${line:0:1}]=$((${occurences[${line:0:1}]}+1)) for ((i=1; i<${#line}; i++)); do pair=${line:$((i-1)):2} polymer[$pair]=$((${polymer[$pair]}+1)) occurences[${line:$i:1}]=$((${occurences[${line:$i:1}]}+1)) done read while read line; do rules+=( ${line% ->*}'|'${line#*-> } ) done for ((i=0; i<$n_step; i++)); do declare -A new_polymer for rule in ${rules[@]}; do rule_pair=${rule:0:2} rule_pair_1=${rule:0:1}${rule:3:1} rule_pair_2=${rule:3:1}${rule:1:1} if ! [ -v polymer[$rule_pair] ]; then polymer[$rule_pair]=0 fi new_polymer[$rule_pair]=$((${new_polymer[$rule_pair]}-${polymer[$rule_pair]})) new_polymer[$rule_pair_1]=$((${new_polymer[$rule_pair_1]}+${polymer[$rule_pair]})) new_polymer[$rule_pair_2]=$((${new_polymer[$rule_pair_2]}+${polymer[$rule_pair]})) occurences[${rule:3:1}]=$((${occurences[${rule:3:1}]}+${polymer[$rule_pair]})) done for new_pair in ${!new_polymer[@]}; do if ! [ -v polymer[$new_pair] ]; then polymer[$new_pair]=0 fi polymer[$new_pair]=$((${polymer[$new_pair]}+${new_polymer[$new_pair]})) done unset new_polymer done occurences_array=( $(printf "%s\n" "${occurences[@]}" | sort -nr) ) echo $((occurences_array[0]-occurences_array[-1]))