q = [1] dp[1] = 1 g = -1 until q.empty? c = q.shift i = dp[c] if c == n g = i end d = c.bits [c + d, c - d].select { |v| RANGE.include?(v) }.each do |v| if i + 1 < dp[v] q.push(v) dp[v] = i + 1 end end end puts g