diff options
| -rw-r--r-- | challenge-109/lance-wicks/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-109/lance-wicks/elm/elm.json | 26 | ||||
| -rw-r--r-- | challenge-109/lance-wicks/elm/src/Chowla.elm | 31 | ||||
| -rw-r--r-- | challenge-109/lance-wicks/elm/tests/N.elm | 41 | ||||
| -rw-r--r-- | challenge-109/lance-wicks/elm/tests/Nums.elm | 19 | ||||
| -rw-r--r-- | challenge-109/lance-wicks/perl/ch-1.pl | 12 | ||||
| -rw-r--r-- | challenge-109/lance-wicks/perl/lib/Chowla.pm | 26 | ||||
| -rw-r--r-- | challenge-109/lance-wicks/perl/t/01-chowla.t | 12 |
8 files changed, 168 insertions, 0 deletions
diff --git a/challenge-109/lance-wicks/blog.txt b/challenge-109/lance-wicks/blog.txt new file mode 100644 index 0000000000..50cb30e0fb --- /dev/null +++ b/challenge-109/lance-wicks/blog.txt @@ -0,0 +1 @@ +https://perl.kiwi/tales/2021/04/24/perl-weekly-challenge-109-in-perl-and-elm/ diff --git a/challenge-109/lance-wicks/elm/elm.json b/challenge-109/lance-wicks/elm/elm.json new file mode 100644 index 0000000000..418d33c9ab --- /dev/null +++ b/challenge-109/lance-wicks/elm/elm.json @@ -0,0 +1,26 @@ +{ + "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-explorations/test": "1.2.2" + }, + "indirect": { + "elm/json": "1.1.3", + "elm/random": "1.0.0", + "elm/time": "1.0.0", + "elm/url": "1.0.0", + "elm/virtual-dom": "1.0.2" + } + }, + "test-dependencies": { + "direct": {}, + "indirect": {} + } +} diff --git a/challenge-109/lance-wicks/elm/src/Chowla.elm b/challenge-109/lance-wicks/elm/src/Chowla.elm new file mode 100644 index 0000000000..d5041545ea --- /dev/null +++ b/challenge-109/lance-wicks/elm/src/Chowla.elm @@ -0,0 +1,31 @@ +module Chowla exposing (chowla, n, nums) + +import List + + +nums : Int -> List Int +nums max = + List.range 1 max + |> List.map n + + +n : Int -> Int +n num = + let + denominators = + List.range 2 (num - 1) + + numbers = + List.map (chowla num) denominators + in + List.foldl (+) 0 numbers + + +chowla : Int -> Int -> Int +chowla num denom = + case remainderBy denom num of + 0 -> + denom + + _ -> + 0 diff --git a/challenge-109/lance-wicks/elm/tests/N.elm b/challenge-109/lance-wicks/elm/tests/N.elm new file mode 100644 index 0000000000..6a81cde5a1 --- /dev/null +++ b/challenge-109/lance-wicks/elm/tests/N.elm @@ -0,0 +1,41 @@ +module N exposing (..) + +import Chowla +import Expect +import Test exposing (..) + + +suite : Test +suite = + describe "Chowla number" + [ test "n 1" <| + \_ -> Chowla.n 1 |> Expect.equal 0 + , test "n 4" <| + \_ -> Chowla.n 4 |> Expect.equal 2 + , test "n 6" <| + \_ -> Chowla.n 6 |> Expect.equal 5 + ] + + +chowla : Test +chowla = + describe "Chowla number logic" + [ test "chowla 2 2" <| + \_ -> Chowla.chowla 2 2 |> Expect.equal 2 + , test "chowla 2 3" <| + \_ -> Chowla.chowla 2 3 |> Expect.equal 0 + , test "chowla 2 4" <| + \_ -> Chowla.chowla 2 4 |> Expect.equal 0 + ] + + +list : Test +list = + describe "First 20 Chowla numbers" + [ test "nums 6" <| + \_ -> Chowla.nums 6 |> Expect.equal [ 0, 0, 0, 2, 0, 5 ] + , test "nums 22" <| + \_ -> Chowla.nums 22 |> Expect.equal [ 0, 0, 0, 2, 0, 5, 0, 6, 3, 7, 0, 15, 0, 9, 8, 14, 0, 20, 0, 21, 10, 13 ] + , test "nums 20" <| + \_ -> Chowla.nums 20 |> Expect.equal [ 0, 0, 0, 2, 0, 5, 0, 6, 3, 7, 0, 15, 0, 9, 8, 14, 0, 20, 0, 21 ] + ] diff --git a/challenge-109/lance-wicks/elm/tests/Nums.elm b/challenge-109/lance-wicks/elm/tests/Nums.elm new file mode 100644 index 0000000000..8fc89e54b8 --- /dev/null +++ b/challenge-109/lance-wicks/elm/tests/Nums.elm @@ -0,0 +1,19 @@ +module Nums exposing (..) + +import Chowla +import Expect +import Test exposing (..) + + +suite : Test +suite = + describe "Chowla numbers" + [ test "nums 20" <| + \_ -> Chowla.nums 20 |> Expect.equal [ 0, 0, 0, 2, 0, 5, 0, 6, 3, 7, 0, 15, 0, 9, 8, 14, 0, 20, 0, 21 ] + , test "nums 18" <| + \_ -> Chowla.nums 18 |> Expect.equal [ 0, 0, 0, 2, 0, 5, 0, 6, 3, 7, 0, 15, 0, 9, 8, 14, 0, 20 ] + , test "nums 6" <| + \_ -> Chowla.nums 6 |> Expect.equal [ 0, 0, 0, 2, 0, 5 ] + , test "nums 4" <| + \_ -> Chowla.nums 4 |> Expect.equal [ 0, 0, 0, 2 ] + ] diff --git a/challenge-109/lance-wicks/perl/ch-1.pl b/challenge-109/lance-wicks/perl/ch-1.pl new file mode 100644 index 0000000000..ddbb11ad8a --- /dev/null +++ b/challenge-109/lance-wicks/perl/ch-1.pl @@ -0,0 +1,12 @@ +use strict; +use warnings; + +use lib './lib'; +use Chowla; + +my $c = Chowla->new; +my $numbers = $c->list(20); + +for my $n (@$numbers) { + print "$n, "; +} diff --git a/challenge-109/lance-wicks/perl/lib/Chowla.pm b/challenge-109/lance-wicks/perl/lib/Chowla.pm new file mode 100644 index 0000000000..06619c38d2 --- /dev/null +++ b/challenge-109/lance-wicks/perl/lib/Chowla.pm @@ -0,0 +1,26 @@ +package Chowla; + +use Moo; + +sub list { + my ($self,$max) = @_; + my @chowla_numbers; + for my $n (1..$max) { + push @chowla_numbers, $self->n($n); + } + return \@chowla_numbers; +} + +sub n { + my ($self,$num) = @_; + + my $total = 0; + for my $n (2..$num-1) { + if ($num % $n == 0) { + $total += $n; + } + } + return $total; +} + +1; diff --git a/challenge-109/lance-wicks/perl/t/01-chowla.t b/challenge-109/lance-wicks/perl/t/01-chowla.t new file mode 100644 index 0000000000..15d50ac14e --- /dev/null +++ b/challenge-109/lance-wicks/perl/t/01-chowla.t @@ -0,0 +1,12 @@ +use Test2::V0 -target => 'Chowla'; + +is $CLASS->list(20),[0, 0, 0, 2, 0, 5, 0, 6, 3, 7, 0, 15, 0, 9, 8, 14, 0, 20, 0, 21], 'List the first 20 Chowla numbers'; + +is $CLASS->n(1),0, 'First Chowla number should be zero'; +is $CLASS->n(2),0, 'Second Chowla number should be zero'; +is $CLASS->n(3),0, 'Third Chowla number should be zero'; +is $CLASS->n(4),2, 'Fourth Chowla number should be two'; +is $CLASS->n(5),0, 'Fifth Chowla number should be 0'; +is $CLASS->n(6),5, 'Sixth Chowla number should be 5'; + +done_testing; |
