aboutsummaryrefslogtreecommitdiff
path: root/challenge-020
diff options
context:
space:
mode:
author冯昶 <fengchang@novel-supertv.com>2019-08-10 15:16:10 +0800
committer冯昶 <fengchang@novel-supertv.com>2019-08-10 15:16:10 +0800
commite4495f7320fff9c79889afa1818d591bad5e410d (patch)
treec459433700dddff78199750c65a976f2bfa798bc /challenge-020
parentcdeda343bd6f44b567fc100cece604b721e7f4ea (diff)
downloadperlweeklychallenge-club-e4495f7320fff9c79889afa1818d591bad5e410d.tar.gz
perlweeklychallenge-club-e4495f7320fff9c79889afa1818d591bad5e410d.tar.bz2
perlweeklychallenge-club-e4495f7320fff9c79889afa1818d591bad5e410d.zip
#020 solutions
Diffstat (limited to 'challenge-020')
-rwxr-xr-xchallenge-020/feng-chang/perl5/ch-1.pl35
-rwxr-xr-xchallenge-020/feng-chang/perl5/ch-2.pl47
-rwxr-xr-xchallenge-020/feng-chang/perl6/ch-1.p63
-rwxr-xr-xchallenge-020/feng-chang/perl6/ch-2.p611
4 files changed, 96 insertions, 0 deletions
diff --git a/challenge-020/feng-chang/perl5/ch-1.pl b/challenge-020/feng-chang/perl5/ch-1.pl
new file mode 100755
index 0000000000..b34ce16cdb
--- /dev/null
+++ b/challenge-020/feng-chang/perl5/ch-1.pl
@@ -0,0 +1,35 @@
+#!/bin/env perl
+
+use Modern::Perl;
+
+die "usage: $0 <string>\n" unless $ARGV[0];
+
+say 'Solution 1:';
+{
+ my @a;
+ my $last_char = '';
+ my $s = '';
+ for my $c (split //, $ARGV[0]) {
+ if ($c eq $last_char) {
+ $s .= $c;
+ } else {
+ push(@a, $s) if $s;
+ $s = $last_char = $c;
+ }
+ }
+ push(@a, $s) if $s;
+
+ say join ' ', @a;
+}
+
+say 'Solution 2:';
+{
+ my @a;
+ my $i = 1;
+ for my $s ($ARGV[0] =~ m/((.)\2*)/g) {
+ push(@a, $s) if $i;
+ $i = 1 - $i;
+ }
+
+ say join ' ', @a;
+}
diff --git a/challenge-020/feng-chang/perl5/ch-2.pl b/challenge-020/feng-chang/perl5/ch-2.pl
new file mode 100755
index 0000000000..5d68276e7c
--- /dev/null
+++ b/challenge-020/feng-chang/perl5/ch-2.pl
@@ -0,0 +1,47 @@
+#!/bin/env perl
+
+use Modern::Perl;
+use integer;
+
+my $i = 0;
+my %sods;
+my $cnt = 0;
+
+while (1) {
+ $sods{ $i } = sod($i) unless defined $sods{ $i };
+ my $v = $sods{ $i };
+
+ if ($v > $i) {
+ $sods{ $v } = sod($v) unless defined $sods{ $v };
+ if ($i == $sods{ $v }) {
+ say "$i $v";
+ last if ++$cnt == 5;
+ }
+ }
+
+ ++$i;
+}
+
+# sum of proper divisors
+sub sod {
+ my $n = shift;
+
+ my $sum = 0;
+ my @a = (1) x ($n/2 + 1);
+
+ for (my $i = 1; $i < $n/2 + 1; ++$i) {
+ next unless $a[$i];
+
+ if ($n % $i) {
+ my $j = $i;
+ while ($j <= $n/2 + 1) {
+ $a[$j] = 0;
+ $j += $i;
+ }
+ } else {
+ $sum += $i;
+ }
+ }
+
+ return $sum;
+}
diff --git a/challenge-020/feng-chang/perl6/ch-1.p6 b/challenge-020/feng-chang/perl6/ch-1.p6
new file mode 100755
index 0000000000..5e737a5950
--- /dev/null
+++ b/challenge-020/feng-chang/perl6/ch-1.p6
@@ -0,0 +1,3 @@
+#!/bin/env perl6
+
+sub MAIN($str = 'ABBCDEEF') { $str.comb(/(.)$0*/).say }
diff --git a/challenge-020/feng-chang/perl6/ch-2.p6 b/challenge-020/feng-chang/perl6/ch-2.p6
new file mode 100755
index 0000000000..a7fd1d71cb
--- /dev/null
+++ b/challenge-020/feng-chang/perl6/ch-2.p6
@@ -0,0 +1,11 @@
+#!/bin/env perl6
+
+my @a = (0..∞).map: { sod($_) };
+my @b = (0..∞).grep: { @a[$_] > $_ and @a[@a[$_]] == $_ };
+
+say(@b[0], ' ', @a[@b[0]]);
+
+# sum of proper divisors
+sub sod(UInt $n) {
+ [+] (1 .. $n/2).grep: { $n %% $_ }
+}