-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsplit-sum.pl
More file actions
70 lines (57 loc) · 1.69 KB
/
split-sum.pl
File metadata and controls
70 lines (57 loc) · 1.69 KB
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
58
59
60
61
62
63
64
65
66
67
68
69
70
use Data::Dump qw(dump);
use Time::HiRes;
use Benchmark ':hireswallclock';
sub splitSum(@) {
my (@nums) = @{$_[0]};
my $totalLeft = 0;
my $totalRight = 0;
my $left = 0;
my $right = scalar(@nums) - 1;
# Empty array, or single element array.
if ($right < 1) {
return ( [ ], [ ] );
}
# Sum until the indexes meet in the middle.
while ($right != $left) {
if ($totalLeft <= $totalRight) {
$totalLeft = $totalLeft + $nums[$left++];
} else {
$totalRight = $totalRight + $nums[$right--];
}
}
# Check middle in left group.
if (($totalLeft + $nums[$left]) == $totalRight) {
return ( [ @nums[0..$left] ], [ @nums[$right + 1..$#nums] ] )
}
# Check middle in right group.
if ($totalLeft == ($totalRight + $nums[$right])) {
return ( [ @nums[0..$left-1] ], [ @nums[$right..$#nums] ] );
}
return ( [ ], [ ] );
}
# Global so they aren't reallcoated on the stack each invocation.
my $casesRef = [ [ ],
[ 100 ],
[ 99, 99 ],
[ 98, 1, 99],
[ 99, 1, 98],
[ 1, 2, 3, 0],
[ 1, 2, 3, 5],
[ 1, 2, 2, 1, 0],
[ 10, 11, 12, 16, 17],
[ 1, 1, 1, 1, 1, 1, 6 ],
[ 6, 1, 1, 1, 1, 1, 1 ],
];
# Test cases
sub testCases(@) {
my ($toScreen) = @_;
foreach my $c (@$casesRef) {
if ($toScreen) {
print("perl5: ", dump($c), " -> ", dump(splitSum($c)), "\n");
} else {
splitSum($c);
}
}
}
testCases(1);
printf("perl5: %.3f seconds\n",timeit(1000000, 'testCases(0)')->cpu_a);