]> www.fi.muni.cz Git - aoc.git/blobdiff - 2021/16.pl
Moved 2021 to a subdir
[aoc.git] / 2021 / 16.pl
diff --git a/2021/16.pl b/2021/16.pl
new file mode 100755 (executable)
index 0000000..86d8dfb
--- /dev/null
@@ -0,0 +1,67 @@
+#!/usr/bin/perl -w
+
+use v5.16;
+
+my %digits = (
+       abcefg  => 0,
+       cf      => 1,
+       acdeg   => 2,
+       acdfg   => 3,
+       bcdf    => 4,
+       abdfg   => 5,
+       abdefg  => 6,
+       acf     => 7,
+       abcdefg => 8,
+       abcdfg  => 9,
+);
+
+my @perms;
+
+sub do_perms {
+       my ($t, @vals) = @_;
+       if (@vals == 1) {
+               push @perms, $t.$vals[0];
+       } else {
+               for my $i (0 .. $#vals) {
+                       my @v1 = @vals;
+                       my $u = splice @v1, $i, 1;
+                       do_perms("$t$u", @v1);
+               }
+       }
+}
+
+do_perms('', qw(a b c d e f g));
+
+sub permute {
+       my ($val, $perm) = @_;
+       eval "\$val =~ y/abcdefg/$perm/";
+       join('', sort split //, $val);
+}
+
+my $sum = 0;
+ROW:
+while (<>) {
+       chomp;
+       my ($inv, $outv) = split /\s+\|\s+/;
+       my (@in) = sort { length $a <=> length $b } split /\s+/, $inv;
+       # say "$inv => ", join(' ', @in);
+       my (@out) = split /\s+/, $outv;
+
+       PERM: for my $perm (@perms) {
+               for my $i (@in) {
+                       my $ni = permute($i, $perm);
+                       next PERM if !defined $digits{$ni};
+               }
+               my $rv;
+               for my $o (@out) {
+                       my $no = permute($o, $perm);
+                       $rv .= $digits{$no};
+               }
+               $sum += $rv;
+               next ROW;
+       }
+}
+
+say $sum;
+                       
+