From 99264cf95c516cdd258f8f202334d4c9985918c1 Mon Sep 17 00:00:00 2001 From: "Jaldhar H. Vyas" Date: Sat, 4 Oct 2025 18:24:01 -0400 Subject: [PATCH] Challenge 210 by Jaldhar H. Vyas. --- challenge-210/jaldhar-h-vyas/ch2ex1.txt | 5 ++ challenge-210/jaldhar-h-vyas/ch2ex2.txt | 6 ++ challenge-210/jaldhar-h-vyas/perl/ch-1.pl | 12 ++++ challenge-210/jaldhar-h-vyas/perl/ch-2.pl | 74 +++++++++++++++++++++ challenge-210/jaldhar-h-vyas/raku/ch-1.raku | 13 ++++ challenge-210/jaldhar-h-vyas/raku/ch-2.raku | 64 ++++++++++++++++++ 6 files changed, 174 insertions(+) create mode 100644 challenge-210/jaldhar-h-vyas/ch2ex1.txt create mode 100644 challenge-210/jaldhar-h-vyas/ch2ex2.txt create mode 100755 challenge-210/jaldhar-h-vyas/perl/ch-1.pl create mode 100755 challenge-210/jaldhar-h-vyas/perl/ch-2.pl create mode 100755 challenge-210/jaldhar-h-vyas/raku/ch-1.raku create mode 100755 challenge-210/jaldhar-h-vyas/raku/ch-2.raku 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