38 lines
764 B
Perl
38 lines
764 B
Perl
|
use 5.20.0;
|
||
|
use List::AllUtils qw/ sum uniq /;
|
||
|
use List::UtilsBy qw/ nsort_by /;
|
||
|
|
||
|
use experimental qw/ postderef smartmatch /;
|
||
|
|
||
|
use DDP;
|
||
|
|
||
|
my $i;
|
||
|
my @raw = map { [ map { [ split ',' ] } /[pva]=<(.*?)>/g ] } <>;
|
||
|
|
||
|
while() {
|
||
|
check_collisions();
|
||
|
move_particles();
|
||
|
say scalar @raw;
|
||
|
}
|
||
|
|
||
|
sub move_particles {
|
||
|
for ( @raw ) {
|
||
|
for my $i ( 0..2 ) {
|
||
|
$_->[1][$i] += $_->[2][$i];
|
||
|
$_->[0][$i] += $_->[1][$i];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sub check_collisions {
|
||
|
my %seen;
|
||
|
my @to_delete;
|
||
|
for ( 0..$#raw ) {
|
||
|
my $k = join ':', $raw[$_][0]->@*;
|
||
|
push @to_delete, $seen{$k}, $_ if exists $seen{$k};
|
||
|
$seen{$k} = $_;
|
||
|
}
|
||
|
return unless @to_delete;
|
||
|
@raw = @raw[ grep { not $_ ~~ @to_delete } 0..$#raw ];
|
||
|
}
|