Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- use strict;
- use warnings;
- use feature qw(say);
- use Math::Vector::Real;
- my @Dirs = (V(-1,-1), V( 0,-1), V( 1,-1),
- V(-1, 0), V( 1, 0),
- V(-1, 1), V( 0, 1), V( 1, 1));
- my %Rolls;
- # Initialize hash at positions with rolls:
- while (<>) {
- $Rolls{pos, $.} = 0 while (m/@/g);
- }
- # For each roll, get number of adjacent rolls (hash is pos => neighbours)
- foreach my $roll (keys %Rolls) {
- my $pos = V(split $;, $roll);
- $Rolls{$roll} = scalar grep {exists $Rolls{$_->[0], $_->[1]}} map {$pos + $_} @Dirs;
- }
- my $part1;
- my $part2 = 0;
- while (my @removable = grep { $Rolls{$_} < 4 } keys %Rolls) {
- $part1 //= @removable; # Number removed in first pass
- $part2 += @removable; # Total removed over all passes
- # Remove removable rolls of paper
- foreach my $roll (@removable) {
- delete $Rolls{$roll}; # remove roll
- # Remove roll from neighbour counts:
- my $pos = V(split $;, $roll);
- $Rolls{$_->[0], $_->[1]}-- foreach (grep {$Rolls{$_->[0], $_->[1]}} map {$pos + $_} @Dirs);
- }
- }
- say "Part 1: $part1";
- say "Part 2: $part2";
Advertisement
Add Comment
Please, Sign In to add comment