diff options
| author | Jan Krňávek <Jan.Krnavek@gmail.com> | 2023-03-26 21:35:38 +0200 |
|---|---|---|
| committer | Jan Krňávek <Jan.Krnavek@gmail.com> | 2023-03-26 21:35:38 +0200 |
| commit | ab5b38d3831d6ee115de0e362c43229e5a89df29 (patch) | |
| tree | 4687126b16914563e65e18a9c1a7adf44d9597e7 | |
| parent | a9c3c64ac9aa05dd9f5ebfd19ef3f89b4c50467b (diff) | |
| download | perlweeklychallenge-club-ab5b38d3831d6ee115de0e362c43229e5a89df29.tar.gz perlweeklychallenge-club-ab5b38d3831d6ee115de0e362c43229e5a89df29.tar.bz2 perlweeklychallenge-club-ab5b38d3831d6ee115de0e362c43229e5a89df29.zip | |
solution week 209-2 -- without special class
| -rw-r--r-- | challenge-209/wambash/raku/ch-2.raku | 71 |
1 files changed, 25 insertions, 46 deletions
diff --git a/challenge-209/wambash/raku/ch-2.raku b/challenge-209/wambash/raku/ch-2.raku index 719d9bdc6d..fe07c54e11 100644 --- a/challenge-209/wambash/raku/ch-2.raku +++ b/challenge-209/wambash/raku/ch-2.raku @@ -1,63 +1,42 @@ #!/usr/bin/env raku -class Account { - has $.name; - has Set() $.email; - - multi method COERCE (+@ (Str $name, +@email)) { - Account.new: :$name, :@email - } - - multi method List { - $!name, |$!email.keys.sort - } -} - - -multi join-account (+@acc) {samewith @acc} -multi join-account (Array[Account()]() \acc) { - Account.new: name => acc.head.name, email => [(|)] acc».email; +sub join-account (+@acc) { + @acc.head.head, |@acc.map( |*.skip ).sort.squish; } -sub merge-account-reducer ( @accounts, $email) { - @accounts - andthen .classify: { $email ∈ .email }\ - andthen |.{False}, join-account |.{True} +sub merge-account-reducer ( @account, $email) { + @account + andthen .classify: { $email ∈ .skip }\ + andthen |(.{False} // Empty), join-account |.{True} } -multi merge-account (+@acc) {samewith @acc} -multi merge-account (Array[Account()]() \accounts) { - my @email = ([∪] accounts.map( *.email)).keys; +sub merge-account (+@accounts) { + my @email = @accounts.map( |*.skip ).unique; - accounts, |@email + @accounts, |@email andthen .reduce: &merge-account-reducer } multi MAIN (Bool :test($)!) { use Test; - is-deeply Account('A', 'a1@a.com', 'a2@a.com').email, <a1@a.com a2@a.com>.Set; - is Account(<B b@b.com>).name, 'B'; - is-deeply join-account( - <A a1@a.com a2@a.com>, <B b1@b.com>, <A a3@a.com a1@a.com> - ).email, <a1@a.com a2@a.com b1@b.com a3@a.com>.Set; + my @accounts := <A a1@a.com a2@a.com>, <B b1@b.com>, <A a3@a.com a1@a.com>; + is-deeply join-account( @accounts ), <A a1@a.com a2@a.com a3@a.com b1@b.com>; is-deeply join-account( - <A a1@a.com a2@a.com>, <B b1@b.com>, <A a3@a.com a1@a.com> - ).name, 'A'; - is-deeply merge-account-reducer( - Array[Account()](<A a1@a.com a2@a.com>, <B b1@b.com>, <A a3@a.com a1@a.com>), - 'a1@a.com' - )».email, (<b1@b.com>.Set, <a1@a.com a2@a.com a3@a.com>.Set) ; - is-deeply merge-account( <A a1@a.com a2@a.com>, <B b1@b.com>, <A a3@a.com a1@a.com> ).sort(*.name).head.email, - <a1@a.com a2@a.com a3@a.com>.Set; - is merge-account( <A a1@a.com a2@a.com>, <B b1@b.com>, <A a3@a.com a1@a.com> )».List.sort, - (<A a1@a.com a2@a.com a3@a.com>, <B b1@b.com>); - is merge-account( <A a1@a.com a2@a.com>, <B b1@b.com b2@b.com>, <A a3@a.com > )».List.sort, - (<A a1@a.com a2@a.com>, <A a3@a.com>, <B b1@b.com b2@b.com>); - is merge-account( <A a1@a.com a2@a.com>, <B b1@b.com b2@b.com>, <A a3@a.com >, <A a4@a.com a1@a.com> )».List.sort, - (<A a1@a.com a2@a.com a4@a.com>, <A a3@a.com>, <B b1@b.com b2@b.com>); + <A a1@a.com a2@a.com>, <A a3@a.com a2@a.com a1@a.com> + ), <A a1@a.com a2@a.com a3@a.com>; + is-deeply merge-account-reducer( @accounts, 'a1@a.com' ), (<B b1@b.com>,<A a1@a.com a2@a.com a3@a.com>); + is-deeply merge-account-reducer( @accounts, 'a2@a.com' ), (<B b1@b.com>, <A a3@a.com a1@a.com>, <A a1@a.com a2@a.com>); + is-deeply merge-account-reducer( @accounts, 'a3@a.com' ), (<A a1@a.com a2@a.com>,<B b1@b.com>, <A a1@a.com a3@a.com>); + is-deeply merge-account( @accounts ), ( <B b1@b.com>, <A a1@a.com a2@a.com a3@a.com> ); + is-deeply merge-account( <A a1@a.com a2@a.com>, <B b1@b.com b2@b.com>, <A a3@a.com > ), + (<A a1@a.com a2@a.com>, <B b1@b.com b2@b.com>, <A a3@a.com>); + is merge-account( <A a1@a.com a2@a.com>, <B b1@b.com b2@b.com>, <A a3@a.com >, <A a4@a.com a1@a.com> ), + ( <B b1@b.com b2@b.com>, <A a3@a.com>, <A a1@a.com a2@a.com a4@a.com>, ); + is-deeply merge-account( <A a b c>, <A a> ), ( <A a b c>,); + is-deeply merge-account( <A a b c>, <A c d e>, <B x y>, <A d f> ), ( <B x y>, <A a b c d e f>,); done-testing; } -multi MAIN (@account) { - say merge-account @account +multi MAIN (:@account) { + say merge-account @account.map: *.words.list } |
