Private vocales As String[] = ["a", "e", "i", "o", "u", "á", "é", "í", "ó", "ú"]
Private consonantes As String[] = ["b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "ñ", "p", "q", "r", "s", "t", "v", "w", "y", "z"]
Public Sub Main()
  'Condición 1. Consonante al comienzo de la palabra
  'No se comtempla aún que exista al final de la palabra una consonante
  'Descomponer("casa")
  'Descomponer("colibrí")
  Descomponer("frigorífico")
  'Aquí fallaría
  'Descomponer("neveras")
End
Public Sub Descomponer(palabra As String)
  Dim lugar As Integer
  Dim subcadena As String
  While String.Len(palabra) > 1
    subcadena = ConsonanteAlPrincipio(palabra)
    Print subcadena
    'Para obtener el lugar hasta donde llega la subcadena:
    'Encuentro el comienzo de la subcadena dentro de la cadena palabra y le añado el tamaño de la longitud de la subcadena menos una posición
    'No existe una posición cero, las cadenas comienzan desde 1
    lugar = String.RInStr(palabra, subcadena) + String.Len(subcadena) - 1
    'Eliminamos de la palabra, la subcadena que se encuentra en el lugar más una posición
    'Creando una palabra nueva, lo que queda de la palabra original
    palabra = String.Mid(palabra, lugar + 1)
  Wend
End
Public Function ConsonanteAlPrincipio(cadena As String) As String
  Dim palabra As String
  Dim x As Integer
  Dim encuentraconsonante As Boolean
  Dim encuentravocal As Boolean
  palabra = ""
  x = 1
  While Not encuentraconsonante Or Not encuentravocal And x <= String.Len(cadena)
    'Primero encontrar la consonante
    If consonantes.Find(String.Mid(cadena, x, 1)) <> -1 Then
      encuentraconsonante = True
      palabra &= String.Mid(cadena, x, 1)
    Endif
    'Si encontramos la consonante, podemos buscar la vocal
    If encuentraconsonante Then
      If vocales.Find(String.Mid(cadena, x, 1)) <> -1 Then
        encuentravocal = True
        palabra &= String.Mid(cadena, x, 1)
      Endif
    Endif
    Inc x
  Wend
  Return palabra
End
Public Function ConsonanteAlPrincipio(cadena As String) As String
  Dim palabra As String
  Dim x As Integer
  Dim encuentraconsonante As Boolean
  Dim encuentravocal As Boolean
  Dim incremento As Integer
  palabra = ""
  x = 1
  incremento = 1
  While Not encuentraconsonante Or Not encuentravocal And x <= String.Len(cadena)
    'Primero encontrar la consonante
    If consonantes.Find(String.Mid(cadena, x, 1)) <> -1 Then
      encuentraconsonante = True
      palabra &= String.Mid(cadena, x, 1)
    Endif
    'Si encontramos la consonante, podemos buscar la vocal
    If encuentraconsonante Then
      If vocales.Find(String.Mid(cadena, x, 1)) <> -1 Then
        encuentravocal = True
        palabra &= String.Mid(cadena, x, 1)
        'Comprobar si sumando una posición llegamos al tamaño de la cadena
        If x + 1 = String.Len(cadena) Then
          'Se tiene que añadir la consonante que queda en la última posición de la cadena
          palabra &= String.Mid(cadena, x + 1, 1)
          'Cambiamos el valor del incremento en 2
          incremento = 2
        Endif
      Endif
    Endif
    x += incremento
  Wend
  Return palabra
End
		
	
		
	Public Function silabaTonica(palabra As String) As String ''Retorna la sílaba tónica de una palabra
 
  Dim sil As New String[]
  Dim toni As Integer
 
  sil = silabeame(palabra)
  toni = miTonica(sil)
 
  'Return sil[sil.Count + toni]
  Return sil[sil.Max + toni]
 
End

Private Function contiene2(lis As String[], pala As String) As Boolean
 
  'Dim devolver As Boolean = False
  Dim letras As New String[]
 
  For a As Integer = 1 To String.Len(pala)
    letras.Add(String.Mid(pala, a, 1))
  Next
 
  For Each j As String In letras
    If lis.Exist(j) Then
      'Siempre va a devolver True
      'devolver = True
      Return True
    Endif
  Next
  'Siempre va a devolver False
  'Return devolver
  Return False
 
End  ' **** Estadísiticas de un texto.
  ' <<<< Devuelve una matriz de enteros:
  '       [0]: Número de palabras
  '       [1]: Número de tipos
  '       [2]: Número de caracteres
  '       [3]: Perspicuidad de Szgrizt 1993
  ' >>>> Texto plano para obtener estadísticas.
  '
  '' ╔═════════════════════════════════════════════════════════════╗
  '' ║ Atención: PCRE sólo admite texto ASCII extendido, no UTF-8. ║
  '' ║            Los valores obtenidos son aproximados.           ║
  '' ╚═════════════════════════════════════════════════════════════╝
  Dim iPaso As New Integer[4]     ' Variable de paso para almacenar resultados
  Dim sEse As String              ' Cadena de trabajo
  Dim iPal As Integer             ' Nº Palabras para cálculo perspicuidad
  Dim iSil As Integer             ' Nº Sílabas   "    "
  Dim iLet As Integer             ' Nº Letras    "    "
  Dim iFrs As Integer             ' Nº Frases    "    "
  Dim SCAM As String = Chr(7)     ' El símbolo «campanita» que ya no se usa
  ' Si no hay texto, no hay resultados
  If Not Texto Then Return [0, 0, 0, 0]
  ' Palabras
  sEse = RegExp.Replace(Texto, "([A-Za-zÁÉÍÓÚáéíóúÜüñÑ0-9])[A-Za-zÁÉÍÓÚáéíóúÜüñÑ0-9]*", SCAM, RegExp.Greedy)
  iPal = Split(sEse, SCAM).Max
  iPaso[0] = iPal
  ' Tipos
  sEse = RegExp.Replace(Texto, ".", SCAM, RegExp.Greedy)
  iPaso[1] = Split(sEse, SCAM).Max
  ' Caracteres
  sEse = RegExp.Replace(Texto, "\\S", SCAM, RegExp.Greedy)
  iPaso[2] = Split(sEse, SCAM).Max
  ' Sílabas
  sEse = RegExp.Replace(Texto, "[aeo]h[iu]|[iu]h[aeo]|[aeo][iu]|[aeo][y]|[y]|[íú]|[iu][^aeo]|[aeo]|[áéíóú]|[q|g]ui[aeo]", SCAM, RegExp.Greedy + RegExp.Caseless)
  iSil = Split(sEse, SCAM).Max
  ' Letras
  sEse = RegExp.Replace(Texto, "[A-Za-zÁÉÍÓÚáéíóúÜüñÑ0-9]", SCAM, RegExp.Greedy)
  iLet = Split(sEse, SCAM).Max
  ' Frases
  sEse = RegExp.Replace(Texto, "[.?!][^.?!]", SCAM, RegExp.Greedy)
  iFrs = Split(sEse, SCAM).Max
  ' Perspicuidad
  If iPal > 0 And iFrs > 0 Then
    iPaso[3] = 206.835 - 62.3 * iSil / iPal - iPal / iFrs
  Else
    iPaso[3] = 0
  Endif
  Return iPaso
End