# Factorial user-defined operator symbol: n!
sub postfix:<!>(UInt $parameter --> UInt) is tighter(&infix:<**>){
return [*] 1..$parameter;
};
# Subfactorial user-defined operator symbol: !n
# Defined as `multi` since prefix `!` is also defined as the boolean negation operator
multi sub prefix:<!>(UInt $parameter) is tighter(&infix:<**>){
my @terms = map {(-1)**$^x/$^x!}, 0..$parameter;
my $sum = [+] @terms;
return $parameter!*$sum;
};
sub combinations(UInt $elements,UInt $extraction){
return $elements!/($extraction!*($elements-$extraction)!);
};
sub permutations(UInt $elements,UInt $extraction){
return $extraction!*combinations($elements,$extraction);
};
say "A set of 9 distinct elements all drawn together has...{combinations(9,9)} combinations, {permutations(9,9)} permutations, and {!9} derangements!";
say 'The first twenty one derangements are:';
my $number = 0;
until $number == 21 {
say !$number;
$number++;
};