From: "inopinatus (Joshua GOODALL) via ruby-core" Date: 2024-06-23T16:58:49+00:00 Subject: [ruby-core:118376] [Ruby master Feature#18762] Add an Array#undigits that compliments Integer#digits Issue #18762 has been updated by inopinatus (Joshua GOODALL). I'll speak up for this feature. Whilst writing a base58 encoder/decoder today, I was surprised by the lack of an inverse to Integer#digits. In my benchmarking the reduce/inject variant is considerably faster than the sum variant, especially when we get into bignum territory. However, for consistency with other conversions, `Integer(array, base)` should work too, as `Integer(string, base)` currently does. The latter is already special-cased, so that could be extended to handle an array even if the method above doesn't end up as `Array#to_i`. ---------------------------------------- Feature #18762: Add an Array#undigits that compliments Integer#digits https://bugs.ruby-lang.org/issues/18762#change-108888 * Author: shan (Shannon Skipper) * Status: Open ---------------------------------------- I've found Integer#digits convenient and useful but several times have needed to go from the place-value notation back to an Integer after manipulation and wished there was a complimentary Array#undigits. ``` ruby class Array def undigits(base = 10) each_with_index.sum do |digit, exponent| digit * base**exponent end end end 42.digits.undigits #=> 42 42.digits(16).undigits(16) #=> 42 ``` Below is my stab at a Ruby implementation with behavior mirroring Integer#digits. ``` ruby class Array def undigits(base = 10) base_int = base.to_int raise TypeError, "wrong argument type #{base_int.class} (expected Integer)" unless base_int.is_a?(Integer) raise ArgumentError, 'negative radix' if base_int.negative? raise ArgumentError, "invalid radix #{base_int}" if base_int < 2 each_with_index.sum do |digit, exponent| raise MathDomainError, 'out of domain' if digit.negative? digit * base_int**exponent end end end ``` -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/