Skip to content

Commit c7f95c6

Browse files
committed
Challenge 210 by Jaldhar H. Vyas.
1 parent 8915a66 commit c7f95c6

File tree

4 files changed

+163
-0
lines changed

4 files changed

+163
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#!/usr/bin/perl
2+
use 5.038;
3+
use warnings;
4+
5+
my @bits = @ARGV;
6+
my $arg = join q{}, @ARGV;
7+
8+
$arg =~ s/10/b/g;
9+
$arg =~ s/11/c/g;
10+
$arg =~ s/0/a/g;
11+
12+
say $arg =~ /a$/ ? 1 : 0;
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#!/usr/bin/perl
2+
use 5.038;
3+
use warnings;
4+
use Data::Dumper;
5+
$Data::Dumper::Terse = 1;
6+
$Data::Dumper::Indent = 1;
7+
8+
sub mergeAccounts ($accounts) {
9+
my %emailToName;
10+
my %emailToEmails;
11+
12+
for my $account (@{$accounts}) {
13+
my $name = $account->[0];
14+
my @emails = @{$account}[1 .. scalar @{$account} - 1];
15+
16+
for my $email (@emails) {
17+
$emailToName{$email} = $name;
18+
}
19+
20+
for my $email (@emails) {
21+
$emailToEmails{$email} //= {};
22+
for my $connected (@emails) {
23+
$emailToEmails{$email}->{$connected} = 1;
24+
}
25+
}
26+
}
27+
28+
my %seen;
29+
my @result;
30+
31+
for my $email (keys %emailToEmails) {
32+
if ($seen{$email}) {
33+
next;
34+
}
35+
36+
# Find all connected emails using BFS
37+
my @q = ($email);
38+
my $i = 0;
39+
while ($i < @q) {
40+
my $current = $q[$i++];
41+
for my $connected (keys %{$emailToEmails{$current}}) {
42+
unless ($seen{$connected}) {
43+
$seen{$connected} = 1;
44+
push @q, $connected;
45+
}
46+
}
47+
}
48+
49+
my $name = $emailToName{$email};
50+
push @result, [$name, sort(unique(@q))];
51+
}
52+
53+
return \@result;
54+
}
55+
56+
sub unique(@list) {
57+
my %elems;
58+
for (@list) {
59+
$elems{$_}++;
60+
}
61+
62+
return (keys %elems);
63+
}
64+
65+
sub getAccountsFrom($filename) {
66+
open my $fh, '<', $filename or die "Could not open file: $!";
67+
local $/ = undef;
68+
my $content = <$fh>;
69+
close $fh;
70+
my $accounts = eval $content || die "Could not eval content: $@"; ## no critic
71+
return $accounts;
72+
}
73+
74+
say Dumper(mergeAccounts(getAccountsFrom($ARGV[0])));
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/usr/bin/raku
2+
3+
sub MAIN(
4+
*@bits
5+
) {
6+
my $arg = @bits.join(q{});
7+
8+
$arg ~~ s:g/10/b/;
9+
$arg ~~ s:g/11/c/;
10+
$arg ~~ s:g/0/a/;
11+
12+
say $arg ~~ /a$/ ?? 1 !! 0;
13+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#!/usr/bin/raku
2+
use MONKEY-SEE-NO-EVAL;
3+
4+
sub mergeAccounts(@accounts) {
5+
my %emailToName;
6+
my %emailToEmails;
7+
8+
for @accounts -> @account {
9+
my $name = @account[0];
10+
my @emails = @account[1..*];
11+
12+
for @emails -> $email {
13+
%emailToName{$email} = $name;
14+
}
15+
16+
for @emails -> $email {
17+
unless %emailToEmails{$email}:exists {
18+
%emailToEmails{$email} = Set.new();
19+
}
20+
%emailToEmails{$email} = @emails.Set;
21+
}
22+
}
23+
24+
# Second pass: merge connected components
25+
my %seen;
26+
my @result;
27+
28+
for %emailToEmails.keys -> $email {
29+
if %seen{$email} {
30+
next;
31+
}
32+
33+
# Find all connected emails using BFS
34+
my @q = [$email];
35+
my $i = 0;
36+
while $i < @q.elems {
37+
my $current = @q[$i++];
38+
for %emailToEmails{$current}.keys -> $connected {
39+
unless %seen{$connected} {
40+
%seen{$connected} = True;
41+
@q.push($connected);
42+
}
43+
}
44+
}
45+
46+
# Sort emails and add to result, removing duplicates
47+
my $name = %emailToName{$email};
48+
@result.push([$name, |@q.unique.sort]);
49+
}
50+
51+
return @result;
52+
}
53+
54+
sub getAccountsFrom($filename) {
55+
my $content = $filename.IO.slurp;
56+
my @accounts = EVAL($content);
57+
return @accounts;
58+
}
59+
60+
sub MAIN(
61+
Str $filename
62+
) {
63+
mergeAccounts(getAccountsFrom($filename)).raku.say;
64+
}

0 commit comments

Comments
 (0)