• + 0 comments

    Perl:

    sub timeInWords {
        my ($hour, $minute) = @_;
        
        my @numbers = qw(zero one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen);
        my @tens = qw(twenty thirty forty fifty);
        
        return "$numbers[$hour] o' clock" if $minute == 0;
        return "quarter past $numbers[$hour]" if $minute == 15;
        return "half past $numbers[$hour]" if $minute == 30;
        return "quarter to $numbers[($hour + 1) % 12]" if $minute == 45;
    
        my $word_min;
        my $next_hour = ($hour % 12) + 1;
        if ($minute > 30) {
            my $remaining_minutes = 60 - $minute;
            $word_min = ($remaining_minutes < 20) 
                ? $numbers[$remaining_minutes] 
                : $tens[int($remaining_minutes / 10) - 2] . 
                  ($remaining_minutes % 10 ? " " . $numbers[$remaining_minutes % 10] : "");
            
            return $remaining_minutes == 1 
                ? "one minute to $numbers[$next_hour]" 
                : "$word_min minutes to $numbers[$next_hour]";
        } else {
            $word_min = ($minute < 20) 
                ? $numbers[$minute] 
                : $tens[int($minute / 10) - 2] . 
                  ($minute % 10 ? " " . $numbers[$minute % 10] : "");
    
            return $minute == 1 
                ? "one minute past $numbers[$hour]" 
                : "$word_min minutes past $numbers[$hour]";
        }
    }