- my ($id, @rows) = split /\n/;
- $id =~ s/Tile //;
- $id =~ s/://;
- @rows = map { y/#./10/; oct "0b$_" } @rows;
- $tiles{$id} = \@rows;
- $sides{$id} = [
- $rows[0],
- (($rows[0] & 1) << 9)
- | (($rows[1] & 1) << 8)
- | (($rows[2] & 1) << 7)
- | (($rows[3] & 1) << 6)
- | (($rows[4] & 1) << 5)
- | (($rows[5] & 1) << 4)
- | (($rows[6] & 1) << 3)
- | (($rows[7] & 1) << 2)
- | (($rows[8] & 1) << 1)
- | (($rows[9] & 1) << 0),
- $rows[9],
- (($rows[0] & 512) >> 0)
- | (($rows[1] & 512) >> 1)
- | (($rows[2] & 512) >> 2)
- | (($rows[3] & 512) >> 3)
- | (($rows[4] & 512) >> 4)
- | (($rows[5] & 512) >> 5)
- | (($rows[6] & 512) >> 6)
- | (($rows[7] & 512) >> 7)
- | (($rows[8] & 512) >> 8)
- | (($rows[9] & 512) >> 9),
- ];
- print "Tile <$id> sides ", join(',', @{ $sides{$id} }), "\n";
- for my $side (@{ $sides{$id} }) {
- push @{ $side2tiles{$side} }, $id;
- push @{ $side2tiles{invbits($side)} }, $id;
+ my ($id, $data) = /\ATile\s+(\d+):\n(.*?\n)\n?\z/xms;
+ for (1 .. 8) {
+ push @{ $top2tile{top_side($data)} }, $id;
+ $data = rotate_or_flip($data, $_);