# Ref http://p...content-available-to-author-only...e.com/questions/2194/color-the-table
from itertools import permutations, ifilter
#-----------------------------------------------------------
def inColumn( x, y) : # Return true if x,y are in same column.
dxy = abs ( x-y)
return dxy == 6 or dxy == 3
#-----------------------------------------------------------
def nextTo( x, y) : # Return true if x,y are Manhattan-adjacent.
dxy = abs ( x-y)
return dxy == 1 or dxy == 3
#-----------------------------------------------------------
# Test if permutation p satisfies all conditions.
def isGood( p) :
B, G, K, L, O, P, R, W, Y = p
# Tests 1 and 2.
# Note, digit 3 is in cell 1 and digit 5 is in cell 0
# 1. nextTo(Y,O); not nextTo(R, B)
# 2. color(number(3)) in {W,G,L,R}; color(number(5)) not in {W,P};
if nextTo( R, B) or not nextTo( Y, O) or \
1 not in ( W, G, L, R) or 0 in ( W, P) :
return False
# Tests 3 and 4.
# 3. inColumn(P,O); not inColumn(Y,B); not inColumn(G,L)
# 4. abs(number(W)-number(K)) == 1; not nextTo(W,K)
if not inColumn( P, O) or inColumn( Y, B) or inColumn( G, L) or \
abs ( number[ W] -number[ K] ) != 1 or nextTo( W, K) :
return False
# Tests 5 and 6.
# 5. abs(number(R)-number(Y)) < 3; abs(number(W)-number(L)) < 4
# 6. abs(number(R)-number(L)) > 2
if abs ( number[ R] -number[ Y] ) > 2 or abs ( number[ W] -number[ L] ) > 3 \
or abs ( number[ R] -number[ L] ) < 3 :
return False
# Tests 7, 8, 9.
# 7. nextTo(G,K); odd(number(G))
# 8. not inColumn(R,Y)
# 9. number(L) > number(G)
if not nextTo( G, K) or not number[ G] &1 or \
inColumn( R, Y) or \
number[ L] <= number[ G] :
return False
return True
#---------------------------Main program--------------------
cellNums = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]
digCells = [ 7 , 8 , 1 , 6 , 0 , 3 , 4 , 2 , 5 ]
number = [ 5 , 3 , 8 , 6 , 7 , 9 , 4 , 1 , 2 ]
colors = [ 'black' , 'green' , 'pink' , 'blue' , 'orange' , 'purple' , 'red' , 'white' , 'yellow' ]
for p in ifilter( isGood, permutations( cellNums) ) :
for cn in digCells:
for j, c in enumerate ( p) :
if c== cn: print colors[ j] ,
print
IyBSZWYgaHR0cDovL3AuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuY29tL3F1ZXN0aW9ucy8yMTk0L2NvbG9yLXRoZS10YWJsZQpmcm9tIGl0ZXJ0b29scyBpbXBvcnQgcGVybXV0YXRpb25zLCBpZmlsdGVyCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkZWYgaW5Db2x1bW4oeCx5KTogICAjIFJldHVybiB0cnVlIGlmIHgseSBhcmUgaW4gc2FtZSBjb2x1bW4uCiAgICBkeHkgPSBhYnMoeC15KQogICAgcmV0dXJuIGR4eSA9PSA2IG9yIGR4eSA9PSAzCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkZWYgbmV4dFRvKHgseSk6ICAgICAjIFJldHVybiB0cnVlIGlmIHgseSBhcmUgTWFuaGF0dGFuLWFkamFjZW50LgogICAgZHh5ID0gYWJzKHgteSkKICAgIHJldHVybiBkeHkgPT0gMSBvciBkeHkgPT0gMwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUZXN0IGlmIHBlcm11dGF0aW9uIHAgc2F0aXNmaWVzIGFsbCBjb25kaXRpb25zLgpkZWYgaXNHb29kKHApOgogICAgQiwgRywgSywgTCwgTywgUCwgUiwgVywgWSA9IHAKICAgICMgVGVzdHMgMSBhbmQgMi4KICAgICMgTm90ZSwgZGlnaXQgMyBpcyBpbiBjZWxsIDEgYW5kIGRpZ2l0IDUgaXMgaW4gY2VsbCAwCiAgICAjIDEuIG5leHRUbyhZLE8pOyBub3QgbmV4dFRvKFIsIEIpCiAgICAjIDIuIGNvbG9yKG51bWJlcigzKSkgaW4ge1csRyxMLFJ9OyBjb2xvcihudW1iZXIoNSkpIG5vdCBpbiB7VyxQfTsKICAgIGlmIG5leHRUbyhSLCBCKSBvciBub3QgbmV4dFRvKFksTykgb3IgXAogICAgICAgICAgICAxIG5vdCBpbiAoVyxHLEwsUikgb3IgMCBpbiAoVyxQKToKICAgICAgICByZXR1cm4gRmFsc2UKICAgICMgVGVzdHMgMyBhbmQgNC4KICAgICMgMy4gaW5Db2x1bW4oUCxPKTsgbm90IGluQ29sdW1uKFksQik7IG5vdCBpbkNvbHVtbihHLEwpCiAgICAjIDQuIGFicyhudW1iZXIoVyktbnVtYmVyKEspKSA9PSAxOyBub3QgbmV4dFRvKFcsSykKICAgIGlmIG5vdCBpbkNvbHVtbihQLE8pIG9yIGluQ29sdW1uKFksQikgb3IgaW5Db2x1bW4oRyxMKSBvciBcCiAgICAgICAgICAgIGFicyhudW1iZXJbV10tbnVtYmVyW0tdKSAhPSAxIG9yIG5leHRUbyhXLEspOgogICAgICAgIHJldHVybiBGYWxzZQogICAgIyBUZXN0cyA1IGFuZCA2LgogICAgIyA1LiBhYnMobnVtYmVyKFIpLW51bWJlcihZKSkgPCAzOyBhYnMobnVtYmVyKFcpLW51bWJlcihMKSkgPCA0CiAgICAjIDYuIGFicyhudW1iZXIoUiktbnVtYmVyKEwpKSA+IDIKICAgIGlmIGFicyhudW1iZXJbUl0tbnVtYmVyW1ldKSA+IDIgb3IgYWJzKG51bWJlcltXXS1udW1iZXJbTF0pID4gMyBcCiAgICAgICAgICAgIG9yIGFicyhudW1iZXJbUl0tbnVtYmVyW0xdKSA8IDM6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAjIFRlc3RzIDcsIDgsIDkuCiAgICAjIDcuIG5leHRUbyhHLEspOyAgb2RkKG51bWJlcihHKSkKICAgICMgOC4gbm90IGluQ29sdW1uKFIsWSkKICAgICMgOS4gbnVtYmVyKEwpID4gbnVtYmVyKEcpCiAgICBpZiBub3QgbmV4dFRvKEcsSykgb3Igbm90IG51bWJlcltHXSYxIG9yIFwKICAgICAgICAgICAgaW5Db2x1bW4oUixZKSBvciBcCiAgICAgICAgICAgIG51bWJlcltMXSA8PSBudW1iZXJbR106CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gVHJ1ZQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTWFpbiBwcm9ncmFtLS0tLS0tLS0tLS0tLS0tLS0tLS0KY2VsbE51bXMgPSBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOF0KZGlnQ2VsbHMgPSBbNywgOCwgMSwgNiwgMCwgMywgNCwgMiwgNV0KbnVtYmVyID0gWzUsIDMsIDgsIDYsIDcsIDksIDQsIDEsIDJdCmNvbG9ycyA9IFsnYmxhY2snLCAnZ3JlZW4nLCAncGluaycsICdibHVlJywgJ29yYW5nZScsICdwdXJwbGUnLCAncmVkJywgJ3doaXRlJywgJ3llbGxvdyddCgpmb3IgcCBpbiBpZmlsdGVyKGlzR29vZCwgcGVybXV0YXRpb25zKGNlbGxOdW1zKSk6CiAgICBmb3IgY24gaW4gZGlnQ2VsbHM6CiAgICAgICAgZm9yIGosIGMgaW4gZW51bWVyYXRlKHApOgogICAgICAgICAgICBpZiBjPT1jbjogcHJpbnQgY29sb3JzW2pdLAogICAgcHJpbnQK