90 lines
2.2 KiB
Ruby
90 lines
2.2 KiB
Ruby
require 'set'
|
|
|
|
def hash_code(string)
|
|
initial_string = [*0..255]
|
|
suffix = [17, 31, 73, 47, 23]
|
|
# shifts = File.open('puzzle_10.txt').read.split(',').map(&:to_i) + suffix
|
|
# shifts = [1, 2, 3] + suffix
|
|
# shifts = suffix
|
|
shifts = string.split('').map(&:ord)
|
|
shifts = shifts + suffix
|
|
skip_size = 0
|
|
offset = 0
|
|
shifts = shifts * 64
|
|
for shift in shifts do
|
|
initial_string.rotate! offset
|
|
if shift > 0 then
|
|
rotated_bit = initial_string[0..shift - 1]
|
|
kept_bit = initial_string[shift..initial_string.length-1]
|
|
initial_string = rotated_bit.reverse + kept_bit
|
|
end
|
|
initial_string.rotate! -offset
|
|
offset += shift + skip_size
|
|
skip_size += 1
|
|
end
|
|
blocks = initial_string.each_slice(16).to_a
|
|
hash = blocks.map do |block|
|
|
block.inject(0) { |x, y| x^y }.to_s(16).rjust(2, '0')
|
|
end
|
|
return hash.join('')
|
|
end
|
|
|
|
input = "jxqlasbh"
|
|
# input = "flqrgnkx"
|
|
total = 0
|
|
map = []
|
|
128.times do |time|
|
|
hash_input = input + '-' + time.to_s
|
|
computed_hash = hash_code(hash_input)
|
|
binary = computed_hash.split('').map do |it|
|
|
it.to_i 16
|
|
end.map do |it|
|
|
(it.to_s 2).rjust(4, '0')
|
|
end.join('')
|
|
total += binary.count '1'
|
|
map.push(binary.split(''))
|
|
end
|
|
|
|
puts total
|
|
|
|
puts "#{map[0][0..3]}"
|
|
puts "#{map[1][0..3]}"
|
|
puts "#{map[2][0..3]}"
|
|
puts "#{map[3][0..3]}"
|
|
|
|
enabled = []
|
|
128.times do |x|
|
|
128.times do |y|
|
|
if map[x][y] != '1' then next end
|
|
enabled.push [[x, y]]
|
|
end
|
|
end
|
|
|
|
def is_neighbor(a, b)
|
|
a_neighbors = [[a[0]+1,a[1]],[a[0]-1, a[1]], [a[0],a[1]+1], [a[0],a[1]-1]]
|
|
return a_neighbors.include? b
|
|
end
|
|
|
|
final_groups = []
|
|
modified = true
|
|
while modified do
|
|
modified = false
|
|
i = 0
|
|
while i < enabled.length do
|
|
current = enabled[i]
|
|
j = i + 1
|
|
while j < enabled.length do
|
|
other = enabled[j]
|
|
if (current.product other).any? { |a| is_neighbor(a[0], a[1]) } then
|
|
current.concat other
|
|
enabled.delete_at(j)
|
|
modified = true
|
|
else
|
|
j += 1
|
|
end
|
|
end
|
|
i += 1
|
|
end
|
|
end
|
|
puts enabled.length
|