aboutsummaryrefslogtreecommitdiff
path: root/challenge-206/spadacciniweb/perl/ch-2.pl
blob: 94c3d005c11baf2cfd671e3643695db48dc70238 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/usr/bin/env perl

# Task 2: Array Pairings
# Submitted by: Mohammad S Anwar
# 
# You are given an array of integers having even number of elements..
# Write a script to find the maximum sum of the minimum of each pairs.
# 
# Example 1
# Input: @array = (1,2,3,4)
# Output: 4
# 
# Possible Pairings are as below:
# a) (1,2) and (3,4). So min(1,2) + min(3,4) => 1 + 3 => 4
# b) (1,3) and (2,4). So min(1,3) + min(2,4) => 1 + 2 => 3
# c) (1,4) and (2,3). So min(1,4) + min(2,3) => 2 + 1 => 3
# 
# So the maxium sum is 4.
# 
# Example 2
# Input: @array = (0,2,1,3)
# Output: 2
# 
# Possible Pairings are as below:
# a) (0,2) and (1,3). So min(0,2) + min(1,3) => 0 + 1 => 1
# b) (0,1) and (2,3). So min(0,1) + min(2,3) => 0 + 2 => 2
# c) (0,3) and (2,1). So min(0,3) + min(2,1) => 0 + 1 => 1
# 
# So the maximum sum is 2.

use strict;
use warnings;
use Algorithm::Combinatorics qw(partitions);
use List::Util qw(min max sum);

my @input = @ARGV;
die "Input error\n"
    if scalar @input < 1
       or
       (scalar @input) % 2 != 0
       or
       (scalar map { $_ =~ /\D/ ? 1 : () }
                @input) != 0;

my @pairing;
my $iter = partitions([map { int($_) } @input], (scalar @input/2));
while (my $p = $iter->next) {
    my $bool = 1;
    foreach my $set (@$p) {
        if (scalar @$set != 2) {
            $bool = 0;
            last;
        }
    }
    push @pairing, $p
        if $bool;
}

my @min;
foreach my $pairs (@pairing) {
    push @min, sum map { min @{$_} }
                     values @$pairs;
}
printf "%s\n", max @min;