micropython: add micropython component
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
# Source: https://github.com/python/pyperformance
|
||||
# License: MIT
|
||||
|
||||
# Simple, brute-force N-Queens solver.
|
||||
# author: collinwinter@google.com (Collin Winter)
|
||||
# n_queens function: Copyright 2009 Raymond Hettinger
|
||||
|
||||
# Pure-Python implementation of itertools.permutations().
|
||||
def permutations(iterable, r=None):
|
||||
"""permutations(range(3), 2) --> (0,1) (0,2) (1,0) (1,2) (2,0) (2,1)"""
|
||||
pool = tuple(iterable)
|
||||
n = len(pool)
|
||||
if r is None:
|
||||
r = n
|
||||
indices = list(range(n))
|
||||
cycles = list(range(n - r + 1, n + 1))[::-1]
|
||||
yield tuple(pool[i] for i in indices[:r])
|
||||
while n:
|
||||
for i in reversed(range(r)):
|
||||
cycles[i] -= 1
|
||||
if cycles[i] == 0:
|
||||
indices[i:] = indices[i + 1 :] + indices[i : i + 1]
|
||||
cycles[i] = n - i
|
||||
else:
|
||||
j = cycles[i]
|
||||
indices[i], indices[-j] = indices[-j], indices[i]
|
||||
yield tuple(pool[i] for i in indices[:r])
|
||||
break
|
||||
else:
|
||||
return
|
||||
|
||||
|
||||
# From http://code.activestate.com/recipes/576647/
|
||||
def n_queens(queen_count):
|
||||
"""N-Queens solver.
|
||||
Args: queen_count: the number of queens to solve for, same as board size.
|
||||
Yields: Solutions to the problem, each yielded value is a N-tuple.
|
||||
"""
|
||||
cols = range(queen_count)
|
||||
for vec in permutations(cols):
|
||||
if queen_count == len(set(vec[i] + i for i in cols)) == len(set(vec[i] - i for i in cols)):
|
||||
yield vec
|
||||
|
||||
|
||||
###########################################################################
|
||||
# Benchmark interface
|
||||
|
||||
bm_params = {
|
||||
(50, 25): (1, 5),
|
||||
(100, 25): (1, 6),
|
||||
(1000, 100): (1, 7),
|
||||
(5000, 100): (1, 8),
|
||||
}
|
||||
|
||||
|
||||
def bm_setup(params):
|
||||
res = None
|
||||
|
||||
def run():
|
||||
nonlocal res
|
||||
for _ in range(params[0]):
|
||||
res = len(list(n_queens(params[1])))
|
||||
|
||||
def result():
|
||||
return params[0] * 10 ** (params[1] - 3), res
|
||||
|
||||
return run, result
|
Reference in New Issue
Block a user