38 lines
643 B
Ruby
38 lines
643 B
Ruby
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}"
|