challenge 急勾配の判定

有限の長さの数列で,各要素の値が,その要素の後ろにある残りの列に含まれるすべての要素の和よりも大きい列を「急勾配の列」ということにします(空列の和は0とします).

任意の長さ(ただし有限の長さの)数列を与えられたとき,それが「急勾配の列」であるかどうかを判定する述語関数を定義してください.

必須ではありませんが,効率についてコメントがあれば面白いかもしれませんね.

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 "

Index

Feed

Other

Link

Pathtraq

loading...