]> www.fi.muni.cz Git - aoc.git/blobdiff - 2018/25.pl
Year 2018
[aoc.git] / 2018 / 25.pl
diff --git a/2018/25.pl b/2018/25.pl
new file mode 100755 (executable)
index 0000000..57f36a1
--- /dev/null
@@ -0,0 +1,72 @@
+#!/usr/bin/perl -w
+
+use v5.30;
+use strict;
+
+$; = ',';
+my @map = map { chomp; [ split // ] } <>;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+my @carts;
+for my $y (0 .. $ymax) {
+       for my $x (0 .. $xmax) {
+               my $p = $map[$y][$x];
+               if ($p eq '^') {
+                       $map[$y][$x] = '|';
+                       push @carts, [ $x, $y, 0, 0 ];
+               }
+               if ($p eq '>') {
+                       $map[$y][$x] = '-';
+                       push @carts, [ $x, $y, 1, 0 ];
+               }
+               if ($p eq 'v') {
+                       $map[$y][$x] = '|';
+                       push @carts, [ $x, $y, 2, 0 ];
+               }
+               if ($p eq '<') {
+                       $map[$y][$x] = '-';
+                       push @carts, [ $x, $y, 3, 0 ];
+               }
+       }
+}
+
+my %cartpos;
+for my $c (@carts) {
+       my ($x, $y) = @$c;
+       $cartpos{$x,$y} = 1;
+}
+while (1) {
+       for my $c (@carts) {
+               my ($x, $y, $dir, $state) = @$c;
+               my $m = $map[$y][$x];
+               if ($m eq '/') {
+                       $dir =~ y/0123/1032/;
+               } elsif ($m eq '\\') {
+                       $dir =~ y/0123/3210/;
+               } elsif ($m eq '+') {
+                       if ($state == 0) {
+                               $dir =~ y/0123/3012/;
+                       } elsif ($state == 2) {
+                               $dir =~ y/0123/1230/;
+                       }
+                       $state = 0 if ++$state > 2;
+               }
+               delete $cartpos{$x,$y};
+               $y-- if $dir == 0;
+               $x++ if $dir == 1;
+               $y++ if $dir == 2;
+               $x-- if $dir == 3;
+               if ($cartpos{$x,$y}++) {
+                       say "$x,$y";
+                       exit 0;
+               }
+               $c->[0] = $x;
+               $c->[1] = $y;
+               $c->[2] = $dir;
+               $c->[3] = $state;
+       }
+       @carts = sort { $a->[1] == $b->[1]
+               ? $a->[0] <=> $b->[0]
+               : $a->[1] <=> $b->[1] } @carts;
+}