Entrada destacada

Distancia media de dos puntos en un cuadrado unitario

martes, 20 de noviembre de 2018

Sucesión Contadora


Dada una sucesión definimos la Sucesión Contadora como la sucesión formada por los enteros positivos que indican el número de bloques de símbolos consecutivos iguales en la sucesión inicial.
Por ejemplo, la sucesión contadora de la sucesión :
  a b b a a b b b a b a a b b . . .
    es la sucesión :
  1 2 2 3 1 1 2 2 . . .
    pues empieza con 1 letra a, luego 2 letras b, 2 letras a, 3 letras b y así sucesivamente.
 
    tiene la propiedad que la suma de todos sus términos es la longitud de la lista inicial.

En Mathematica

Definimos la función contadora[ ], que se aplica sobre una lista de números como:

contadora[lis_List] := Module[{j = 1,
   con = {}, len = Length[lis]},
  Do[Which[n == len - 1 && lis[[n]] == lis[[n + 1]], j++; 
    AppendTo[con, j], n == len - 1 && lis[[n]] != lis[[n + 1]], 
    AppendTo[con, {j, 1}], lis[[n]] == lis[[n + 1]], j++, 
    lis[[n]] != lis[[n + 1]], AppendTo[con, j]; j = 1], {n, len - 1}];
   Flatten[con]]

Por ejemplo, dada la sucesión:

lista = {1, 1, 1, 3, 3, 4, 2, 2, 1, 1, 4, 4, 4, 5, 5, 6};

Al aplicarle la función contadora[ ] obtenemos :

contadora[lista]
{3, 2, 1, 2, 2, 3, 2, 1}

que nos indica que lista tiene: 3 elementos iguales al comienzo (en este caso 3 unos), luego un bloque de dos iguales (2 tres), un bloque de uno solo (1 cuatro), y así sucesivamente.

Otro ejemplo, dada la sucesión lista2 formada por combinación de letras y posiblemente también números:

Clear[a, b, c, d]
lista2 = {a, b, b, c, a, a, a, a, 2, d, c, c, c, a};

al aplicarle contadora[ ], obtenemos:

contadora[lista2]
{ }

El problema ocurre pues :

a == a
True

a==b
a==b

Mathematica no establece un valor de verdad para a==b, no decide si es verdadero (true) o falso (False), que es indispensable para poder utilizar el comando Which[ ], pero si los tomamos como caracteres tenemos:

"a" == "a"
True

"a" == "b"
False

por tanto, mejoramos nuestra función contar[ ], haciendo que previamente convierta la lista en una cadena de caracteres y esto lo logramos con el comando ToString aplicado a cada elemento de la lista mediante el comando Map[ ].

contadora[list_List] := Module[{j = 1,
   con = {}, len = Length[list]}, lis = Map[ToString, list];
  Do[Which[n == len - 1 && lis[[n]] == lis[[n + 1]], j++; 
    AppendTo[con, j], n == len - 1 && lis[[n]] != lis[[n + 1]], 
    AppendTo[con, {j, 1}], lis[[n]] == lis[[n + 1]], j++, 
    lis[[n]] != lis[[n + 1]], AppendTo[con, j]; j = 1], {n, len - 1}];
   Flatten[con]]

contadora[lista2]
{1, 2, 1, 4, 1, 1, 3, 1}

Y aún opera bien sobre listas numéricas :

contadora[lista]
{3, 2, 1, 2, 2, 3, 2, 1}


Para aprender más sobre Mathematica ingrese aquí sitio de aprendizaje de Wolfram o en mi website ustamathematica.wixsite.com/basicas

No hay comentarios.:

Publicar un comentario