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

puzzle = puzzlepedia.parse("""
name in {Beth, Charles, David, Frank, Jessica, Karen, Taylor}
crime in {innocent, first, last}

df_first2 = variable('df_first2')
if David == first or Frank == first: df_first2 == True
cj_last2 = variable('cj_last2')
if Charles == last or Jessica == last: cj_last2 == True
ckt_first2 = variable('ckt_first2')
if Charles == first or Karen == first or Taylor == first: ckt_first2 == True
bfk_last2 = variable('bfk_last2')
if Beth == last or Frank == last or Karen == last: bfk_last2 == True
david_before_charles = variable('david_before_charles')
if David == last: david_before_charles == False
if Charles == last: david_before_charles == True
if David == first: david_before_charles == True
if Charles == first: david_before_charles == False

#1: Two criminals.
sum(n.first for n in name) == 1
sum(n.last for n in name) == 1

#2: n/a.

#3: First to enter is guilty.

#4: Last to leave is guilty.

#5: n/a.

#6:
David != first
Frank != first
df_first2 == False

#7:
Charles != last
Jessica != last
cj_last2 == False

#8:
if Beth.innocent:
  (Jessica == first) | (David == last)

#9:
if Charles.innocent:
  Charles != first
  Karen != first
  Taylor != first
  ckt_first2 == False
  Beth != last
  Frank != last
  Karen != last
  bfk_last2 == False

#10:
if David.innocent:
  David != last
  Charles != first
  Karen != first
  Taylor != first
  ckt_first2 == False

#11:
if Frank.innocent:
  (David != last) | (Jessica != first)
  if Jessica == first: david_before_charles == True  

#12:
if Jessica.innocent:
  david_before_charles == False
  David != last
  Beth != last
  Frank != last
  Karen != last
  bfk_last2 == False

#13:
if Karen.innocent:
  (Charles != last) | (Jessica != first)
  if Jessica == first: david_before_charles == False 

#14:
if Taylor.innocent:
  bfk_last2 == True

print('david_before_charles', david_before_charles)
""")


david_before_charles 0

In [ ]: