# Quartets

Author: L. Grondin

http://rosalind.info/problems/qrt/

Sample input

```cat dog elephant ostrich mouse rabbit robot
01xxx00
x11xx00
111x00x```

Sample output

```{elephant, dog} {rabbit, robot}
{cat, dog} {mouse, rabbit}
{mouse, rabbit} {cat, elephant}
{dog, elephant} {mouse, rabbit}```

Source code: qrt-grondilu.pl

```use v6;

proto combine (Int, @) {*}
multi combine (0,  @)  { [] }
multi combine (\$,  []) { () }
multi combine (\$n, [\$head, *@tail]) {
gather {
take [\$head, @\$_] for combine(\$n-1, @tail);
take [ @\$_ ] for combine(\$n, @tail);
}
}

sub ncombine(\$n, \$k) {
(state@)[\$n][\$k] //= combine(\$k, [^\$n])
}

my \$default-input = q:to/END/;
cat dog elephant ostrich mouse rabbit robot
01xxx00
x11xx00
111x00x
END

sub MAIN(\$input-file = Nil) {
my \$input = \$input-file ?? \$input-file.IO.slurp !! \$default-input;
my @data = \$input.lines;

my %seen;
my @taxa = @data.shift.words;
for @data -> \$line {
my %h = @taxa Z=> \$line.comb;
my @classif =
classify( { %h{\$_} }, @taxa )<0 1>;
next if any(@classif) < 2;
note "processing \$line";
my @a = map { [ @classif[0][@\$_] ] }, ncombine(@classif[0].elems, 2)[];
my @b = map { [ @classif[1][@\$_] ] }, ncombine(@classif[1].elems, 2)[];
for @a X @b -> \$a, \$b {
my \$left = \$a.sort.join(', ');
my \$right = \$b.sort.join(', ');
next if %seen{\$left}{\$right}++ ?| %seen{\$right}{\$left}++;
say '{' ~ \$left ~ '} {' ~ \$right ~ '}';
}
}
}

```