diff options
| author | Luca Ferrari <fluca1978@gmail.com> | 2023-05-08 11:10:31 +0200 |
|---|---|---|
| committer | Luca Ferrari <fluca1978@gmail.com> | 2023-05-08 11:52:13 +0200 |
| commit | a6a67dc89ec8bd9cc6a008e1dc953b57778c265a (patch) | |
| tree | c149ca029e310a3ab786a0ceb8a68a14bbf03f98 /challenge-216/luca-ferrari/postgresql/ch-2.sql | |
| parent | aa4c667437e5674d217fc9f008ad2430a3caece1 (diff) | |
| download | perlweeklychallenge-club-a6a67dc89ec8bd9cc6a008e1dc953b57778c265a.tar.gz perlweeklychallenge-club-a6a67dc89ec8bd9cc6a008e1dc953b57778c265a.tar.bz2 perlweeklychallenge-club-a6a67dc89ec8bd9cc6a008e1dc953b57778c265a.zip | |
Task 2 plpgsql done
Diffstat (limited to 'challenge-216/luca-ferrari/postgresql/ch-2.sql')
| -rw-r--r-- | challenge-216/luca-ferrari/postgresql/ch-2.sql | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/challenge-216/luca-ferrari/postgresql/ch-2.sql b/challenge-216/luca-ferrari/postgresql/ch-2.sql new file mode 100644 index 0000000000..ceca3277e2 --- /dev/null +++ b/challenge-216/luca-ferrari/postgresql/ch-2.sql @@ -0,0 +1,67 @@ +-- +-- Perl Weekly Challenge 216 +-- Task 2 +-- +-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-216/> +-- + +CREATE SCHEMA IF NOT EXISTS pwc216; + +CREATE OR REPLACE FUNCTION +pwc216.task2_plpgsql( word text, stickers text[] ) +RETURNS TABLE ( sticker text, run int, letter text ) +AS $CODE$ +DECLARE + cl text; + current_sticker text; + m int; +BEGIN + CREATE TEMPORARY TABLE IF NOT EXISTS letters( l text, c int DEFAULT 1, s text ); + TRUNCATE letters; + + INSERT INTO letters( l, c ) + SELECT ll, count(*) + FROM regexp_split_to_table( word, '' ) ll + GROUP BY ll; + + FOUND := true; + run := 0; + WHILE FOUND LOOP + run := run + 1; + + PERFORM count(*) + FROM letters + WHERE c > 0; + + IF NOT FOUND THEN + RETURN; + END IF; + + FOR cl IN SELECT l FROM letters WHERE c > 0 LOOP + FOREACH current_sticker IN ARRAY stickers LOOP + SELECT count(*) + INTO m + FROM regexp_split_to_table( current_sticker, '' ) s + WHERE s = cl; + + + IF m <= 0 THEN + CONTINUE; + END IF; + + UPDATE letters + SET c = c - m + , s = s || ', ' || current_sticker; + + sticker := current_sticker; + letter := cl; + + RETURN NEXT; + EXIT; + END LOOP; + END LOOP; + END LOOP; + +END +$CODE$ +LANGUAGE plpgsql; |
