2016-05-25 4 views
2

こんばんは、ハイ&ロー番号(ルビー)

私はCodewars上の問題を解決しようとしている:あなたは、スペースで区切られた数字の文字列を与えられているこの小さな割り当てで

を、最高と最低の番号を返す必要があります。

例:

high_and_low("1 2 3 4 5") # return "5 1" 
high_and_low("1 2 -3 4 5") # return "5 -3" 
high_and_low("1 9 3 4 -5") # return "9 -5" 

注:

すべての数字が有効なのInt32、それらを検証する必要はありませんです。 入力文字列には常に1つ以上の数字があります。 出力文字列は、1つのスペースで区切られた2つの数字でなければなりません。

私は以下の解決策を考え出しましたが、なぜメソッドが「-214 542」ではなく「542」しか返さないのか分かりません。私は#at、#shift、#popを使って同じ結果を試してみました。

紛失しているものがありますか?誰かが私を正しい方向に向けることを願っています。私はなぜこれが起こっているのか理解したいと思います。

def high_and_low(numbers) 
    numberArray = numbers.split(/\s/).map(&:to_i).sort 
    numberArray[-1] 
    numberArray[0] 
end 

high_and_low("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6") 

EDIT

また、私はこれを試み、失敗したテスト "無記号" を受信:ソートを使用して

def high_and_low(numbers) 
    numberArray = numbers.split(/\s/).map(&:to_i).sort 
    puts "#{numberArray[-1]}" + " " + "#{numberArray[0]}" 
end 
+0

ありがとうございました!私はその質問を編集した。宜しくお願いします。 –

+0

あなたが指定したフォームに結果を入れるには、@ Yuの提案の2番目のものに 'join( '')'をつけるだけです: 'numbers.split.minmax_by(&:to_i).join( '')# => "-214 542"、私はそれを配列として残しておくほうがおそらくもっと便利だと思います。 –

答えて

2

を関数はその本体内の最後の式の結果を返します。両方を配列として返すには:

def high_and_low(numbers) 
    numberArray = numbers.split(/\s/).map(&:to_i).sort 
    return numberArray[0], numberArray[-1] 
end 

puts high_and_low("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6") 
# => [-214, 542] 
+0

これは非常に役に立ちました。ありがとうございました! –

2

は大きな配列のために効率が悪いです。代わりに、Enumerable#minmaxを使用します。

numbers.split.map(&:to_i).minmax 
# => [-214, 542] 

それとも、文字列のままに結果を好きならEnumerable#minmax_byを使用します。return文を省略する場合

numbers.split.minmax_by(&:to_i) 
# => ["-214", "542"] 
+0

うわー、これは知っているととても良いことです。どうもありがとうございました! –