aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-144/luca-ferrari/postgresql/ch-2.sql52
1 files changed, 52 insertions, 0 deletions
diff --git a/challenge-144/luca-ferrari/postgresql/ch-2.sql b/challenge-144/luca-ferrari/postgresql/ch-2.sql
new file mode 100644
index 0000000000..0fa2b07521
--- /dev/null
+++ b/challenge-144/luca-ferrari/postgresql/ch-2.sql
@@ -0,0 +1,52 @@
+CREATE OR REPLACE FUNCTION f_ulam_do_sum( ulam int[] )
+RETURNS SETOF int
+AS $CODE$
+DECLARE
+ left_index int;
+ right_index int;
+BEGIN
+
+ FOR left_index IN 1 .. array_length( ulam, 1 ) LOOP
+ FOR right_index IN left_index + 1 .. array_length( ulam, 1 ) LOOP
+ RETURN NEXT ulam[ left_index ] + ulam[ right_index ];
+ END LOOP;
+ END LOOP;
+
+ RETURN;
+END
+$CODE$
+LANGUAGE plpgsql;
+
+
+CREATE OR REPLACE FUNCTION f_ulam( u int, v int, lim int default 10 )
+RETURNS int[]
+AS $CODE$
+DECLARE
+ ulam int[];
+ next_value int;
+BEGIN
+-- PERFORM array_append( ulam, u );
+-- PERFORM array_append( ulam, v );
+-- PERFORM array_append( ulam, u + v );
+
+
+ ulam := ulam || u || v || u + v;
+
+ WHILE array_length( ulam, 1 ) < lim LOOP
+
+ SELECT vv
+ INTO next_value
+ FROM f_ulam_do_sum( ulam ) AS sums( vv )
+ WHERE vv > ulam[ array_length( ulam, 1 ) ]
+ GROUP BY 1
+ HAVING COUNT( * ) = 1
+ ORDER BY vv
+ LIMIT 1;
+
+ ulam := ulam || next_value;
+ END LOOP;
+
+ RETURN ulam;
+END
+$CODE$
+LANGUAGE plpgsql;