2017-10-30 4 views
0

私の問題は、配列の終わりに達するまで、アイテムの配列全体を反復し、 1つのアイテムだけがアレイに残るまで前後に移動します。1つだけが残るまで配列内の他のすべてのアイテムを削除する

例えば:1,2,3,4,5、1,3,5になると、その後

3は、私は別の配列を作成したので、私は、元の配列から削除されるべきではないことを理解するであろうことサイズを減らしながら他のアイテムを1つだけ保持しますが、それを動作させて無限ループに終わらせることはできません。

arr=*(1..10) 
s_arr=[] 
until s_arr.length==1 
i=0 
    while i<arr.length 
    s_arr.push(arr[i]) 
    i+=2 
end 
    arr=s_arr.reverse 
    s_arr=arr 
end 

ありがとうございます。

+0

'arr = *(1..10)'の出力は? '(0 ... arr.size).each {| index | [index、-index] .each {| el | arr.delete_at el}} '仕事? –

+0

'[1、2、3、4、5、6、7、8]'の出力はどうなりますか? –

+0

こんにちはセバスチャンこの行arr = *(1..10)は、任意の配列で置き換えられます。arr = [2,21,1,5,6,12,100,9,17] この配列でコードを実行した後私は2つの要素が残っています => [6、9] そして私はただ一つで終わる必要があります。何かご意見は? コード内の-indexはどのように機能しますか?私は前にマイナスで使ったことはありません。おかげさまで – Borris

答えて

0
arr=*(1..10) 

s_arr=[] 

until s_arr.length == 1 
    i=0 
    while i < arr.length 
    s_arr.push(arr[i]) 
    i+=2 
    end 

    arr=s_arr.reverse 

    if s_arr.length != 1 
    s_arr=[] 
    end 

end 

問題は、s_arr配列をarrと同じに設定していました。次に、それが1に達したときに停止するように指示するために条件を追加する必要があります。そうしないと、代わりに0になります。

EDIT:

arr=*(1..10) 

s_arr=[] 

until s_arr.length == 1 
    s_arr = [] 
    i=0 
    while i < arr.length 
    s_arr.push(arr[i]) 
    i+=2 
    end 
    arr=s_arr.reverse 
end 

より良いソリューションを提供します。

+1

ありがとう。素晴らしい解決策。したがって、s_arr.length!= 1の場合に条件/を追加することによって、長さが1に達するとすぐにループが解除されることを確認します。 – Borris

+0

はい。おそらく、i = 0のs_arrを移動することもできます。 – jackneedshelp

+0

私はこのサイトの人々の半分を理解していない、男は彼のコードでヘルプを求め、彼は完全に他の何かを作成するのに役立たない。 – jackneedshelp

0

あなたはルビーコンソール上でこれを試してみてくださいRubyのパワーの

result = [] 
array.each_with_index {|val,idx| result << val if (idx % 2 == 0)} 
+1

インデックスが偶数の要素の配列を返すだけで問題を誤解していると思います。直接関係はありませんが、コードを 'array.select.with_index {| val、idx | idx.even? } '。 –

+0

@CarySwovelandあなたの訂正を感謝し、私はあなたの提案が好きです –

0

を活用することができますので、このような何かを試してみてください。

arr=*(1..10) 

x = (Math::log(arr.length)/Math::log(3)).to_i 

3**x 
+0

これは何か数学的正当な理由があれば、それは全く動作します。 – Max

+0

クローズフォームソリューションを導出しようとするあなたの試みに感心しますが、これは正しくありません。たとえば、 'arr = [1,2,3,4,5]; x =(Math :: log(arr.length)/ Math :: log(3))。to_i#1; 3 ** x#=> 3 'となる。後で、最初の(左 - 右)パスの後に '[1,3,5]'を、次に二番目(右から左へ)のパスの後に '' 1,5 ''を、そして最後に '[1]' 。 –

1

各繰り返し、他のすべての要素にバージョンを持つ配列を置き換えます落ちた

arr = *(1..10) 

while arr.length > 1 
    arr = arr.select.with_index { |_, i| i % 2 == 0 }.reverse 
end 

これはあなたの例と一致しませんが、あなたの例は一貫しています。 [1,2,3,4,5]が[1,3,5]になる場合、[3]ではなく[1,5]にする必要があります。

+0

あなたは絶対に正しいです。私は誤算した。アンダースコアを説明してください。私はそれが気にしない変数を表していますが、i%2 == 0の偶数をすでに取り除いているときは、ここでどのように適用されますか? – Borris

+0

'.select.with_index'は2つの引数、つまり配列の要素とそのインデックスを渡します。インデックスを使用して保持する要素を決定するだけなので、最初の引数は無視されます。 – Max

1

これは@ Maxの答えと似ていますが、再帰的に実装されています。

def last_one_standing(arr) 
    return arr.first if arr.size == 1 
    last_one_standing arr.select.with_index { |_,i| i.even? }.reverse 
end 

(1..16).each { |i| puts "1..%d: %d" % [i, last_one_standing((1..i).to_a)] } 
1..1: 1 
1..2: 1 
1..3: 3 
1..4: 3 
1..5: 1 
1..6: 1 
1..7: 3 
1..8: 3 
1..9: 9 
1..10: 9 
1..11: 11 
1..12: 11 
1..13: 9 
1..14: 9 
1..15: 11 
1..16: 11  
関連する問題