diff options
Diffstat (limited to 'src/14/part1')
| -rw-r--r-- | src/14/part1 | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/14/part1 b/src/14/part1 new file mode 100644 index 0000000..5e2f6a1 --- /dev/null +++ b/src/14/part1 @@ -0,0 +1,63 @@ +--- Day 14: Docking Data --- + +As your ferry approaches the sea port, the captain asks for your help again. The computer system +that runs this port isn't compatible with the docking program on the ferry, so the docking +parameters aren't being correctly initialized in the docking program's memory. + +After a brief inspection, you discover that the sea port's computer system uses a strange bitmask +system in its initialization program. Although you don't have the correct decoder chip handy, you +can emulate it in software! + +The initialization program (your puzzle input) can either update the bitmask or write a value to +memory. Values and memory addresses are both 36-bit unsigned integers. For example, ignoring +bitmasks for a moment, a line like mem[8] = 11 would write the value 11 to memory address 8. + +The bitmask is always given as a string of 36 bits, written with the most significant bit +(representing 2^35) on the left and the least significant bit (2^0, that is, the 1s bit) on the +right. The current bitmask is applied to values immediately before they are written to memory: a 0 +or 1 overwrites the corresponding bit in the value, while an X leaves the bit in the value +unchanged. + +For example, consider the following program: + +mask = XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X +mem[8] = 11 +mem[7] = 101 +mem[8] = 0 + +This program starts by specifying a bitmask (mask = ....). The mask it specifies will overwrite two +bits in every written value: the 2s bit is overwritten with 0, and the 64s bit is overwritten with +1. + +The program then attempts to write the value 11 to memory address 8. By expanding everything out to +individual bits, the mask is applied as follows: + +value: 000000000000000000000000000000001011 (decimal 11) +mask: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X +result: 00000000000000000000000000000[1m[37m1[0m0010[1m[37m0[0m1 (decimal 73) + +So, because of the mask, the value 73 is written to memory address 8 instead. Then, the program +tries to write 101 to address 7: + +value: 000000000000000000000000000001100101 (decimal 101) +mask: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X +result: 00000000000000000000000000000[1m[37m1[0m1001[1m[37m0[0m1 (decimal 101) + +This time, the mask has no effect, as the bits it overwrote were already the values the mask tried +to set. Finally, the program tries to write 0 to address 8: + +value: 000000000000000000000000000000000000 (decimal 0) +mask: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X +result: 00000000000000000000000000000[1m[37m1[0m0000[1m[37m0[0m0 (decimal 64) + +64 is written to address 8 instead, overwriting the value that was there previously. + +To initialize your ferry's docking program, you need the sum of all values left in memory after the +initialization program completes. (The entire 36-bit address space begins initialized to the value 0 +at every address.) In the above example, only two values in memory are not zero - 101 (at address 7) +and 64 (at address 8) - producing a sum of [1m[37m165[0m. + +Execute the initialization program. [1m[37mWhat is the sum of all values left in memory after it +completes?[0m + + |
