#!/bin/bash # # ex1-slow.bash: Advent2020 game, day 11/game 1. CMD=${0##*/} shopt -s extglob declare -a rowsstr rows declare -i RLENGTH declare -i NROWS declare floor function adj() { local -i r="$1" n="$2" c="$3" count=0 local -a prow=(${rows[r-1]}) local -a row=(${rows[r]}) local -a nrow=(${rows[r+1]}) #echo #echo p="${prow[*]}" #echo r="${row[*]}" #echo p1=${prow[1]} #echo r1=${row[1]} #return #echo r="$row" #echo n="$nrow" if (( row[n] == 0 )); then echo "-1" return fi for ((i=n-1; i 0)); do changed=0 seated=0 for ((r=1; r<=NROWS; ++r)); do row=(${rows[r]}) newrow=(0) for ((c=1; c<=RLENGTH; ++c)); do newrow+=("${row[c]}") #if ((r == 1 && c ==1 )); then # printf "r1c1: %s %d\n" "${row[c]}" $(adj $r $c 2) #fi case ${row[c]} in 0) continue ;; 1) if (( $(adj $r $c 2) == 0 )); then ((++changed)) newrow[c]=2 fi #printf "[%d][%d]: %s %s %d\n" $r $c "${row[c]}" "${newrow[c]}" $(adj $r $c 2) ;; 2) if (( $(adj $r $c 2) >= 4 )); then ((++changed)) newrow[c]=1 fi ;; esac ((newrow[c] == 2)) && ((seated++)) done newrow+=(0) new[$r]="${newrow[*]}" #echo "${newrow[*]} ;" done #echo "$floor" #echo "${new[*]}" #echo changed=$changed ((loop++)) #echo loop="$loop" for ((r=1; r<=NROWS; ++r)); do rows[r]="${new[$r]}" done #printf "loop %d seated %d\n" "$loop" "$seated" >&2 done echo "$seated" } readarray -t rowsstr for ((i=0; i<${#rowsstr[@]}; ++i)); do rowsstr[i]=${rowsstr[i]//./0} rowsstr[i]=${rowsstr[i]//L/1} #echo "${rowsstr[i]}" done RLENGTH=${#rowsstr[0]} NROWS=${#rowsstr[@]} #echo "L=$RLENGTH N=$NROWS" # add floor rows at beginning and end printf -v floor '%0.s0 ' $(eval "echo {1..$((RLENGTH+2))}") #echo floor="$floor" #echo floor="$floor" #echo #for ((i=0; i<${#rowsstr[@]}; ++i)); do # rowsstr[i]=0${rowsstr[i]}0 # echo "${rowsstr[i]}" #done # split arrays in integers for ((r=0; r