aboutsummaryrefslogtreecommitdiff
path: root/challenge-059
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-059')
-rw-r--r--challenge-059/cheok-yin-fung/BLOG.txt1
-rw-r--r--challenge-059/cheok-yin-fung/perl/ch-1.pl121
-rw-r--r--challenge-059/cheok-yin-fung/perl/ch-2.pl31
3 files changed, 153 insertions, 0 deletions
diff --git a/challenge-059/cheok-yin-fung/BLOG.txt b/challenge-059/cheok-yin-fung/BLOG.txt
new file mode 100644
index 0000000000..0db37b7d91
--- /dev/null
+++ b/challenge-059/cheok-yin-fung/BLOG.txt
@@ -0,0 +1 @@
+http://blogs.perl.org/users/c_y_fung/2020/05/cys-take-on-perl-weekly-challenge-059.html
diff --git a/challenge-059/cheok-yin-fung/perl/ch-1.pl b/challenge-059/cheok-yin-fung/perl/ch-1.pl
new file mode 100644
index 0000000000..64e34adbb2
--- /dev/null
+++ b/challenge-059/cheok-yin-fung/perl/ch-1.pl
@@ -0,0 +1,121 @@
+#!/usr/bin/perl
+use strict;
+
+{ package item;
+
+ sub new
+ {
+ my ($class) = @_;
+ bless {
+ _value => $_[1],
+ _next => $_[2],
+ }, $class;
+ }
+
+ sub value { $_[0]->{_value}}
+
+ sub inext {
+ my ($self, $newnext) = @_;
+ $self->{_next} = $newnext if defined($newnext);
+ return $self->{_next};
+ }
+
+ sub unlink {
+ my ($self) = @_;
+ $self->{_next} = undef;
+ return $self->{_next};
+ }
+}
+
+#my @input = (2,1, 2,3);
+#my $K = 2;
+
+my @input = (5,6,3,2,7,9);
+my $K = 6;
+
+#my @input = (1 , 4, 3, 2, 5, 2 );
+#my $K = 3;
+
+# my @input = (2 , 4, 3, 1, 5, 1 );
+ # my $K = 3;
+
+my ($head, $smallpivot, $inusepivot);
+my $ll;
+
+
+sub make_linked_list {
+ my @temp_list = @_;
+ $ll->[$#temp_list] = item->new( $temp_list[$#temp_list] , \(undef) );
+ for (reverse 0..$#temp_list-1) {
+ $ll->[$_] = item->new($temp_list[$_] , \( $ll->[$_+1] ) );
+ }
+ $head = \($ll->[0]);
+}
+
+
+
+my $HELPER = -1;
+make_linked_list($HELPER, @input);
+
+$smallpivot = $head;
+$inusepivot = ${$head}->inext;
+
+sub print_linked_listi { #for testing use
+ my $i = 0;
+ my $t = ${$head};
+ while( $t = ${$t->inext} and $i<10) {
+ print $t->value, "->";
+ $i++;
+ }
+ print "nil\n";
+}
+
+sub print_linked_list {
+ my $t = ${$head};
+ while( $t = ${$t->inext} ) {
+ print $t->value, "->";
+ }
+ print "nil\n";
+}
+
+
+print "\nbefore: ";
+print_linked_list;
+print "\n";
+
+my $j = 0;
+
+my $previous = $head;
+while( 1) { #j is for testing help
+
+ # print $$inusepivot->value, " " ,$$smallpivot->value, " \n";
+ # print_linked_list;print "\n";
+
+ if ($$inusepivot->value < $K) {
+ $$previous->unlink;
+ $$previous->inext( $$inusepivot->inext );
+
+ $$inusepivot->unlink;
+ $$inusepivot->inext($$smallpivot->inext);
+
+ $$smallpivot->unlink;
+ $$smallpivot->inext($inusepivot);
+ $smallpivot = $inusepivot;
+
+ }
+
+
+ if (($$previous->inext != \undef) and ($$inusepivot->inext != \undef)) {
+ $previous = $inusepivot;
+ $inusepivot = $$inusepivot->inext;
+ }
+ else {
+ print "\nafter : ";
+ print_linked_list;
+ exit;
+ }
+
+}
+
+
+
diff --git a/challenge-059/cheok-yin-fung/perl/ch-2.pl b/challenge-059/cheok-yin-fung/perl/ch-2.pl
new file mode 100644
index 0000000000..420c20d172
--- /dev/null
+++ b/challenge-059/cheok-yin-fung/perl/ch-2.pl
@@ -0,0 +1,31 @@
+#!/usr/bin/perl
+use strict;
+use Test::Simple tests => 2;
+use List::Util qw/max sum/;
+
+#reference: https://www.tutorialspoint.com/perl/bitwise_operators_example.htm
+
+
+sub f { # compare two bit-strings by xor
+ my $hint = ($_[0] ^ $_[1]) ;
+ my $ans = sum (split //, sprintf("%b", $hint));
+ return $ans;
+}
+
+# first parameter: number of terms; remaining: terms in the list
+sub conclude {
+ my ($N, @val) = @_;
+ my $sum = 0;
+ for my $i (0..$N-2) {
+ for my $j ($i+1..$N-1) {
+ $sum += f($val[$i], $val[$j]);
+ }
+ }
+ return $sum;
+}
+
+
+ok (conclude(3,2,3,4) == 6), "bad";
+ok (conclude(2,1,3)==1), "too bad";
+
+