aboutsummaryrefslogtreecommitdiff
path: root/challenge-144/luca-ferrari/postgresql/ch-2.sql
blob: 0fa2b07521bb4b701720a2ebc61154a8879f6b37 (plain)
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
CREATE OR REPLACE FUNCTION f_ulam_do_sum( ulam int[] )
RETURNS SETOF int
AS $CODE$
DECLARE
        left_index int;
        right_index int;
BEGIN

        FOR left_index IN 1 .. array_length( ulam, 1 ) LOOP
            FOR right_index IN left_index + 1 .. array_length( ulam, 1 ) LOOP
                RETURN NEXT ulam[ left_index ] + ulam[ right_index ];
            END LOOP;
        END LOOP;

        RETURN;
END
$CODE$
LANGUAGE plpgsql;


CREATE OR REPLACE FUNCTION f_ulam( u int, v int, lim int default 10 )
RETURNS int[]
AS $CODE$
DECLARE
        ulam int[];
        next_value int;
BEGIN
--        PERFORM array_append( ulam, u );
--        PERFORM array_append( ulam, v );
--        PERFORM array_append( ulam, u + v );


        ulam := ulam || u || v || u + v;

        WHILE array_length( ulam, 1 ) < lim LOOP

              SELECT vv
              INTO next_value
              FROM f_ulam_do_sum( ulam ) AS sums( vv )
              WHERE vv > ulam[ array_length( ulam, 1 ) ]
              GROUP BY 1
              HAVING COUNT( * ) = 1
              ORDER BY vv
              LIMIT 1;

              ulam := ulam || next_value;
        END LOOP;

        RETURN ulam;
END
$CODE$
LANGUAGE plpgsql;