code: def encipher_vigenere(plaintext, plain_vocab, key):
    
    ciphertext = []
    # generate Vigenere table
    layers = [
        ShiftEncryptionLayer(plain_vocab, i) for i in range(len(plain_vocab))
    ]
  
    for i, sentence in enumerate(plaintext):
      cipher_sentence = []
      for j, character in enumerate(sentence):
        key_idx = key[j % len(key)]
        encrypted_char = layers[key_idx].encrypt_character(character)
        cipher_sentence.append(encrypted_char)
      ciphertext.append(cipher_sentence)
  
    return ciphertext
docs: Encrypt plain text with given key.
  
    Args:
      plaintext (list of list of Strings): a list of plain text to encrypt.
      plain_vocab (list of Integer): unique vocabularies being used.
      key (list of Integer): key to encrypt cipher using Vigenere table.
  
    Returns:
      ciphertext (list of Strings): encrypted plain text.