Day 14 - implemented in bash, because, well, I could
[advent-of-code-2020.git] / day14 / dockingdata.sh
diff --git a/day14/dockingdata.sh b/day14/dockingdata.sh
new file mode 100755 (executable)
index 0000000..2cb150b
--- /dev/null
@@ -0,0 +1,39 @@
+#!/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"