aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLance Wicks <lw@judocoach.com>2020-08-06 23:16:33 +0100
committerLance Wicks <lw@judocoach.com>2020-08-06 23:16:33 +0100
commit06a9e28f55f45861649e2df43a7c44e8ca7fc4af (patch)
treec4a775204d0f60a2e98933111a72258f0d85637d
parente08b42ecae515d2f138ed9775adc85d430e8c5b1 (diff)
downloadperlweeklychallenge-club-06a9e28f55f45861649e2df43a7c44e8ca7fc4af.tar.gz
perlweeklychallenge-club-06a9e28f55f45861649e2df43a7c44e8ca7fc4af.tar.bz2
perlweeklychallenge-club-06a9e28f55f45861649e2df43a7c44e8ca7fc4af.zip
Add solutions in Perl and Elm by Lance Wicks
Hope this is ok. Perl is just fine. Elm is I hope ok
-rw-r--r--challenge-072/lance-wicks/README1
-rw-r--r--challenge-072/lance-wicks/elm/elm.json25
-rw-r--r--challenge-072/lance-wicks/elm/src/Main.elm75
-rw-r--r--challenge-072/lance-wicks/perl/calc_factorial_and_count_trailing_zeroes.pl13
-rw-r--r--challenge-072/lance-wicks/perl/lib/Trailing/Zeroes.pm21
-rw-r--r--challenge-072/lance-wicks/perl/t/00-basic.t24
6 files changed, 159 insertions, 0 deletions
diff --git a/challenge-072/lance-wicks/README b/challenge-072/lance-wicks/README
new file mode 100644
index 0000000000..73a1899c17
--- /dev/null
+++ b/challenge-072/lance-wicks/README
@@ -0,0 +1 @@
+Solution by Lance Wicks.
diff --git a/challenge-072/lance-wicks/elm/elm.json b/challenge-072/lance-wicks/elm/elm.json
new file mode 100644
index 0000000000..8f0ab65173
--- /dev/null
+++ b/challenge-072/lance-wicks/elm/elm.json
@@ -0,0 +1,25 @@
+{
+ "type": "application",
+ "source-directories": [
+ "src"
+ ],
+ "elm-version": "0.19.1",
+ "dependencies": {
+ "direct": {
+ "elm/browser": "1.0.2",
+ "elm/core": "1.0.5",
+ "elm/html": "1.0.0",
+ "elm/regex": "1.0.0"
+ },
+ "indirect": {
+ "elm/json": "1.1.3",
+ "elm/time": "1.0.0",
+ "elm/url": "1.0.0",
+ "elm/virtual-dom": "1.0.2"
+ }
+ },
+ "test-dependencies": {
+ "direct": {},
+ "indirect": {}
+ }
+}
diff --git a/challenge-072/lance-wicks/elm/src/Main.elm b/challenge-072/lance-wicks/elm/src/Main.elm
new file mode 100644
index 0000000000..ec034ad971
--- /dev/null
+++ b/challenge-072/lance-wicks/elm/src/Main.elm
@@ -0,0 +1,75 @@
+module Main exposing (..)
+
+import Array exposing (map)
+import Browser
+import Html exposing (Html, button, div, text)
+import Html.Events exposing (onClick)
+import Regex
+import String
+
+
+main =
+ Browser.sandbox { init = initModel, update = update, view = view }
+
+
+type alias Model =
+ { number : Int
+ , factorialOfNumber : Int
+ , trailingZeroes : Int
+ }
+
+
+initModel =
+ { number = 10
+ , factorialOfNumber = 0
+ , trailingZeroes = 0
+ }
+
+
+type Msg
+ = Increment
+ | Decrement
+
+
+update msg model =
+ case msg of
+ Increment ->
+ { model | number = model.number + 1 }
+
+ Decrement ->
+ { model | number = model.number - 1 }
+
+
+view model =
+ div []
+ [ button [ onClick Decrement ] [ text "-" ]
+ , div [] [ text ("Number:" ++ String.fromInt model.number) ]
+ , div [] [ text ("Trailing zeroes of factorial:" ++ String.fromInt (calcFactorial model.number)) ]
+ , div [] [ text ("Factorial of number:" ++ String.fromInt (trailingZeroes (calcFactorial model.number))) ]
+ , button [ onClick Increment ] [ text "+" ]
+ ]
+
+
+calcFactorial : Int -> Int
+calcFactorial n =
+ List.product (List.range 1 n)
+
+
+trailingZeroes : Int -> Int
+trailingZeroes x =
+ let
+ a =
+ List.head <|
+ Regex.find zeroes <|
+ String.fromInt x
+ in
+ case a of
+ Just foo ->
+ String.length foo.match
+
+ Nothing ->
+ 0
+
+
+zeroes =
+ Maybe.withDefault Regex.never (Regex.fromString "0+$")
diff --git a/challenge-072/lance-wicks/perl/calc_factorial_and_count_trailing_zeroes.pl b/challenge-072/lance-wicks/perl/calc_factorial_and_count_trailing_zeroes.pl
new file mode 100644
index 0000000000..5acdc0ca55
--- /dev/null
+++ b/challenge-072/lance-wicks/perl/calc_factorial_and_count_trailing_zeroes.pl
@@ -0,0 +1,13 @@
+use strict;
+use warnings;
+
+use lib './lib';
+use Trailing::Zeroes;
+
+my $N = $ARGV[0];
+
+my $fz = Trailing::Zeroes->new;
+
+print "\n";
+print $fz->count($fz->factorial($N));
+print "\n";
diff --git a/challenge-072/lance-wicks/perl/lib/Trailing/Zeroes.pm b/challenge-072/lance-wicks/perl/lib/Trailing/Zeroes.pm
new file mode 100644
index 0000000000..21ffb0ae46
--- /dev/null
+++ b/challenge-072/lance-wicks/perl/lib/Trailing/Zeroes.pm
@@ -0,0 +1,21 @@
+package Trailing::Zeroes;
+
+use List::Util qw(reduce);
+use Moo;
+
+# TODO Handle any number not just zero
+
+sub factorial {
+ my ( $self, $n ) = @_;
+
+ return reduce { $a * $b } 1 .. $n;
+}
+
+sub count {
+ my ( $self, $number ) = @_;
+ $number =~ /(0+)$/;
+ return length($1) || 0;
+}
+
+1;
+
diff --git a/challenge-072/lance-wicks/perl/t/00-basic.t b/challenge-072/lance-wicks/perl/t/00-basic.t
new file mode 100644
index 0000000000..fb335a9a88
--- /dev/null
+++ b/challenge-072/lance-wicks/perl/t/00-basic.t
@@ -0,0 +1,24 @@
+use Test2::V0 -target => 'Trailing::Zeroes';
+
+subtest 'Just testing the count of trailing zeroes' => sub {
+ is $CLASS->count(3628800), 2, 'Should calculate 3628800 has 2 trailing zeroes';
+ is $CLASS->count(5040), 1, 'Should calculate 5040 has 1 trailing zeroes';
+ is $CLASS->count(24), 0, 'Should calculate 24 has 1 trailing zero';
+};
+
+subtest 'Calculate factorial' => sub {
+ my $input = 10;
+ my $expected = 3628800;
+ is $CLASS->factorial($input), $expected, "factorial of $input should be $expected";
+
+ $input = 7;
+ $expected = 5040;
+ is $CLASS->factorial($input), $expected, "factorial of $input should be $expected";
+
+ $input = 4;
+ $expected = 24;
+ is $CLASS->factorial($input), $expected, "factorial of $input should be $expected";
+};
+
+
+done_testing;