Day 14 - implemented in bash, because, well, I could
[advent-of-code-2020.git] / day14 / dockingdata.sh
1 #!/bin/bash
2
3 filename="${1:-p1_165.txt}"
4
5 declare -A mem
6
7 parse_line() {
8     line="$1"
9     key=${line% = *}
10     value=${line#* = }
11
12     if [ $key == "mask" ]; then
13         mask_part1=${value//X/0}
14         mask_part2=${value//1/X}
15         mask_part2=${mask_part2//0/1}
16         mask_part2=${mask_part2//X/0}
17     else
18         # it's a memory instruction, yay
19         loc=${key%]}
20         loc=${loc#*[}
21         value=$((value | 2#$mask_part1))
22         value=$(( ~ $value & (2**36)-1 ))
23         value=$((value | 2#$mask_part2))
24         value=$(( ~ $value & (2**36)-1 ))
25         mem[$loc]=$value
26     fi
27 }
28
29 exec 3<"$filename"
30 while read -u 3 line; do
31     parse_line "$line"
32 done
33
34 total=0
35 for key in ${!mem[@]}; do
36     total=$((total+${mem[$key]}))
37 done
38
39 echo "Total: $total"