From da655ffa1f5deed38c5051f2ee162231c0caeb19 Mon Sep 17 00:00:00 2001 From: "Jan \"Yenya\" Kasprzak" Date: Fri, 6 Dec 2024 07:37:52 +0100 Subject: [PATCH] Day 6: pretty straightforward, but part 2 quite slow --- 2024/11.pl | 39 +++++++++++++++++++++++++++++++++++++++ 2024/12.pl | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100755 2024/11.pl create mode 100755 2024/12.pl diff --git a/2024/11.pl b/2024/11.pl new file mode 100755 index 0000000..7f71908 --- /dev/null +++ b/2024/11.pl @@ -0,0 +1,39 @@ +#!/usr/bin/perl -w + +use v5.40; + +my @map = map { chomp; [ split // ] } <>; +my $xmax = $#{ $map[0] }; +my $ymax = $#map; + +my ($gx, $gy, $gd); +for my $y (0 .. $ymax) { + for my $x (0 .. $xmax) { + ($gx, $gy, $gd) = ($x, $y, $map[$y][$x]) + if $map[$y][$x] !~ /[\.\#]/; + } +} + +my %dir = ( + '^' => [0, -1], + '>' => [1, 0], + 'v' => [0, 1], + '<' => [-1, 0], +); + +my %seen; +while (1) { + $seen{"$gx,$gy"}++; + my ($dx, $dy) = $dir{$gd}->@*; + $dx += $gx; + $dy += $gy; + last if $dx < 0 || $dx > $xmax || $dy < 0 || $dy > $ymax; + if ($map[$dy][$dx] eq '#') { + $gd =~ y/^>vv<^/; + } else { + ($gx, $gy) = ($dx, $dy); + } +} + +say scalar keys %seen; + diff --git a/2024/12.pl b/2024/12.pl new file mode 100755 index 0000000..204a5d1 --- /dev/null +++ b/2024/12.pl @@ -0,0 +1,52 @@ +#!/usr/bin/perl -w + +use v5.40; + +my @map = map { chomp; [ split // ] } <>; +my $xmax = $#{ $map[0] }; +my $ymax = $#map; + +my ($gx, $gy, $gd); +for my $y (0 .. $ymax) { + for my $x (0 .. $xmax) { + ($gx, $gy, $gd) = ($x, $y, $map[$y][$x]) + if $map[$y][$x] !~ /[\.\#]/; + } +} + +my %dir = ( + '^' => [0, -1], + '>' => [1, 0], + 'v' => [0, 1], + '<' => [-1, 0], +); + +sub loops($map, $gx, $gy, $gd) { + my %seen; + while (1) { + return 1 if $seen{"$gx,$gy,$gd"}++; + # say "at $gx,$gy,$gd"; + my ($dx, $dy) = $dir{$gd}->@*; + $dx += $gx; + $dy += $gy; + return 0 if $dx < 0 || $dx > $xmax || $dy < 0 || $dy > $ymax; + if ($map->[$dy][$dx] eq '#') { + $gd =~ y/^>vv<^/; + } else { + ($gx, $gy) = ($dx, $dy); + } + } +} + +my $count; +for my $y (0 .. $ymax) { + for my $x (0 .. $xmax) { + next if $map[$y][$x] ne '.'; + my @m1 = map { [ @$_ ] } @map; + $m1[$y][$x] = '#'; + $count++ if loops(\@m1, $gx, $gy, $gd); + } +} + +say $count; + -- 2.43.5