aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Ferrari <fluca1978@gmail.com>2022-06-13 14:14:00 +0200
committerLuca Ferrari <fluca1978@gmail.com>2022-06-13 14:14:00 +0200
commitc2056becd5ab21a15782724cc2e6c8b55581f065 (patch)
treeff0e226da1e100df187b2d3a54c8e6f6e6c0cadd
parent15ed6cf0901328126ba9166a563511659ff0f821 (diff)
downloadperlweeklychallenge-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.sql54
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;