aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Ferrari <fluca1978@gmail.com>2022-06-13 13:56:06 +0200
committerLuca Ferrari <fluca1978@gmail.com>2022-06-13 13:56:06 +0200
commit15ed6cf0901328126ba9166a563511659ff0f821 (patch)
treee45067d989586883e3fa1f8a27847a95c79c9331
parent55afa949e1500760e2fbc96f9f980ae551b3a30a (diff)
downloadperlweeklychallenge-club-15ed6cf0901328126ba9166a563511659ff0f821.tar.gz
perlweeklychallenge-club-15ed6cf0901328126ba9166a563511659ff0f821.tar.bz2
perlweeklychallenge-club-15ed6cf0901328126ba9166a563511659ff0f821.zip
Task 1 plpgsql
-rw-r--r--challenge-169/luca-ferrari/postgresql/ch-1.sql98
1 files changed, 98 insertions, 0 deletions
diff --git a/challenge-169/luca-ferrari/postgresql/ch-1.sql b/challenge-169/luca-ferrari/postgresql/ch-1.sql
new file mode 100644
index 0000000000..a2d04d97dc
--- /dev/null
+++ b/challenge-169/luca-ferrari/postgresql/ch-1.sql
@@ -0,0 +1,98 @@
+-- Perl Weekly Challenge 169
+-- Task 1
+
+CREATE SCHEMA IF NOT EXISTS pwc169;
+
+CREATE OR REPLACE FUNCTION
+pwc169.is_prime( n int )
+RETURNS bool
+AS $CODE$
+DECLARE
+ i int;
+BEGIN
+ FOR i IN 2 .. ( n - 1 ) LOOP
+ IF n % i = 0 THEN
+ RETURN FALSE;
+ END IF;
+ END LOOP;
+
+ RETURN TRUE;
+END
+$CODE$
+LANGUAGE plpgsql;
+
+
+CREATE OR REPLACE FUNCTION
+pwc169.compute_factors( n int )
+RETURNS SETOF INT
+AS $CODE$
+DECLARE
+ i int;
+BEGIN
+
+ FOR i IN 2 .. ( n - 1 ) LOOP
+ IF NOT pwc169.is_prime( i ) THEN
+ CONTINUE;
+ END IF;
+
+ WHILE n % i = 0 LOOP
+ RETURN NEXT i;
+ n = n / i;
+ END LOOP;
+ END LOOP;
+
+RETURN;
+END
+$CODE$
+LANGUAGE plpgsql;
+
+
+CREATE OR REPLACE FUNCTION
+pwc169.task1_plpgsql( n int DEFAULT 20 )
+RETURNS SETOF INT
+AS $CODE$
+DECLARE
+ i int;
+ f int;
+ current_length int := 0;
+ current_count int := 0;
+ ok bool := false;
+ previous_f int := 0;
+BEGIN
+
+ FOR i IN 2 .. 100000 LOOP
+
+ current_length := 0;
+ current_count := 0;
+ ok := true;
+ previous_f := 0;
+
+ FOR f IN SELECT * FROM pwc169.compute_factors( i ) ORDER BY 1 LOOP
+
+ current_count := current_count + 1;
+ IF current_length = 0 THEN
+ current_length := length( f::text );
+ END IF;
+
+ IF length( f::text ) <> current_length OR current_count > 2 OR f = previous_f THEN
+ ok := false;
+ EXIT;
+ END IF;
+
+ previous_f := f;
+ END LOOP;
+
+ IF ok AND previous_f <> 0 THEN
+
+ RETURN NEXT i;
+ IF n = 0 THEN
+ RETURN;
+ END IF;
+ n := n - 1;
+ END IF;
+ END LOOP;
+
+RETURN;
+END
+$CODE$
+LANGUAGE plpgsql;