diff options
| author | 冯昶 <fengchang@novel-supertv.com> | 2023-02-06 18:29:49 +0800 |
|---|---|---|
| committer | 冯昶 <fengchang@novel-supertv.com> | 2023-02-06 18:29:49 +0800 |
| commit | 0f18fa3badcf6e6ddc58e793c868ce041054a496 (patch) | |
| tree | ad0b6ebe9b4b6b896475079163a282aec6b3fee3 /challenge-202/luca-ferrari/postgresql/ch-2.sql | |
| parent | b99b26aef8b033642ff3794f0fddf6deb3234b43 (diff) | |
| parent | f92e84261b474f81c014f4982268d6e2797b66d9 (diff) | |
| download | perlweeklychallenge-club-0f18fa3badcf6e6ddc58e793c868ce041054a496.tar.gz perlweeklychallenge-club-0f18fa3badcf6e6ddc58e793c868ce041054a496.tar.bz2 perlweeklychallenge-club-0f18fa3badcf6e6ddc58e793c868ce041054a496.zip | |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'challenge-202/luca-ferrari/postgresql/ch-2.sql')
| -rw-r--r-- | challenge-202/luca-ferrari/postgresql/ch-2.sql | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/challenge-202/luca-ferrari/postgresql/ch-2.sql b/challenge-202/luca-ferrari/postgresql/ch-2.sql new file mode 100644 index 0000000000..46efaf0434 --- /dev/null +++ b/challenge-202/luca-ferrari/postgresql/ch-2.sql @@ -0,0 +1,70 @@ +-- +-- Perl Weekly Challenge 202 +-- Task 2 +-- +-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-202/> +-- + +CREATE SCHEMA IF NOT EXISTS pwc202; + +CREATE OR REPLACE FUNCTION +pwc202.task2_plpgsql( l int[] ) +RETURNS SETOF int[] +AS $CODE$ +DECLARE + cur int; + lft int[]; + rgt int[]; + idx int; + iter int; + prev int; +BEGIN + + CREATE TEMPORARY TABLE IF NOT EXISTS pwc202 + ( lft int[], rgt int[], dim int DEFAULT 0 ); + TRUNCATE pwc202; + + + FOR idx IN 1 .. array_length( l, 1 ) - 1 LOOP + cur := l[ idx ]; + IF l[ idx + 1 ] > cur THEN + CONTINUE; + END IF; + + lft := NULL; + lft := array_append( lft, cur ); + FOR iter IN idx + 1 .. array_length( l, 1 ) - 1 LOOP + prev := lft[ array_length( lft, 1 ) ]; + IF l[ iter ] <= prev THEN + lft := array_append( lft, l[ iter ] ); + END IF; + EXIT WHEN l[ iter ] > prev; + END LOOP; + + rgt := NULL; + IF array_length( lft, 1 ) + idx <= array_length( l, 1 ) THEN + prev := l[ idx + array_length( lft, 1 ) ]; + rgt := array_append( rgt, prev ); + FOR iter IN array_length( lft, 1 ) + idx + 1 .. array_length( l, 1 ) LOOP + prev := rgt[ array_length( rgt, 1 ) ]; + IF l[ iter ] >= prev THEN + rgt := array_append( rgt, l[ iter ] ); + END IF; + EXIT WHEN l[ iter ] < prev; + END LOOP; + END IF; + + INSERT INTO pwc202 + VALUES( lft, rgt, array_length( lft, 1 ) + array_length( rgt, 1 ) ); + + + + END LOOP; + + RETURN QUERY SELECT array_cat( p.lft, p.rgt ) + FROM pwc202 p + ORDER BY dim DESC + LIMIT 1; +END +$CODE$ +LANGUAGE plpgsql; |
