File tree Expand file tree Collapse file tree 4 files changed +163
-0
lines changed
challenge-210/jaldhar-h-vyas Expand file tree Collapse file tree 4 files changed +163
-0
lines changed Original file line number Diff line number Diff line change
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;
Original file line number Diff line number Diff line change
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])));
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments