From 53c1f2ca21484b732f646787898e68cbbf731972 Mon Sep 17 00:00:00 2001 From: Nat Lasseter Date: Sun, 10 Dec 2017 21:14:34 +0000 Subject: Day 10 --- day10/part2 | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100755 day10/part2 (limited to 'day10/part2') 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 -- cgit v1.2.3