]> www.fi.muni.cz Git - aoc2020.git/blobdiff - 42.pl
Day 21
[aoc2020.git] / 42.pl
diff --git a/42.pl b/42.pl
new file mode 100755 (executable)
index 0000000..05bf2ac
--- /dev/null
+++ b/42.pl
@@ -0,0 +1,42 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+my %allergens;
+my %is_al;
+
+while (<>) {
+       chomp;
+       my ($ingr, $al) = /\A([^\(]+) \(contains (.*)\)\z/;
+       my %ingr = map { $_ => 1 } split /\s+/, $ingr;
+       my @al = split /, /, $al;
+       for my $al (@al) {
+               if (defined $allergens{$al}) {
+                       for my $in1 (keys %{ $allergens{$al} }) {
+                               if (! $ingr{$in1}) {
+                                       delete $allergens{$al}->{$in1};
+                               }
+                       }
+               } else {
+                       $allergens{$al} = { %ingr };
+               }
+       }
+}
+
+AGAIN:
+for my $al (keys %allergens) {
+       if (keys %{ $allergens{$al} } == 1) {
+               my $in1;
+               for my $in (keys %{ $allergens{$al} }) {
+                       $is_al{$in} = $al;
+                       $in1 = $in;
+               }
+               delete $allergens{$al};
+               for my $al1 (keys %allergens) {
+                       delete $allergens{$al1}->{$in1};
+               }
+               goto AGAIN;
+       }
+}
+
+print join(',', sort { $is_al{$a} cmp $is_al{$b} } keys %is_al), "\n";