class Integer def layer ((Math.sqrt(self).ceil) / 2) + 1 end def layer_first_corner (((self - 1) * 2) - 1)**2 end def layer_length (self - 1) << 3 end def layer_side_length layer_length >> 2 end def layer_last_corner (self + 1).layer_first_corner end def layer_middles (0..3).map { |n| layer_first_corner + (layer_side_length >> 1) * ((2 * n) + 1) } end def layer_middles_offsets layer.layer_middles.map { |middle| (middle - self).abs } end def distance layer + layer_middles_offsets.min - 1 end end n = STDIN.read.chomp.to_i part_1 = n.distance puts "Part 1: #{part_1}"