In [29]:
import forge
from puzzle.puzzlepedia import puzzlepedia
puzzle = puzzlepedia.parse("""
name in {Beth, Charles, David, Frank, Jessica, Karen, Taylor}
magazine in {CI, FF, FW, FD, HW, PS, VH}
time in {1, 2, 3, 4}
crime in {innocent, guilty}
#1a: Killer acted alone.
sum(n.guilty for n in name) == 1
#1b: BFJT sub to CI, FF, FW, VH
bfjt = [Beth, Frank, Jessica, Taylor]
subs = [CI, FF, FW, VH]
for n in bfjt:
any(n[s] for s in subs)
#2: one of these is true
(Charles == FD) or (David == HW) or (Karen == PS)
(Beth == CI) or (Frank == FF) or (Jessica == VH) or (Taylor == FW)
#3a: max 2 people per time
for i in time:
sum(n[i] for n in name) <= 2
#3b: Knife @ 2:30 - 3:30
for n in name:
if n.guilty: n == 3
#4:
if Beth == FF: Taylor == VH
if Taylor == VH: Karen != HW
#5:
if Charles == PS: Karen == HW
#6:
if Taylor == FF: Jessica == CI
#7:
(Charles == PS) or (Jessica == CI) or (Taylor == FF)
#8:
if Beth.innocent:
Beth == 4
HW == 4
#9:
if Charles.innocent:
Charles == 4
FW == 4
#10:
if David.innocent:
David == 4
FD == 4
#11:
if Frank.innocent:
Frank == 2
#12:
if Jessica.innocent:
Jessica == 3
FW != 3
HW != 3
#13:
if Karen.innocent:
Karen == 2
#14:
if Taylor.innocent:
Taylor == 1
""")
In [ ]: