diff options
| -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; |
