rename repo, subdir for yearly challenges
This commit is contained in:
61
2020/day14/ex2.bash
Executable file
61
2020/day14/ex2.bash
Executable file
@@ -0,0 +1,61 @@
|
||||
#!/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
|
Reference in New Issue
Block a user