7 return join("\n", @rows) . "\n";
12 my $dim =()= $str =~ /(\n)/g;
14 for my $y (0 .. $dim-1) {
15 for my $x (0 .. $dim-1) {
16 $newstr .= substr($str, $y + ($dim+1)*($dim - $x - 1), 1);
25 return rows2str(map { join('', reverse split //) } split /\n/, $str);
29 my ($str, $count) = @_;
30 return $count == 4 ? flip($str) : rotate($str);
35 my @rows = split /\n/, $str;
38 return map { s/\A.//; s/.\z//; $_ } @rows;
42 $_[0] =~ /\A(.*?)\n/xms;
47 $_[0] =~ /\A.*\n(.*?)\n\z/xms;
52 return join('', map { substr($_, 0, 1) } split /\n/, $_[0]);
56 return join('', map { substr($_, -1, 1) } split /\n/, $_[0]);
59 my (%top2tile, %left2tile);
64 my ($id, $data) = /\ATile\s+(\d+):\n(.*?\n)\n?\z/xms;
66 push @{ $top2tile{top_side($data)} }, [ $id, $data ];
67 push @{ $left2tile{left_side($data)} }, [ $id, $data ];
68 $data = rotate_or_flip($data, $_);
74 my $top_row = '###.#.#...';
77 # my $top_row = '#...##.#..';
83 for my $y (0 .. $dim-1) {
84 my ($id) = grep { $_->[0] != $top_id } @{ $top2tile{$top_row} };
85 ($top_id, $data) = @$id;
86 $top_row = bottom_side($data);
88 push @map_rows, trim($data);
90 my $right_id = $top_id;
91 my $right_row = right_side($data);
93 for my $x (1 .. $dim-1) {
94 my ($id) = grep { $_->[0] != $right_id } @{ $left2tile{$right_row} };
95 ($right_id, $data) = @$id;
96 $right_row = right_side($data);
98 my $i = @map_rows - 8;
100 $map_rows[$i++] .= $_;
105 my $map = rows2str(@map_rows);
106 my $hashes =()= $map =~ /#/g;
109 . join('[\.#\n]' x ($dim * 8 - 20 + 1),
110 map { my $a=$_; $a=~ s/\./[\.#]/g; $a }
111 '..................#.',
112 '#....##....##....###',
113 '.#..#..#..#..#..#...'
117 if (my $count =()= $map =~ /($monster)/g) {
118 print "$count matches\n";
119 print "$hashes-$count*15=", $hashes-$count*15, "\n";
122 $map = rotate_or_flip($map, $_);