--- /dev/null
+#!/bin/bash
+
+filename="${1:-p1_165.txt}"
+
+declare -A mem
+
+parse_line() {
+ line="$1"
+ key=${line% = *}
+ value=${line#* = }
+
+ if [ $key == "mask" ]; then
+ mask_part1=${value//X/0}
+ mask_part2=${value//1/X}
+ mask_part2=${mask_part2//0/1}
+ mask_part2=${mask_part2//X/0}
+ else
+ # it's a memory instruction, yay
+ loc=${key%]}
+ loc=${loc#*[}
+ value=$((value | 2#$mask_part1))
+ value=$(( ~ $value & (2**36)-1 ))
+ value=$((value | 2#$mask_part2))
+ value=$(( ~ $value & (2**36)-1 ))
+ mem[$loc]=$value
+ fi
+}
+
+exec 3<"$filename"
+while read -u 3 line; do
+ parse_line "$line"
+done
+
+total=0
+for key in ${!mem[@]}; do
+ total=$((total+${mem[$key]}))
+done
+
+echo "Total: $total"