]> www.fi.muni.cz Git - aoc2020.git/blob - 32.pl
Task 9 Perl Golf-style
[aoc2020.git] / 32.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4
5 local $/ = "\n\n";
6 my @classes;
7 for (split /\n/, <>) {
8         my (@cls) = /\A(.*): (\d+)-(\d+) or (\d+)-(\d+)/;
9         print "$2:$3,$4:$5.\n";
10         push @classes, \@cls;
11 }
12
13 $_ = <>;
14 my @your = /(\d+)/g;
15 print "Your:", join("|", @your), "\n";
16
17 my @nearby;
18 TICKET:
19 for (split /\n/, <>) {
20         next if !/\d/;
21         my @n = /(\d+)/g;
22         NUM:
23         for my $num (@n) {
24                 for my $r (@classes) {
25                         if (($num >= $r->[1] && $num <= $r->[2])
26                                 || $num >= $r->[3] && $num <= $r->[4]) {
27                                 next NUM;
28                         }
29                 }
30                 next TICKET;
31         }
32         # print "nearby:", join("|", @n), "\n";
33         push @nearby, \@n;
34 }
35
36 my %valid_cols;
37 for my $cls (@classes) {
38         my ($name, $f1, $t1, $f2, $t2) = @$cls;
39         # print "Class $name:\n";
40         COL:
41         for my $col (0 .. $#your) {
42                 # print "col $col\n";
43                 for my $ticket (@nearby) {
44                         if (($ticket->[$col] < $f1 || $ticket->[$col] > $t1)
45                                 && $ticket->[$col] < $f2 || $ticket->[$col] > $t2) {
46                                 next COL;
47                         }
48                 }
49                 $valid_cols{$name}->{$col} = 1;
50                 print "$name can be $col\n";
51         }
52 }
53
54 my $mul = 1;
55 LOOP:
56 while (keys %valid_cols) {
57         for my $class (keys %valid_cols) {
58                 if (keys %{ $valid_cols{$class} } == 1) {
59                         my ($col) = keys %{ $valid_cols{$class} };
60                         print "$class is $col\n";
61                         delete $valid_cols{$class};
62                         for my $cl1 (keys %valid_cols) {
63                                 delete $valid_cols{$cl1}->{$col};
64                         }
65                         $mul *= $your[$col] if $class =~ /\Adeparture/;
66                         next LOOP;
67                 }
68         }
69 }
70
71 print "Total: $mul\n";