sub a {
    my ($a,$b,$c,@d) = @_;
    my $e = 1 + $#d;
    my $f = $d[$b];
    $b == $e ? &$a (1) : $f == $c || abs ($f - $c) == $e - $b ? &$a (0) : &a ($a, $b + 1, $c, @d);
}

sub b {
    my ($a,$b,$c,$d,@e) = @_;
    my $f = sub { my @g = @_; $b == $c ? (&$a (@g)) : &b (sub { &$a (@g, @_); }, $b + 1, $c, $d, @e); };
    my $h = sub { (pop) ? &c ($f, $c, $d - 1, @e, $b) : &$f (); };
    &a ($h, 0, $b, @e);
}


sub c {
    my ($a,$b,$c,@d) = @_;
    $c ? &b ($a, 1, $b, $c, @d) : &$a([@d]);
}

my $x = $ARGV[0];
&c (sub { foreach (@_) { print join (',', @{$_}), "\n"; } }, $x, $x);
