Thinking about the 8-queens problems, I remember a smart Perl script using a regex to solve sudoku.
For my fisrt try, I used a simple string 12345678 (8 times/lines) but I failed because I used (?<!pattern) with \digit : "A zero-width negative look-behind assertion. (...) Works only for fixed-width look-behind." (perlvar)
Finally, with a more complex string I found a solution.
The idea is a probably similar to The N-queens problem using pure regexes by Abigail-II.
Perhaps in a more golfic-way (I was a Perl Golf fan) with heavy usage of capturing ( $1 to $64 for an 8x8 chess ;-)
Here is the code :
#!/usr/bin/perl use strict; use warnings; my $n =($ARGV[0] || 8); # usage : perl queens.pl n # ex : perl queens.pl 20 ############# my $p=1; my (@s,@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.*?_(?!(?:\\".(jo +in '|\\',@r,@s).')!)(\d+)!'); $p+=2*($n-$i)+1; $_+=2 for @s; } my $l="a"; if ($str=~$re){print join",",map{$l++.eval"\$$_"}@r} else {print "no s +olution"} #print "\n\n",$str; #print "\n\n",$re;
The problem : this solver find only one solution.
Is it possible to be exhaustive ? Perhaps using s/// and modifications in the string instead of m// ?...
Below, some explanations :
String (5x5 chess): _1!0;2!0;3!0;4!0;5!_2!1;3!0;4!0;5!0;0!_3!2;4!1;5!0;0!0;0!_4!3;5!2;0!1; +0!0;0!_5!4;0!3;0!2;0!1;0! _1!0;2!0;3!0;4!_2!1;3!0;4!0;5!_3!2;4!1;5!0;0!_4!3;5!2;0!1;0!_5!4;0!3;0 +!2;0! _1!0;2!0;3!_2!1;3!0;4!_3!2;4!1;5!_4!3;5!2;0!_5!4;0!3;0! _1!0;2!_2!1;3!_3!2;4!_4!3;5!_5!4;0! _1!_2!_3!_4!_5! Regex: _(\d+)!(\d+);(\d+)!(\d+);(\d+)!(\d+);(\d+)!(\d+);(\d+)!.*? .*?_(?!(?:\1|\2|\3)!)(\d+)!(\d+);(\d+)!(\d+);(\d+)!(\d+);(\d+)!.*? .*?_(?!(?:\1|\10|\4|\5|\11|\12)!)(\d+)!(\d+);(\d+)!(\d+);(\d+)!.*? .*?_(?!(?:\1|\10|\17|\6|\7|\13|\14|\18|\19)!)(\d+)!(\d+);(\d+)!.*? .*?_(?!(?:\1|\10|\17|\22|\8|\9|\15|\16|\20|\21|\23|\24)!)(\d+)! Solution in : $1 $10 $17 $22 $25 _3!2;4!1;5! means : if in this line, the queen is in column "3" (_3!), then in next line queen will not be on column "2" or "4" (!2;4!) and in the line after queen will not be in col "1" or "5" (!1;5!) (dia +gonal)

In reply to N-Queens problem with a regex (again) by brx

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.