aboutsummaryrefslogtreecommitdiff
path: root/challenge-026
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2019-09-16 19:54:58 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2019-09-16 19:54:58 +0100
commitca00b4a1598ac659b6eaf0861c715c57df14366d (patch)
tree4ae3c6838f9d56d5fc7f0cc965dc392094021f27 /challenge-026
parent1e134265b6df56d0d7e27c22d479ff6f8f1a2ebe (diff)
downloadperlweeklychallenge-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.txt1
-rw-r--r--challenge-026/laurent-rosenfeld/perl5/ch-1.pl10
-rw-r--r--challenge-026/laurent-rosenfeld/perl5/ch-2.pl32
-rw-r--r--challenge-026/laurent-rosenfeld/perl6/ch-1.p67
-rw-r--r--challenge-026/laurent-rosenfeld/perl6/ch-2.p623
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";