fork(1) download
  1.  
  2. # [digits].my_digits(base)
  3. # [digits].my_digits([base]) # ex. [9,33,21,1428].undigits([24,60,60]) #=> 123456789
  4. class Array
  5. def undigits(base=10)
  6. if base.class == Array
  7. bs = [*base,1]
  8. b = 1
  9. return self.inject(0){|r,i|
  10. if bs.empty?
  11. # raise ArgumentError
  12. return r
  13. else
  14. b *= bs.pop
  15. next b * i + r if i.class == Integer
  16. # raise ArgumentError
  17. r
  18. end
  19. }
  20. end
  21. raise ArgumentError if base.class != Integer || base <= 1
  22. self.reverse.inject(0){|r,i|
  23. next base * r + i if i.class == Integer
  24. # raise ArgumentError
  25. r
  26. }
  27. end
  28. alias_method :to_i, :undigits
  29. end
  30.  
  31. # val.my_digits(base)
  32. # val.my_digits([base]) # ex. 123456789.my_digits([24,60,60]) #=> [9,33,21,1428]
  33. class Integer
  34. def my_digits(base=10)
  35. v = self.to_i
  36. raise ArgumentError if v < 0
  37. if base.class == Array
  38. return [0] if v == 0
  39. bs = base.dup
  40. r = []
  41. while v > 0
  42. if bs.empty?
  43. r << v
  44. break
  45. else
  46. b = bs.pop
  47. v, n = v.divmod(b)
  48. r << n
  49. end
  50. end
  51. return r
  52. end
  53. raise ArgumentError if base.class != Integer || base <= 1
  54. return [0] if v == 0
  55. r = []
  56. while v > 0
  57. v, n = v.divmod(base)
  58. r << n
  59. end
  60. r
  61. end
  62. end
  63.  
  64. p a = 123.my_digits(2) #=> [1, 1, 0, 1, 1, 1, 1]
  65. p a.undigits(2) #=> 123
  66. p [1, 1, 0, 1, 'hoge'].to_i(2) #=> 11
  67.  
  68. p 12345.my_digits([24,60]) #=> [45, 13, 8]
  69. p 123456789.my_digits([24,60,60]) #=> [9, 33, 21, 1428]
  70. p [9,33,21,1428,'d h:m:s'].undigits([24,60,60]) #=> 123456789
  71. p [9,33,21,1428, 9,9,9,9].undigits([24,60,60]) #=> 123456789
  72. p [9,33].undigits([24,60,60]) #=> 1989
  73.  
Success #stdin #stdout 0s 6420KB
stdin
Standard input is empty
stdout
[1, 1, 0, 1, 1, 1, 1]
123
11
[45, 13, 8]
[9, 33, 21, 1428]
123456789
123456789
1989