aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-111/james-smith/perl/ch-1.pl17
1 files changed, 17 insertions, 0 deletions
diff --git a/challenge-111/james-smith/perl/ch-1.pl b/challenge-111/james-smith/perl/ch-1.pl
index ae3f2e55f5..927633a2c0 100644
--- a/challenge-111/james-smith/perl/ch-1.pl
+++ b/challenge-111/james-smith/perl/ch-1.pl
@@ -97,6 +97,7 @@ my $tests = {
'DNF' => sub { find_val_dnf( $_, $matrix ) foreach @KEYS; },
'DNFOpt' => sub { find_val_dnf_optimal( $_, $matrix ) foreach @KEYS; },
'DNFGen' => sub { find_val_general_dnf( $_, $matrix ) foreach @KEYS; },
+ 'Binary' => sub { find_val_binary( $_, $matrix ) foreach @KEYS; },
'Hash' => sub { find_val_hash( $_, $matrix ) foreach @KEYS; },
'Flatten@' => sub { flatten_array( $_, @M ) foreach @KEYS; },
@@ -109,6 +110,9 @@ my $tests = {
'preGrep' => sub { find_val_grep_pre( $_, $A ) foreach @KEYS; },
};
+is( find_val_binary( 35, $matrix ), 0 );
+is( find_val_binary( 39, $matrix ), 1 );
+is( find_val_binary( $_, $matrix ), $TEST_SET{$_} ) foreach @KEYS;
is( find_val_any_any_naive( 35, $matrix ), 0 );
is( find_val_any_any_naive( 39, $matrix ), 1 );
is( find_val_any_any_naive( $_, $matrix ), $TEST_SET{$_} ) foreach @KEYS;
@@ -183,6 +187,19 @@ sub find_val_general_dnf {
return 0;
}
+sub find_val_binary {
+ my($v,$m)=@_;
+ return 0 if$v<$m->[0][0]||$v>$m->[-1][-1];
+ my $size = @{$m};
+ my($v2,$n,$l,$r)=(0,0,0,$size*$size-1);
+ while($l<=$r) {
+ $n=($l+$r)>>1;
+ return 1 if $v == ($v2 = $m->[$n/$size][$n%$size]);
+ $v>$v2?($l=$n+1):($r=$n-1);
+ }
+ return 0;
+}
+
sub find_val_dnf {
my($v,$m) = @_;
return $v < $m->[0][0] || $v > $m->[4][4]