Skip to content

Commit 50ecf32

Browse files
committed
add hopper test
1 parent 56a2576 commit 50ecf32

File tree

2 files changed

+168
-0
lines changed

2 files changed

+168
-0
lines changed

Kangli/hopper.py

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
import sys
2+
3+
OUTPUT_TYPE = 'Output'
4+
ANSWER_TYPE = 'Answer'
5+
GOTO_TYPE = 'Goto'
6+
CONCLUSION_TYPE = 'Conclusion'
7+
8+
HOPPER_MESSAGE_PREFIX = 'Hopper: '
9+
USER_MESSAGE_PREFIX = 'User: '
10+
CONCLUSION_MESSAGE_PREFIX = 'Conclusion: '
11+
12+
class Output:
13+
def __init__(self, text, label=None):
14+
self.text = text
15+
self.label = label
16+
self.type = OUTPUT_TYPE
17+
def __str__(self):
18+
return 'Output({}, label={})'.format(self.text, self.label)
19+
20+
21+
class Answer:
22+
def __init__(self, text):
23+
self.text = text
24+
self.type = ANSWER_TYPE
25+
def __str__(self):
26+
return 'Answer({})'.format(self.text)
27+
28+
29+
class Goto:
30+
def __init__(self, label):
31+
self.label = label
32+
self.type = GOTO_TYPE
33+
def __str__(self):
34+
return 'Goto({})'.format(self.label)
35+
36+
37+
class Conclusion:
38+
def __init__(self, text):
39+
self.text = text
40+
self.type = CONCLUSION_TYPE
41+
def __str__(self):
42+
return 'Conclusion({})'.format(self.text)
43+
44+
45+
class IndentationAndInputObject:
46+
def __init__(self, indentation, input_object):
47+
self.indentation = indentation
48+
self.input_object = input_object
49+
50+
def print_conversation(flat_tree, user_answers):
51+
# Write your solution below
52+
# Some example code is provided to show you how to access our data structures, feel free to modify/delete
53+
cur_indent, res = 0, []
54+
response = 0
55+
chosen = True
56+
label_dictionary = {}
57+
for i, v in enumerate(flat_tree):
58+
if v.input_object.type == OUTPUT_TYPE:
59+
label_dictionary[v.input_object.label] = i
60+
i = 0
61+
answers = []
62+
while i < len(flat_tree):
63+
row = flat_tree[i]
64+
i += 1
65+
if row.input_object.type == OUTPUT_TYPE and row.indentation == cur_indent and chosen:
66+
res.append(row)
67+
elif row.input_object.type == ANSWER_TYPE:
68+
answers.append(row.input_object.text)
69+
if user_answers[response] == row.input_object.text:
70+
res.append(row)
71+
response += 1
72+
cur_indent += 2
73+
chosen = True
74+
else:
75+
if i == len(flat_tree)-1:
76+
res.append("User: "+user_answers[response])
77+
response += 1
78+
res.append("Hopper: Invalid input")
79+
for j in range(response, len(user_answers)):
80+
res.append("User: " + user_answers[j])
81+
res.append("Conclusion: Goodbye!")
82+
break
83+
chosen = False
84+
elif row.input_object.type == GOTO_TYPE and chosen:
85+
i = label_dictionary[row.input_object.label]
86+
87+
elif row.input_object.type == CONCLUSION_TYPE and chosen:
88+
res.append(row)
89+
break
90+
91+
for row in res:
92+
if type(row) == str:
93+
print(row)
94+
elif row.input_object.type == OUTPUT_TYPE:
95+
print(HOPPER_MESSAGE_PREFIX + row.input_object.text)
96+
elif row.input_object.type == ANSWER_TYPE:
97+
print(USER_MESSAGE_PREFIX + row.input_object.text)
98+
elif row.input_object.type == CONCLUSION_TYPE:
99+
print(CONCLUSION_MESSAGE_PREFIX + row.input_object.text)
100+
101+
# for row in flat_tree:
102+
# if row.input_object.type == OUTPUT_TYPE:
103+
# print(HOPPER_MESSAGE_PREFIX + row.input_object.text)
104+
# elif row.input_object.type == ANSWER_TYPE:
105+
# print(USER_MESSAGE_PREFIX + row.input_object.text)
106+
# elif row.input_object.type == CONCLUSION_TYPE:
107+
# print(CONCLUSION_MESSAGE_PREFIX + row.input_object.text)
108+
109+
def parse_line(line):
110+
def parse_spaces_and_line(line):
111+
for i, c in enumerate(line):
112+
if c != ' ':
113+
return len(line[:i]), line[i:]
114+
raise RuntimeError("Found all whitespace line")
115+
116+
def parse_label_and_output(line_content):
117+
for i, c in enumerate(line_content):
118+
if not c.isdigit():
119+
if c == ':' and i > 0:
120+
return int(line_content[:i]), line_content[i+1:]
121+
else:
122+
return None, line_content
123+
return None, line_content
124+
125+
indentation, line_content = parse_spaces_and_line(line)
126+
if line_content.startswith('-'):
127+
return IndentationAndInputObject(indentation, Answer(line_content[1:]))
128+
elif line_content.startswith('='):
129+
return IndentationAndInputObject(indentation, Conclusion(line_content[1:]))
130+
elif line_content.startswith('>'):
131+
return IndentationAndInputObject(indentation, Goto(int(line_content[1:])))
132+
else:
133+
label, output = parse_label_and_output(line_content)
134+
return IndentationAndInputObject(indentation, Output(output, label))
135+
136+
137+
def read_input():
138+
tree = []
139+
answers = []
140+
reading_examples = False
141+
for line in sys.stdin.readlines():
142+
line = line.rstrip()
143+
if line == '---':
144+
reading_examples = True
145+
elif not reading_examples:
146+
tree.append(parse_line(line))
147+
else:
148+
answers.append(line)
149+
return tree, answers
150+
151+
152+
flat_tree, user_answers = read_input()
153+
print_conversation(flat_tree, user_answers)

Kangli/hopper_input.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
Hello!
2+
Are you?
3+
-No
4+
Some other
5+
1:We're happy
6+
Would you
7+
-Not right now
8+
=Okay
9+
-Yes, please upgrade
10+
=Okay, upgraded!
11+
-Yes
12+
>1
13+
---
14+
Yes
15+
Yes, please upgrade

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy