Rya*_*ery 15 ruby math numerical
我想生成一系列字母,即"A","DE""GJE"等,对应一个数字.前26个很容易,因此3返回"C",26返回"Z",27返回"AA",28"AB",依此类推.
我无法弄清楚的是如何做到这一点,它将处理传入的任何数字.所以如果我传入4123我应该回到3个字母的组合,因为(26*26*26)允许最多+17,000种组合.
有什么建议?
saw*_*awa 13
class Numeric
Alph = ("a".."z").to_a
def alph
s, q = "", self
(q, r = (q - 1).divmod(26)); s.prepend(Alph[r]) until q.zero?
s
end
end
3.alph
# => "c"
26.alph
# => "z"
27.alph
# => "aa"
4123.alph
# => "fbo"
Run Code Online (Sandbox Code Playgroud)
Dex*_*Dex 12
对@sawa原始回答的问题进行了调整,因为我无法让他按原样运行:
class Numeric
Alpha26 = ("a".."z").to_a
def to_s26
return "" if self < 1
s, q = "", self
loop do
q, r = (q - 1).divmod(26)
s.prepend(Alpha26[r])
break if q.zero?
end
s
end
end
Run Code Online (Sandbox Code Playgroud)
在这里它从字符串到整数反向:
class String
Alpha26 = ("a".."z").to_a
def to_i26
result = 0
downcased = downcase
(1..length).each do |i|
char = downcased[-i]
result += 26**(i-1) * (Alpha26.index(char) + 1)
end
result
end
end
Run Code Online (Sandbox Code Playgroud)
用法:
1234567890.to_s26
# => "cywoqvj"
"cywoqvj".to_i26
# => 1234567890
1234567890.to_s26.to_i26
# => 1234567890
"".to_i26
# => 0
0.to_s26
# => ""
Run Code Online (Sandbox Code Playgroud)
字符串确实有一个succ方法,因此它们可以在Range中使用."Z"的后继者恰好是"AA",所以这有效:
h = {}
('A'..'ZZZ').each_with_index{|w, i| h[i+1] = w }
p h[27] #=> "AA"
Run Code Online (Sandbox Code Playgroud)