input = ARGF.read.strip def knot_hash(input) list = (0..255).to_a current = 0 lengths = input.split(//).map(&:ord) lengths.concat([17, 31, 73, 47, 23]) skip = 0 64.times do lengths.each do |length| list[0, length] = list[0, length].reverse list = list.rotate(length + skip) current += length + skip current %= list.size skip += 1 end end list = list.rotate(list.size - current) dense = list.each_slice(16).map {|slice| slice.inject(&:^) } hex = dense.map {|n| n.to_s(16).rjust(2, ?0) }.join hex.hex.to_s(2).rjust(128, ?0) end # p (0..127).map {|i| "#{input}-#{i}" }.map {|row| knot_hash(row) }.join.split(//).select {|c| c == ?1 }.count # input = "flqrgnkx" grid = (0..127).map {|i| "#{input}-#{i}" }.map {|row| knot_hash(row).split(//) } regions = 0 queue = [] (0..127).each do |y| (0..127).each do |x| if grid[y][x] == ?1 regions += 1 grid[y][x] = ?0 queue << [x, y] until queue.empty? xx,yy = queue.shift [[0, 1], [0, -1], [1, 0], [-1, 0]].each do |dx, dy| xxx = xx + dx yyy = yy + dy if (0..127).cover?(xxx) && (0..127).cover?(yyy) && grid[yyy][xxx] == ?1 grid[yyy][xxx] = ?0 queue << [xxx, yyy] end end end end end end p regions