musifter

AoC 2025, day 5 (Perl)

Dec 4th, 2025 (edited)
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 1.55 KB | Source Code | 0 0
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. use feature         qw(say);
  7. use List::Util      qw(reduce max min);
  8.  
  9. # Paragraph mode, array of sections
  10. $/ = '';
  11. my ($first, $second) = map {[split /\n/]} <>;
  12.  
  13. sub intersect {
  14.     my ($a, $b) = @_;
  15.     return ([max( $a->[0], $b->[0] ), min( $a->[1], $b->[1] )]);
  16. }
  17.  
  18. my @ranges = map { [split /-/] } @$first;
  19.  
  20. say "Part 1: ", scalar grep {my $food = $_; grep {$_->[0] <= $food <= $_->[1]} @ranges} @$second;
  21.  
  22. for (my $i = 1; $i < @ranges; $i++) {
  23.     for (my $j = 0; $j < $i; $j++) {
  24.         my $inter = &intersect( $ranges[$i], $ranges[$j] );
  25.         next if ($inter->[0] > $inter->[1]);    # No intersection
  26.  
  27.         if ($inter->[0] == $ranges[$i][0] and $inter->[1] == $ranges[$i][1]) {
  28.             # $i range is completely within $j range, remove $i
  29.             $ranges[$i] = [-1,-2];
  30.         } elsif ($inter->[0] == $ranges[$j][0] and $inter->[1] == $ranges[$j][1]) {
  31.             # range $j is completely within $i range, remove $j
  32.             $ranges[$j] = [-1,-2];
  33.         } elsif ($inter->[0] == $ranges[$i][0]) {
  34.             # $i range starts in the $j range, trim
  35.             $ranges[$i][0] = $inter->[1] + 1;
  36.         } elsif ($inter->[1] == $ranges[$i][1]) {
  37.             # $i range ends in the $j range, trim
  38.             $ranges[$i][1] = $inter->[0] - 1;
  39.         }
  40.  
  41.         last if ($ranges[$i][0] > $ranges[$i][1]);  # $i range is now empty
  42.     }
  43. }
  44.  
  45. # Filter valid ranges
  46. @ranges = grep { $_->[0] <= $_->[1] } @ranges;
  47.  
  48. say "Part 2: ", reduce { $a + $b->[1] - $b->[0] + 1 } (0, @ranges);
Advertisement
Add Comment
Please, Sign In to add comment