diff options
| author | Adam Russell <ac.russell@live.com> | 2019-08-11 08:51:06 -0400 |
|---|---|---|
| committer | Adam Russell <ac.russell@live.com> | 2019-08-11 08:51:06 -0400 |
| commit | 57319da5cbe701ad641cb9fd59861245db46d080 (patch) | |
| tree | b4f7d9aa1028306b11c93b282d7966d921b908b5 | |
| parent | 201f0efb74efe1ad527beaca31e320b1fb67b735 (diff) | |
| download | perlweeklychallenge-club-57319da5cbe701ad641cb9fd59861245db46d080.tar.gz perlweeklychallenge-club-57319da5cbe701ad641cb9fd59861245db46d080.tar.bz2 perlweeklychallenge-club-57319da5cbe701ad641cb9fd59861245db46d080.zip | |
solutions for 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 |
3 files changed, 73 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); +} |
