aboutsummaryrefslogtreecommitdiff
path: root/challenge-159/luca-ferrari/postgresql/ch-1.plperl
blob: f14fe72613a6f039bcbcc4cde48adfca1e5eb9f4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
CREATE SCHEMA IF NOT EXISTS pwc159;

CREATE OR REPLACE FUNCTION
pwc159.farey( int )
RETURNS SETOF text
AS $CODE$
   my ($n) = @_;

   my %farey;

   for my $denominator ( 2 .. $n ) {
       for my $number ( 1 .. $denominator ) {

           # reduce things like 2/4 to 1/2
          ( $denominator, $number ) /= $number       if ( $denominator % $number == 0 );
          ( $denominator, $number ) /= $denominator  if ( $number % $denominator == 0 );
           
           $farey{ $number/$denominator } = "$number/$denominator";
       }
   }

   # bootstrap
   return_next( '0/1' );

   my %unique_counter;
   for my $key ( sort keys( %farey ) ) {
       # ensure only one item is printed out
       $unique_counter{ $key }++;
       next if $unique_counter{ $key } > 1;
       next if $key == 1;  # last term in the sequence
       
       return_next( $farey{ $key } );
   }

   # end term
   return_next( '1/1' );
   return undef;
$CODE$
LANGUAGE plperl;