diff options
| author | Lance Wicks <lw@judocoach.com> | 2020-08-06 23:16:33 +0100 |
|---|---|---|
| committer | Lance Wicks <lw@judocoach.com> | 2020-08-06 23:16:33 +0100 |
| commit | 06a9e28f55f45861649e2df43a7c44e8ca7fc4af (patch) | |
| tree | c4a775204d0f60a2e98933111a72258f0d85637d | |
| parent | e08b42ecae515d2f138ed9775adc85d430e8c5b1 (diff) | |
| download | perlweeklychallenge-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/README | 1 | ||||
| -rw-r--r-- | challenge-072/lance-wicks/elm/elm.json | 25 | ||||
| -rw-r--r-- | challenge-072/lance-wicks/elm/src/Main.elm | 75 | ||||
| -rw-r--r-- | challenge-072/lance-wicks/perl/calc_factorial_and_count_trailing_zeroes.pl | 13 | ||||
| -rw-r--r-- | challenge-072/lance-wicks/perl/lib/Trailing/Zeroes.pm | 21 | ||||
| -rw-r--r-- | challenge-072/lance-wicks/perl/t/00-basic.t | 24 |
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; |
