aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-210/carlos-oliveira/perl/ch-1.pl24
-rw-r--r--challenge-210/carlos-oliveira/perl/ch-2.pl27
2 files changed, 51 insertions, 0 deletions
diff --git a/challenge-210/carlos-oliveira/perl/ch-1.pl b/challenge-210/carlos-oliveira/perl/ch-1.pl
new file mode 100644
index 0000000000..6e025cc805
--- /dev/null
+++ b/challenge-210/carlos-oliveira/perl/ch-1.pl
@@ -0,0 +1,24 @@
+use strict;
+use warnings;
+use v5.36;
+
+use Test::More;
+use List::MoreUtils qw(frequency);
+
+sub kill_and_win (@integers) {
+ my %histogram = frequency @integers;
+ my $max_score = 0;
+ while (my ($integer, $count) = each %histogram) {
+ my $score = 0;
+ for (my $i = $integer - 1; $i <= $integer + 1; $i++) {
+ $score += ($histogram{$i} || 0) * $i;
+ }
+ $max_score = $score if $score > $max_score;
+ }
+ return $max_score;
+}
+
+is kill_and_win(2, 3, 1), 6;
+is kill_and_win(1, 1, 2, 2, 2, 3), 11;
+
+done_testing;
diff --git a/challenge-210/carlos-oliveira/perl/ch-2.pl b/challenge-210/carlos-oliveira/perl/ch-2.pl
new file mode 100644
index 0000000000..d8e6bd1cb2
--- /dev/null
+++ b/challenge-210/carlos-oliveira/perl/ch-2.pl
@@ -0,0 +1,27 @@
+use strict;
+use warnings;
+use v5.36;
+
+use Test::More;
+
+sub collide_numbers (@integers) {
+ my @result;
+ OUTER_LOOP:
+ for (my $i = 0; $i < @integers; $i++) {
+ my $increment = $integers[$i] > 0 ? 1 : -1;
+ my $stop_condition = $integers[$i] > 0 ? sub { $_[0] < @integers } : sub { $_[0] >= 0 };
+
+ for (my $u = $i + $increment; $stop_condition->($u); $u = $u + $increment) {
+ next unless $integers[$i] * $integers[$u] < 0;
+ next OUTER_LOOP if abs($integers[$i]) <= abs($integers[$u]);
+ }
+ push @result, $integers[$i];
+ }
+ return @result;
+}
+
+is_deeply [collide_numbers(2, 3, -1)], [2, 3];
+is_deeply [collide_numbers(3, 2, -4)], [-4];
+is_deeply [collide_numbers(1, -1)], [];
+
+done_testing;