X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=2023%2F26.pl;fp=2023%2F26.pl;h=e5771066f0e08c292bdc769d77065ddd2e5778bb;hb=27d0c1a07960f4080fd3032e97f25f4ad02b0e73;hp=0000000000000000000000000000000000000000;hpb=73b57709afa3fb057fdba1fb706d0d49506be7cb;p=aoc.git diff --git a/2023/26.pl b/2023/26.pl new file mode 100755 index 0000000..e577106 --- /dev/null +++ b/2023/26.pl @@ -0,0 +1,98 @@ +#!/usr/bin/perl -w + +use v5.38; +use experimental 'multidimensional', 'for_list', 'builtin'; +use builtin 'indexed'; +use List::Util; +use Y::AoC::Task; +$; = ';'; +# t; + +$/ = "\n\n"; + +my $sum; +MAP: +while (<>) { + chomp; + my @map = map { [ split // ] } split /\n/, $_; + + my $n; + COL: + for my $r1 (1 .. $#{ $map[0] }) { + say "Trying col $r1"; + for my $x (0 .. $r1) { + my $x1 = 2*$r1-$x-1; + say "col $x vs $x1"; + next if $x1 > $#{ $map[0] }; + for my $y (0 .. $#map) { + next COL if $map[$y][$x] ne $map[$y][$x1]; + } + } + say "X match at $r1"; + $n += $r1; + goto OUT; + } + ROW: + for my $r1 (1 .. $#map) { + say "Trying row $r1"; + for my $y (0 .. $r1) { + my $y1 = 2*$r1-$y-1; + say "row $y vs $y1"; + next if $y1 > $#map; + for my $x (0 .. $#{ $map[0] }) { + next ROW if $map[$y][$x] ne $map[$y1][$x]; + } + } + say "Y match at $r1"; + $n = 100*$r1; + goto OUT; + } + OUT: + + for my $sx (0 .. $#{ $map[0] }) { + for my $sy (0 .. $#map) { + my $old = $map[$sy][$sx]; + $map[$sy][$sx] = ($old eq '.') ? '#' : '.'; + say "######################### $sx,$sy $old $map[$sy][$sx]"; + say "============ $#{ $map[0] } x $#map =========="; + COL: + for my $r1 (1 .. $#{ $map[0] }) { + next if $n == $r1; + say "Trying col $r1"; + for my $x (0 .. $r1) { + my $x1 = 2*$r1-$x-1; + say "col $x vs $x1"; + next if $x1 > $#{ $map[0] }; + for my $y (0 .. $#map) { + next COL if $map[$y][$x] ne $map[$y][$x1]; + } + } + say "X match at $r1"; + $sum += $r1; + next MAP; + } + ROW: + for my $r1 (1 .. $#map) { + next if $n == 100*$r1; + say "Trying row $r1"; + for my $y (0 .. $r1) { + my $y1 = 2*$r1-$y-1; + say "row $y vs $y1"; + next if $y1 > $#map; + for my $x (0 .. $#{ $map[0] }) { + next ROW if $map[$y][$x] ne $map[$y1][$x]; + } + } + say "Y match at $r1"; + $sum += 100*$r1; + next MAP; + } + $map[$sy][$sx] = $old; + } + } + die "No match at $."; +} + +say $sum; + +