]> www.fi.muni.cz Git - aoc.git/blob - 2016/25.pl
Day 25: examining the input
[aoc.git] / 2016 / 25.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4 use v5.30;
5
6 my $in = 1362;
7 # my $in = 10;
8
9 my %maze;
10 $; = ',';
11 sub is_wall {
12         my ($x, $y) = @_;
13         return $maze{$x,$y} if exists $maze{$x,$y};
14
15         my $sum = $in + $x*$x + 3*$x + 2*$x*$y + $y + $y*$y;
16         my $bin = sprintf("%b", $sum);
17         say "$x $y => $sum => $bin";
18         my $count = () = $bin =~ /1/g;
19         return $maze{$x,$y} = $count & 1;
20 }
21
22 say is_wall(0, 0);
23 say is_wall(3, 5);
24 say is_wall(9, 2);
25
26 my %seen = ( "1,1" => 1 );
27 my @paths = ( [ 1, 1, 0 ] );
28 while (@paths) {
29         my $p = shift @paths;
30         my ($x, $y, $steps) = @$p;
31         if ($x == 31 && $y == 39) {
32                 say $steps;
33                 last;
34         }
35         for my $d ([0, 1], [0, -1], [1, 0], [-1, 0]) {
36                 my $x1 = $x + $d->[0];
37                 my $y1 = $y + $d->[1];
38                 next if $x1 < 0 || $y1 < 0;
39                 next if $seen{$x1,$y1};
40                 next if is_wall($x1, $y1);
41                 $seen{$x1,$y1}++;
42                 push @paths, [$x1, $y1, $steps+1];
43         }
44 }