aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorE7-87-83 <fungcheokyin@gmail.com>2020-10-25 08:58:44 +0800
committerE7-87-83 <fungcheokyin@gmail.com>2020-10-25 08:58:44 +0800
commit242e27c247aa264450786093221c3f077ce85b8c (patch)
treecb46c348da3997dafbe54111367e9d0c701b470d
parent89421f14095148aefcd254da3d728b6150b22cc3 (diff)
downloadperlweeklychallenge-club-242e27c247aa264450786093221c3f077ce85b8c.tar.gz
perlweeklychallenge-club-242e27c247aa264450786093221c3f077ce85b8c.tar.bz2
perlweeklychallenge-club-242e27c247aa264450786093221c3f077ce85b8c.zip
2 Perl scripts
-rw-r--r--challenge-083/cheok-yin-fung/perl/ch-1.pl4
-rw-r--r--challenge-083/cheok-yin-fung/perl/ch-2.pl90
2 files changed, 94 insertions, 0 deletions
diff --git a/challenge-083/cheok-yin-fung/perl/ch-1.pl b/challenge-083/cheok-yin-fung/perl/ch-1.pl
new file mode 100644
index 0000000000..d52d4a2055
--- /dev/null
+++ b/challenge-083/cheok-yin-fung/perl/ch-1.pl
@@ -0,0 +1,4 @@
+$_ = <STDIN>;
+/(^\w+\s)((\w+\s*)+)(\s\w+$)/;
+print length $2,"\n";
+
diff --git a/challenge-083/cheok-yin-fung/perl/ch-2.pl b/challenge-083/cheok-yin-fung/perl/ch-2.pl
new file mode 100644
index 0000000000..b117ae38bf
--- /dev/null
+++ b/challenge-083/cheok-yin-fung/perl/ch-2.pl
@@ -0,0 +1,90 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+#use Test::More tests => 4;
+
+if ($ARGV[0]) {
+ print fliparray([@ARGV]), "\n";
+}
+else {
+ print join " ", 1..12,"\n";
+ print fliparray([1..12]), "\n";
+}
+
+sub num_of_1s_in_a_bit_string {
+ my $bitstr = $_[0];
+ my @temp = grep {$_ == 1} split "", $bitstr;
+ return scalar @temp;
+}
+
+sub make_bit_string {
+ my $len = $_[0];
+ my $dec = $_[1];
+ my $a = sprintf("%b", $dec);
+ my $addz = $len - length $a;
+ if ($addz > 0) {
+ $a = "0" x $addz . $a;
+ }
+ return $a;
+}
+
+sub sum_accord_to_bit_string {
+ my @arr = @{$_[0]};
+ my $bitstr = $_[1];
+ my $sum = 0;
+ my @sgn = split "", $bitstr;
+ for my $i (0..$#arr) {
+ $sum -= $arr[$i] if $sgn[$i] == 1;
+ $sum += $arr[$i] if $sgn[$i] == 0;
+ }
+
+ return $sum;
+}
+
+
+sub fliparray {
+ my @arr = @{$_[0]};
+ my $minflip = $#arr;
+ my $recordmin = 0;
+ $recordmin += $_ for @arr;
+ my $recordflip = scalar @arr;
+
+ my $ans_arr;
+
+ for my $b (1..(2**scalar @arr) - 1) {
+ my $allsign = make_bit_string(scalar @arr,$b);
+ my $sum = sum_accord_to_bit_string(\@arr , $allsign);
+ if ( $sum <= $recordmin and $sum >= 0 ) {
+ $recordflip = scalar @arr if $sum < $recordmin;
+ $recordmin = $sum;
+ my $num_of_1s = num_of_1s_in_a_bit_string $allsign;
+ if ($recordflip > $num_of_1s and $sum == $recordmin) {
+ $recordflip = $num_of_1s;
+ $ans_arr = $allsign;
+ }
+ }
+ }
+
+# assist checking result
+=pod
+ print $recordflip, "\n";
+ print $ans_arr, "\n";
+ for my $i (0..$#arr) {
+ my @sgn = split "", $ans_arr;
+ print " - " if $sgn[$i] == 1;
+ print " + " if $sgn[$i] == 0;
+ print $arr[$i];
+ }
+ print "\n";
+=cut
+
+ return $recordflip;
+}
+
+
+=pod
+ok fliparray([2,10,8]) == 1, "ten";
+ok fliparray([3,10,8]) == 1, "example 1";
+ok fliparray([1,2,3,4,5,6]) == 2, "one to six";
+ok fliparray([1,2,5,6,3,4]) == 2, "one to six,arr";
+=cut