perl logo Perl logo (Thanks to Olaf Alders)

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