The weekly challenge 310 - Task 2: Sort Odd Even
1 #!/usr/bin/env perl 2 # https://theweeklychallenge.org/blog/perl-weekly-challenge-310/#TASK2 3 # 4 # Task 2: Sort Odd Even 5 # ===================== 6 # 7 # You are given an array of integers. 8 # 9 # Write a script to sort odd index elements in decreasing order and even index 10 # elements in increasing order in the given array. 11 # 12 ## Example 1 13 ## 14 ## Input: @ints = (4, 1, 2, 3) 15 ## Output: (2, 3, 4, 1) 16 ## 17 ## Even index elements: 4, 2 => 2, 4 (increasing order) 18 ## Odd index elements : 1, 3 => 3, 1 (decreasing order) 19 # 20 ## Example 2 21 ## 22 ## Input: @ints = (3, 1) 23 ## Output: (3, 1) 24 # 25 ## Example 3 26 ## 27 ## Input: @ints = (5, 3, 2, 1, 4) 28 ## Output: (2, 3, 4, 1, 5) 29 ## 30 ## Even index elements: 5, 2, 4 => 2, 4, 5 (increasing order) 31 ## Odd index elements : 3, 1 => 3, 1 (decreasing order) 32 # 33 ############################################################ 34 ## 35 ## discussion 36 ## 37 ############################################################ 38 # 39 # First, create two arrays, one for all the odd index elements and 40 # one for the even index elements. Then sort both of those lists 41 # in the desired order. Then mix the two arrays into the result array. 42 43 use v5.36; 44 45 sort_odd_even(4, 1, 2, 3); 46 sort_odd_even(3, 1); 47 sort_odd_even(5, 3, 2, 1, 4); 48 49 sub sort_odd_even(@ints) { 50 say "Input: (" . join(", ", @ints) . ")"; 51 my @result; 52 my @odd; 53 my @even; 54 foreach my $i (0..$#ints) { 55 if($i % 2) { 56 push @odd, $ints[$i]; 57 } else { 58 push @even, $ints[$i]; 59 } 60 } 61 @odd = sort { $b <=> $a } @odd; 62 @even = sort { $a <=> $b } @even; 63 foreach my $i (0..$#even) { 64 push @result, $even[$i]; 65 push @result, $odd[$i] if defined $odd[$i]; 66 } 67 say "Output: (" . join(", ", @result) . ")"; 68 } 69 70