From b0c7e074a39fa483f4a52cceb4170a2f749c630d Mon Sep 17 00:00:00 2001 From: Noud Aldenhoven Date: Fri, 20 Sep 2019 21:59:40 +0200 Subject: Solutions to challenge 026 problem 1 and 2 in Perl 6 by Noud --- challenge-026/noud/perl6/ch-1.p6 | 13 ++++++++++++ challenge-026/noud/perl6/ch-2.p6 | 45 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 challenge-026/noud/perl6/ch-1.p6 create mode 100644 challenge-026/noud/perl6/ch-2.p6 diff --git a/challenge-026/noud/perl6/ch-1.p6 b/challenge-026/noud/perl6/ch-1.p6 new file mode 100644 index 0000000000..f31eed9c8a --- /dev/null +++ b/challenge-026/noud/perl6/ch-1.p6 @@ -0,0 +1,13 @@ +# Create a script that accepts two strings, let us call it, “stones” and +# “jewels”. It should print the count of “alphabet” from the string “stones” +# found in the string “jewels”. For example, if your stones is “chancellor” and +# “jewels” is “chocolate”, then the script should print “8”. To keep it simple, +# only A-Z,a-z characters are acceptable. Also make the comparison case +# sensitive. + +# I hope I understood the exercise. +sub count_abc(Str $stones, Str $jewels) { + $jewels.comb.grep({$_ (elem) $stones.comb.Set}).elems; +} + +count_abc('chancellor', 'chocolate').say; diff --git a/challenge-026/noud/perl6/ch-2.p6 b/challenge-026/noud/perl6/ch-2.p6 new file mode 100644 index 0000000000..e1a03f3091 --- /dev/null +++ b/challenge-026/noud/perl6/ch-2.p6 @@ -0,0 +1,45 @@ +# Create a script that prints mean angles of the given list of angles in +# degrees. Please read wiki page that explains the formula in details with an +# example. + +sub mean(@array) { + @array.sum / @array.elems; +} + +# Mean of circular quantities using atan2. +sub mean_angle(@angles) { + atan2(mean(@angles.map(&sin)), mean(@angles.map(&cos))); +} + +# Mean of circular quantities using complex numbers. +sub mean_angle2(@angles) { + my $z = mean(@angles.map({ exp(i * $_) })); + atan($z.im / $z.re); +} + +# Mean of circular quantities using modulo over the circle +sub mean_angle3(@angles) { + mean(@angles.map({ ($_ + pi) % (2 * pi) - pi })); +} + +# Compute means in radians +mean_angle((0.1, 2 * pi + 0.2, -2 * pi + 0.3)).say; +mean_angle2((0.1, 2 * pi + 0.2, -2 * pi + 0.3)).say; +mean_angle3((0.1, 2 * pi + 0.2, -2 * pi + 0.3)).say; + +# Wrap methods to convert degrees to radians +sub deg2rad($degree) { + $degree * pi / 180; +} + +sub rad2deg($rad) { + $rad * 180 / pi; +} + +&mean_angle.wrap: -> @arr { rad2deg(callwith(@arr.map(°2rad))) }; +&mean_angle2.wrap: -> @arr { rad2deg(callwith(@arr.map(°2rad))) }; +&mean_angle3.wrap: -> @arr { rad2deg(callwith(@arr.map(°2rad))) }; + +mean_angle((10, 20 + 360, 30 - 360)).say; +mean_angle2((10, 20 + 360, 30 - 360)).say; +mean_angle3((10, 20 + 360, 30 - 360)).say; -- cgit