diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2019-08-11 17:19:14 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-08-11 17:19:14 +0100 |
| commit | 32fd776c9a764d1ae8913eb3292ef3985484747b (patch) | |
| tree | b191a86a408162acaa04da0d0ea6609ac388b54f | |
| parent | 20677bc18469a657b157b42038c16eaaa96ee6d4 (diff) | |
| parent | 73a1e728aba58a14a511ab24599e48a59f1ced91 (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rw-r--r-- | challenge-020/adam-russell/perl5/ch-1.pl | 18 | ||||
| -rw-r--r-- | challenge-020/adam-russell/perl5/ch-2.pl | 54 | ||||
| -rw-r--r-- | challenge-020/adam-russell/perl6/ch-1.rk | 16 | ||||
| -rw-r--r-- | challenge-020/adam-russell/perl6/ch-2.rk | 46 |
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; + } + } + } + } +} |
