aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2019-08-11 17:19:14 +0100
committerGitHub <noreply@github.com>2019-08-11 17:19:14 +0100
commit32fd776c9a764d1ae8913eb3292ef3985484747b (patch)
treeb191a86a408162acaa04da0d0ea6609ac388b54f
parent20677bc18469a657b157b42038c16eaaa96ee6d4 (diff)
parent73a1e728aba58a14a511ab24599e48a59f1ced91 (diff)
downloadperlweeklychallenge-club-32fd776c9a764d1ae8913eb3292ef3985484747b.tar.gz
perlweeklychallenge-club-32fd776c9a764d1ae8913eb3292ef3985484747b.tar.bz2
perlweeklychallenge-club-32fd776c9a764d1ae8913eb3292ef3985484747b.zip
Merge pull request #500 from adamcrussell/challenge-020
Challenge 020
-rw-r--r--challenge-020/adam-russell/blog.txt1
-rw-r--r--challenge-020/adam-russell/perl5/ch-1.pl18
-rw-r--r--challenge-020/adam-russell/perl5/ch-2.pl54
-rw-r--r--challenge-020/adam-russell/perl6/ch-1.rk16
-rw-r--r--challenge-020/adam-russell/perl6/ch-2.rk46
5 files changed, 135 insertions, 0 deletions
diff --git a/challenge-020/adam-russell/blog.txt b/challenge-020/adam-russell/blog.txt
new file mode 100644
index 0000000000..c6d4916e2f
--- /dev/null
+++ b/challenge-020/adam-russell/blog.txt
@@ -0,0 +1 @@
+https://adamcrussell.livejournal.com/6526.html
diff --git a/challenge-020/adam-russell/perl5/ch-1.pl b/challenge-020/adam-russell/perl5/ch-1.pl
new file mode 100644
index 0000000000..7ca9fbd9e3
--- /dev/null
+++ b/challenge-020/adam-russell/perl5/ch-1.pl
@@ -0,0 +1,18 @@
+use strict;
+use warnings;
+##
+# Write a script to accept a string from command line and split it on change of character.
+##
+my $string = $ARGV[0];
+my @letters = split(//, $string);
+my $letter;
+my $letter_previous = shift @letters;
+do{
+ $letter = shift @letters;
+ print $letter_previous if($letter eq $letter_previous);
+ print "$letter_previous\n" if($letter ne $letter_previous);
+ $letter_previous = $letter;
+}while(@letters);
+print $letter_previous if($letter eq $letter_previous);
+print "$letter_previous\n" if($letter ne $letter_previous);
+print "\n";
diff --git a/challenge-020/adam-russell/perl5/ch-2.pl b/challenge-020/adam-russell/perl5/ch-2.pl
new file mode 100644
index 0000000000..e86084b6c7
--- /dev/null
+++ b/challenge-020/adam-russell/perl5/ch-2.pl
@@ -0,0 +1,54 @@
+use strict;
+use warnings;
+##
+# Write a script to print the smallest pair of Amicable Numbers.
+##
+use boolean;
+use Thread;
+use constant RANGE_SIZE => 50;
+use constant THREAD_COUNT => 4;
+
+sub factor_sum{
+ my(@numbers) = @_;
+ my %number_sof;
+ foreach my $n (@numbers){
+ my @factors = (1);
+ foreach my $j (2..sqrt($n)){
+ push @factors, $j if $n % $j == 0;
+ push @factors, ($n / $j) if $n % $j == 0 && $j ** 2 != $n;
+ }
+ $number_sof{$n}=unpack("%32C*", pack("C*", @factors));
+ }
+ return \%number_sof;
+}
+
+MAIN:{
+ my %number_sof;
+ my @threads;
+ my $range_start = 1;
+ my $range_end = RANGE_SIZE;
+ my $found = false;
+ do{
+ for(0 .. (THREAD_COUNT - 1)){
+ my $t = Thread->new(\&factor_sum, ($range_start .. $range_end));
+ push @threads, $t;
+ $range_start = $range_end + 1;
+ $range_end = $range_start + RANGE_SIZE;
+ }
+ foreach my $t (@threads){
+ my $sof = $t->join();
+ @number_sof{keys %{$sof}} = values %{$sof};
+ foreach my $k (values %{$sof}){
+ if($number_sof{$k}){
+ if($number_sof{$number_sof{$k}} &&
+ $number_sof{$number_sof{$k}} == $k &&
+ $number_sof{$k} != $k && !$found){
+ print "First amicable pair of numbers: $k " . $number_sof{$k} . " \n";
+ $found = true;
+ }
+ }
+ }
+ }
+ @threads = ();
+ }while(!$found);
+}
diff --git a/challenge-020/adam-russell/perl6/ch-1.rk b/challenge-020/adam-russell/perl6/ch-1.rk
new file mode 100644
index 0000000000..f0d6dc2faa
--- /dev/null
+++ b/challenge-020/adam-russell/perl6/ch-1.rk
@@ -0,0 +1,16 @@
+##
+# Write a script to accept a string from command line and split it on change of character.
+##
+my $string = @*ARGS[0];
+my @letters = split(/""/, $string);
+my $letter;
+@letters.shift();
+my $letter_previous = @letters.shift();
+repeat {
+ $letter = @letters.shift();
+ print $letter_previous if ($letter eq $letter_previous);
+ print "$letter_previous\n" if ($letter ne $letter_previous);
+ $letter_previous = $letter;
+}while (@letters);
+print $letter_previous if ($letter eq $letter_previous);
+print "$letter_previous\n" if ($letter ne $letter_previous);
diff --git a/challenge-020/adam-russell/perl6/ch-2.rk b/challenge-020/adam-russell/perl6/ch-2.rk
new file mode 100644
index 0000000000..8a574752bf
--- /dev/null
+++ b/challenge-020/adam-russell/perl6/ch-2.rk
@@ -0,0 +1,46 @@
+##
+# Write a script to print the smallest pair of Amicable Numbers.
+##
+constant RANGE_SIZE = 50;
+sub factor-sum(@numbers){
+ my %number_sof;
+ for @numbers -> $n {
+ my @factors = (1);
+ for (2 .. sqrt($n)) -> $j {
+ @factors.push($j) if $n %% $j;
+ @factors.push($n / $j) if $n %% $j && $j ** 2 != $n;
+ }
+ my $sum = [+] @factors;
+ %number_sof{$n} = $sum;
+ }
+ return %number_sof;
+}
+my $range_start = 1;
+my $range_end = RANGE_SIZE;
+my $found = Bool::False;
+my %number_sof;
+my @promises;
+while (!$found) {
+ @promises = ();
+ for (0 .. 3) {
+ @promises.push(Promise.start( {
+ factor-sum($range_start .. $range_end);
+ }));
+ $range_start = $range_end + 1;
+ $range_end = $range_start + RANGE_SIZE;
+ }
+ await(|@promises);
+ for @promises -> $p {
+ %number_sof{ keys $p.result} = values $p.result;
+ for (values $p.result) -> $k {
+ if (%number_sof{$k}) {
+ if (%number_sof{%number_sof{$k}} &&
+ %number_sof{%number_sof{$k}} == $k &&
+ %number_sof{$k} != $k && !$found) {
+ say "First amicable pair of numbers: $k " ~ %number_sof{$k};
+ $found = Bool::True;
+ }
+ }
+ }
+ }
+}