2014-05-06 31 views
0

我想將一個字符串拆分爲三個數組,如所示,需要的輸出爲。使用Array#each_slice這樣1_223_213_213.to_s.split('').each_slice(3){|arr| p arr }使用each_slice從字符串結尾開始分割輸入?

Current output:     Desired output 
# ["1", "2", "2"]    # ["0", "0", "1"] 
# ["3", "2", "1"]    # ["2", "2", "3"] 
# ["3", "2", "1"]    # ["2", "1", "3"] 
# ["3"]       # ["2", "1", "3"] 

必須從(0..trillion)號工作。我在下面發佈了我的解決方案作爲答案。希望大家可以給我一些建議來優化或替代實現?

+0

「給我的代碼」沒有嘗試的解決方案。 – maerics

+0

@maerics我發佈了我的解決方案。見答案。這是「餵我的代碼」,而不是「給我的代碼」;) – fyz

+0

好的交易,謝謝你。通常,您直接在您的問題中發佈您嘗試的解決方案,以免人們認爲您要求他人爲您完成工作;-) – maerics

回答

2

您可能會發現這一點更令人高興的眼睛:

def slice_by_3(n) 
    n = n.to_s 
    l = n.length 
    [*n.rjust(l % 3 == 0 ? l : l + 3 - l % 3, '0').chars.each_slice(3)] 
end 

slice_by_3 2_123_456_544_545_355 
=> [["0", "0", "2"], 
    ["1", "2", "3"], 
    ["4", "5", "6"], 
    ["5", "4", "4"], 
    ["5", "4", "5"], 
    ["3", "5", "5"]] 

或者,如果你想要一個更通用的解決方案:

def slice_by_n(num, n=3) 
    num = num.to_s 
    l = num.length 
    [*num.rjust(l % n == 0 ? l : l + n - l % n, '0').chars.each_slice(n)] 
end 
+0

要計算填充大小,您應該檢查'l'是否是3的倍數,否則是'9 + 3 - 9%3#=> 12'。 – toro2k

+0

@ toro2k良好的發現,現在編輯 – wvandaal

+0

@wvandaal您回答最快,您的解決方案比較優雅,而且與其他一些答案相比實際上效果更好。謝謝。 – fyz

0

下面是這個問題的一個可能的解決方案:

def slice_by_3 number 
    initial_number = number.to_s.split('').size 
    number = "00#{number}" if initial_number == 1 
    modulus = number.to_s.split(/.{3}/).size 
    padleft = '0' * ((modulus*3) % number.to_s.split('').size) 
    ("#{padleft}#{number}").split('').each_slice(3){|arr| p arr } 
end 

slice_by_3 2_123_456_544_545_355 
# ["0", "0", "2"] 
# ["1", "2", "3"] 
# ["4", "5", "6"] 
# ["5", "4", "4"] 
# ["5", "4", "5"] 
# ["3", "5", "5"] 

只是看起來有點複雜,我想相信有一個更好的辦法。感謝您的反饋。

4

嘗試左填充用零,直到字符串長度是你的「切片」目標的偶數倍:

def slice_with_padding(s, n=3, &block) 
    s = "0#{s}" while s.to_s.size % n != 0 
    s.to_s.chars.each_slice(n, &block) 
end 

slice_with_padding(1_223_213_213) { |x| puts x.inspect } 
# ["0", "0", "1"] 
# ["2", "2", "3"] 
# ["2", "1", "3"] 
# ["2", "1", "3"] 

slice_with_padding(12_345, 4) { |x| puts x.inspect } 
# ["0", "0", "0", "1"] 
# ["2", "3", "4", "5"] 
0

這裏有幾種方法

n = 1_223_213_213.to_s 
n.rjust(n.size + n.size % 3,"0").chars.each_slice(3).to_a 

OR

n.rjust(15,"0").chars.each_slice(3).drop_while{|a| a.join == "000"} 

15是因爲你說的最多是一個萬億明顯,因爲它拒絕任何包含全零,因此任何數量比15大於是整除的所有結果這個數字意味着很少3將努力爲您例如

+1

只是一個說明:1_223_213_213不是字符串 – BroiSatse

+0

@BroiSatse好了改變了我的答案。 – engineersmnky

0

另一種方式:

def split_nbr(n) 
    str = n.to_s 
    len = str.size 
    str.rjust(len + (3-len%3)%3, '0').scan(/.../).map(&:chars) 
end 

split_nbr( 1_223_213_213) 
    #=> [["0", "0", "1"], ["2", "2", "3"], ["2", "1", "3"], ["2", "1", "3"]] 
split_nbr(11_223_213_213) 
    #=> [["0", "1", "1"], ["2", "2", "3"], ["2", "1", "3"], ["2", "1", "3"]] 
split_nbr(111_223_213_213) 
    #=> [["1", "1", "1"], ["2", "2", "3"], ["2", "1", "3"], ["2", "1", "3"]] 
+2

只是說明:'1_223_213_213'不是一個字符串。 – BroiSatse

+0

@BroiSatse,謝謝,哈!我很習慣在我的大腦剛添加的SO問題中看到沒有引號的字符串。我看到我並不孤單。我糾正了我的答案。 –

0
def slice_by_3 number 
    "000#{number}".split('').reverse 
    .each_slice(3).to_a[0..-2].reverse 
    .each { |arr| p arr.reverse } 
end 

slice_by_3 13_456_544_545_355 
# ["0", "1", "3"] 
# ["4", "5", "6"] 
# ["5", "4", "4"] 
# ["5", "4", "5"] 
# ["3", "5", "5"] 

此代碼在將數字開頭添加3個零後反轉整個數組。 each_slice(3)然後根據數字的原始長度切片到適當的組(儘管相反)加上由["0","0","0"],["0","0"]["0"]組成的組。

[0..-2]削減最後一組零。然後將這些組倒轉回來,並且打印每個組(反轉回)。

相關問題