aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorE7-87-83 <fungcheokyin@gmail.com>2021-09-13 22:32:50 +0800
committerE7-87-83 <fungcheokyin@gmail.com>2021-09-13 22:32:50 +0800
commit73723efab604e762a952b51a8050706648d2514b (patch)
tree15eb5041750a5748f37a2b11da657d726f989eb3
parent4febc5583e703645864cd8030e2ed9f58dcf9031 (diff)
downloadperlweeklychallenge-club-73723efab604e762a952b51a8050706648d2514b.tar.gz
perlweeklychallenge-club-73723efab604e762a952b51a8050706648d2514b.tar.bz2
perlweeklychallenge-club-73723efab604e762a952b51a8050706648d2514b.zip
Task 1
-rw-r--r--challenge-130/cheok-yin-fung/perl/ch-1.pl48
1 files changed, 48 insertions, 0 deletions
diff --git a/challenge-130/cheok-yin-fung/perl/ch-1.pl b/challenge-130/cheok-yin-fung/perl/ch-1.pl
new file mode 100644
index 0000000000..562e47f8b4
--- /dev/null
+++ b/challenge-130/cheok-yin-fung/perl/ch-1.pl
@@ -0,0 +1,48 @@
+#!/usr/bin/perl
+# The Weekly Challenge 130
+# Task 1 Odd Number
+# Usage: $ ch-1.pl @N
+use constant BIGN => 1024;
+
+use v5.12.0;
+use warnings;
+use Test::More tests => 2;
+
+my @N = @ARGV;
+@N = (2, 5, 4, 4, 5, 5, 2) if !defined($ARGV[0]);
+
+
+say "@{oddities(@N)}";
+say the_only_odd(@N);
+
+sub the_only_odd {
+ my $s = "";
+ for my $d (@_) {
+ my $md = index((scalar reverse $s), (scalar reverse "- $d "));
+ my $pd = index((scalar reverse $s), (scalar reverse "+ $d "));
+ $md = BIGN if $md == -1 && $pd >= 0;
+ $pd = BIGN if $md == -1 && $pd == -1;
+ $s .= $md < $pd ? "+ $d " : "- $d ";
+ }
+ return eval $s;
+}
+
+
+sub oddities {
+ # return all the numbers appear odd number of times
+ # inspired by Andrezgz's Week 127 solution after reading
+ # https://theweeklychallenge.org/blog/review-challenge-127/#PWC127TASK1
+ my @ans;
+ my %ap;
+ for (@_) {
+ $ap{$_}++ && ($ap{$_} *= -1);
+ }
+ @ans = grep {$ap{$_} > 0} keys %ap;
+ return [@ans];
+}
+
+
+ok ${oddities(1, 2, 3, 4, 3, 2, 1, 4, 4)}[0] == 4,
+ "Example 2 using subroutine oddities";
+ok the_only_odd(1, 2, 3, 4, 3, 2, 1, 4, 4) == 4,
+ "Example 2 using subroutine the_only_odd";