aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2023-03-26 23:42:17 +0100
committerGitHub <noreply@github.com>2023-03-26 23:42:17 +0100
commit8cfd7d8424eceeef43f9c43b1e4f1028d5236eae (patch)
tree6b3c34e7a513d1ecd56d8b8e9cdbefef08be64f9
parent8fffee813e7b342c0a4865225f4656cdaef96ef8 (diff)
parent040c65055d5c2f92219f9b3c18e176d299510729 (diff)
downloadperlweeklychallenge-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-xchallenge-209/2colours/raku/ch-1.raku17
-rwxr-xr-xchallenge-209/2colours/raku/ch-2.raku54
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;
+}