#! /usr/bin/perl

#*
# Generate a derangement of given strings
# (https://en.wikipedia.org/wiki/Derangement)

# USAGE:

# $0 input.lst

#**

use strict;
use warnings;

use List::Util qw/shuffle/;

my @strings = <>;

my $n = 0;
my @numbered_pairs = map { [$n++, $_, $_] } @strings;

my @shuffled = shuffle @numbered_pairs;

my @new_order = map { $_->[2] } @shuffled;

my @derangement = ( @new_order[1..$#new_order], $new_order[0] );

my @derangement_pairs;

for my $i (0..$#numbered_pairs) {
    push( @derangement_pairs, [$shuffled[$i][0], $shuffled[$i][1], $derangement[$i]] );
}

my @sorted_pairs = sort { $a->[0] <=> $b->[0] } @derangement_pairs;

for my $pair (@sorted_pairs) {
    print $pair->[2];
}
