aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Krňávek <Jan.Krnavek@gmail.com>2023-03-26 21:35:38 +0200
committerJan Krňávek <Jan.Krnavek@gmail.com>2023-03-26 21:35:38 +0200
commitab5b38d3831d6ee115de0e362c43229e5a89df29 (patch)
tree4687126b16914563e65e18a9c1a7adf44d9597e7
parenta9c3c64ac9aa05dd9f5ebfd19ef3f89b4c50467b (diff)
downloadperlweeklychallenge-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.raku71
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
}