-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path21.pl
77 lines (66 loc) · 1.19 KB
/
21.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
use feature 'say';
use Clipboard;
use List::Util qw/sum/;
use Math::Cartesian::Product;
sub out {
my $out = shift;
Clipboard->copy_to_all_selections($out);
print "$out\n";
}
my $res = 0;
my %ING;
my %ALL;
while(<>) {
chomp;
m{^([\w\s]+)\(contains ([\w\s,]+)\)$}o or die;
my @ilist = split(' ', $1);
for my $i (@ilist) {
$ING{$i}++;
}
my @alist = split(/,\s+/, $2);
for my $a (@alist) {
my %ihash = map {$_ => 1} @ilist;
unless ($ALL{$a}) {
$ALL{$a} = \%ihash;
} else {
foreach (keys %{$ALL{$a}}){
delete $ALL{$a}{$_} unless $ihash{$_};
}
}
}
}
print Dumper(\%ALL);
for my $i (keys %ING) {
my $good = 1;
for my $a (values %ALL) {
if ($a->{$i}) {
$good = 0;
last;
}
}
$res+= $ING{$i} if $good;
}
out ($res);
my %RES;
while (%ALL) {
my ($i, $a);
while (my ($k, $v) = each %ALL) {
if (%$v == 1) {
($i) = keys %$v;
$a = $k;
last;
}
}
$RES{$a} = $i;
delete $ALL{$a};
for my $data (values %ALL) {
delete $data->{$i};
}
}
print Dumper(\%RES);
my @alist = map {$RES{$_}} (sort(keys %RES));
$res = join(',', @alist);
out $res;