diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2019-07-01 18:33:26 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-07-01 18:33:26 +0100 |
| commit | 56fbc2d245942eceda73c1175ca5beec2336611e (patch) | |
| tree | 73d87417c265574e9653d19fdef2bc7a5e8005ad | |
| parent | d058cc897094733ded2988aa03af754c92e7ab92 (diff) | |
| parent | ffab85aae53b8c73d2a8759a0879b46e886f2400 (diff) | |
| download | perlweeklychallenge-club-56fbc2d245942eceda73c1175ca5beec2336611e.tar.gz perlweeklychallenge-club-56fbc2d245942eceda73c1175ca5beec2336611e.tar.bz2 perlweeklychallenge-club-56fbc2d245942eceda73c1175ca5beec2336611e.zip | |
Merge pull request #324 from Firedrake/roger-branch
RogerBW's solutions
| -rwxr-xr-x | challenge-015/roger-bell-west/perl5/ch1.pl | 39 | ||||
| -rwxr-xr-x | challenge-015/roger-bell-west/perl5/ch2.pl | 54 |
2 files changed, 93 insertions, 0 deletions
diff --git a/challenge-015/roger-bell-west/perl5/ch1.pl b/challenge-015/roger-bell-west/perl5/ch1.pl new file mode 100755 index 0000000000..0bae3b6389 --- /dev/null +++ b/challenge-015/roger-bell-west/perl5/ch1.pl @@ -0,0 +1,39 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +# Arbitrary cap +my $cap=110; + +my $limit=10; + +# Sieve of Eratosthenes to give us a prime list +my %n=map {$_ => 1} (2..$cap); +foreach my $f (2..int(sqrt($cap))) { + map {($f<$_ && $_%$f == 0)?delete $n{$_}:0} keys %n; +} +my @p=sort {$a <=> $b} (keys %n); + +# Double difference finds the ones closer to prime above than to prime below +my @d1=map {$p[$_+1]-$p[$_]} (0..$#p-1); +my @d2=map {$d1[$_+1]-$d1[$_]} (0..$#d1-1); + +my @res; +foreach my $k (0..$#d2) { + my $i=1; + if ($d2[$k]<0) { + $i=0; + } + push @{$res[$i]},$p[$k+1]; +} + +my @l=qw(Strong Weak); +if (scalar @{$res[0]} >= $limit && scalar @{$res[1]} >= $limit) { + foreach my $m (0,1) { + splice @{$res[$m]},$limit; + print $l[$m],': ',join(', ',@{$res[$m]}),"\n"; + } +} else { + warn "Re-run with a higher cap value\n"; +} diff --git a/challenge-015/roger-bell-west/perl5/ch2.pl b/challenge-015/roger-bell-west/perl5/ch2.pl new file mode 100755 index 0000000000..59cad40c96 --- /dev/null +++ b/challenge-015/roger-bell-west/perl5/ch2.pl @@ -0,0 +1,54 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +use Getopt::Std; + +my %o; + +getopts('dk:h',\%o); + +# Ensure we have a key +unless ($o{k}) { + $o{h}=1; +} +if ($o{h}) { + print STDERR <<EOF; +Usage: $0 -k KEY (-d) +Use -d to decrypt. +Encryption/decryption is from stdin to stdout. +EOF + exit 0; +} + +my @alphabet=('A'..'Z'); +my %tonumber=map {$alphabet[$_] => $_} (0..$#alphabet); + +$o{k}=strip($o{k}); +my %ak=map {$_=>1} @alphabet; +my @k; +foreach my $kl (split '',$o{k}) { + if (exists $ak{$kl}) { + push @k,($o{d}?-1:1)*$tonumber{$kl}; + delete $ak{$kl} + } +} +my $keylen=scalar @k; + +while (<>) { + chomp; + my @pt=map {$tonumber{$_}} split '',strip($_); + my @ct; + foreach my $n (0..$#pt) { + push @ct,$alphabet[($pt[$n]+$k[$n%$keylen])%26]; + } + print join('',@ct),"\n"; +} + +sub strip { + my $r=shift @_; + $r=uc($r); + $r =~ s/[^A-Z]//g; + return $r; +} |
