From 1312fbc3fd0b51942919ea6f53b66a8365c32e88 Mon Sep 17 00:00:00 2001 From: RhiobeT Date: Tue, 14 Dec 2021 11:42:37 +0100 Subject: [PATCH] Day 14 --- 14/01.sh | 25 +++++++++++++++++++++++++ 14/02.sh | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100755 14/01.sh create mode 100755 14/02.sh diff --git a/14/01.sh b/14/01.sh new file mode 100755 index 0000000..1b805ae --- /dev/null +++ b/14/01.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +rules=() +n_step=10 +read polymer +read + +while read line; do + rules+=( ${line% ->*}'|'${line#*-> } ) +done + +for ((i=0; i<$n_step; i++)); do + polymer_size=0 + while [ $polymer_size -lt ${#polymer} ]; do + polymer_size=${#polymer} + for rule in ${rules[@]}; do + polymer=${polymer//${rule:0:2}/${rule:0:1}'|'${rule:3:1}'|'${rule:1:1}} + done + done + polymer=${polymer//'|'/} +done + +occurences=( $(printf "%s\n" $(sed 's/\(.\)/\1 /g' <<< $polymer) | sort | uniq -c \ + | sort -nr | sed 's/.$//') ) +echo $((occurences[0]-occurences[-1])) diff --git a/14/02.sh b/14/02.sh new file mode 100755 index 0000000..fa82923 --- /dev/null +++ b/14/02.sh @@ -0,0 +1,44 @@ +#!/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]))