]> www.fi.muni.cz Git - aoc2021.git/blob - 16.pl
Day 25: pretty straightforward
[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 sub permute {
36         my ($val, $perm) = @_;
37         eval "\$val =~ y/abcdefg/$perm/";
38         join('', sort split //, $val);
39 }
40
41 my $sum = 0;
42 ROW:
43 while (<>) {
44         chomp;
45         my ($inv, $outv) = split /\s+\|\s+/;
46         my (@in) = sort { length $a <=> length $b } split /\s+/, $inv;
47         # say "$inv => ", join(' ', @in);
48         my (@out) = split /\s+/, $outv;
49
50         PERM: for my $perm (@perms) {
51                 for my $i (@in) {
52                         my $ni = permute($i, $perm);
53                         next PERM if !defined $digits{$ni};
54                 }
55                 my $rv;
56                 for my $o (@out) {
57                         my $no = permute($o, $perm);
58                         $rv .= $digits{$no};
59                 }
60                 $sum += $rv;
61                 next ROW;
62         }
63 }
64
65 say $sum;
66                         
67