In [10]:
import forge
from puzzle.puzzlepedia import puzzlepedia

puzzle = puzzlepedia.parse("""
import Numberjack

position in range(1, 8+1)
animal in {Attlee, Pretty, Rattat, Struth, Stuart, Tatter, Tweety, Tybalt}
item in {banana, crayon, diadem, dickie, earbud, inkpad, pecans, straws}

def dist(a, b):
  return abs(a.position - b.position)

pairs = [8, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 8]
def neighbor(a, b):
  #return any(a[i] and b[j] for i, j in zip(pairs, pairs[1:]))
  return dist(a, b) == 1 or dist(a, b) == 7

#1
Attlee != straws
Attlee.position > Tweety.position

#2
Rattat == inkpad or Rattat == diadem
neighbor(dickie, Rattat)
neighbor(pecans, Rattat)

#3
Struth != dickie
Struth.position > dickie.position + 1
Struth.position < 8

#4
opposites = [
  None,
  5, 6, 7, 8, 1, 2, 3, 4
]
all(Struth[i] == Stuart[opposites[i]] for i in range(1, 8+1))
Struth != diadem
Stuart != diadem

#5
Tatter == earbud or Tatter == pecans
neighbor(Tatter, Tybalt) == False
neighbor(Tatter, Pretty) == False

#6
inkpad.position == banana.position * 2

#7
all(Tybalt[i] == straws[opposites[i]] for i in range(1, 8+1))
all(Pretty[i] == crayon[opposites[i]] for i in range(1, 8+1))
neighbor(Tybalt, straws) == False
neighbor(Pretty, crayon) == False
neighbor(Pretty, Tybalt) == False

model.grid()
""")


 *	Attlee	Pretty	Rattat	Struth	Stuart	Tatter	Tweety	Tybalt		banana	crayon	diadem	dickie	earbud	inkpad	pecans	straws	
1	0	0	0	0	0	0	0	1		0	0	0	1	0	0	0	0	
2	0	0	1	0	0	0	0	0		0	0	1	0	0	0	0	0	
3	0	1	0	0	0	0	0	0		0	0	0	0	0	0	1	0	
4	0	0	0	1	0	0	0	0		1	0	0	0	0	0	0	0	
5	0	0	0	0	0	0	1	0		0	0	0	0	0	0	0	1	
6	0	0	0	0	0	1	0	0		0	0	0	0	1	0	0	0	
7	1	0	0	0	0	0	0	0		0	1	0	0	0	0	0	0	
8	0	0	0	0	1	0	0	0		0	0	0	0	0	1	0	0	

banana	0	0	0	1	0	0	0	0	
crayon	1	0	0	0	0	0	0	0	
diadem	0	0	1	0	0	0	0	0	
dickie	0	0	0	0	0	0	0	1	
earbud	0	0	0	0	0	1	0	0	
inkpad	0	0	0	0	1	0	0	0	
pecans	0	1	0	0	0	0	0	0	
straws	0	0	0	0	0	0	1	0	


 *	Attlee	Pretty	Rattat	Struth	Stuart	Tatter	Tweety	Tybalt		banana	crayon	diadem	dickie	earbud	inkpad	pecans	straws	
1	0	0	0	0	0	0	0	1		0	0	0	1	0	0	0	0	
2	0	0	1	0	0	0	0	0		0	0	1	0	0	0	0	0	
3	0	1	0	0	0	0	0	0		0	0	0	0	0	0	1	0	
4	0	0	0	1	0	0	0	0		1	0	0	0	0	0	0	0	
5	0	0	0	0	0	0	1	0		0	0	0	0	0	0	0	1	
6	0	0	0	0	0	1	0	0		0	0	0	0	1	0	0	0	
7	1	0	0	0	0	0	0	0		0	1	0	0	0	0	0	0	
8	0	0	0	0	1	0	0	0		0	0	0	0	0	1	0	0	

banana	0	0	0	1	0	0	0	0	
crayon	1	0	0	0	0	0	0	0	
diadem	0	0	1	0	0	0	0	0	
dickie	0	0	0	0	0	0	0	1	
earbud	0	0	0	0	0	1	0	0	
inkpad	0	0	0	0	1	0	0	0	
pecans	0	1	0	0	0	0	0	0	
straws	0	0	0	0	0	0	1	0	


 *	Attlee	Pretty	Rattat	Struth	Stuart	Tatter	Tweety	Tybalt		banana	crayon	diadem	dickie	earbud	inkpad	pecans	straws	
