9 jupytext_version: 1.14.5
11 display_name: Python 3 (ipykernel)
17 from riddle_definitions import *
20 from typing import Dict, Tuple, List, Set
21 from enum import Enum, auto
25 def tokenise(phrase: str) -> List[str]:
26 return [w.lower() for w in re.split(r'\W+', phrase) if w]
30 tokenise("My first is in apple, but not in fish.")
34 def parse_line(tokens: List[str]) -> Tuple[int, Tuple[RiddleClue, RiddleClue]]:
35 stripped_tokens = [t for t in tokens if t not in stop_words]
37 position_word = [t for t in stripped_tokens if t in ordinals][0]
38 pos = from_ordinal(position_word)
40 first_index, first_word = [(i, t) for i, t in enumerate(stripped_tokens)
42 if t not in negative_words][0]
43 second_index, second_word = [(i, t) for i, t in enumerate(stripped_tokens)
45 if t not in negative_words][1]
46 neg_indices = [i for i, t in enumerate(stripped_tokens) if t in negative_words]
52 if neg_indices[0] < first_index:
53 first_clue = RiddleClue(valence = RiddleValence.Exclude,
55 if len(neg_indices) > 1:
56 second_clue = RiddleClue(valence = RiddleValence.Exclude,
58 elif neg_indices[0] < second_index:
59 second_clue = RiddleClue(valence = RiddleValence.Exclude,
62 if first_clue is None:
63 first_clue = RiddleClue(valence = RiddleValence.Include,
66 if second_clue is None:
67 second_clue = RiddleClue(valence = RiddleValence.Include,
70 return (pos, (first_clue, second_clue))
74 e1 = parse_line(tokenise("My first is in apple, but not in pad."))
79 e2 = parse_line(tokenise("My second is in apple and also in banana."))
84 e3 = parse_line(tokenise('My seventh is neither in callus nor in calves'))
89 sample_riddle_text = """My first is in shoat but not in oath
90 My second is in orate but not in ratter
91 My third is in preposition but not in osteoporosis
92 My fourth is in astern but not in taster
93 My fifth is in conscientiousness but not in suction
94 My sixth is in immorality but not in immorally"""
96 sample_riddle_lines = {i: elem
98 [parse_line(tokenise(l))
99 for l in sample_riddle_text.split('\n')]}
104 sample_riddle = collapse_riddle_clues(sample_riddle_lines)
109 def parse_riddle(riddle_text: str) -> Riddle:
110 riddle_lines = {i: elem
112 [parse_line(tokenise(l)) for l in riddle_text.split('\n')]}
113 return collapse_riddle_clues(riddle_lines)
117 solve_riddle(sample_riddle)
121 def parse_and_solve_riddle(riddle_text: str) -> List[str]:
122 riddle = parse_riddle(riddle_text)
123 return solve_riddle(riddle)
127 sample_riddles = open('sample-riddles.txt').read().split('\n\n')
132 [parse_and_solve_riddle(r) for r in sample_riddles]
136 sample_riddles = open('generated-riddles.txt').read().split('\n\n')
137 sample_riddles = [riddle.split('\nTarget: ') for riddle in sample_riddles]
138 sample_riddles = [(r, s.strip()) for r, s in sample_riddles]
143 for r, s in sample_riddles:
144 found_solns = parse_and_solve_riddle(r)
145 correct = len(found_solns) == 1 and found_solns[0] == s
146 print(found_solns, s, correct)
150 # [parse_line(tokenise(line)) for line in sample_riddles[4][0]]
151 [parse_line(tokenise(line)) for line in sample_riddles[4][0].split('\n')]
155 parse_riddle(sample_riddles[4][0])