]> www.fi.muni.cz Git - aoc2020.git/blob - 42.pl
Task 9 Perl Golf-style
[aoc2020.git] / 42.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4
5 my %allergens;
6 my %is_al;
7
8 while (<>) {
9         chomp;
10         my ($ingr, $al) = /\A([^\(]+) \(contains (.*)\)\z/;
11         my %ingr = map { $_ => 1 } split /\s+/, $ingr;
12         my @al = split /, /, $al;
13         for my $al (@al) {
14                 if (defined $allergens{$al}) {
15                         for my $in1 (keys %{ $allergens{$al} }) {
16                                 if (! $ingr{$in1}) {
17                                         delete $allergens{$al}->{$in1};
18                                 }
19                         }
20                 } else {
21                         $allergens{$al} = { %ingr };
22                 }
23         }
24 }
25
26 AGAIN:
27 for my $al (keys %allergens) {
28         if (keys %{ $allergens{$al} } == 1) {
29                 my $in1;
30                 for my $in (keys %{ $allergens{$al} }) {
31                         $is_al{$in} = $al;
32                         $in1 = $in;
33                 }
34                 delete $allergens{$al};
35                 for my $al1 (keys %allergens) {
36                         delete $allergens{$al1}->{$in1};
37                 }
38                 goto AGAIN;
39         }
40 }
41
42 print join(',', sort { $is_al{$a} cmp $is_al{$b} } keys %is_al), "\n";