From bdd1421637e7bbeeb68505741799ae95736a8865 Mon Sep 17 00:00:00 2001 From: Pierre Jeanjean Date: Tue, 21 Dec 2021 14:47:09 +0100 Subject: [PATCH] Day 21 --- 21/01.sh | 32 ++++++++++++++++ 21/02.sh | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+) create mode 100755 21/01.sh create mode 100755 21/02.sh diff --git a/21/01.sh b/21/01.sh new file mode 100755 index 0000000..2852693 --- /dev/null +++ b/21/01.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +positions=() +scores=() + +while read line; do + positions+=( $(sed 's/^.* \([0-9]*\)$/\1/' <<< $line) ) + scores+=( 0 ) +done + +dice_next_value=1 +player_index=0 +finished=0 +n_rolls=0 + +while [ $finished -eq 0 ]; do + roll=$((dice_next_value+dice_next_value+1+(dice_next_value+1)%100+1)) + dice_next_value=$(((dice_next_value+2)%100+1)) + positions[$player_index]=$(((positions[player_index]+roll-1)%10+1)) + scores[$player_index]=$((scores[player_index]+positions[player_index])) + if [ ${scores[$player_index]} -ge 1000 ]; then + finished=1 + fi + player_index=$(((player_index+1)%${#positions[@]})) + n_rolls=$((n_rolls+3)) +done + +for score in ${scores[@]}; do + if [ $score -lt 1000 ]; then + echo $((score*n_rolls)) + fi +done diff --git a/21/02.sh b/21/02.sh new file mode 100755 index 0000000..00888f8 --- /dev/null +++ b/21/02.sh @@ -0,0 +1,113 @@ +#!/bin/bash + +declare -A positions +declare -A scores +declare -A victories +read line +start_position_1=$(sed 's/^.* \([0-9]*\)$/\1/' <<< $line) +read line +start_position_2=$(sed 's/^.* \([0-9]*\)$/\1/' <<< $line) +positions[$start_position_1,$start_position_2]=1 +scores[0,0,$start_position_1,$start_position_2]=1 +victories[1]=0 +victories[2]=0 + +rolls=( 0 0 0 1 3 6 7 6 3 1 ) + +iter=0 + +for ((iter=0;iter<21;iter++)); do + declare -A new_positions + declare -A new_scores + for position in ${!positions[@]}; do + for ((i=3;i<10;i++)); do + position_1=${position%,*} + position_2=${position#*,} + new_position_1=$(((position_1+i-1)%10+1)) + new_positions[$new_position_1,$position_2]=$((${new_positions[$new_position_1,$position_2]}+${positions[$position]}*rolls[i])) + for score in ${!scores[@]}; do + score_1=${score%%,*} + score_2=${score#*,} + score_2=${score_2%%,*} + score_position_1=${score%,*} + score_position_1=${score_position_1##*,} + score_position_2=${score##*,} + if [ $score_position_1 -eq $position_1 ] && [ $score_position_2 -eq $position_2 ]; then + new_score_1=$((score_1+new_position_1)) + if [ $new_score_1 -ge 21 ]; then + victories[1]=$((${victories[1]}+${scores[$score]}*rolls[i])) + new_positions[$new_position_1,$position_2]=$((${new_positions[$new_position_1,$position_2]}-${scores[$score]})) + else + new_scores[$new_score_1,$score_2,$new_position_1,$position_2]=$((${new_scores[$new_score_1,$score_2,$new_position_1,$position_2]}+${scores[$score]}*rolls[i])) + fi + fi + done + done + done + + unset positions + declare -A positions + for position in ${!new_positions[@]}; do + positions[$position]=${new_positions[$position]} + positions[$position]=${new_positions[$position]} + done + unset new_positions + unset scores + declare -A scores + for score in ${!new_scores[@]}; do + scores[$score]=${new_scores[$score]} + scores[$score]=${new_scores[$score]} + done + unset new_scores + + declare -A new_positions + declare -A new_scores + for position in ${!positions[@]}; do + for ((i=3;i<10;i++)); do + position_1=${position%,*} + position_2=${position#*,} + new_position_2=$(((position_2+i-1)%10+1)) + new_positions[$position_1,$new_position_2]=$((${new_positions[$position_1,$new_position_2]}+${positions[$position]}*rolls[i])) + for score in ${!scores[@]}; do + score_1=${score%%,*} + score_2=${score#*,} + score_2=${score_2%%,*} + score_position_1=${score%,*} + score_position_1=${score_position_1##*,} + score_position_2=${score##*,} + if [ $score_position_1 -eq $position_1 ] && [ $score_position_2 -eq $position_2 ]; then + new_score_2=$((score_2+new_position_2)) + if [ $new_score_2 -ge 21 ]; then + victories[2]=$((${victories[2]}+${scores[$score]}*rolls[i])) + new_positions[$position_1,$new_position_2]=$((${new_positions[$position_1,$new_position_2]}-${scores[$score]})) + else + new_scores[$score_1,$new_score_2,$position_1,$new_position_2]=$((${new_scores[$score_1,$new_score_2,$position_1,$new_position_2]}+${scores[$score]}*rolls[i])) + fi + fi + done + done + done + + unset positions + declare -A positions + for position in ${!new_positions[@]}; do + positions[$position]=${new_positions[$position]} + positions[$position]=${new_positions[$position]} + done + unset new_positions + unset scores + declare -A scores + for score in ${!new_scores[@]}; do + scores[$score]=${new_scores[$score]} + scores[$score]=${new_scores[$score]} + done + unset new_scores +done + +most_victories=0 +for victory in ${victories[@]}; do + if [ $victory -gt $most_victories ]; then + most_victories=$victory + fi +done +echo $most_victories