2

if/else ステートメントを使用せずに、桁数の異なる数字を含む文字列を分割する方法があるかどうかを調べようとしています。そうするための完全な方法はありますか。文字列の例を次に示します。

"123456789101112131415161718192021222324252627282930"

最初に配列を 1 桁に分割し、それを分離し、9 を見つけ、9 の後の 2 つの要素ごとに組み合わせることを繰り返すことなく、1-9 と 10-30 を含む配列に分割されるようにします。

明確にするためにこれを行う現在の方法は次のとおりです。

single_digits, double_digits = [], []
string = "123456789101112131415161718192021222324252627282930".split('')

single_digits << string.slice!(0,9)
single_digits.map! {|e| e.to_i}
string.each_slice(2) {|num| double_digits << num.join.to_i}

これは私に与えるでしょう:

single_digits = [1,2,3,4,5,6,7,8,9]
double_digits = [10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]
4

3 に答える 3

1

すべての数値がその前の数値よりも大きく、0 よりも大きく、1 桁から最大までの数値の長さが少なくとも 1 回は表されることが確実である限り、次のように記述できます。

def split_numbers(str)
  numbers = []
  current = 0
  str.each_char do |ch|
    current = current * 10 + ch.to_i
    if numbers.empty? or current > numbers.last
      numbers << current
      current = 0
    end
  end
  numbers << current if current > 0
  numbers
end

p split_numbers('123456789101112131415161718192021222324252627282930')

出力

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]

アノンの例で192837453572は、

[1, 9, 28, 37, 45, 357, 2]
于 2013-07-21T00:33:06.537 に答える
0

文字列の各文字を調べて、9 が見つかるまで 1 つの「数字」を収集し (制御値を設定して 1 ずつ増やします)、2 つの連続する 9 が見つかるまで 2 桁の収集を続けます。

これは、例の文字列などの数値のシーケンスを処理するために記述できます。

于 2013-07-20T23:45:52.320 に答える
0

あなたはこれを行うことができます:

str = "123456789101112131415161718192021222324252627282930"

result = str[0..8].split('').map {|e| e.to_i }
result += str[9..-1].scan(/../).map {|e| e.to_i }

それは本質的にあなたのものと同じ解決策ですが、少しきれいです(数字のペアを組み合わせる必要はありません)。しかし、ええ、任意の長さの文字列(2桁以上を含む)に対する一般化可能なソリューションが必要な場合、それはあなたが求めているように見えるものとは異なる質問です。

更新

簡単で一般化できる解決策がありそうな気がするので、この疑問が頭から離れませんでした。だからここに私の試みがあります。基本的な考え方は、文字列から切り出したい数字が何桁であるかを知るために、カウンターを保持することです。

str = "123456789101112131415161718192021222324252627282930"

result = []
i = 1
done = str.length < 1
str_copy = str

while !done do
  result << str_copy.slice!(0..i.to_s.size-1).to_i
  done = true if str_copy.size == 0
  i += 1
end

puts result

これにより、目的の出力が生成され、1 から始まる連続した正の整数の文字列に一般化できます。これに対する他の人々の改善を見てみたいと思います。非常に簡潔ではありません。

于 2013-07-20T23:52:05.247 に答える