aboutsummaryrefslogtreecommitdiff
path: root/challenge-198/james-smith/perl/ch-1.pl
blob: 2f6c10f2a2d97e758997f3949962aac6fb6dd87c (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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/usr/local/bin/perl

use strict;
use warnings;
use feature qw(say);
use Test::More;
use Benchmark qw(cmpthese timethis);

my @TESTS = (
  [ [2,5,8,1                         ], 2 ],
  [ [3                               ], 0 ],
  [ [1..9,21..25, map { 2*$_ } 5..10 ], 5 ],
  [ [(1) x 10                        ], 9 ],
  [ [ 1..10                          ], 9 ],
  [ [ 2.9 , 3..10                    ], 7],
  [ [ 1..8,8.1                       ], 7],
  [ [ 1, 3..10                       ], 1 ],
  [ [ 1..8, 10                       ], 1 ],
  [ [ 1..999, 1001                   ], 1 ],
  [ [ 1..999, 999.1                  ], 998 ],
);

is( max_gap_sort(    @{$_->[0]} ), $_->[1] ) for @TESTS;
is( max_gap_nosort(  @{$_->[0]} ), $_->[1] ) for @TESTS;
is( max_gap_nosort_faster(  @{$_->[0]} ), $_->[1] ) for @TESTS;
done_testing();

cmpthese( -2, {
  'sort'   => sub { max_gap_sort(   @{$_->[0]} ) for @TESTS }, # 1700/s
  'nosort' => sub { max_gap_nosort( @{$_->[0]}) for @TESTS },  # 3535/s
  'nosort_faster' => sub { max_gap_nosort_faster( @{$_->[0]}) for @TESTS },  # 3535/s
} );

sub max_gap_sort {
  return 0 unless $#_;
  @_ = sort { $a <=> $b } @_;
  my $p = shift;
  @_ = sort { $b <=> $a } map { ($_-$p,$p=$_)[0] } @_;
  $_[0]==$_[$_] || return $_ for 1..$#_;
  1*@_
}

sub max_gap_nosort {
  return 0 unless $#_;
  @_ = sort { $a <=> $b } @_;
  my($p,$b,$c)=(shift,0,0);
  $_-$p>$b ? ($b,$c)=($_-$p,1) : $_-$p==$b && $c++, $p=$_ for @_;
  $c;
}

sub max_gap_nosort_faster {
  return 0 unless $#_;
  my($p,$t,$c) = ($_[0]+1,0,0);
  $_-$p>$t ? ($t,$c)=($_-$p,1) : $_-$p==$t && $c++, $p=$_ for sort { $a<=>$b } @_;
  $c;
}