aoc2015

Advent of Code 2015 solutions in Perl.
git clone git://git.samirparikh.com/aoc2015
Log | Files | Refs | README

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;