diff options
| author | Luca Ferrari <fluca1978@gmail.com> | 2022-06-13 14:14:00 +0200 |
|---|---|---|
| committer | Luca Ferrari <fluca1978@gmail.com> | 2022-06-13 14:14:00 +0200 |
| commit | c2056becd5ab21a15782724cc2e6c8b55581f065 (patch) | |
| tree | ff0e226da1e100df187b2d3a54c8e6f6e6c0cadd | |
| parent | 15ed6cf0901328126ba9166a563511659ff0f821 (diff) | |
| download | perlweeklychallenge-club-c2056becd5ab21a15782724cc2e6c8b55581f065.tar.gz perlweeklychallenge-club-c2056becd5ab21a15782724cc2e6c8b55581f065.tar.bz2 perlweeklychallenge-club-c2056becd5ab21a15782724cc2e6c8b55581f065.zip | |
Task2 in plpgsql
| -rw-r--r-- | challenge-169/luca-ferrari/postgresql/ch-2.sql | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/challenge-169/luca-ferrari/postgresql/ch-2.sql b/challenge-169/luca-ferrari/postgresql/ch-2.sql new file mode 100644 index 0000000000..4c791bbab3 --- /dev/null +++ b/challenge-169/luca-ferrari/postgresql/ch-2.sql @@ -0,0 +1,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; |
