Files
advent-of-code/2020/day14/ex2.bash

62 lines
1014 B
Bash
Executable File

#!/bin/bash
#
# ex2.bash: Advent2020 game, day 14/game 2.
CMD=${0##*/}
shopt -s extglob
declare -A mem
declare -i pos exp lenmask
declare ORMASK ANDMASK
declare -a xlist
function applymask() {
local -i curmem val mask
if (($# < 3)); then
mem[$1]=$2
return
fi
curmem="$1"
val="$2"
mask="$3"
shift 3
applymask "$curmem" "$val" $*
applymask $((curmem+mask)) "$val" $*
}
while read -r line; do
line=${line// /}
if [[ $line =~ ^mask ]]; then
eval "$line"
ORMASK=2\#${mask//X/0}
ANDMASK=2\#${mask//0/1}
ANDMASK=${ANDMASK//X/0}
lenmask=${#mask}
xlist=()
exp=1
for ((i=1; i<=lenmask; ++i)); do
c=${mask: -i:1}
if [[ "$c" == "X" ]]; then
xlist+=("$exp")
fi
((exp<<=1))
done
else
[[ $line =~ ^.*\[([0-9]+)\][^0-9]*([0-9]+)$ ]]
pos=${BASH_REMATCH[1]}
val=${BASH_REMATCH[2]}
((pos |= ORMASK))
((pos &= ANDMASK))
applymask "$pos" "$val" ${xlist[*]}
fi
done
SUM=0
for i in ${!mem[@]}; do
((SUM+=${mem[$i]}))
done
printf "%s : res=%d\n" "$CMD" "$SUM"
exit 0