aboutsummaryrefslogtreecommitdiff
path: root/day10/part2
diff options
context:
space:
mode:
Diffstat (limited to 'day10/part2')
-rwxr-xr-xday10/part285
1 files changed, 85 insertions, 0 deletions
diff --git a/day10/part2 b/day10/part2
new file mode 100755
index 0000000..5a55d7d
--- /dev/null
+++ b/day10/part2
@@ -0,0 +1,85 @@
+#!/usr/bin/env ruby
+
+class KnotHash
+ def initialize
+ @list = (0...256).to_a
+ @skip = 0
+ @ptr = 0
+ end
+
+ def reverse_sublist(len)
+ if @ptr + len > @list.length then
+ reverse_wrapping_sublist(len)
+ else
+ reverse_contained_sublist(len)
+ end
+
+ inc_ptr(len)
+ end
+
+ def compress
+ p = 0
+ out = []
+
+ 16.times do
+ out << @list[p...p+16].inject(:^)
+ p += 16
+ end
+
+ return out
+ end
+
+ def hexdigest
+ dense = self.compress
+ hex = dense.map { |i| "%02x" % i }
+ return hex.join
+ end
+
+ def to_a
+ return @list
+ end
+
+ def to_s
+ l = @list.dup
+ l[@ptr] = "[#{l[@ptr]}]"
+ return "#{l.join(' ')} skip = #{@skip}"
+ end
+
+ private
+
+ def reverse_wrapping_sublist(len)
+ dbl = @list.dup + @list.dup
+ sublist = dbl[@ptr...@ptr+len].reverse
+
+ (@ptr...@ptr+len).each do |i|
+ @list[i % @list.length] = sublist[i-@ptr]
+ end
+ end
+
+ def reverse_contained_sublist(len)
+ sublist = @list[@ptr...@ptr+len].reverse
+
+ (@ptr...@ptr+len).each do |i|
+ @list[i] = sublist[i-@ptr]
+ end
+ end
+
+ def inc_ptr(len)
+ @ptr += len
+ @ptr += @skip
+ @ptr = @ptr % @list.length
+ @skip += 1
+ end
+end
+
+input = gets.chomp.chars.map(&:ord) + [17,31,73,47,23]
+
+hash = KnotHash.new
+
+64.times do
+ input.each do |len|
+ hash.reverse_sublist(len)
+ end
+end
+
+puts hash.hexdigest