Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

kQuestion = \'question\' kGuess = \'guess\' # define a function for asking yes/n

ID: 3619849 • Letter: K

Question

kQuestion = 'question'
kGuess = 'guess'

# define a function for asking yes/no questions
def yesno(prompt):
    ans = raw_input(prompt)
return (ans[0]=='y' or ans[0]=='Y')

# define a node in the question tree (either question or guess)
class Qnode:

# initialization method
    def __init__(self,guess):
        self.nodetype = kGuess
self.desc = guess

# get the question to ask
def query(self):
    if (self.nodetype == kQuestion):
        return self.desc + " "
    elif (self.nodetype == kGuess):
        return "Is it a " + self.desc + "? "
    else:
        return "Error: invalid node type!"

# return new node, given a boolean response
def nextnode(self,answer):
    return self.nodes[answer]

# turn a guess node into a question node and add new item
# give a question, the new item, and the answer for that item
def makeQuest( self, question, newitem, newanswer ):

# create new nodes for the new answer and old answer
    newAnsNode = Qnode(newitem)
    oldAnsNode = Qnode(self.desc)

# turn this node into a question node
self.nodetype = kQuestion
self.desc = question

# assign the yes and no nodes appropriately
self.nodes = {newanswer:newAnsNode, not newanswer:oldAnsNode}

def traverse(fromNode):
# ask the question
    yes = yesno( fromNode.query() )

# if this is a guess node, then did we get it right?
if (fromNode.nodetype == kGuess):
    if (yes):
        print "I'm a genius!!!"
return
# if we didn't get it right, return the node
return fromNode

# if it's a question node, then ask another question
return traverse( fromNode.nextnode(yes) )

def run():
# start with a single guess node
    topNode = Qnode('python')

done = 0
while not done:
# ask questions till we get to the end
    result = traverse( topNode )

# if result is a node, we need to add a question
if (result):
    item = raw_input("OK, what were you thinking of? ")
print "Enter a question that distinguishes a",
print item, "from a", result.desc + ":"
q = raw_input()
ans = yesno("What is the answer for " + item + "? ")
result.makeQuest( q, item, ans )
print "Got it."

# repeat until done
print
done = not yesno("Do another? ")
print

# immediate-mode commands, for drag-and-drop or execfile() execution
if __name__ == '__main__':
    run()
print
raw_input("press Return>")
else:
print "Module questor imported."
print "To run, type: questor.run()"
print "To reload after changes to the source, type: reload(questor)"

Explanation / Answer

# define some constants for future use

kQuestion = 'question'
kGuess = 'guess'
result = Qnode('Phython');

def yesno(prompt):
    ans = raw_input(prompt)
    return (ans[0]=='y' or ans[0]=='Y')

class Qnode:
    newAnsNode='';
    newanswer = '';
    oldAnsNode = '';
    nodes = {}
    def __init__(self,guess):
        self.nodetype = kGuess
        self.desc = guess


    def query(self):
        if (self.nodetype == kQuestion):
            return self.desc + " "
        elif (self.nodetype == kGuess):
            return "Is it a " + self.desc + "? "
        else:
            return "Error: invalid node type!"


    def nextnode(self,answer):
        return self.nodes[answer]


    def makeQuest( self, question, newitem, newanswer ):


        newAnsNode = Qnode(newitem)
        newAnsNode.newanswer = newanswer;
        oldAnsNode = Qnode(self.desc)


        self.nodetype = kQuestion
        self.desc = question

        self.nodes = {newanswer:newAnsNode, not newanswer:oldAnsNode}

def traverse(fromNode):
    yes = yesno( fromNode.query() )

    if (fromNode.nodetype == kGuess):
        if (yes):
            print "I'm a genius!!!"
         
            return fromNode

    return traverse( fromNode.nextnode(yes) )

def run():
    topNode = Qnode('python')
    item = ''
    done = 0

    while not done:
        result = traverse( topNode )

    if (result):
        item = raw_input("OK, what were you thinking of? ")
        print "Enter a question that distinguishes a",
        print item, "from a", result.desc + ":"
q = raw_input()
item = q
ans = yesno("What is the answer for " + item + "? ")
result.makeQuest( q, item, ans )
print "Got it."

print
done = not yesno("Do another? ")
print

if __name__ == '__main__':
    run()
    print raw_input("press Return>")
else:
    print "Module questor imported."
print "To run, type: questor.run()"
print "To reload after changes to the source, type: reload(questor)"