Techioz Blog

配列のすべての要素の方向が交互になっているかどうかを確認する

概要

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