Bragging about Python (8 queens)
Steve Howell
showell30 at yahoo.com
Fri Jun 8 17:54:17 EDT 2007
--- Paul McGuire <ptmcg at austin.rr.com> wrote:
> >
> > So I'm throwing down the gauntlet--can somebody
> write
> > a short program (maybe 10 to 20 lines) where you
> solve
> > a problem more simply than a similar
> > non-generator-using solution would solve it?
> Maybe
> > something like Eight Queens?
> >
>
> Well, I misread your "gauntlet throwing", and
> implemented a brief 8-
> queens using recursion and exceptions. Perhaps this
> could serve as
> the "before" to an "after" using generators. (I note
> that neither
> recursion nor exceptions are covered in your
> examples.)
Actually, there was a minor example with exceptions,
but agreed re:recursion, and this is just such a
classic problem, it belongs on the page.
> Also, in
> googling about for other 8-queens solutions in
> Python, most are quite
> complicated - this one uses only 24 lines, and works
> for boards of any
> size. I also think this line for printing out the
> board:
>
> print "\n".join( "."*q+"Q"+"."*(BOARD_SIZE-q-1) for
> q in queens )
>
> illustrates a couple of interesting idioms of Python
> (joining a list,
> generator expression, "."*repetition to give
> "....").
Agreed.
>
> Worthy of your page?
>
Definitely worthy. Go ahead and add it.
FWIW I have been labelling programs by the number of
lines of code. So this is program #24, which now
creates a gap between #16 and #23.
Also, I humbly suggest test_queens instead of
testQueens. I don't want to reopen the PEP 8 debate,
just a recommendation. I think PEP 8 would also
suggest some white space around '+' and '=='.
>
> BOARD_SIZE = 8
> def validate(queens):
> left = right = col = queens[-1]
> for r in reversed(queens[:-1]):
> left,right = left-1,right+1
> if r in (left, col, right):
> raise Exception
>
> def add_queen(queens):
> for i in range(BOARD_SIZE):
> testQueens = queens+[i]
> try:
> validate(testQueens)
> if len(testQueens)==BOARD_SIZE:
> return testQueens
> else:
> return add_queen(testQueens)
> except:
> pass
> raise Exception
>
> queens = add_queen([])
> print queens
> print "\n".join( "."*q+"Q"+"."*(BOARD_SIZE-q-1) for
> q in queens )
>
Very Pythonic solution IMHO. Nicely done.
____________________________________________________________________________________
Looking for a deal? Find great prices on flights and hotels with Yahoo! FareChase.
http://farechase.yahoo.com/
More information about the Python-list
mailing list