Advertisement
5keeve

Advent of code 2024 Day 6

Dec 22nd, 2024
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 2.34 KB | Source Code | 0 0
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my $map = '';
  6. my $width = 0;
  7. while (<DATA>) {
  8.     next unless my $hit = /^start/../^stop/;
  9.     next if $hit == 1;
  10.     last if $hit + 0 ne $hit;
  11.     chomp;
  12.     $width = length $_ unless $width;
  13.     $map .= $_ . ':';
  14. }
  15.  
  16. my ($moves, $result) = solve($map);
  17.  
  18. sub solve {
  19.     my($map) = shift;
  20.     my $moves = 1;
  21.     printmap($map);
  22.     my $last = '|';
  23.     my $field = '.';
  24.     MOVE: while (1) {
  25.         while ($map =~ s/([-+.|])(.{$width})\^/^$2$last/) {
  26.             ++$moves if $1 eq '.';
  27.             $field = $1;
  28.             $last = nextv($1);
  29.             printmap($map);
  30.         }
  31.         last MOVE unless $map =~/^[-+.|#]{$width}/;
  32.         return undef if $field eq '+';
  33.         $map =~ s/\^/>/;
  34.         $last = '+';
  35.         printmap($map);
  36.         while ($map =~ s/>([-+.|])/$last>/) {
  37.             ++$moves if $1 eq '.';
  38.             $field = $1;
  39.             $last = nexth($1);
  40.             printmap($map);
  41.         }
  42.         last MOVE if $map =~ />:/;
  43.         return undef if $field eq '+';
  44.         $map =~ s/>/v/;
  45.         $last = '+';
  46.         printmap($map);
  47.         while ($map =~ s/v(.{$width})([-+.|])/$last$1v/) {
  48.             ++$moves if $2 eq '.';
  49.             $field = $1;
  50.             $last = nextv($2);
  51.             printmap($map);
  52.         }
  53.         last MOVE unless $map =~ /[-+.|#]{$width}:$/;
  54.         return undef if $field eq '+';
  55.         $map =~ s/v/</;
  56.         $last = '+';
  57.         printmap($map);
  58.         while ($map =~ s/([-+.|])</<$last/) {
  59.             ++$moves if $1 eq '.';
  60.             $field = $1;
  61.             $last = nexth($1);
  62.             printmap($map);
  63.         }
  64.         last MOVE if $map =~ /(^|:)</;
  65.         return undef if $field eq '+';
  66.         $map =~ s/</^/;
  67.         $last = '+';
  68.         printmap($map);
  69.     }
  70.     return ($moves, $map);
  71. }
  72.  
  73. sub nextv {
  74.     my $last = shift;
  75.     return '|' if $last eq '.';
  76.     return '|' if $last eq '|';
  77.     return '+';
  78. }
  79.  
  80. sub nexth {
  81.     my $last = shift;
  82.     return '-' if $last eq '.';
  83.     return '-' if $last eq '-';
  84.     return '+';
  85. }
  86.  
  87. printf "Moves: %d\n", $moves;
  88.  
  89. $result =~ s/[^:#.]/O/g;
  90.  
  91. my $positions = 0;
  92. my $pos = index $result, 'O';
  93. while ($pos >= 0) {
  94.     my $copy = $map;
  95.     if (substr($copy, $pos, 1) ne '^') {
  96.         substr $copy, $pos, 1, '#';
  97.         my($solved) = solve($copy);
  98.         if (not defined $solved) {
  99.             ++$positions;
  100.         }
  101.     }
  102.     ++$pos;
  103.     $pos = index $result, 'O', $pos;
  104. }
  105.  
  106. printf "Positions: %d\n", $positions;
  107.  
  108. sub printmap {
  109.     local $_ = shift;
  110.     #return if $_;
  111.     #$_ = shift;
  112.     s/:/\n/g;
  113.     print;
  114.     <>
  115. }
  116.  
  117. __DATA__
  118. start
  119. ....#.....
  120. .........#
  121. ..........
  122. ..#.......
  123. .......#..
  124. ..........
  125. .#..^.....
  126. ........#.
  127. #.........
  128. ......#...
  129. stop
  130.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement