musifter

AoC 2025 day 4 (Perl)

Dec 4th, 2025 (edited)
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 1.16 KB | Source Code | 0 0
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5. use feature         qw(say);
  6. use Math::Vector::Real;
  7.  
  8. my @Dirs = (V(-1,-1), V( 0,-1), V( 1,-1),
  9.             V(-1, 0),           V( 1, 0),
  10.             V(-1, 1), V( 0, 1), V( 1, 1));
  11.  
  12. my %Rolls;
  13.  
  14. # Initialize hash at positions with rolls:
  15. while (<>) {
  16.     $Rolls{pos, $.} = 0  while (m/@/g);
  17. }
  18.  
  19. # For each roll, get number of adjacent rolls (hash is pos => neighbours)
  20. foreach my $roll (keys %Rolls) {
  21.     my $pos = V(split $;, $roll);
  22.     $Rolls{$roll} = scalar grep {exists $Rolls{$_->[0], $_->[1]}} map {$pos + $_} @Dirs;
  23. }
  24.  
  25. my $part1;
  26. my $part2 = 0;
  27.  
  28. while (my @removable = grep { $Rolls{$_} < 4 } keys %Rolls) {
  29.     $part1 //= @removable;  # Number removed in first pass
  30.     $part2  += @removable;  # Total removed over all passes
  31.  
  32.     # Remove removable rolls of paper
  33.     foreach my $roll (@removable) {
  34.         delete $Rolls{$roll};   # remove roll
  35.  
  36.         # Remove roll from neighbour counts:          
  37.         my $pos = V(split $;, $roll);
  38.         $Rolls{$_->[0], $_->[1]}-- foreach (grep {$Rolls{$_->[0], $_->[1]}} map {$pos + $_} @Dirs);
  39.     }
  40. }
  41.  
  42. say "Part 1: $part1";
  43. say "Part 2: $part2";
  44.  
Advertisement
Add Comment
Please, Sign In to add comment