In [ ]:
from pyeda.inter import *

In [ ]:
X = exprvars('x', 8, 8)

In [ ]:
R = And(*[OneHot(*[X[r,c] for c in range(8)]) for r in range(8)])

In [ ]:
C = And(*[OneHot(*[X[r,c] for r in range(8)]) for c in range(8)])

In [ ]:
starts = [(i, 0) for i in range(8-2, 0, -1)] + [(0, i) for i in range(8-1)]
lrdiags = []
for r, c in starts:
    lrdiags.append([])
    ri, ci = r, c
    while ri < 8 and ci < 8:
        lrdiags[-1].append((ri, ci))
        ri += 1
        ci += 1

DLR = And(*[OneHot0(*[X[r,c] for r, c in diag]) for diag in lrdiags])

In [ ]:
starts = [(i, 8-1) for i in range(8-2, -1, -1)] + [(0, i) for i in range(8-2, 0, -1)]
rldiags = []
for r, c in starts:
    rldiags.append([])
    ri, ci = r, c
    while ri < 8 and ci >= 0:
        rldiags[-1].append((ri, ci))
        ri += 1
        ci -= 1

DRL = And(*[OneHot0(*[X[r,c] for r, c in diag]) for diag in rldiags])

In [ ]:
S = And(R, C, DLR, DRL)

In [ ]:
S.is_cnf()

In [ ]:
len(S.xs)

In [ ]:
def display(point):
    chars = list()
    for r in range(8):
        for c in range(8):
            if point[X[r,c]]:
                chars.append("Q")
            else:
                chars.append(".")
        if r != 7:
            chars.append("\n")
    print("".join(chars))

In [ ]:
display(S.satisfy_one())

In [ ]:
for i, soln in enumerate(S.satisfy_all()):
    print("Solution", i+1, end="\n\n")
    display(soln)
    print("")

In [ ]:
S.satisfy_count()

In [ ]:
len(list(S.satisfy_all()))

In [ ]: