diff options
Diffstat (limited to 'challenge-159/luca-ferrari/postgresql/ch-1.sql')
| -rw-r--r-- | challenge-159/luca-ferrari/postgresql/ch-1.sql | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/challenge-159/luca-ferrari/postgresql/ch-1.sql b/challenge-159/luca-ferrari/postgresql/ch-1.sql index da8824c0c2..1ebd6c5112 100644 --- a/challenge-159/luca-ferrari/postgresql/ch-1.sql +++ b/challenge-159/luca-ferrari/postgresql/ch-1.sql @@ -1 +1,70 @@ -- Perl Weekly Challenge 159 + + +CREATE SCHEMA IF NOT EXISTS pwc159; + + +CREATE OR REPLACE FUNCTION +pwc159.farey_not_unique( n int ) +RETURNS TABLE( f text, v numeric ) +AS $CODE$ +DECLARE + numerator int; + denominator int; + dd int; + nn int; +BEGIN + + -- bootstrap term + SELECT '0/1', 0 + INTO f, v; + + RETURN NEXT; + + + FOR denominator IN 2 .. n LOOP + FOR numerator IN 1 .. denominator LOOP + nn := numerator; + dd := denominator; + + IF dd % nn = 0 THEN + dd := dd / nn; + nn := 1; + END IF; + + IF nn % dd = 0 THEN + nn := nn / dd; + dd := 1; + END IF; + + IF nn / dd = 1 THEN + CONTINUE; + END IF; + + SELECT nn || '/' || dd, nn/dd::numeric + INTO f, v; + + RETURN NEXT; + + END LOOP; + END LOOP; + + -- end term + SELECT '1/1', 1 + INTO f, v; + + RETURN NEXT; + +RETURN; +END +$CODE$ +LANGUAGE plpgsql; + + +WITH farey AS ( + SELECT distinct( f ), v + FROM pwc159.farey_not_unique( 5 ) + ORDER BY v +) +SELECT f +FROM farey; |
