Re: /$sudoku/

[email protected] (Patrik Grip-Jansson)
Newsgroups perl.fwp
Organization Gnulix Society
Message-ID <[email protected]>
Nyttigt regexp :-)

On Thursday 20 April 2006 16:03, Ilmari Karonen wrote:
> Sudoku solvers are old hat, of course, but this one is a bit different:
> it's a regexp.  I suppose someone may have done this before, but if so,
> I haven't seen it.  It's grossly inefficient, of course, solving the
> puzzle entirely by guesswork and backtracking, but that's not really the
> point.  (It could be made quite a bit faster by hardcoding the givens in
> the regexp, but that would make the regexp non-generic.)
>
> #!/usr/bin/perl -w
> use strict;
>
> my $sudoku = ("^.*" .
>                (join ".*\n.*", "(.)",
>                 map {
>                     my $n = $_;
>                     ("(?!" .
>                      (join "|",
>                       (map "\\" . ($_+1),
>                        (grep $_ < $n &&
>                         (int($_ % 9) == int($n % 9) ||
>                          int($_ / 9) == int($n / 9) ||
>                          int($_ / 27) == int($n / 27) &&
>                          int($_ / 3 % 3) == int($n / 3 % 3)),
>                         0..80))) .
>                      ")(.)");
>                 } 1..80) .
>                ".*\$"
>               );
>
> while (<>) {
>      chomp;
>      length != 81 || tr/1-9_//c and (print("Bad input.\n"), next);
>      s/(.)/$1 eq "_" ? "123456789\n" : "$1\n"/eg;
>      print((join("", /$sudoku/) || "No solution."), "\n");
> }
>
>
> __END__
>
> Input, in case it's not obvious from the code, is an 81-character string
> listing the numbers in left-right, top-down order, with "_" for blanks.
>   The while loop mangles it into the proper format for the regexp (81
> lines, each listing the allowed numbers for the corresponding cell) and
> outputs the solution in the same format as the input.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.