day18
This commit is contained in:
parent
72b8a71cae
commit
3684ca9d1a
73
18/2.pl
Normal file
73
18/2.pl
Normal file
@ -0,0 +1,73 @@
|
||||
use 5.20.0;
|
||||
use experimental qw/ signatures postderef /;
|
||||
use List::AllUtils qw/ any /;
|
||||
|
||||
my @commands = <>;
|
||||
|
||||
my @prog = map { bless
|
||||
{ q => [], id => $_, reg => { p => $_ }, }, 'Prog'
|
||||
} 0..1;
|
||||
|
||||
use DDP;
|
||||
|
||||
my $sent1;
|
||||
|
||||
|
||||
package Prog {
|
||||
my $vr = qr/(?<val>-?\d+|.)/;
|
||||
|
||||
sub valof($self, $x) {
|
||||
$x =~ /\d/ ? $x : $self->{reg}{$x};
|
||||
}
|
||||
|
||||
sub run($self) {
|
||||
while() {
|
||||
use DDP;
|
||||
my $i = $self->{i};
|
||||
my $c = $commands[$i] or return;
|
||||
|
||||
if( $c =~ /snd (.)/ ) {
|
||||
warn ++$sent1 if $self->{id};
|
||||
push $prog[ 1 - $self->{id} ]->{q}->@*, $self->valof($1);
|
||||
}
|
||||
elsif( $c =~ /set (.) $vr/ ) {
|
||||
$self->{reg}{$1} = $self->valof($2);
|
||||
}
|
||||
elsif( $c =~ /add (.) $vr/ ) {
|
||||
$self->{reg}{$1} += $self->valof($2);
|
||||
}
|
||||
elsif( $c =~ /mul (.) $vr/ ) {
|
||||
$self->{reg}{$1} *= $self->valof($2);
|
||||
}
|
||||
elsif( $c =~ /mod (.) $vr/ ) {
|
||||
$self->{reg}{$1} %= $self->valof($2);
|
||||
}
|
||||
elsif( $c =~ /jgz (.) $vr/ ) {
|
||||
$self->{i} += ($self->valof($1) > 0) ? $self->valof($2) : 1;
|
||||
next;
|
||||
}
|
||||
elsif( $c =~ /rcv (.)/ ) {
|
||||
return unless $self->{q}->@*;
|
||||
my $j = shift $self->{q}->@*;
|
||||
$self->{reg}{$1} = $j;
|
||||
}
|
||||
else { die "wut? $_"; }
|
||||
|
||||
$self->{i}++;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while() {
|
||||
$prog[1]->run;
|
||||
$prog[0]->run;
|
||||
# p @prog;
|
||||
# my $dummy = <STDIN>;
|
||||
warn join ":", map { $_->{i} } @prog;
|
||||
last unless any { scalar $_->@* } map { $_->{q} } @prog;
|
||||
last if 2 == grep { $_ >= @commands } map { $_->{i} } @prog;
|
||||
}
|
||||
|
||||
say $sent1;
|
||||
|
Loading…
Reference in New Issue
Block a user