Added Solution for 2020 day 14

This commit is contained in:
Burnus 2023-04-08 16:23:39 +02:00
parent ca28a58a8b
commit 5594482117

View file

@ -51,6 +51,81 @@ To initialize your ferry's docking program, you need the sum of all values left
Execute the initialization program. *What is the sum of all values left in memory after it completes?* (Do not truncate the sum to 36 bits.)
To begin, [get your puzzle input](14/input).
Your puzzle answer was `6559449933360`.
Answer:
\--- Part Two ---
----------
For some reason, the sea port's computer system still can't communicate with your ferry's docking program. It must be using *version 2* of the decoder chip!
A version 2 decoder chip doesn't modify the values being written at all. Instead, it acts as a [memory address decoder](https://www.youtube.com/watch?v=PvfhANgLrm4). Immediately before a value is written to memory, each bit in the bitmask modifies the corresponding bit of the destination *memory address* in the following way:
* If the bitmask bit is `0`, the corresponding memory address bit is *unchanged*.
* If the bitmask bit is `1`, the corresponding memory address bit is *overwritten with `1`*.
* If the bitmask bit is `X`, the corresponding memory address bit is *floating*.
A *floating* bit is not connected to anything and instead fluctuates unpredictably. In practice, this means the floating bits will take on *all possible values*, potentially causing many memory addresses to be written all at once!
For example, consider the following program:
```
mask = 000000000000000000000000000000X1001X
mem[42] = 100
mask = 00000000000000000000000000000000X0XX
mem[26] = 1
```
When this program goes to write to memory address `42`, it first applies the bitmask:
```
address: 000000000000000000000000000000101010 (decimal 42)
mask: 000000000000000000000000000000X1001X
result: 000000000000000000000000000000X1101X
```
After applying the mask, four bits are overwritten, three of which are different, and two of which are *floating*. Floating bits take on every possible combination of values; with two floating bits, four actual memory addresses are written:
```
000000000000000000000000000000011010 (decimal 26)
000000000000000000000000000000011011 (decimal 27)
000000000000000000000000000000111010 (decimal 58)
000000000000000000000000000000111011 (decimal 59)
```
Next, the program is about to write to memory address `26` with a different bitmask:
```
address: 000000000000000000000000000000011010 (decimal 26)
mask: 00000000000000000000000000000000X0XX
result: 00000000000000000000000000000001X0XX
```
This results in an address with three floating bits, causing writes to *eight* memory addresses:
```
000000000000000000000000000000010000 (decimal 16)
000000000000000000000000000000010001 (decimal 17)
000000000000000000000000000000010010 (decimal 18)
000000000000000000000000000000010011 (decimal 19)
000000000000000000000000000000011000 (decimal 24)
000000000000000000000000000000011001 (decimal 25)
000000000000000000000000000000011010 (decimal 26)
000000000000000000000000000000011011 (decimal 27)
```
The entire 36-bit address space still begins initialized to the value 0 at every address, and you still need the sum of all values left in memory at the end of the program. In this example, the sum is *`208`*.
Execute the initialization program using an emulator for a version 2 decoder chip. *What is the sum of all values left in memory after it completes?*
Your puzzle answer was `3369767240513`.
Both parts of this puzzle are complete! They provide two gold stars: \*\*
At this point, you should [return to your Advent calendar](/2020) and try another puzzle.
If you still want to see it, you can [get your puzzle input](14/input).