From 6719f481fff99f20f699da898af9ba5ab317a646 Mon Sep 17 00:00:00 2001
From: "Jan \"Yenya\" Kasprzak" <kas@fi.muni.cz>
Date: Thu, 12 Dec 2024 06:44:51 +0100
Subject: [PATCH] Day 12: code too long

---
 2024/23.pl | 50 +++++++++++++++++++++++++++++++++
 2024/24.pl | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 132 insertions(+)
 create mode 100755 2024/23.pl
 create mode 100755 2024/24.pl

diff --git a/2024/23.pl b/2024/23.pl
new file mode 100755
index 0000000..a5f0aa4
--- /dev/null
+++ b/2024/23.pl
@@ -0,0 +1,50 @@
+#!/usr/bin/perl -w
+
+use v5.40;
+
+my @map = map { chomp; [ split // ] } <>;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+my %seen;
+my $sum;
+for my $y (0 .. $ymax) {
+	for my $x (0 .. $xmax) {
+		$sum += walk($x, $y) if !$seen{"$x,$y"};
+	}
+}
+say $sum;
+
+sub walk {
+	my ($x0, $y0) = (@_);
+
+	my $m = $map[$y0][$x0];
+	my ($area, $price);
+
+	my @q = [$x0, $y0];
+	while (my $qe = shift @q) {
+		my ($x, $y) = @$qe;
+		next if $seen{"$x,$y"}++;
+
+		$area++;
+
+		for my ($dx, $dy) (
+			-1, 0,
+			1, 0,
+			0, -1,
+			0, 1,
+		) {
+			my ($nx, $ny) = ($x+$dx, $y+$dy);
+			if ($nx < 0 || $nx > $xmax
+				|| $ny < 0 || $ny > $ymax) {
+				$price++;
+			} elsif ($map[$ny][$nx] ne $m) {
+				$price++;
+			} else {
+				push @q, [$nx, $ny];
+			}
+		}
+	}
+	# say "$m at $_[0] $_[1] area $area price $price";
+	return $area * $price;
+}
diff --git a/2024/24.pl b/2024/24.pl
new file mode 100755
index 0000000..a02b392
--- /dev/null
+++ b/2024/24.pl
@@ -0,0 +1,82 @@
+#!/usr/bin/perl -w
+
+use v5.40;
+
+my @map = map { chomp; [ split // ] } <>;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+my %seen;
+my $sum;
+for my $y (0 .. $ymax) {
+	for my $x (0 .. $xmax) {
+		$sum += walk($x, $y) if !$seen{"$x,$y"};
+	}
+}
+say $sum;
+
+sub walk {
+	my ($x0, $y0) = (@_);
+
+	my $m = $map[$y0][$x0];
+	my ($area, $price);
+
+	my (%sides, @sides);
+	my @q = [$x0, $y0];
+	while (my $qe = shift @q) {
+		my ($x, $y) = @$qe;
+		next if $seen{"$x,$y"}++;
+
+		$area++;
+
+		for my ($dx, $dy, $dir) (
+			-1, 0, 'L',
+			1, 0,  'R',
+			0, -1, 'U',
+			0, 1,  'D',
+		) {
+			my ($nx, $ny) = ($x+$dx, $y+$dy);
+			if ($nx < 0 || $nx > $xmax
+				|| $ny < 0 || $ny > $ymax
+				|| $map[$ny][$nx] ne $m) {
+				$sides{"$nx,$ny,$dir"}++;
+				push @sides, [$nx, $ny, $dir];
+			} else {
+				push @q, [$nx, $ny];
+			}
+		}
+	}
+
+	my %sseen;
+	for my $side (@sides) {
+		my ($x, $y, $dir) = @$side;
+		next if $sseen{"$x,$y,$dir"}++;
+
+		if ($dir =~ /[UD]/) {
+			my $x1 = $x;
+			while ($sides{"$x1,$y,$dir"}) {
+				$sseen{"$x1,$y,$dir"}++;
+				$x1++;
+			}
+			$x1 = $x-1;
+			while ($sides{"$x1,$y,$dir"}) {
+				$sseen{"$x1,$y,$dir"}++;
+				$x1--;
+			}
+		} else {
+			my $y1 = $y;
+			while ($sides{"$x,$y1,$dir"}) {
+				$sseen{"$x,$y1,$dir"}++;
+				$y1++;
+			}
+			$y1 = $y-1;
+			while ($sides{"$x,$y1,$dir"}) {
+				$sseen{"$x,$y1,$dir"}++;
+				$y1--;
+			}
+		}
+		$price++;
+	}
+		
+	return $area * $price;
+}
-- 
2.43.5