code: def compete(source_x, source_o, timeout=None, memlimit=None, cgroup='tictactoe',
              cgroup_path='/sys/fs/cgroup'):
      
  
      gameplay = []
      for xo, moveresult, log in run_interactive(source_x, source_o, timeout,
                                                 memlimit, cgroup, cgroup_path):
          if moveresult[0] == 'error':
              return 'error', xo, moveresult[1], gameplay + [0]
          elif moveresult[0] == 'state_coords':
              gameplay.append(coords_to_num(moveresult[1][1]))
              state = moveresult[1][0]
              if state == 'draw' or state == 'x' or state == 'o':
                  return 'ok', state, gameplay
docs: Fights two source files.
  
      Returns either:
      * ('ok', 'x' | 'draw' | 'o', GAMEPLAY)
      * ('error', GUILTY, REASON, GAMEPLAY)
  
      REASON := utf8-encoded error string (can be up to 65k chars)
      GAMEPLAY := [ NUM ]
      GUILTY := 'x' | 'o' (during whose turn the error occured)
      NUM := 1..81 | 0
  
      NUM=0 means the move resulted in error (then ERROR_STRING is non-empty)
      GAMEPLAY is never more than 255 characters long:
        len(",".join(map(str, range(1, 81)))) == 230