def determine_sort( list_orig, data ):
  # Get history for sorts: Selection, Insertion, and Shell
  hSelection, hInsertion, hShell = get_sort_history( list_orig )
  # Append 0 for "Original Sort"
  res = [0] 
  # Determine sorts for test_data 1 to N-1 
  for i,test_data in enumerate(data[1:-1]):
    R = [H.history_contains( hInsertion, test_data ), 
         H.history_contains( hSelection, test_data ), 
         H.history_contains( hShell,     test_data )]
    if   R[0] and not R[1] and not R[2]:
      res.append(1) # Insertion sort
    elif not R[0] and R[1] and not R[2]:
      res.append(2) # Selection sort
    elif not R[0] and not R[1] and R[2]:
      res.append(3) # Shell sort
    else:
      raise Exception("UNKNOWN SORT")
    print test_data
    print i+1, res[-1], R[0]
    print i+1, res[-1], R[1]
    print i+1, res[-1], R[2]
  # Append 4 for "Sorted"
  res.append(4)
  return res
 def test_wk2_ex_Stacks_489125b(self):
   # (seed = 489125)
   print "\n489125b"
   #o, stk = run("0 1 2 3 4 5 6 7 8 9")
   o, stk = run("0 - 1 - 2 3 - - 4 - 5 6 - 7 8 - - 9")
   #self.failUnless( H.chk(o, "0 1 3 2 4 6 8 5 7 9"))
   o, stk = run("0 1 2 3 4 5 6 - - - - - - - 7 - 8 - 9 -")
   self.failUnless( H.chk(o, "6 5 4 3 2 1 0 7 8 9"))
   o, stk = run("0 1 2 3 - 4 - 5 - 6 7 8 - 9 - - - - - -")
   self.failUnless( H.chk(o, "3 4 5 8 9 7 6 2 1 0"))
   o, stk = run("0 - 1 2 3 - 4 5 6 7 - - - - - 8 9 - - -")
   self.failUnless( H.chk(o, "0 3 7 6 5 4 2 9 8 1"))
   o, stk = run("0 1 - - 2 3 - 4 5 - - 6 7 8 9")
 def test_wk2_ex_Stacks_634506b(self):
   # (seed = 634506)
   print "\n634506b DONE"
   o, stk = run("0 1 2 3 - - - 4 5 - - 6 7 8 9")
   #self.failUnless( H.chk(o, "3 2 1 5 0 6 7 8 9 4") )
   o, stk = run("0 1 2 - - - 3 - 4 - 5 - 6 - 7 - 8 - 9 -")
   self.failUnless( H.chk(o, "2 1 0 3 4 5 6 7 8 9") )
   o, stk = run("0 - 1 - 2 3 - - 4 - 5 - 6 - 7 8 - - 9 -")
   self.failUnless( H.chk(o, "0 1 3 2 4 5 6 8 7 9") )
   o, stk = run("0 1 2 3 - 4 5 - - 6 7 8 9")
   #self.failUnless( H.chk(o, "3 5 2 4 6 1 0 8 7 9") )
   o, stk = run("0 1 2 - - 3 4 5 6 - - - 7 - - 8 - - 9 -")
   self.failUnless( H.chk(o, "2 1 6 5 4 7 3 8 0 9") )
 def test_wk2_ex_Stacks_634506(self):
   # (seed = 634506)
   # Suppose that an intermixed sequence of 10 push and 10 pop
   # operations are performed on a LIFO stack. The pushes push
   # the letters 0 through 9 in order; the pops print out the
   # return value. Which of the following output sequence(s)
   # could occur?
   print "\n634506 DONE"
   o, stk = run("0 1 2 3 - - - 4 5 - 6 7 8 9")
   #self.failUnless( H.chk(o, "3 2 1 5 0 6 7 8 9 4") )
   o, stk = run("0 1 2 - - - 3 - 4 - 5 - 6 - 7 - 8 - 9 -")
   self.failUnless( H.chk(o, "2 1 0 3 4 5 6 7 8 9") )
   o, stk = run("0 - 1 - 2 3 - - 4 - 5 - 6 - 7 8 - - 9 -")
   self.failUnless( H.chk(o, "0 1 3 2 4 5 6 8 7 9") )
   o, stk = run("0 1 2 3 - 4 5 - - 6 7 8 9")
   #self.failUnless( H.chk(o, "3 5 2 4 6 1 0 8 7 9") )
   o, stk = run("0 1 2 - - 3 4 5 6 - - - 7 - - 8 - - 9 -")
   self.failUnless( H.chk(o, "2 1 6 5 4 7 3 8 0 9") )
 def test_wk2_q2a(self):
   desc = 'SELECTION SORT WORDS'
   exp = "BECK BUSH DEVO EVE6 HOLE JAYZ KORN MIMS VAIN RATT TOTO PINK SADE NOFX SOAD WHAM"
   a = "HOLE BUSH MIMS BECK WHAM SOAD NOFX TOTO VAIN RATT DEVO PINK SADE KORN JAYZ EVE6".split()
   array_history = []
   Sort(a, array_history)
   show_array_history(desc, array_history)
   for idx, A in enumerate(array_history):
     if H.chk( A[0], exp ):
       print "MATCH", idx
   print
  def test_wk2_ex_Stacks_489125(self):
    # (seed = 489125)
    # Suppose that an intermixed sequence of 10 push and 10 pop
    # operations are performed on a LIFO stack. The pushes push
    # the letters 0 through 9 in order; the pops print out the
    # return value. Which of the following output sequence(s)
    # could occur?
    # o, stk = run("0 1 2 3 4 5 6 7 8 9")
    print "\n489125 DONE"
    o, stk = run("0 - 1 - 2 3 - - 4 - 5 6 - 7 8 - - 9 -")
    #self.failUnless( H.chk(o, "0 1 3 2 4 6 8 5 7 9") )

    o, stk = run("0 1 2 3 4 5 6 - - - - - - - 7 - 8 - 9 -")
    self.failUnless( H.chk(o, "6 5 4 3 2 1 0 7 8 9") )

    o, stk = run("0 1 2 3 - 4 - 5 - 6 7 8 - 9 - - - - - -")
    self.failUnless( H.chk(o, "3 4 5 8 9 7 6 2 1 0") )

    o, stk = run("0 - 1 2 3 - 4 5 6 7 - - - - - 8 9 - - -")
    self.failUnless( H.chk(o, "0 3 7 6 5 4 2 9 8 1") )

    o, stk = run("0 1 - - 2 3 - 4 5 - 6 7 8 9")
    # self.failUnless( H.chk(o, "1 0 3 5 2 7 6 8 9 4") )
    print
  def test_wk2_ex_Queues_608030(self):
    # Question 2
    # (seed = 608030)
    # Suppose that an intermixed sequence of 10 enqueue and 10
    # dequeue operations are performed on a FIFO queue. The
    # enqueues add the letters 0 through 9 in order; the dequeues
    # print out the return value. Which of the following output
    # sequence(s) could occur?
    # r = run("0 1 2 3 4 5 6 7 8 9")
    r = run("0 - 1 2 - 3 4 5 6 7 8 9")
    #self.failUnless( H.chk(r, "0 2 1 3 7 4 9 6 8 5") )

    r = run("0 1 2 - - - 3 4 5 - 6 - - 7 8 9")
    #self.failUnless( H.chk(r, "0 1 2 5 6 4 8 9 3 7") )

    r = run("0 1 2 3 4 5 6 7 8 9 - - - - - - - - - -")
    self.failUnless( H.chk(r, "0 1 2 3 4 5 6 7 8 9") )

    r = run("0 - 1 2 3 4 5 6 7 8 9")
    #self.failUnless( H.chk(r, "0 7 4 1 8 3 6 2 9 5") )

    r = run("0 - 1 2 3 4 5 6 7 8 9")