aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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
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);
+}