diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2023-03-26 23:42:17 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-26 23:42:17 +0100 |
| commit | 8cfd7d8424eceeef43f9c43b1e4f1028d5236eae (patch) | |
| tree | 6b3c34e7a513d1ecd56d8b8e9cdbefef08be64f9 | |
| parent | 8fffee813e7b342c0a4865225f4656cdaef96ef8 (diff) | |
| parent | 040c65055d5c2f92219f9b3c18e176d299510729 (diff) | |
| download | perlweeklychallenge-club-8cfd7d8424eceeef43f9c43b1e4f1028d5236eae.tar.gz perlweeklychallenge-club-8cfd7d8424eceeef43f9c43b1e4f1028d5236eae.tar.bz2 perlweeklychallenge-club-8cfd7d8424eceeef43f9c43b1e4f1028d5236eae.zip | |
Merge pull request #7805 from 2colours/branch-for-challenge-209
Weeklies by 2colours
| -rwxr-xr-x | challenge-209/2colours/raku/ch-1.raku | 17 | ||||
| -rwxr-xr-x | challenge-209/2colours/raku/ch-2.raku | 54 |
2 files changed, 71 insertions, 0 deletions
diff --git a/challenge-209/2colours/raku/ch-1.raku b/challenge-209/2colours/raku/ch-1.raku new file mode 100755 index 0000000000..3b4a2ac689 --- /dev/null +++ b/challenge-209/2colours/raku/ch-1.raku @@ -0,0 +1,17 @@ +#!/usr/bin/env raku + + +my token bit { <[01]> }; +subset BitList of Str where /^ '(' <bit>* % ',' ')' $/; + +sub MAIN(Str $bits) { + die 'Please supply a valid list of bits.' unless $bits.subst(/\s/, '', :g) ~~ BitList; + my Str() @bits = $<bit>; + die 'The last bit must be zero!' unless @bits[*-1] == 0; + my $bit-string = @bits.join; + $bit-string + .trans: <0 10 11> => <a b c> andthen + .substr(*-1) eq 'a' andthen + .Int + .say; +} diff --git a/challenge-209/2colours/raku/ch-2.raku b/challenge-209/2colours/raku/ch-2.raku new file mode 100755 index 0000000000..3a6ce5e96d --- /dev/null +++ b/challenge-209/2colours/raku/ch-2.raku @@ -0,0 +1,54 @@ +#!/usr/bin/env raku + +use Email::Valid; # zef install Email::Valid +my $email = Email::Valid.new; + +# Constraints: +# - the name can't have quotation marks + +my token name { '"' <( .*? )> '"' } +my token email { '"' <( .*? )> '"' <?{ $email.validate($/.Str) }> } +my token account { '[' <name> [ ',' <email>+ % ',' ]? ']' } +subset AccountList of Str where /^ '[' <account>* % ',' ']' $/; + +use MONKEY-TYPING; +augment class Array { + proto method unify-transitive is nodal {*} + multi method unify-transitive([]:) { [] } + multi method unify-transitive([@emails-head, **@rest]:) { + my @unified-rest = @rest.unify-transitive; + my @result; + @result.push: @emails-head; + for @unified-rest -> @emails-current { + given @result.head { + if $_ (&) @emails-current { + .append: keys(@emails-current (-) $_); + } + else { + @result.push: @emails-current; + } + } + } + @result + } +} + +sub build-account-str($name, @mails) { + my $mails-part = @mails.map('"' ~ * ~ '"').join(', '); + qq:to/END/.chomp + ["$name"{", $_" if .so given $mails-part}] + END +} + +sub MAIN(Str $accounts) { + die 'Please supply a valid list of accounts.' unless $accounts.subst(/\s/, '', :g) ~~ AccountList; + my @accounts <== + $<account>.map: { .<name>.Str => .<email>>>.Str }; + @accounts + .classify: *.key, as => *.value andthen + .duckmap: *.unify-transitive andthen + .map: {slip(.key X[&build-account-str] .value[])} andthen + .join: ', ' andthen + "[$_]" andthen + .say; +} |
