From: Jan "Yenya" Kasprzak Date: Sun, 10 Dec 2023 06:00:16 +0000 (+0100) Subject: Day 10: quite ugly solution, does not work on examples of part 2 X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?p=aoc.git;a=commitdiff_plain;h=0e9a2132dee3b812571f5506794af300aa1d1d15 Day 10: quite ugly solution, does not work on examples of part 2 --- diff --git a/2023/19.pl b/2023/19.pl new file mode 100755 index 0000000..f6da134 --- /dev/null +++ b/2023/19.pl @@ -0,0 +1,72 @@ +#!/usr/bin/perl -w + +use v5.38; +use experimental 'multidimensional', 'for_list', 'builtin'; +use builtin 'indexed'; +use List::Util; +use Y::AoC::Task; +$; = ';'; +# t; + +my @map = map { chomp; [ split //, ".$_." ] } <>; +push @map, [ ('.') x @map ]; +unshift @map, [ ('.') x @map ]; +my $xmax = $#{$map[0]}; +my $ymax = $#map; + +my ($sx, $sy); +for my $x (0 .. $xmax) { +for my $y (0 .. $ymax) { + next if $map[$y][$x] ne 'S'; + $sx = $x; $sy = $y; +} } + +say "starting at $sx, $sy"; + +my %dirs = ( + '|' => [ 0, -1, 0, 1], + '-' => [-1, 0, 1, 0], + 'J' => [-1, 0, 0, -1], + 'L' => [ 1, 0, 0, -1], + 'F' => [ 1, 0, 0, 1], + '7' => [-1, 0, 0, 1], +); + +if ($map[$sy][$sx-1] eq '-' && $map[$sy][$sx+1] eq '-') { + $map[$sy][$sx] = '-'; +} elsif ($map[$sy+1][$sx] eq '|' && $map[$sy-1][$sx] eq '|') { + $map[$sy][$sx] = '|'; +} elsif ($map[$sy][$sx-1] eq '-' && $map[$sy-1][$sx] eq '|') { + $map[$sy][$sx] = 'J'; +} elsif ($map[$sy][$sx-1] eq '-' && $map[$sy+1][$sx] eq '|') { + $map[$sy][$sx] = '7'; +} elsif ($map[$sy][$sx+1] eq '-' && $map[$sy-1][$sx] eq '|') { + $map[$sy][$sx] = 'L'; +} elsif ($map[$sy][$sx+1] eq '-' && $map[$sy+1][$sx] eq '|') { + $map[$sy][$sx] = 'F'; +} + +my %seen; +my $len = 0; +my ($px, $py); +while (!$seen{$sx,$sy}++) { + my @d = $dirs{ $map[$sy][$sx] }->@*; + say "map: $map[$sy][$sx] @d"; + if (!defined($px) || ($px != $d[0] || $py != $d[1])) { + say "first"; + $sx += $d[0]; + $sy += $d[1]; + $px = -$d[0]; + $py = -$d[1]; + } else { + say "second"; + $sx += $d[2]; + $sy += $d[3]; + $px = -$d[2]; + $py = -$d[3]; + } + ++$len; + say "at $sx $sy $map[$sy][$sx] from $px $py len $len"; +} + +say $len/2; diff --git a/2023/20.pl b/2023/20.pl new file mode 100755 index 0000000..c6d299a --- /dev/null +++ b/2023/20.pl @@ -0,0 +1,101 @@ +#!/usr/bin/perl -w + +use v5.38; +use experimental 'multidimensional', 'for_list', 'builtin'; +use builtin 'indexed'; +use List::Util; +use Y::AoC::Task; +$; = ';'; +# t; + +my @map = map { chomp; [ split //, ".$_." ] } <>; +push @map, [ ('.') x @{ $map[0]} ]; +unshift @map, [ ('.') x @{$map[0]} ]; +my $xmax = $#{$map[0]}; +my $ymax = $#map; + +my ($sx, $sy); +for my $x (0 .. $xmax) { +for my $y (0 .. $ymax) { + next if $map[$y][$x] ne 'S'; + $sx = $x; $sy = $y; +} } + + +my %dirs = ( + '|' => [ 0, -1, 0, 1], + '-' => [-1, 0, 1, 0], + 'J' => [-1, 0, 0, -1], + 'L' => [ 1, 0, 0, -1], + 'F' => [ 1, 0, 0, 1], + '7' => [-1, 0, 0, 1], +); + + +if ($map[$sy][$sx-1] eq '-' && $map[$sy][$sx+1] eq '-') { + $map[$sy][$sx] = '-'; +} elsif ($map[$sy+1][$sx] eq '|' && $map[$sy-1][$sx] eq '|') { + $map[$sy][$sx] = '|'; +} elsif ($map[$sy][$sx-1] eq '-' && $map[$sy-1][$sx] eq '|') { + $map[$sy][$sx] = 'J'; +} elsif ($map[$sy][$sx-1] eq '-' && $map[$sy+1][$sx] eq '|') { + $map[$sy][$sx] = '7'; +} elsif ($map[$sy][$sx+1] eq '-' && $map[$sy-1][$sx] eq '|') { + $map[$sy][$sx] = 'L'; +} elsif ($map[$sy][$sx+1] eq '-' && $map[$sy+1][$sx] eq '|') { + $map[$sy][$sx] = 'F'; +} + +say "starting at $sx, $sy $map[$sy][$sx]"; +my %seen; +my $len = 0; +my ($px, $py); +while (!$seen{$sx,$sy}++) { + my @d = $dirs{ $map[$sy][$sx] }->@*; + if (!defined($px) || ($px != $d[0] || $py != $d[1])) { + $sx += $d[0]; + $sy += $d[1]; + $px = -$d[0]; + $py = -$d[1]; + } else { + $sx += $d[2]; + $sy += $d[3]; + $px = -$d[2]; + $py = -$d[3]; + } + ++$len; +} + +say "loop len ", $len/2; + +my $sum; +for my $x (0 .. $xmax) { + my $in = 0; + my $left = 0; + for my $y (0 .. $ymax) { + if ($seen{$x,$y}) { + my $pt = $map[$y][$x]; + if ($pt eq '-') { + $in = !$in; + } elsif ($pt eq '7') { + $left = 1; + } elsif ($pt eq 'F') { + $left = -1; + } elsif ($pt eq 'J') { + if ($left == -1) { + $in = !$in; + } + } elsif ($pt eq 'L') { + if ($left == 1) { + $in = !$in; + } + } + say "$x $y in $in left $left"; + } elsif ($in) { + say "$x $y inside"; + $sum++; + } + } +} + +say $sum;