]> www.fi.muni.cz Git - aoc.git/blob - 2018/25.pl
Day 25: examining the input
[aoc.git] / 2018 / 25.pl
1 #!/usr/bin/perl -w
2
3 use v5.30;
4 use strict;
5
6 $; = ',';
7 my @map = map { chomp; [ split // ] } <>;
8 my $xmax = $#{ $map[0] };
9 my $ymax = $#map;
10
11 my @carts;
12 for my $y (0 .. $ymax) {
13         for my $x (0 .. $xmax) {
14                 my $p = $map[$y][$x];
15                 if ($p eq '^') {
16                         $map[$y][$x] = '|';
17                         push @carts, [ $x, $y, 0, 0 ];
18                 }
19                 if ($p eq '>') {
20                         $map[$y][$x] = '-';
21                         push @carts, [ $x, $y, 1, 0 ];
22                 }
23                 if ($p eq 'v') {
24                         $map[$y][$x] = '|';
25                         push @carts, [ $x, $y, 2, 0 ];
26                 }
27                 if ($p eq '<') {
28                         $map[$y][$x] = '-';
29                         push @carts, [ $x, $y, 3, 0 ];
30                 }
31         }
32 }
33
34 my %cartpos;
35 for my $c (@carts) {
36         my ($x, $y) = @$c;
37         $cartpos{$x,$y} = 1;
38 }
39 while (1) {
40         for my $c (@carts) {
41                 my ($x, $y, $dir, $state) = @$c;
42                 my $m = $map[$y][$x];
43                 if ($m eq '/') {
44                         $dir =~ y/0123/1032/;
45                 } elsif ($m eq '\\') {
46                         $dir =~ y/0123/3210/;
47                 } elsif ($m eq '+') {
48                         if ($state == 0) {
49                                 $dir =~ y/0123/3012/;
50                         } elsif ($state == 2) {
51                                 $dir =~ y/0123/1230/;
52                         }
53                         $state = 0 if ++$state > 2;
54                 }
55                 delete $cartpos{$x,$y};
56                 $y-- if $dir == 0;
57                 $x++ if $dir == 1;
58                 $y++ if $dir == 2;
59                 $x-- if $dir == 3;
60                 if ($cartpos{$x,$y}++) {
61                         say "$x,$y";
62                         exit 0;
63                 }
64                 $c->[0] = $x;
65                 $c->[1] = $y;
66                 $c->[2] = $dir;
67                 $c->[3] = $state;
68         }
69         @carts = sort { $a->[1] == $b->[1]
70                 ? $a->[0] <=> $b->[0]
71                 : $a->[1] <=> $b->[1] } @carts;
72 }