perl logo Perl logo (Thanks to Olaf Alders)

The weekly challenge 339 - Task 2: Peak Point

  1 #!/usr/bin/env perl
  2 # https://theweeklychallenge.org/blog/perl-weekly-challenge-339/#TASK2
  3 #
  4 # Task 2: Peak Point
  5 # ==================
  6 #
  7 # You are given an array of altitude gain.
  8 #
  9 # Write a script to find the peak point gained.
 10 #
 11 ## Example 1
 12 ##
 13 ## Input: @gain = (-5, 1, 5, -9, 2)
 14 ## Output: 1
 15 ##
 16 ## start: 0
 17 ## 1st change:  0 + (-5) = -5
 18 ## 2nd change: -5 + 1    = -4
 19 ## 3rd change: -4 + 5    = 1
 20 ## 4th change:  1 + (-9) = -8
 21 ## 5th change: -8 + 2    = -6
 22 ##
 23 ## max(0, -5, -4, 1, -8, -6) = 1
 24 #
 25 #
 26 ## Example 2
 27 ##
 28 ## Input: @gain = (10, 10, 10, -25)
 29 ## Output: 30
 30 ##
 31 ## start: 0
 32 ## 1st change:  0 + 10    = 10
 33 ## 2nd change: 10 + 10    = 20
 34 ## 3rd change: 20 + 10    = 30
 35 ## 4th change: 30 + (-25) = 5
 36 ##
 37 ## max(0, 10, 20, 30, 5) = 30
 38 #
 39 #
 40 ## Example 3
 41 ##
 42 ## Input: @gain = (3, -4, 2, 5, -6, 1)
 43 ## Output: 6
 44 ##
 45 ## start: 0
 46 ## 1st change:  0 + 3    = 3
 47 ## 2nd change:  3 + (-4) = -1
 48 ## 3rd change: -1 + 2    = 1
 49 ## 4th change:  1 + 5    = 6
 50 ## 5th change:  6 + (-6) = 0
 51 ## 6th change:  0 + 1    = 1
 52 ##
 53 ## max(0, 3, -1, 1, 6, 0, 1) = 6
 54 #
 55 #
 56 ## Example 4
 57 ##
 58 ## Input: @gain = (-1, -2, -3, -4)
 59 ## Output: 0
 60 ##
 61 ## start: 0
 62 ## 1st change:  0 + (-1) = -1
 63 ## 2nd change: -1 + (-2) = -3
 64 ## 3rd change: -3 + (-3) = -6
 65 ## 4th change: -6 + (-4) = -10
 66 ##
 67 ## max(0, -1, -3, -6, -10) = 0
 68 #
 69 #
 70 ## Example 5
 71 ##
 72 ## Input: @gain = (-10, 15, 5)
 73 ## Output: 10
 74 ##
 75 ## start: 0
 76 ## 1st change:   0 + (-10) = -10
 77 ## 2nd change: -10 + 15    = 5
 78 ## 3rd change:   5 + 5     = 10
 79 ##
 80 ## max(0, -10, 5, 10) = 10
 81 #
 82 ############################################################
 83 ##
 84 ## discussion
 85 ##
 86 ############################################################
 87 #
 88 # We just walk the gains, calculate the new altitude and keep
 89 # the maximum one.
 90 
 91 use v5.36;
 92 
 93 peak_point(-5, 1, 5, -9, 2);
 94 peak_point(10, 10, 10, -25);
 95 peak_point(3, -4, 2, 5, -6, 1);
 96 peak_point(-1, -2, -3, -4);
 97 peak_point(-10, 15, 5);
 98 
 99 sub peak_point( @gain ) {
100     say "Input: (" . join(", ", @gain) . ")";
101     my $max = 0;
102     my $current = 0;
103     foreach my $g (@gain) {
104         $current += $g;
105         $max = $current > $max ? $current : $max;
106     }
107     say "Output: $max";
108 }