aboutsummaryrefslogtreecommitdiff
path: root/challenge-169/luca-ferrari/postgresql/ch-2.sql
blob: 4c791bbab36f5a38d00d6bb31d8f69f439eda489 (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
53
54
-- Perl Weekly Challenge 169
-- Task 2

CREATE SCHEMA IF NOT EXISTS pwc169;

CREATE OR REPLACE FUNCTION
pwc169.task2_plpgsql( n int DEFAULT 20 )
RETURNS SETOF INT
AS $CODE$
DECLARE
        i int;
        current_min int;
        current_gcd int;
        previous_gcd int;
BEGIN

        FOR i IN 1 .. 999999 LOOP

           WITH bag AS (
                SELECT f, count(*) AS counter
                FROM pwc169.compute_factors( i ) f
                GROUP BY f
           )
           SELECT min( counter )
           INTO current_min
           FROM bag
           ;

           IF current_min < 2 THEN
              CONTINUE;
           END IF;

           previous_gcd := -1;
           FOR current_gcd IN  SELECT count(f) FROM pwc169.compute_factors( i ) f GROUP BY f LOOP
               IF previous_gcd < 0 THEN
                  previous_gcd := current_gcd;
                  CONTINUE;
               END IF;

               previous_gcd := gcd( previous_gcd, current_gcd );
           END LOOP;

           IF previous_gcd = 1 THEN
              RETURN NEXT i;
              IF n = 0 THEN
                 RETURN;
              END IF;
              n := n - 1;
           END IF;
        END LOOP;
RETURN;
END
$CODE$
LANGUAGE plpgsql;