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 }