#!/usr/bin/perl use strict; use warnings; my $n =($ARGV[0] || 8); # usage : perl queens.pl n # ex : perl queens.pl 20 ############# use re 'eval'; my $p=1; my @s; local our @r; my $str; my $re='_(\d+)!'; for my $i (1..$n) { for my $j (1..$n) { $str.= join '!',"_$j",(map {join';',$j-$_<0?0:$j-$_,$j+$_ >$n?0:$j+$_} (1..($n-$i))),''; } $str.="\n"; push @s,$p+1,$p+2; push @r,$p; $re.=($i==$n)?'':(('(\d+);(\d+)!'x($n-$i)).".*?\n.*?_(?!(?:\\".(join '|\\',@r,@s).')!)(\d+)!'); $p+=2*($n-$i)+1; $_+=2 for @s; } $re .= '(?{ my $l = "a"; print join",",map{$l++.eval"\$$_"}@r; print "\n"; })(?!)'; $str=~$re;