假設我有一個大整數293649214912。
我想得到下一個結果:
[2936,9364,3649,6492。4921, 9214, 2149, 1491, 4912]
uj5u.com熱心網友回復:
使用Integer#digits和Enumerable的一些基本迭代方法可以很容易地完成:
def split_integer_into_sliding_groups_of_4_digits(n)>
n.
數字。
each_cons(4)。
地圖 do |arr|
arr.each_with_index.reduce(0) {|acc, (d, i)| acc d * 10 ** i }
end
end end
作為一個替代方案,也可以通過字串操作來完成:
def split_integer_into_sliding_groups_of_4_digits(n)
n.to_s.each_char.each_cons(4).map(&:join).map(&:to_i)
end。
或者兩者的混合:
def split_integer_into_sliding_groups_of_4_digits(n)
n.digits.reverse.each_cons(4).map(&:join).map(&:to_i)
end。
uj5u.com熱心網友回復:
人們可以將整數轉換為字串,并使用正則運算式與String#gsub或String#scan。
str = 293649214912.to_s
#=> "293649214912"。
r = /(?=(d{4}))/
str.gsub(r).map { $1.to_i }
#=> [2936, 9364, 3649, 6492, 4921, 9214, 2149, 1491, 4912]
這使用了String#gsub的形式,它需要一個引數(pattern)和沒有塊,回傳一個列舉器1,我已經把它鏈到Enumerable#map。
該正則運算式可以匹配一個零長度的字串(想想連續的數字之間的位置),只要該位置后面有四個數字。(?=(d{4}))是一個正向查找,它斷言匹配后緊跟四位數字。這四位數字不是回傳的匹配的一部分。這四個數字被保存在捕獲組1中,所以它們可以在塊中被檢索。區塊變數_持有一個空字串(匹配)。我使用了一個下劃線來表示它沒有被用于區塊計算中(一個常見的慣例)。
另外,
scan可以使用相同的正則運算式。2
str.scan(r).map { |(s)| s.to_i }
#=> [2936, 9364, 3649, 6492, 4921, 9214, 2149, 1491, 4912]
回顧一下scan是如何處理捕獲組的。"如果模式包含組,每個單獨的結果本身就是一個陣列,每個組包含一個條目。"
注意:
<注意:
str.scan(r)
#=> [["2936"], ["9364"], ["3649"], ["6492"], ["4921"],/span>
# ["9214"], ["2149"], ["1491"], ["4912"]]
如果選擇堅持使用整數,這里是@Allan的答案的一個變體,當他的引數n等于4時:
def construct(n)
loop.with_object([]) do |_,arr|
arr.unshift(n % 10_000)
n /= 10
break arr if n < 1_000 >。
end
end end
construct(293649214912)
#=> [2936, 9364, 3649, 6492, 4921, 9214, 2149, 1491, 4912]
這使用了Kernel#loop的形式,它不接受一個塊,并回傳一個列舉器。我把這個列舉器鏈到Enumerator#with_object.
。1.這種形式的 2.這可以寫成 uj5u.com熱心網友回復: 下面是通過字串操作來實作的: 和一個整數版本:
標籤:gsub與字串替換無關:列舉器str.gsub(r)只是生成匹配。
str.scan(r).map { |a| a.first.to_i }。def split_n(i, n)
s = i.to_s
return s.length < n ?
[] :
(0...s.length-n).map { |i| s.slice(i, n).to_i }
end
結束。
def split_n(i, n)
mask = 10**n
limit = 10**(n-1)
r = []
while i > limitdo
r.unshift(i % mask)
i /=10
結束。
return r
end end
