Question 5: Another Perl solution 

#!/usr/bin/perl

use strict;
use warnings;
use 5.014;

use Data::Dump qw(dump);
use File::Slurp;

my %lines_for;

sub match {
    my ($a, $b) = @_;

    my $alines = $lines_for{$a} ||= [
        read_file('contestants/contestant' . sprintf('%02d', $a))
    ];
    my $blines = $lines_for{$b} ||= [
        read_file('contestants/contestant' . sprintf('%02d', $b))
    ];

    shift @$alines if $alines->[0] =~ /Name/;
    shift @$blines if $blines->[0] =~ /Name/;

    while ($alines->[0] eq $blines->[0]) {
        shift @$alines;
        shift @$blines;
    }

    my $ac = $alines->[0];
    chomp $ac;

    my $bc = $blines->[0];
    chomp $bc;

    shift @$alines;
    shift @$blines;

    if ($ac eq 'scissors') {
        if ($bc eq 'rock') {
            return $b;
        }
        else {
            return $a;
        }
    }
    if ($ac eq 'rock') {
        if ($bc eq 'paper') {
            return $b;
        }
        else {
            return $a;
        }
    }
    if ($ac eq 'paper') {
        if ($bc eq 'scissors') {
            return $b;
        }
        else {
            return $a;
        }
    }
}

my @result = ();
for my $i (1..32) {
    push @result, match(2*$i - 1, 2*$i);
}


my @input = @result;
@result = ();
say '--';
while (@input) {
    push @result, match(shift @input, shift @input);
}
say dump(\@result);

@input = @result;
@result = ();
say '--';
while (@input) {
    push @result, match(shift @input, shift @input);
}
say dump(\@result);

@input = @result;
@result = ();
say '--';
while (@input) {
    push @result, match(shift @input, shift @input);
}
say dump(\@result);

@input = @result;
@result = ();
say '--';
while (@input) {
    push @result, match(shift @input, shift @input);
}
say dump(\@result);

@input = @result;
@result = ();
say '--';
while (@input) {
    push @result, match(shift @input, shift @input);
}
say dump(\@result);