]> www.fi.muni.cz Git - aoc2020.git/blob - 39.pl
Day 20: manual coding, coding, coding
[aoc2020.git] / 39.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4
5 local $/ = "\n\n";
6
7 sub invbits {
8         my ($in) = @_;
9         return (($in & 1) << 9)
10                 | (($in & 2) << 7)
11                 | (($in & 4) << 5)
12                 | (($in & 8) << 3)
13                 | (($in & 16) << 1)
14                 | (($in & 32) >> 1)
15                 | (($in & 64) >> 3)
16                 | (($in & 128) >> 5)
17                 | (($in & 256) >> 7)
18                 | (($in & 512) >> 9);
19 }
20
21 my %tiles;
22 my %sides;
23 my %side2tiles;
24 while (<>) {
25         my ($id, @rows) = split /\n/;
26         $id =~ s/Tile //;
27         $id =~ s/://;
28         @rows = map { y/#./10/; oct "0b$_" } @rows;
29         $tiles{$id} = \@rows;
30         $sides{$id} = [
31                 $rows[0],
32                 (($rows[0] & 1) << 9)
33                 | (($rows[1] & 1) << 8)
34                 | (($rows[2] & 1) << 7)
35                 | (($rows[3] & 1) << 6)
36                 | (($rows[4] & 1) << 5)
37                 | (($rows[5] & 1) << 4)
38                 | (($rows[6] & 1) << 3)
39                 | (($rows[7] & 1) << 2)
40                 | (($rows[8] & 1) << 1)
41                 | (($rows[9] & 1) << 0),
42                 $rows[9],
43                 (($rows[0] & 512) >> 0)
44                 | (($rows[1] & 512) >> 1)
45                 | (($rows[2] & 512) >> 2)
46                 | (($rows[3] & 512) >> 3)
47                 | (($rows[4] & 512) >> 4)
48                 | (($rows[5] & 512) >> 5)
49                 | (($rows[6] & 512) >> 6)
50                 | (($rows[7] & 512) >> 7)
51                 | (($rows[8] & 512) >> 8)
52                 | (($rows[9] & 512) >> 9),
53         ];
54         print "Tile <$id> sides ", join(',', @{ $sides{$id} }), "\n";
55         for my $side (@{ $sides{$id} }) {
56                 push @{ $side2tiles{$side} }, $id;
57                 push @{ $side2tiles{invbits($side)} }, $id;
58         }
59 }
60
61 my %single_ids;
62 for my $side (keys %side2tiles) {
63         print "side $side: ", join(',', @{ $side2tiles{$side} }), "\n";
64         # print "inv  ", invbits($side), "\n";
65         if (scalar @{ $side2tiles{$side} } == 1
66                 && scalar @{ $side2tiles{invbits($side)} } == 1) {
67                 print "side $side of tile $side2tiles{$side}->[0] is single\n";
68                 $single_ids{$side2tiles{$side}->[0]}++;
69         }
70         
71 }
72
73 my @corners = grep { $single_ids{$_} == 4 } keys %single_ids;
74 print join('*', @corners), '=', eval join('*', @corners), "\n"
75