1	0	0	0	0	0	0	0	1		0	0	0	1	0	0	0	0	
2	0	0	1	0	0	0	0	0		0	0	1	0	0	0	0	0	
3	0	1	0	0	0	0	0	0		0	0	0	0	0	0	1	0	
4	0	0	0	1	0	0	0	0		1	0	0	0	0	0	0	0	
5	0	0	0	0	0	0	1	0		0	0	0	0	0	0	0	1	
6	0	0	0	0	0	1	0	0		0	0	0	0	1	0	0	0	
7	1	0	0	0	0	0	0	0		0	1	0	0	0	0	0	0	
8	0	0	0	0	1	0	0	0		0	0	0	0	0	1	0	0	

banana	0	0	0	1	0	0	0	0	
crayon	1	0	0	0	0	0	0	0	
diadem	0	0	1	0	0	0	0	0	
dickie	0	0	0	0	0	0	0	1	
earbud	0	0	0	0	0	1	0	0	
inkpad	0	0	0	0	1	0	0	0	
pecans	0	1	0	0	0	0	0	0	
straws	0	0	0	0	0	0	1	0	


 *	Attlee	Pretty	Rattat	Struth	Stuart	Tatter	Tweety	Tybalt		banana	crayon	diadem	dickie	earbud	inkpad	pecans	straws	
1	0	0	0	0	0	0	0	1		0	0	0	1	0	0	0	0	
2	0	0	1	0	0	0	0	0		0	0	1	0	0	0	0	0	
3	0	1	0	0	0	0	0	0		0	0	0	0	0	0	1	0	
4	0	0	0	1	0	0	0	0		1	0	0	0	0	0	0	0	
5	0	0	0	0	0	0	1	0		0	0	0	0	0	0	0	1	
6	0	0	0	0	0	1	0	0		0	0	0	0	1	0	0	0	
7	1	0	0	0	0	0	0	0		0	1	0	0	0	0	0	0	
8	0	0	0	0	1	0	0	0		0	0	0	0	0	1	0	0	

banana	0	0	0	1	0	0	0	0	
crayon	1	0	0	0	0	0	0	0	
diadem	0	0	1	0	0	0	0	0	
dickie	0	0	0	0	0	0	0	1	
earbud	0	0	0	0	0	1	0	0	
inkpad	0	0	0	0	1	0	0	0	
pecans	0	1	0	0	0	0	0	0	
straws	0	0	0	0	0	0	1	0	


 *	Attlee	Pretty	Rattat	Struth	Stuart	Tatter	Tweety	Tybalt		banana	crayon	diadem	dickie	earbud	inkpad	pecans	straws	
1	0	0	0	0	0	0	0	1		0	0	0	1	0	0	0	0	
2	0	0	1	0	0	0	0	0		0	0	1	0	0	0	0	0	
3	0	1	0	0	0	0	0	0		0	0	0	0	0	0	1	0	
4	0	0	0	1	0	0	0	0		1	0	0	0	0	0	0	0	
5	0	0	0	0	0	0	1	0		0	0	0	0	0	0	0	1	
6	0	0	0	0	0	1	0	0		0	0	0	0	1	0	0	0	
7	1	0	0	0	0	0	0	0		0	1	0	0	0	0	0	0	
8	0	0	0	0	1	0	0	0		0	0	0	0	0	1	0	0	

banana	0	0	0	1	0	0	0	0	
crayon	1	0	0	0	0	0	0	0	
diadem	0	0	1	0	0	0	0	0	
dickie	0	0	0	0	0	0	0	1	
earbud	0	0	0	0	0	1	0	0	
inkpad	0	0	0	0	1	0	0	0	
pecans	0	1	0	0	0	0	0	0	
straws	0	0	0	0	0	0	1	0	


In [ ]:
"""
position | animal |   item
       1 | Tybalt | dickie
       2 | Rattat | diadem
       3 | Pretty | pecans
       4 | Struth | banana
       5 | Tweety | straws
       6 | Tatter | earbud
       7 | Attlee | crayon
       8 | Stuart | inkpad
"""

In [ ]: