aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad Sajid Anwar <Mohammad.Anwar@yahoo.com>2025-10-05 19:43:03 +0100
committerGitHub <noreply@github.com>2025-10-05 19:43:03 +0100
commitbd746a760464901d725219642cb138d1c7b42d2c (patch)
treec76e049bfdce48b0d322dda4de732e55cb46d693
parentc59ffb1a5097d715ebce7a56a744401e7c52c9f8 (diff)
parent99264cf95c516cdd258f8f202334d4c9985918c1 (diff)
downloadperlweeklychallenge-club-bd746a760464901d725219642cb138d1c7b42d2c.tar.gz
perlweeklychallenge-club-bd746a760464901d725219642cb138d1c7b42d2c.tar.bz2
perlweeklychallenge-club-bd746a760464901d725219642cb138d1c7b42d2c.zip
Merge pull request #12789 from jaldhar/challenge-210
Challenge 210 by Jaldhar H. Vyas.
-rw-r--r--challenge-210/jaldhar-h-vyas/ch2ex1.txt5
-rw-r--r--challenge-210/jaldhar-h-vyas/ch2ex2.txt6
-rwxr-xr-xchallenge-210/jaldhar-h-vyas/perl/ch-1.pl12
-rwxr-xr-xchallenge-210/jaldhar-h-vyas/perl/ch-2.pl74
-rwxr-xr-xchallenge-210/jaldhar-h-vyas/raku/ch-1.raku13
-rwxr-xr-xchallenge-210/jaldhar-h-vyas/raku/ch-2.raku64
6 files changed, 174 insertions, 0 deletions
diff --git a/challenge-210/jaldhar-h-vyas/ch2ex1.txt b/challenge-210/jaldhar-h-vyas/ch2ex1.txt
new file mode 100644
index 0000000000..f584841ac7
--- /dev/null
+++ b/challenge-210/jaldhar-h-vyas/ch2ex1.txt
@@ -0,0 +1,5 @@
+[
+ ["A", "a1\@a.com", "a2\@a.com"],
+ ["B", "b1\@b.com"],
+ ["A", "a3\@a.com", "a1\@a.com"]
+]
diff --git a/challenge-210/jaldhar-h-vyas/ch2ex2.txt b/challenge-210/jaldhar-h-vyas/ch2ex2.txt
new file mode 100644
index 0000000000..2178d5c291
--- /dev/null
+++ b/challenge-210/jaldhar-h-vyas/ch2ex2.txt
@@ -0,0 +1,6 @@
+[
+ ["A", "a1\@a.com", "a2\@a.com"],
+ ["B", "b1\@b.com"],
+ ["A", "a3\@a.com"],
+ ["B", "b2\@b.com", "b1\@b.com"]
+]
diff --git a/challenge-210/jaldhar-h-vyas/perl/ch-1.pl b/challenge-210/jaldhar-h-vyas/perl/ch-1.pl
new file mode 100755
index 0000000000..6bee57a5c8
--- /dev/null
+++ b/challenge-210/jaldhar-h-vyas/perl/ch-1.pl
@@ -0,0 +1,12 @@
+#!/usr/bin/perl
+use 5.038;
+use warnings;
+
+my @bits = @ARGV;
+my $arg = join q{}, @ARGV;
+
+$arg =~ s/10/b/g;
+$arg =~ s/11/c/g;
+$arg =~ s/0/a/g;
+
+say $arg =~ /a$/ ? 1 : 0;
diff --git a/challenge-210/jaldhar-h-vyas/perl/ch-2.pl b/challenge-210/jaldhar-h-vyas/perl/ch-2.pl
new file mode 100755
index 0000000000..e20beb2619
--- /dev/null
+++ b/challenge-210/jaldhar-h-vyas/perl/ch-2.pl
@@ -0,0 +1,74 @@
+#!/usr/bin/perl
+use 5.038;
+use warnings;
+use Data::Dumper;
+$Data::Dumper::Terse = 1;
+$Data::Dumper::Indent = 1;
+
+sub mergeAccounts ($accounts) {
+ my %emailToName;
+ my %emailToEmails;
+
+ for my $account (@{$accounts}) {
+ my $name = $account->[0];
+ my @emails = @{$account}[1 .. scalar @{$account} - 1];
+
+ for my $email (@emails) {
+ $emailToName{$email} = $name;
+ }
+
+ for my $email (@emails) {
+ $emailToEmails{$email} //= {};
+ for my $connected (@emails) {
+ $emailToEmails{$email}->{$connected} = 1;
+ }
+ }
+ }
+
+ my %seen;
+ my @result;
+
+ for my $email (keys %emailToEmails) {
+ if ($seen{$email}) {
+ next;
+ }
+
+ # Find all connected emails using BFS
+ my @q = ($email);
+ my $i = 0;
+ while ($i < @q) {
+ my $current = $q[$i++];
+ for my $connected (keys %{$emailToEmails{$current}}) {
+ unless ($seen{$connected}) {
+ $seen{$connected} = 1;
+ push @q, $connected;
+ }
+ }
+ }
+
+ my $name = $emailToName{$email};
+ push @result, [$name, sort(unique(@q))];
+ }
+
+ return \@result;
+}
+
+sub unique(@list) {
+ my %elems;
+ for (@list) {
+ $elems{$_}++;
+ }
+
+ return (keys %elems);
+}
+
+sub getAccountsFrom($filename) {
+ open my $fh, '<', $filename or die "Could not open file: $!";
+ local $/ = undef;
+ my $content = <$fh>;
+ close $fh;
+ my $accounts = eval $content || die "Could not eval content: $@"; ## no critic
+ return $accounts;
+}
+
+say Dumper(mergeAccounts(getAccountsFrom($ARGV[0]))); \ No newline at end of file
diff --git a/challenge-210/jaldhar-h-vyas/raku/ch-1.raku b/challenge-210/jaldhar-h-vyas/raku/ch-1.raku
new file mode 100755
index 0000000000..0038b7576e
--- /dev/null
+++ b/challenge-210/jaldhar-h-vyas/raku/ch-1.raku
@@ -0,0 +1,13 @@
+#!/usr/bin/raku
+
+sub MAIN(
+ *@bits
+) {
+ my $arg = @bits.join(q{});
+
+ $arg ~~ s:g/10/b/;
+ $arg ~~ s:g/11/c/;
+ $arg ~~ s:g/0/a/;
+
+ say $arg ~~ /a$/ ?? 1 !! 0;
+} \ No newline at end of file
diff --git a/challenge-210/jaldhar-h-vyas/raku/ch-2.raku b/challenge-210/jaldhar-h-vyas/raku/ch-2.raku
new file mode 100755
index 0000000000..75f18eb1eb
--- /dev/null
+++ b/challenge-210/jaldhar-h-vyas/raku/ch-2.raku
@@ -0,0 +1,64 @@
+#!/usr/bin/raku
+use MONKEY-SEE-NO-EVAL;
+
+sub mergeAccounts(@accounts) {
+ my %emailToName;
+ my %emailToEmails;
+
+ for @accounts -> @account {
+ my $name = @account[0];
+ my @emails = @account[1..*];
+
+ for @emails -> $email {
+ %emailToName{$email} = $name;
+ }
+
+ for @emails -> $email {
+ unless %emailToEmails{$email}:exists {
+ %emailToEmails{$email} = Set.new();
+ }
+ %emailToEmails{$email} ∪= @emails.Set;
+ }
+ }
+
+ # Second pass: merge connected components
+ my %seen;
+ my @result;
+
+ for %emailToEmails.keys -> $email {
+ if %seen{$email} {
+ next;
+ }
+
+ # Find all connected emails using BFS
+ my @q = [$email];
+ my $i = 0;
+ while $i < @q.elems {
+ my $current = @q[$i++];
+ for %emailToEmails{$current}.keys -> $connected {
+ unless %seen{$connected} {
+ %seen{$connected} = True;
+ @q.push($connected);
+ }
+ }
+ }
+
+ # Sort emails and add to result, removing duplicates
+ my $name = %emailToName{$email};
+ @result.push([$name, |@q.unique.sort]);
+ }
+
+ return @result;
+}
+
+sub getAccountsFrom($filename) {
+ my $content = $filename.IO.slurp;
+ my @accounts = EVAL($content);
+ return @accounts;
+}
+
+sub MAIN(
+ Str $filename
+) {
+ mergeAccounts(getAccountsFrom($filename)).raku.say;
+} \ No newline at end of file