aboutsummaryrefslogtreecommitdiff
path: root/challenge-191/luca-ferrari/postgresql/ch-2.sql
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-191/luca-ferrari/postgresql/ch-2.sql')
-rw-r--r--challenge-191/luca-ferrari/postgresql/ch-2.sql71
1 files changed, 71 insertions, 0 deletions
diff --git a/challenge-191/luca-ferrari/postgresql/ch-2.sql b/challenge-191/luca-ferrari/postgresql/ch-2.sql
new file mode 100644
index 0000000000..7b4755b34c
--- /dev/null
+++ b/challenge-191/luca-ferrari/postgresql/ch-2.sql
@@ -0,0 +1,71 @@
+-- Perl Weekly Challenge 191
+-- Task 2
+
+CREATE SCHEMA IF NOT EXISTS pwc191;
+
+CREATE OR REPLACE FUNCTION
+pwc191.task2_plpgsql( n int )
+RETURNS int
+AS $CODE$
+DECLARE
+ cute_counter int := 0;
+ i int;
+ src int[];
+ permutation int[];
+ is_cute bool;
+BEGIN
+
+ FOR i IN 1 .. n LOOP
+ src = src || i;
+ END LOOP;
+
+
+
+ FOR permutation IN
+ with recursive
+ data as (select src as arr),
+ keys as (select generate_subscripts(d.arr, 1) as rn from data d),
+ cte as (
+ select d.arr initial_arr, array[d.arr[k.rn]] new_arr, array[k.rn] used_rn
+ from data d
+ cross join keys k
+ union all
+ select initial_arr, c.new_arr || c.initial_arr[k.rn], used_rn || k.rn
+ from cte c
+ inner join keys k on not (k.rn = any(c.used_rn))
+ )
+ select new_arr
+ from cte
+ WHERE array_length( new_arr, 1 ) = n
+ LOOP
+
+ is_cute := 1;
+ FOR i IN 1 .. array_length( permutation, 1 ) LOOP
+ IF permutation[i] % i <> 0 THEN
+ is_cute = false;
+ EXIT;
+ END IF;
+ END LOOP;
+
+ IF is_cute THEN
+ cute_counter := cute_counter + 1;
+ END IF;
+
+ is_cute := 1;
+ FOR i IN 1 .. array_length( permutation, 1 ) LOOP
+ IF i % permutation[i] <> 0 THEN
+ is_cute = false;
+ EXIT;
+ END IF;
+ END LOOP;
+ IF is_cute THEN
+ cute_counter := cute_counter + 1;
+ END IF;
+
+ END LOOP;
+
+
+RETURN cute_counter;
+END
+$CODE$
+LANGUAGE plpgsql;