0

私は整数9、すなわち、、、、、、、、5を持っています。3 つの降順または昇順の整数のシーケンスが存在するインデックスを返したいと考えています。上記の例では、インデックスと. このためのルビーコードは何ですか?43167815

def seq
  array = [9,5,4,3,1,6,7,8]
  array.each_with_index |val, index| 
    if (val < (array[index + 1]).val < (array[index + 1]).val) 
     puts "#{index}"
     # Skip two indexes 
    end
end
4

3 に答える 3

0

質問が十分に明確ではないため。質問は、昇順または降順の連続する 3 つの数字を見つけることだと思います。満たされたシーケンスの長さが 3 より長い場合 ([2, 3, 4, 5] など)、0 と 1 を返します。

アルゴリズムはlist[index] - list[index - 1]次のとおりです。すべての要素に対して実行し、もう一度繰り返します。計算後の答えは、0 要素のインデックスになります。

直感的に、

original       9,  5,  4,  3,  1,  6,  7, 8
first pass    -4, -1, -1, -2,  5,  1,  1
2nd pass       3,  0, -1,  7,  4,  0  -> the answer will be the indexes of 0's, which is 1, 5

アルゴリズム:

lst = [9, 5, 4, 3, 1, 6, 7, 8]
lst1 = lst.each_cons(2).map{ |a, b| b-a }
lst2 = lst1.each_cons(2).map{ |a, b| b-a }
result = lst2.each_index.select{|i| lst2[i] == 0}

result = [1, 5]
于 2013-08-07T21:04:07.933 に答える
0

あなたのソリューションの背後にあるロジックはほぼ正しいと思いますが、構文は有効な Ruby からかなりかけ離れています。

以下は、(うまくいけば)かなり明白な、非常に冗長なソリューションのペアです。

numbers = [9, 6, 5, 4, 3, 1, 6, 7, 8]

# Find non-overlapping sets
i = 0
until i > numbers.length - 2
  a, b, c = numbers[i..i + 2]
  if (a - b == b - c) && (a - b).abs == 1
    puts "#{i} (#{a},#{b},#{c})"
    # Skip next two indexes
    i += 3
  else
    i += 1
  end
end

# Find overlapping sets (same solution, but don't skip indexes)
(0...numbers.length - 2).each do |i|
  a, b, c = numbers[i..i + 2]
  if (a - b == b - c) && (a - b).abs == 1
    puts "#{i} (#{a},#{b},#{c})"
  end
end
于 2013-08-07T21:04:22.353 に答える
0

を使用したソリューションは次のeach_cons(3).with_indexとおりです。

[9,5,4,3,1,6,7,8].each_cons(3).with_index.select { |s, i| s[0] < s[1] && s[1] < s[2] }.map(&:last)
于 2013-08-07T21:07:23.773 に答える