|
1 | 1 | # Answers
|
2 | 2 |
|
3 |
| -| Part 1 | Part 2 | |
4 |
| -|---------|--------| |
5 |
| -| `38628` | ` ` | |
| 3 | +| Part 1 | Part 2 | |
| 4 | +|---------|------------------------------------| |
| 5 | +| `38628` | `e1462100a34221a7f0906da15c1c979a` | |
6 | 6 |
|
7 | 7 | ## --- Day 10: Knot Hash ---
|
8 | 8 |
|
@@ -47,3 +47,34 @@ Suppose we instead only had a circular list containing five elements, `0, 1, 2,
|
47 | 47 | In this example, the first two numbers in the list end up being `3` and `4`; to check the process, you can multiply them together to produce `12`.
|
48 | 48 |
|
49 | 49 | However, you should instead use the standard list size of `256` (with values `0` to `255`) and the sequence of _lengths_ in your puzzle input. Once this process is complete, _what is the result of multiplying the first two numbers in the list_?
|
| 50 | + |
| 51 | +----------------- |
| 52 | + |
| 53 | +## --- Part Two --- |
| 54 | + |
| 55 | +The logic you've constructed forms a single _round_ of the _Knot Hash_ algorithm; running the full thing requires many of these rounds. Some input and output processing is also required. |
| 56 | + |
| 57 | +First, from now on, your input should be taken not as a list of numbers, but as a string of bytes instead. Unless otherwise specified, convert characters to bytes using their [ASCII codes](https://en.wikipedia.org/wiki/ASCII#Printable_characters). This will allow you to handle arbitrary ASCII strings, and it also ensures that your input lengths are never larger than `255`. For example, if you are given `1,2,3`, you should convert it to the ASCII codes for each character: `49,44,50,44,51`. |
| 58 | + |
| 59 | +Once you have determined the sequence of lengths to use, add the following lengths to the end of the sequence: `17, 31, 73, 47, 23`. For example, if you are given `1,2,3`, your final sequence of lengths should be `49,44,50,44,51,17,31,73,47,23` (the ASCII codes from the input string combined with the standard length suffix values). |
| 60 | + |
| 61 | +Second, instead of merely running one _round_ like you did above, run a total of `64` rounds, using the same _length_ sequence in each round. The _current position_ and _skip size_ should be preserved between rounds. For example, if the previous example was your first round, you would start your second round with the same _length_ sequence (`3, 4, 1, 5, 17, 31, 73, 47, 23`, now assuming they came from ASCII codes and include the suffix), but start with the previous round's _current position_ (`4`) and _skip size_ (`4`). |
| 62 | + |
| 63 | +Once the rounds are complete, you will be left with the numbers from `0` to `255` in some order, called the _sparse hash_. Your next task is to reduce these to a list of only `16` numbers called the _dense hash_. To do this, use numeric bitwise [XOR](https://en.wikipedia.org/wiki/Bitwise_operation#XOR) to combine each consecutive block of `16` numbers in the sparse hash (there are `16` such blocks in a list of `256` numbers). So, the first element in the dense hash is the first sixteen elements of the sparse hash XOR'd together, the second element in the dense hash is the second sixteen elements of the sparse hash XOR'd together, etc. |
| 64 | + |
| 65 | +For example, if the first sixteen elements of your sparse hash are as shown below, and the XOR operator is `^`, you would calculate the first output number like this: |
| 66 | + |
| 67 | + 65 ^ 27 ^ 9 ^ 1 ^ 4 ^ 3 ^ 40 ^ 50 ^ 91 ^ 7 ^ 6 ^ 0 ^ 2 ^ 5 ^ 68 ^ 22 = 64 |
| 68 | + |
| 69 | +Perform this operation on each of the sixteen blocks of sixteen numbers in your sparse hash to determine the sixteen numbers in your dense hash. |
| 70 | + |
| 71 | +Finally, the standard way to represent a Knot Hash is as a single [hexadecimal](https://en.wikipedia.org/wiki/Hexadecimal) string; the final output is the dense hash in hexadecimal notation. Because each number in your dense hash will be between `0` and `255` (inclusive), always represent each number as two hexadecimal digits (including a leading zero as necessary). So, if your first three numbers are `64, 7, 255`, they correspond to the hexadecimal numbers `40, 07, ff`, and so the first six characters of the hash would be `4007ff`. Because every Knot Hash is sixteen such numbers, the hexadecimal representation is always `32` hexadecimal digits (`0`\-`f`) long. |
| 72 | + |
| 73 | +Here are some example hashes: |
| 74 | + |
| 75 | +* The empty string becomes `a2582a3a0e66e6e86e3812dcb672a272`. |
| 76 | +* `AoC 2017` becomes `33efeb34ea91902bb2f59c9920caa6cd`. |
| 77 | +* `1,2,3` becomes `3efbe78a8d82f29979031a4aa0b16a9d`. |
| 78 | +* `1,2,4` becomes `63960835bcdc130f0b66d7ff4f6a5a8e`. |
| 79 | + |
| 80 | +Treating your puzzle input as a string of ASCII characters, _what is the Knot Hash of your puzzle input?_ Ignore any leading or trailing whitespace you might encounter. |
0 commit comments