challenge 急勾配の判定

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

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

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

Posted feedbacks - SQL

SQL Server 2008 で確認しました。 SQL で関数というと、ストアドファンクションとかになると思うんですけど、入力に対して出力がありさえすれば関数と言うことで、SELECT オンリーで書いてみました。

肝心のロジック部分は、もっといいやり方はあると思います。 3段階SELECTがネストしてるんで、効率は・・・

 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
WITH
  Input(i, n) AS (
    SELECT 1, 100
    UNION ALL
    SELECT 2, 50
    UNION ALL
    SELECT 3, 10
  )
, HeavySlopes(col) AS (
    SELECT
        1
    FROM
        Input P
    WHERE
        EXISTS(
          SELECT * FROM Input C
          WHERE P.i < C.i AND P.n > (SELECT SUM(GC.n) FROM Input GC WHERE P.i < GC.i)
        )
  )
, IsHeavySlope(result) AS (
    SELECT
        CASE (SELECT COUNT(*) FROM Input)
        WHEN COUNT(*) + 1 THEN 1
                          ELSE 0
        END
    FROM
        HeavySlopes
  )
SELECT * FROM IsHeavySlope

Index

Feed

Other

Link

Pathtraq

loading...