Skip to content

Instantly share code, notes, and snippets.

@tompng
Last active February 17, 2020 05:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tompng/dcba662e6693580f26b1ef9ef941f050 to your computer and use it in GitHub Desktop.
Save tompng/dcba662e6693580f26b1ef9ef941f050 to your computer and use it in GitHub Desktop.
digits memo
class Integer
alias_method :original_digits, :digits
def digits(base)
bits = bit_length
base_bits = base.bit_length
return original_digits base if bits < base_bits * 64 # return [self] if self < base
if base == 1 << (base_bits - 1)
n = base_bits - 1
# return Array.new((bits + n - 1) / n) { self[n * _1, n] } # but it's slow
return Array.new((bits + n - 1) / n) { |i| k = 0; j = 0; while j < n; k |= self[n * i + j] << j; j += 1; end; k }
end
arr = digits(base ** 2).flat_map { [_1 % base, _1 / base] }
arr.pop if arr.last.zero?
arr
end
def digits2
return bit_length.times.map { |i| self[i] }
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment