Day14.pm (1130B) - raw
1 package Day14; 2 3 use strict; 4 use warnings; 5 use v5.32; 6 use Exporter qw( import ); 7 8 our @EXPORT = qw( init_reindeer get_position ); 9 10 sub init_reindeer { 11 my $input = shift; 12 my %reindeer; 13 foreach ( split /\n/, $input ) { 14 my ( $reindeer, $speed, $fly_duration, $rest_duration ) = 15 m/(\w+) can fly (\d+) km\/s for (\d+) seconds, but then must rest for (\d+) seconds./; 16 $reindeer{ $reindeer }{ speed } = $speed; 17 $reindeer{ $reindeer }{ fly_duration } = $fly_duration; 18 $reindeer{ $reindeer }{ rest_duration } = $rest_duration; 19 $reindeer{ $reindeer }{ points } = 0; 20 } 21 return \%reindeer; 22 } 23 24 sub get_position { 25 my ( $speed, $fly_duration, $rest_duration, $time ) = @_; 26 my $duration = $fly_duration + $rest_duration; 27 my $position; 28 my ( $cycles, $remainder ) = ( int $time / $duration, $time % $duration ); 29 if ( $remainder > $fly_duration ) { 30 $cycles++; 31 $position = $cycles * $fly_duration * $speed; 32 } else { 33 $position = $cycles * $fly_duration * $speed + $remainder * $speed; 34 } 35 return $position; 36 } 37 38 1;