配列のすべての要素の方向が交互になっているかどうかを確認する
概要
Ruby では、配列のすべての要素の方向が交互になっているかどうか、つまり、先行要素と後続要素が各要素より大きいか小さいかをチェックする必要があります。
次の配列を指定すると、結果は示されているとおりになるはずです
[1,3,2,4,3] # => true
[3,2,4,3,5] # => true
[1,2,3,1,3]. # => false
[1,2,2,1,3]. # => false
次のコードを作成しました。これは機能するようですが、非常に理解しやすいものです。
array.each_cons(2) # get subsequent couple of items
.map {|a,b| b-a}. # get the difference between first and second
.map {|n| n <=> 0} # get the sign (-1/+1)
.each_cons(2) # get couple of signs
.map {|a,b| a+b} # sum each couple
.uniq == [0] # return true if all the couple are 0
チェックを簡素化する方法について何か提案はありますか?
解決策
def alternate_direction?(arr)
return true if arr.size < 3
arr.each_cons(3) do |prev, curr, succ|
return false unless (curr > prev && curr > succ) || (curr < prev && curr < succ)
end
true
end
さっそく印刷してみましょう
puts alternate_direction?([1,3,2,4,3]) # => true
puts alternate_direction?([3,2,4,3,5]) # => true
puts alternate_direction?([1,2,3,1,3]) # => false
puts alternate_direction?([1,2,2,1,3]) # => false