急勾配の判定
Posted feedbacks - Groovy
コードは素直に書いてみました。たぶんO(n)のはず。OO的述語関数の表現としてbooleanの読み取り専用プロパティにしてみました。
動作確認は以下のようにしています。
>|groovy|
assert [].is急勾配()
assert [0].is急勾配()
assert [1,0].is急勾配()
assert ! [0,1].is急勾配()
assert [4,2,1].is急勾配()
assert ! [3,2,1].is急勾配()
||<
1 2 3 4 5 | List.metaClass.is急勾配 = {->
delegate.size() <= 1?
true:
delegate[1..-1].is急勾配() && delegate[1..-1].sum() < delegate[0]
}
|

nobsun
#8891()
Rating1/1=1.00
有限の長さの数列で,各要素の値が,その要素の後ろにある残りの列に含まれるすべての要素の和よりも大きい列を「急勾配の列」ということにします(空列の和は0とします).
任意の長さ(ただし有限の長さの)数列を与えられたとき,それが「急勾配の列」であるかどうかを判定する述語関数を定義してください.
必須ではありませんが,効率についてコメントがあれば面白いかもしれませんね.
[ reply ]