7 my @map = map { chomp; [ split // ] } split /\n/, scalar <>;
11 chomp (my $list = <>);
16 $x++ while $map[$y][$x] eq ' ';
37 if ($Y::AoC::Task::in_test) {
76 my %pos_of = reverse %face_of;
78 return map { $dim * $_ } split //, $pos_of{$face};
82 return undef if $x < 0 || $y < 0;
83 my $fx = int($x/$dim);
84 my $fy = int($y/$dim);
85 return $face_of{"$fx$fy"};
88 sub move($sx, $sy, $dir) {
89 my $f1 = face_of($sx, $sy);
90 my ($dx, $dy) = ($sx, $sy);
100 my $f2 = face_of($dx, $dy);
101 if (defined($f2) && $f2 eq $f1) {
102 return ($dx, $dy, $dir);
105 say "moving from $f1 $dir";
106 my $rdir = ($dir - $face_dir{$f1}) % 4;
108 $f2 = $face_next{$f1}[$rdir];
109 my $rdir2 = $face_ndir{$f1}[$rdir];
111 $ndir = ($rdir2 + $face_dir{$f2}) % 4;
112 my ($nx, $ny) = ($dx % $dim, $dy % $dim);
113 my $rot = ($ndir - $dir) % 4;
114 say "$sx,$sy $nx,$ny $f1 -> $f2 r$rot $dir -> $ndir";
116 # ($nx, $ny) = ($ny, (-$nx % $dim));
117 ($nx, $ny) = ((($dim-1-$ny) % $dim), $nx);
118 say "rot -> $nx,$ny";
120 say " -> $nx $ny $ndir";
121 my ($ox, $oy) = pos_of($f2);
125 say "FACE $sx,$sy,$dir $f1 -> $nx,$ny,$ndir $f2";
126 die if $map[$ny][$nx] eq ' ';
127 return ($nx, $ny, $ndir);
130 while (length $list) {
131 $list =~ s/^(\d+|[LR])//;
133 say "$x $y $dir $move";
134 if ($move =~ /\d+/) {
136 my ($dx, $dy, $ddir) = move($x, $y, $dir);
137 last if $map[$dy][$dx] eq '#';
138 $x = $dx; $y = $dy; $dir = $ddir;
139 say " $x $y $dir $move";
142 } elsif ($move eq 'L') {
143 $dir = 3 if --$dir < 0;
144 } elsif ($move eq 'R') {
145 $dir = 0 if ++$dir > 3;
149 say 1000*($y+1) + 4*($x+1) + $dir;