急勾配の判定
Posted feedbacks - Smalltalk
Squeak Smalltalk で。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | "ナイーブに"
| 急勾配か? |
急勾配か? := [:配列 |
(1 to: 配列 size - 1) allSatisfy: [:順 | (配列 at: 順) > (配列 allButFirst: 順) sum]].
急勾配か? value: #(). "=> true "
急勾配か? value: #(1). "=> true "
急勾配か? value: #(0). "=> true "
急勾配か? value: #(32 16 8 4 2 1). "=> true "
急勾配か? value: #(32 15 8 4 2 1). "=> false "
"効率に配慮して"
| 急勾配か? |
急勾配か? := [:配列 |
[:exit |
(配列 size to: 1 by: -1) inject: 0 into: [:和 :順 |
| 要素 |
要素 := 配列 at: 順.
要素 > 和 ifFalse: [exit value]. 和 + 要素]
] valueWithExit notNil].
急勾配か? value: #(). "=> true "
急勾配か? value: #(1). "=> true "
急勾配か? value: #(0). "=> false "
急勾配か? value: #(32 16 8 4 2 1). "=> true "
急勾配か? value: #(32 15 8 4 2 1). "=> false "
|


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