]> www.fi.muni.cz Git - aoc.git/blob - 2018/26.pl
Day 25: examining the input
[aoc.git] / 2018 / 26.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 $i (0 .. $#carts) {
36         my $c = $carts[$i];
37         my ($x, $y) = @$c;
38         $cartpos{$x,$y} = $i;
39 }
40 while (1) {
41         for my $i (0 .. $#carts) {
42                 my $c = $carts[$i];
43                 next if $c->[4];
44                 my ($x, $y, $dir, $state) = @$c;
45                 my $m = $map[$y][$x];
46                 if ($m eq '/') {
47                         $dir =~ y/0123/1032/;
48                 } elsif ($m eq '\\') {
49                         $dir =~ y/0123/3210/;
50                 } elsif ($m eq '+') {
51                         if ($state == 0) {
52                                 $dir =~ y/0123/3012/;
53                         } elsif ($state == 2) {
54                                 $dir =~ y/0123/1230/;
55                         }
56                         $state = 0 if ++$state > 2;
57                 }
58                 delete $cartpos{$x,$y};
59                 $y-- if $dir == 0;
60                 $x++ if $dir == 1;
61                 $y++ if $dir == 2;
62                 $x-- if $dir == 3;
63                 if (defined $cartpos{$x,$y}) {
64                         $c->[4] = 1;
65                         $carts[$cartpos{$x,$y}]->[4] = 1;
66                         delete $cartpos{$x,$y};
67                 } else {
68                         $cartpos{$x,$y} = $i;
69                 }
70                 $c->[0] = $x;
71                 $c->[1] = $y;
72                 $c->[2] = $dir;
73                 $c->[3] = $state;
74         }
75         @carts = sort { $a->[1] == $b->[1]
76                 ? $a->[0] <=> $b->[0]
77                 : $a->[1] <=> $b->[1] } grep { !defined $_->[4] } @carts;
78         if (@carts == 1) {
79                 say $carts[0][0], ',', $carts[0][1];
80                 last;
81         }
82 }