INPUT = [97,167,54,178,2,11,209,174,119,248,254,0,255,1,64,190] INPUT2 = "97,167,54,178,2,11,209,174,119,248,254,0,255,1,64,190" def do_knot text knot_lol = (0..255).to_a skips = 0 curr_pos = 0 text.each do |i| temp = [] (0...i).each do |j| temp << (knot_lol[(curr_pos+j) % 256]) end (0...i).each do |j| knot_lol[(curr_pos+i-1-j) % 256] = temp[j] end curr_pos += skips + i skips += 1 end knot_lol end def do_knot2 text knot_lol = (0..255).to_a skips = 0 curr_pos = 0 (0...64).each do text.each do |i| temp = [] (0...i).each do |j| temp << (knot_lol[(curr_pos+j) % 256]) end (0...i).each do |j| knot_lol[(curr_pos+i-1-j) % 256] = temp[j] end curr_pos += skips + i skips += 1 end end knot_lol end def dense_hash input blocks = input.each_slice(16).to_a final_hash = [] blocks.each do |block| hash = block[0] block[1..block.size-1].each do |s| hash = hash ^ s end final_hash << hash end final_hash end def knot_hash input knot_hashed = [] input.each do |s| a = s.to_s(16) if a.size == 1 then a = "0" + a end knot_hashed << a end knot_hashed.join "" end # input.each do |size| # # p skips+curr_val # if size > 0 then # knot_lol = knot_lol.each_slice(size).to_a # # p knot_lol # knot_lol[0].reverse! # # p knot_lol # knot_lol.flatten! # end # knot_lol = knot_lol.rotate(skips+curr_val) # head += (size + [skips, 0].max) # head = head % 5 # # p "head " + knot_lol[head].to_s # skips += 1 # curr_val = size # # p knot_lol # end out = do_knot INPUT p (out[0] * out[1]).to_s input_2 = INPUT2.split("").map(&:ord) + [17, 31, 73, 47, 23] p knot_hash dense_hash do_knot2 input_2