]> www.fi.muni.cz Git - aoc.git/blob - 2023/26.pl
Day 25: examining the input
[aoc.git] / 2023 / 26.pl
1 #!/usr/bin/perl -w
2
3 use v5.38;
4 use experimental 'multidimensional', 'for_list', 'builtin';
5 use builtin 'indexed';
6 use List::Util;
7 use Y::AoC::Task;
8 $; = ';';
9 # t;
10
11 $/ = "\n\n";
12
13 my $sum;
14 MAP:
15 while (<>) {
16         chomp;
17         my @map = map { [ split // ] } split /\n/, $_;
18         
19         my $n;
20         COL:
21         for my $r1 (1 .. $#{ $map[0] }) {
22                 say "Trying col $r1";
23                 for my $x (0 .. $r1) {
24                         my $x1 = 2*$r1-$x-1;
25                         say "col $x vs $x1";
26                         next if $x1 > $#{ $map[0] };
27                         for my $y (0 .. $#map) {
28                                 next COL if $map[$y][$x] ne $map[$y][$x1];
29                         }
30                 }
31                 say "X match at $r1";
32                 $n += $r1;
33                 goto OUT;
34         }
35         ROW:
36         for my $r1 (1 .. $#map) {
37                 say "Trying row $r1";
38                 for my $y (0 .. $r1) {
39                         my $y1 = 2*$r1-$y-1;
40                         say "row $y vs $y1";
41                         next if $y1 > $#map;
42                         for my $x (0 .. $#{ $map[0] }) {
43                                 next ROW if $map[$y][$x] ne $map[$y1][$x];
44                         }
45                 }
46                 say "Y match at $r1";
47                 $n = 100*$r1;
48                 goto OUT;
49         }
50         OUT:
51         
52         for my $sx (0 .. $#{ $map[0] }) {
53                 for my $sy (0 .. $#map) {
54                         my $old = $map[$sy][$sx];
55                         $map[$sy][$sx] = ($old eq '.') ? '#' : '.';
56                         say "######################### $sx,$sy $old $map[$sy][$sx]";
57         say "============ $#{ $map[0] } x $#map ==========";
58         COL:
59         for my $r1 (1 .. $#{ $map[0] }) {
60                 next if $n == $r1;
61                 say "Trying col $r1";
62                 for my $x (0 .. $r1) {
63                         my $x1 = 2*$r1-$x-1;
64                         say "col $x vs $x1";
65                         next if $x1 > $#{ $map[0] };
66                         for my $y (0 .. $#map) {
67                                 next COL if $map[$y][$x] ne $map[$y][$x1];
68                         }
69                 }
70                 say "X match at $r1";
71                 $sum += $r1;
72                 next MAP;
73         }
74         ROW:
75         for my $r1 (1 .. $#map) {
76                 next if $n == 100*$r1;
77                 say "Trying row $r1";
78                 for my $y (0 .. $r1) {
79                         my $y1 = 2*$r1-$y-1;
80                         say "row $y vs $y1";
81                         next if $y1 > $#map;
82                         for my $x (0 .. $#{ $map[0] }) {
83                                 next ROW if $map[$y][$x] ne $map[$y1][$x];
84                         }
85                 }
86                 say "Y match at $r1";
87                 $sum += 100*$r1;
88                 next MAP;
89         }
90                         $map[$sy][$sx] = $old;
91                 }
92         }
93         die "No match at $.";
94 }
95
96 say $sum;
97
98