diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2019-09-16 19:54:58 +0100 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2019-09-16 19:54:58 +0100 |
| commit | ca00b4a1598ac659b6eaf0861c715c57df14366d (patch) | |
| tree | 4ae3c6838f9d56d5fc7f0cc965dc392094021f27 /challenge-026 | |
| parent | 1e134265b6df56d0d7e27c22d479ff6f8f1a2ebe (diff) | |
| download | perlweeklychallenge-club-ca00b4a1598ac659b6eaf0861c715c57df14366d.tar.gz perlweeklychallenge-club-ca00b4a1598ac659b6eaf0861c715c57df14366d.tar.bz2 perlweeklychallenge-club-ca00b4a1598ac659b6eaf0861c715c57df14366d.zip | |
- Added solutions by Laurent Rosenfeld.
Diffstat (limited to 'challenge-026')
| -rw-r--r-- | challenge-026/laurent-rosenfeld/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-026/laurent-rosenfeld/perl5/ch-1.pl | 10 | ||||
| -rw-r--r-- | challenge-026/laurent-rosenfeld/perl5/ch-2.pl | 32 | ||||
| -rw-r--r-- | challenge-026/laurent-rosenfeld/perl6/ch-1.p6 | 7 | ||||
| -rw-r--r-- | challenge-026/laurent-rosenfeld/perl6/ch-2.p6 | 23 |
5 files changed, 73 insertions, 0 deletions
diff --git a/challenge-026/laurent-rosenfeld/blog.txt b/challenge-026/laurent-rosenfeld/blog.txt new file mode 100644 index 0000000000..96832418b2 --- /dev/null +++ b/challenge-026/laurent-rosenfeld/blog.txt @@ -0,0 +1 @@ +http://blogs.perl.org/users/laurent_r/2019/09/perl-weekly-challenge-26-common-letters-and-mean-angles.html diff --git a/challenge-026/laurent-rosenfeld/perl5/ch-1.pl b/challenge-026/laurent-rosenfeld/perl5/ch-1.pl new file mode 100644 index 0000000000..07eb5a135e --- /dev/null +++ b/challenge-026/laurent-rosenfeld/perl5/ch-1.pl @@ -0,0 +1,10 @@ +#!/usr/bin/perl +use strict; +use warnings; +use feature qw/say/; + +@ARGV == 2 or die "This script needs two strings are parameters"; +my ($str1, $str2) = @ARGV; +my %letters = map {$_ => 1} grep /[A-Za-z]/, split "", $str1; +my $count = scalar grep { exists $letters{$_}} split "", $str2; +say "$str2 has $count letters from $str1"; diff --git a/challenge-026/laurent-rosenfeld/perl5/ch-2.pl b/challenge-026/laurent-rosenfeld/perl5/ch-2.pl new file mode 100644 index 0000000000..5f5e69e1b2 --- /dev/null +++ b/challenge-026/laurent-rosenfeld/perl5/ch-2.pl @@ -0,0 +1,32 @@ +#!/usr/bin/perl +use strict; +use warnings; +use feature qw/say/; +use constant PI => atan2(1, 0) * 2; +use Test::More; +plan tests => 9; + + +sub deg2rad { return $_[0] * PI /180; } +sub rad2deg { return $_[0] * 180 / PI } + +sub mean { + my @angles = map { deg2rad $_ } @_; + my $count = @angles; + my ($sum_sin, $sum_cos) = (0, 0); + for my $angle (@angles) { + $sum_sin += sin $angle; + $sum_cos += cos $angle; + } + return rad2deg atan2 $sum_sin/$count, $sum_cos/$count; +} + +is deg2rad(0), 0, "To rad: 0 degree"; +is deg2rad(90), PI/2, "To rad: 90 degrees"; +is deg2rad(180), PI, "To rad: 180 degrees"; +is rad2deg(PI/2), 90, "To degrees: 90 degrees"; +is rad2deg(PI), 180, "To degrees: 180 degrees"; +is deg2rad(rad2deg(PI)), PI, "Roundtrip rad -> deg -> rad"; +is rad2deg(deg2rad(90)), 90, "Roundtrip deg -> rad -> deg"; +is mean(10, 20, 30), 20, "Mean of 10, 20, 30 degrees"; +is mean(355, 5, 15), 5, "Mean of 355, 5, 15 degrees"; diff --git a/challenge-026/laurent-rosenfeld/perl6/ch-1.p6 b/challenge-026/laurent-rosenfeld/perl6/ch-1.p6 new file mode 100644 index 0000000000..051d9e5799 --- /dev/null +++ b/challenge-026/laurent-rosenfeld/perl6/ch-1.p6 @@ -0,0 +1,7 @@ +use v6; + +sub MAIN (Str $str1, Str $str2) { + my $letters = $str1.comb.grep( /<[A..Za..z]>/ ).Set; + my $count = $str2.comb.grep( { $_ (elem) $letters} ).elems; + say "$str2 has $count letters from $str1"; +} diff --git a/challenge-026/laurent-rosenfeld/perl6/ch-2.p6 b/challenge-026/laurent-rosenfeld/perl6/ch-2.p6 new file mode 100644 index 0000000000..b5fcf755c4 --- /dev/null +++ b/challenge-026/laurent-rosenfeld/perl6/ch-2.p6 @@ -0,0 +1,23 @@ +use v6; +use Test; + +sub deg2rad (Numeric $deg) { return $deg * pi /180; } +sub rad2deg (Numeric $rad) { return $rad * 180 / pi } + +sub mean (*@degrees) { + my @radians = map { deg2rad $_ }, @degrees; + my $count = @radians.elems; + my $avg-sin = ([+] @radians.map( {sin $_})) / $count; + my $avg-cos = ([+] @radians.map( {cos $_})) / $count; + return rad2deg atan2 $avg-sin, $avg-cos; +} +plan 9; +is deg2rad(0), 0, "To rad: 0 degree"; +is deg2rad(90), pi/2, "To rad: 90 degrees"; +is deg2rad(180), pi, "To rad: 180 degrees"; +is rad2deg(pi/2), 90, "To degrees: 90 degrees"; +is rad2deg(pi), 180, "To degrees: 180 degrees"; +is deg2rad(rad2deg(pi)), pi, "Roundtrip rad -> deg -> rad"; +is rad2deg(deg2rad(90)), 90, "Roundtrip deg -> rad -> deg"; +is-approx mean(10, 20, 30), 20, "Mean of 10, 20, 30 degrees"; +is-approx mean(355, 5, 15), 5, "Mean of 355, 5, 15 degrees"; |
