]> www.fi.muni.cz Git - aoc2021.git/blob - 16.pl
Day 8: permutations and y///;
[aoc2021.git] / 16.pl
1 #!/usr/bin/perl -w
2
3 use v5.16;
4
5 my %digits = (
6         abcefg  => 0,
7         cf      => 1,
8         acdeg   => 2,
9         acdfg   => 3,
10         bcdf    => 4,
11         abdfg   => 5,
12         abdefg  => 6,
13         acf     => 7,
14         abcdefg => 8,
15         abcdfg  => 9,
16 );
17
18 my @perms;
19
20 sub do_perms {
21         my ($t, @vals) = @_;
22         if (@vals == 1) {
23                 push @perms, $t.$vals[0];
24         } else {
25                 for my $i (0 .. $#vals) {
26                         my @v1 = @vals;
27                         my $u = splice @v1, $i, 1;
28                         do_perms("$t$u", @v1);
29                 }
30         }
31 }
32
33 do_perms ('', qw(a b c d e f g));
34
35 my $sum = 0;
36 ROW:
37 while (<>) {
38         chomp;
39         my ($inv, $outv) = split /\s+\|\s+/;
40         my (@in) = split /\s+/, $inv;
41         my (@out) = split /\s+/, $outv;
42
43         PERM:
44         for my $perm (@perms) {
45                 for my $i (@in) {
46                         my $ni = $i;
47                         eval "\$ni =~ y/abcdefg/$perm/";
48                         my $sorted = join('', sort split //, $ni);
49                         # say "i=$i ni=$ni sorted=$sorted";
50                         next PERM if !defined $digits{$sorted};
51                 }
52                 my $rv = '';
53                 for my $o (@out) {
54                         my $no = $o;
55                         eval "\$no =~ y/abcdefg/$perm/";
56                         my $nsorted = join('', sort split //, $no);
57                         $rv .= $digits{$nsorted};
58                 }
59                 $sum += $rv;
60                 next ROW;
61         }
62 }
63
64 say $sum;
65                         
66