diff options
| author | Luca Ferrari <fluca1978@gmail.com> | 2022-06-13 13:56:06 +0200 |
|---|---|---|
| committer | Luca Ferrari <fluca1978@gmail.com> | 2022-06-13 13:56:06 +0200 |
| commit | 15ed6cf0901328126ba9166a563511659ff0f821 (patch) | |
| tree | e45067d989586883e3fa1f8a27847a95c79c9331 | |
| parent | 55afa949e1500760e2fbc96f9f980ae551b3a30a (diff) | |
| download | perlweeklychallenge-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.sql | 98 |
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; |
