sub geometric { my @known = @_; my $prev = shift @known; my $curr = shift @known; return undef if ! $prev; my $factor = $curr / $prev; while ( @known ) { $prev = $curr; $curr = shift @known; return undef if ! $prev; return undef if $factor != $curr / $prev; } return $curr * $factor; } sub arith { my @known = @_; my $prev = shift @known; my $curr = shift @known; my $diff = $curr - $prev; while ( @known ) { $prev = $curr; $curr = shift @known; return undef if $diff != $curr - $prev; } return $curr + $diff; } sub series { my @known = @_; return undef if scalar @known < 2; my @next_gen = ( \&arith, \&geometric ); my @next = grep { defined } map { $_->( @known ) } @next_gen; return undef if scalar @next != 1; return $next[0]; }