62 lines
1014 B
Bash
Executable File
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
|