Skip to content

Instantly share code, notes, and snippets.

@seisvelas
Last active December 7, 2018 00:14
Show Gist options
  • Save seisvelas/4e5188567386a8dfe18485aa2880f3d2 to your computer and use it in GitHub Desktop.
Save seisvelas/4e5188567386a8dfe18485aa2880f3d2 to your computer and use it in GitHub Desktop.
import timeit
from numpy import mean
nqueens_gen_setup = """def threatened(pos, past, n):
for i in range(len(past)):
if past[i] == pos or abs(pos - past[i]) == len(past) - i:
return True
return False
def nqueens(n, past=None):
if past == None:
for i in range(n):
yield from nqueens(n, [i+1])
else:
if len(past) == n:
yield past[:]
else:
for pos in range(1,n+1):
if not threatened(pos, past, n):
yield from nqueens(n,past + [pos])
list(nqueens(8))"""
nqueens_global_setup = """
solutions = []
def threatened(pos, past, n):
for i in range(len(past)):
if past[i] == pos or abs(pos - past[i]) == len(past) - i:
return True
return False
def nqueens(n, past=None):
if past == None:
return [nqueens(n, [i+1]) for i in range(n)]
if len(past) == n:
solutions.append(past)
else:
[nqueens(n, past + [pos]) for pos in range(1, n+1) if not threatened(pos, past, n)]
nqueens(8)
"""
print(mean(timeit.Timer(setup=nqueens_gen_setup).repeat(20, 1)))
print(mean(timeit.Timer(setup=nqueens_global_setup).repeat(20,1)))
## I played with the numbers of repeats, nqueens_gen_setup is slightly faster every time. But I bet I could cut the speed on
## nqueens_gobal_setup to be more competitive!
solutions = []
def threatened(pos, past, n):
for i in range(len(past)):
if past[i] == pos or abs(pos - past[i]) == len(past) - i:
return True
return False
def nqueens(n, past=None):
if past == None:
return [nqueens(n, [i+1]) for i in range(n)]
if len(past) == n:
solutions.append(past)
else:
[nqueens(n, past + [pos]) for pos in range(1, n+1) if not threatened(pos, past, n)]
nqueens(8)
print(len(solutions))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment