67 lines
1.0 KiB
Perl
67 lines
1.0 KiB
Perl
|
package P1;
|
||
|
|
||
|
use 5.20.0;
|
||
|
use warnings;
|
||
|
|
||
|
use List::AllUtils qw/ /;
|
||
|
use Math::Vector::Real;
|
||
|
|
||
|
use Moose;
|
||
|
use MooseX::MungeHas 'is_rw';
|
||
|
|
||
|
use experimental qw/ signatures postderef switch /;
|
||
|
|
||
|
has coords => sub {
|
||
|
return V(0,0);
|
||
|
};
|
||
|
|
||
|
has facing => sub {
|
||
|
1;
|
||
|
};
|
||
|
|
||
|
my @delta = (
|
||
|
V(0,1),
|
||
|
V(1,0),
|
||
|
V(0,-1),
|
||
|
V(-1,0),
|
||
|
);
|
||
|
|
||
|
sub delta {
|
||
|
return \@delta;
|
||
|
}
|
||
|
|
||
|
sub turn($self,$n) {
|
||
|
my $d = ($self->facing + $n/90)%4;
|
||
|
$self->facing($d);
|
||
|
}
|
||
|
|
||
|
sub move($self,$m) {
|
||
|
$m =~ /(.)(\d+)/;
|
||
|
|
||
|
my ( $x, $c ) = ($1,$2);
|
||
|
|
||
|
my $coords = $self->coords;
|
||
|
|
||
|
given($x) {
|
||
|
$coords += $c * $delta[$self->facing] when 'F';
|
||
|
$coords += $c * $delta[0] when 'N';
|
||
|
$coords += $c * $delta[1] when 'E';
|
||
|
$coords += $c * $delta[2] when 'S';
|
||
|
$coords += $c * $delta[3] when 'W';
|
||
|
$self->turn($c) when 'R';
|
||
|
$self->turn(-$c) when 'L';
|
||
|
}
|
||
|
|
||
|
$self->coords($coords);
|
||
|
}
|
||
|
|
||
|
sub solution($class,@instructions) {
|
||
|
my $self = $class->new;
|
||
|
|
||
|
$self->move($_) for @instructions;
|
||
|
|
||
|
$self->coords->manhattan_dist(V(0,0));
|
||
|
}
|
||
|
|
||
|
1;
|