# [digits].my_digits(base)
# [digits].my_digits([base]) # ex. [9,33,21,1428].undigits([24,60,60]) #=> 123456789
class Array
def undigits(base=10)
if base.class == Array
bs = [*base,1]
b = 1
return self.inject(0){|r,i|
if bs.empty?
# raise ArgumentError
return r
else
b *= bs.pop
next b * i + r if i.class == Integer
# raise ArgumentError
r
end
}
end
raise ArgumentError if base.class != Integer || base <= 1
self.reverse.inject(0){|r,i|
next base * r + i if i.class == Integer
# raise ArgumentError
r
}
end
alias_method :to_i, :undigits
end
# val.my_digits(base)
# val.my_digits([base]) # ex. 123456789.my_digits([24,60,60]) #=> [9,33,21,1428]
class Integer
def my_digits(base=10)
v = self.to_i
raise ArgumentError if v < 0
if base.class == Array
return [0] if v == 0
bs = base.dup
r = []
while v > 0
if bs.empty?
r << v
break
else
b = bs.pop
v, n = v.divmod(b)
r << n
end
end
return r
end
raise ArgumentError if base.class != Integer || base <= 1
return [0] if v == 0
r = []
while v > 0
v, n = v.divmod(base)
r << n
end
r
end
end
p a = 123.my_digits(2) #=> [1, 1, 0, 1, 1, 1, 1]
p a.undigits(2) #=> 123
p [1, 1, 0, 1, 'hoge'].to_i(2) #=> 11
p 12345.my_digits([24,60]) #=> [45, 13, 8]
p 123456789.my_digits([24,60,60]) #=> [9, 33, 21, 1428]
p [9,33,21,1428,'d h:m:s'].undigits([24,60,60]) #=> 123456789
p [9,33,21,1428, 9,9,9,9].undigits([24,60,60]) #=> 123456789
p [9,33].undigits([24,60,60]) #=> 1989
CiMgW2RpZ2l0c10ubXlfZGlnaXRzKGJhc2UpCiMgW2RpZ2l0c10ubXlfZGlnaXRzKFtiYXNlXSkJCSMgZXguIFs5LDMzLDIxLDE0MjhdLnVuZGlnaXRzKFsyNCw2MCw2MF0pICM9PiAxMjM0NTY3ODkKY2xhc3MgQXJyYXkKCWRlZiB1bmRpZ2l0cyhiYXNlPTEwKQoJCWlmIGJhc2UuY2xhc3MgPT0gQXJyYXkKCQkJYnMgPSBbKmJhc2UsMV0KCQkJYiA9IDEKCQkJcmV0dXJuIHNlbGYuaW5qZWN0KDApe3xyLGl8CgkJCQlpZiBicy5lbXB0eT8KIwkJCQkJcmFpc2UgQXJndW1lbnRFcnJvcgoJCQkJCXJldHVybiByCgkJCQllbHNlCgkJCQkJYiAqPSBicy5wb3AKCQkJCQluZXh0IGIgKiBpICsgcglpZiBpLmNsYXNzID09IEludGVnZXIKIwkJCQkJcmFpc2UgQXJndW1lbnRFcnJvcgoJCQkJCXIKCQkJCWVuZAoJCQl9CgkJZW5kCgkJcmFpc2UgQXJndW1lbnRFcnJvcglpZiBiYXNlLmNsYXNzICE9IEludGVnZXIgfHwgYmFzZSA8PSAxCgkJc2VsZi5yZXZlcnNlLmluamVjdCgwKXt8cixpfAoJCQluZXh0IGJhc2UgKiByICsgaQlpZiBpLmNsYXNzID09IEludGVnZXIKIwkJCXJhaXNlIEFyZ3VtZW50RXJyb3IKCQkJcgoJCX0KCWVuZAoJYWxpYXNfbWV0aG9kIDp0b19pLCA6dW5kaWdpdHMKZW5kCgojIHZhbC5teV9kaWdpdHMoYmFzZSkKIyB2YWwubXlfZGlnaXRzKFtiYXNlXSkJCSMgZXguIDEyMzQ1Njc4OS5teV9kaWdpdHMoWzI0LDYwLDYwXSkgIz0+IFs5LDMzLDIxLDE0MjhdCmNsYXNzIEludGVnZXIKCWRlZiBteV9kaWdpdHMoYmFzZT0xMCkKCQl2ID0gc2VsZi50b19pCgkJcmFpc2UgQXJndW1lbnRFcnJvcglpZiB2IDwgMAoJCWlmIGJhc2UuY2xhc3MgPT0gQXJyYXkKCQkJcmV0dXJuIFswXQlpZiB2ID09IDAKCQkJYnMgPSBiYXNlLmR1cAoJCQlyID0gW10KCQkJd2hpbGUgdiA+IDAKCQkJCWlmIGJzLmVtcHR5PwoJCQkJCXIgPDwgdgoJCQkJCWJyZWFrCgkJCQllbHNlCgkJCQkJYiA9IGJzLnBvcAoJCQkJCXYsIG4gPSB2LmRpdm1vZChiKQoJCQkJCXIgPDwgbgoJCQkJZW5kCgkJCWVuZAoJCQlyZXR1cm4gcgoJCWVuZAoJCXJhaXNlIEFyZ3VtZW50RXJyb3IJaWYgYmFzZS5jbGFzcyAhPSBJbnRlZ2VyIHx8IGJhc2UgPD0gMQoJCXJldHVybiBbMF0JaWYgdiA9PSAwCgkJciA9IFtdCgkJd2hpbGUgdiA+IDAKCQkJdiwgbiA9IHYuZGl2bW9kKGJhc2UpCgkJCXIgPDwgbgoJCWVuZAoJCXIKCWVuZAplbmQKCnAgYSA9IDEyMy5teV9kaWdpdHMoMikJIz0+IFsxLCAxLCAwLCAxLCAxLCAxLCAxXQpwIGEudW5kaWdpdHMoMikJIz0+IDEyMwpwIFsxLCAxLCAwLCAxLCAnaG9nZSddLnRvX2koMikJIz0+IDExCgpwIDEyMzQ1Lm15X2RpZ2l0cyhbMjQsNjBdKQkjPT4gWzQ1LCAxMywgOF0KcCAxMjM0NTY3ODkubXlfZGlnaXRzKFsyNCw2MCw2MF0pCSM9PiBbOSwgMzMsIDIxLCAxNDI4XQpwIFs5LDMzLDIxLDE0MjgsJ2QgaDptOnMnXS51bmRpZ2l0cyhbMjQsNjAsNjBdKQkjPT4gMTIzNDU2Nzg5CnAgWzksMzMsMjEsMTQyOCwgOSw5LDksOV0udW5kaWdpdHMoWzI0LDYwLDYwXSkJIz0+IDEyMzQ1Njc4OQpwIFs5LDMzXS51bmRpZ2l0cyhbMjQsNjAsNjBdKQkjPT4gMTk4OQo=