Mostrando entradas con la etiqueta LINQ. Mostrar todas las entradas
Mostrando entradas con la etiqueta LINQ. Mostrar todas las entradas

martes, 27 de febrero de 2018

Programación Funcional en LINQ - 2.19: Teoría de Números: Generar Triángulo de Pascal (Versión Iterativa)

1. Problema

Generar un triángulo de Pascal.

2. Solución

Para la solución de este problema no se usará recursión; a razón de que puede resultar lento y podría ocasionar un desbordamiento de memoria.


Se recurre al uso de la técnica de memorización: almacenamiento externo para guardar cálculos, y que éstos sirvan para las siguientes iteraciones (Mukherjee, 2014).

3. Código C#




Aunque el código anterior incluye comentarios, valdría la pena hacer notas acerca de cómo se generan los nuevos valores:
  • Línea 32-33: El método de extensión First busca la primera coincidencia que cumpla la condición:

    v => v.Item1 == (filaActual - 1) && v.Item2 == (j - 1)

    Esto quiere decir que va a buscar el Item1 que cumpla la condición (filaActual - 1): fila anterior; y además, el Item2 que cumpla condición (filaActual - 1):  columna anterior.

    De forma análoga para el ítem que suma el siguiente valor de la fila anterior y de la columna actual:

    v => v.Item1 == (filaActual - 1) && v.Item2 == j

    Nótese que la expresión v.Item2 == j hace referencia al valor (Item3) que está enseguida de la columna anteriormente encontrada.
Prueba de ejecución:
Triángulo de Pascal con 12 filas.
Figura 1. Triángulo de Pascal con 12 filas.

4. Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.

O

lunes, 26 de febrero de 2018

Programación Funcional en LINQ No. 2-18.4: Teoría de Números - Generar Factoriones

1. Problema

Generar factoriones en LINQ.

2. Solución

Un factorión es un número natural que es igual a la suma del factorial de sus dígitos. Algebraicamente, queda expresado como:
Definción algebraica de un factorión

Un ejemplo sería 145:


145 = 1 + 24 + 120 = 1! + 4! + 5!

3. Código C#


En las líneas 12-25 está definido el método de extensión Digitos(): permite descomponer un número dado en sus dígitos.


Por su parte, el método Main() (líneas 1-8) efectúa las siguientes operaciones:
  • Línea 3: Genera un rango de números enteros entre 0 y 1000.
  • Línea 4: Aplica el filtro que comprueba que la suma del factorial de los dígitos de k es igual a k:
    • Línea 5: Un nuevo filtro es aplicado para obtener sólo aquellos digítos que son mayores a 0: n > 0
      • Línea 6: Se hace la proyección que consiste en calcular el factorial de cada uno de los dígitos y luego hallar su suma:

        Select(d => Enumerable.Range(1, d).Aggregate((x, y) => x * y)).Sum()
Prueba de ejecución:
Factoriones
Figura 1. Factoriones.

4. Literatura & Enlaces

Bernard J. (2016). Python Recipes Handbook: A Problem-Solution Approach. Canada: Apress.

O

domingo, 25 de febrero de 2018

Programación Funcional en LINQ No. 2-18.3: Teoría de Números - Obtener Números Suma-Producto

1. Problema

Generar números suma-producto utilizando LINQ.

2. Solución

Un número suma-producto es un entero que se obtiene a partir del producto entre la sumatoria y la productoria de los dígitos. Esta definición se puede expresar así:
Definición algebraica de un número suma-producto

La variable l indica la cantidad de dígitos en el número; y las variables d con índice i o j indican el enésimo dígito del número n.

3. Código C#


En las líneas 14-26 se define el método de extensión Digitos(); este método se usa para obtener cada uno de los dígitos de un número como una secuencia.


Entre las líneas 1-9 está definido el método Main(); aquí ocurren las siguientes operaciones:
  • Línea 3: Se genera una secuencia con valores enteros entre 0 y 1000.
  • Línea 4: Se aplica la aplicación filtro Where.
    • Línea 5: Para el k número de la secuencia se obtienen sus dígitos.
    • Línea 7: Se comprueba el predicado que define un número suma-producto; es decir:

      digitos.Sum() * digitos.Aggregate((x, y) => x * y) == k

      Si el producto entre la sumatoria y la productoria de los l dígitos del k número es igual k, entonces k es un número suma-producto.
Prueba de ejecución:
Números suma-producto entre 0 y 1000.
Figura 1. Números suma-producto entre 0 y 1000.

4. Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.

O

Programación Funcional en LINQ No. 2-18.2: Teoría de Números - Generar Números de Dudeney

1. Problema

Generar números de Dudeney usando programación funcional.

2. Solución

El cubo perfecto de un número entero positivo se conoce como número de Dudeney: consiste en sumar cada uno de los dígitos y luego elevarlo al cubo; el resultado será el número original (Mukherjee, 2014).


Por ejemplo:

Número de Dudeney

3. Código C#


El método de extensión Digitos() (líneas 12-24) permite descomponer un número en sus dígitos.


En el bloque de código del método Main() (líneas 1-6) se lleva a cabo las siguientes operaciones:
  1. Línea 3: a través de la función generadora Range() se crea una secuencia de números entre 0 y 1000.
  2. Línea 4: Se aplica la función filtro Where() para obtener sólo los números que cumplan con el predicado que define un número de Dudeney representando por e:
    1. La suma de los dígitos de e al cubo es igual al número e; en otras palabras:

      Math.pow(e.Digitos().Sum(), 3) == e
Prueba de ejecución:
Números de Dudeney entre 0 y 1000
Figura 1. Números de Dudeney entre 0 y 1000.

4. Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.

O

Programación Funcional en LINQ No. 2-18.1: Teoría de Números - Generar Números de Armstrong

1. Problema

Generar números de Armstrong utilizando los elementos de programación funcional que dispone LINQ.

2. Solución

Un número de Armstrong es número que se obtiene a partir de la suma de los dígitos elevados al cubo (Mukherjee, 2014); es decir:
Número de Armstrong

3. Código C#

Archivo C# numeros-armstrong.cs [enlace alternativo]:



El método de extensión Digitos() (líneas 4-16) es el que permite descomponer un número dado en sus dígitos.


En el método Main() (líneas 19-24) se realizan las siguientes operaciones:
  • Se genera el rango 0-1000: Enumerable.Range(0, 1000)
  • Se utiliza la función filtro Where para comprobar que la suma de los dígitos (cada uno elevado al cubo) es igual al número actual k.
    • Por cada número k del rango (0-1000) se realiza la proyección de elevar al cubo cada dígito (obtenidos con la método de extensión Digitos()); y finalmente aplicar la función estadística de Sum() para sumar todos los cubos.
Prueba de ejecución:
Números de Armstrong entre 0 y 1000.
Figura 1. Números de Armstrong entre 0 y 1000.

4. Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.

O

viernes, 23 de febrero de 2018

Programación Funcional en LINQ No. 2-17: - Colecciones - Encontrar el Valor Mínimo y Máximo por Índice

1. Problema

Encontrar el valor mínimo y máximo por índice en distintas sequencias.

2. Solución

El operador Zip se aplica a una sequencia que recibe como argumento otra secuencia, y luego, como segundo argumento los valores de los índices 0, 1, etc. de cada una de las secuencias. Estos valores son comparados con los métodos Math.Min(val1, val2) y Math.Max(val1, val2) (Mukherjee, 2014).

3. Código C#

Archivo C# minimos-maximos-por-indice-secuencias.cs [enlace alternativo]:

Prueba de ejecución en LINQPad:
Mínimos y máximos por índice en secuencias
Figura 1. Mínimos y máximos por índice en secuencias.

4. Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.

O

domingo, 26 de febrero de 2017

Programación Funcional en LINQ No. 2-16 - Colecciones - Seleccionar los n-ésimos Elementos de una Colección

Resumen

En esta ocasión se presenta cómo generar los n-émisos elementos de una serie o colección. Para ello se utiliza un enfoque de programación funcional que consiste, básicamente, en generar un índice que indica la posición del n-ésimo elemento en la colección generada, y una vez obtenido es colocado en una nueva colección.

Videotutorial

Código de Solución

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
Enumerable.Skip(TSource) Method (IEnumerable(TSource), Int32) (System.Linq) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/bb358985(v=vs.110).aspx
Enumerable.First Method (System.Linq) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.linq.enumerable.first(v=vs.110).aspx
List(T) Class (System.Collections.Generic) (2017), Recuperado desde: https://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx


O

domingo, 19 de febrero de 2017

Programación Funcional en LINQ No. 2-15 - Series Recursivas y Patrones - Generar el Conjunto Potencia de un Conjunto

Resumen

En este videotutorial se explica cómo generar el conjunto potencia -conjunto de todos los subconjuntos que se pueden formar a partir de un conjunto dado-. La solución está descrita utilizando el paradigma de programación funcional.

Videotutorial

Código de Solución

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
Conjunto potencia (2017). Recuperado desde: https://es.wikipedia.org/wiki/Conjunto_potencia
HashSet(T) Class (System.Collections.Generic) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/bb359438%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
Enumerable.OrderBy(TSource, TKey) Method (IEnumerable(TSource), Func(TSource, TKey)) (System.Linq) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/bb534966(v=vs.110).aspx
Enumerable.Distinct(TSource) Method (IEnumerable(TSource)) (System.Linq) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/bb348436(v=vs.110).aspx


O

domingo, 5 de febrero de 2017

Programación Funcional en LINQ No. 2-14 - Series Recursivas y Patrones - Generar Permutaciones

Resumen

Este videotutorial ilustra cómo generar permutaciones utilizando el paradigma de programación funcional. Este ejercicio demuestra cómo a través de permutaciones parciales es posible generar todas las permutaciones para un conjunto de datos -para el caso 4 caracteres.

Videotutorial

Código de Solución

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
Permutación (2017). Recuperado desde: https://es.wikipedia.org/wiki/Permutaci%C3%B3n
HashSet(T) Class (System.Collections.Generic) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/bb359438%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
Enumerable.OrderBy(TSource, TKey) Method (IEnumerable(TSource), Func(TSource, TKey)) (System.Linq) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/bb534966(v=vs.110).aspx


O

domingo, 29 de enero de 2017

Programación Funcional en LINQ No. 2-13 - Series Recursivas y Patrones - Generar Números Fibonacci sin Recursión

Resumen

Método alternativo para la generación de números de la serie Fibonacci. Este método es una opción a la solución con recursión.

Videotutorial

Código de Solución

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
Fibonacci number (2017). Recuperado desde: https://en.wikipedia.org/wiki/Fibonacci_number
Recursion (computer science) (2017). Recuperado desde: https://en.wikipedia.org/wiki/Recursion_(computer_science)
Enumerable.Take(TSource) Method (IEnumerable(TSource), Int32) (System.Linq) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/bb503062(v=vs.110).aspx


O

sábado, 28 de enero de 2017

Programación Funcional en LINQ No. 2-12 - Series Recursivas y Patrones - Generar Comandos Logo para Dibujar un Fractal: Triángulo de Sierpinski

Resumen

Generación de comandos del lenguaje de programación Logo para dibujar un triángulo de Sierpinski.

Videotutorial

Código de Solución

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
Sierpinski triangle (2017). Recuperado desde: 
https://en.wikipedia.org/wiki/Sierpinski_triangle
Logo (programming language) (2017). Recuperado desde: https://en.wikipedia.org/wiki/Logo_(programming_language)
papert: logo in your browser (2017). Recuperado desde: http://logo.twentygototen.org/


O

viernes, 27 de enero de 2017

Programación Funcional en LINQ No. 2-11 - Series Recursivas y Patrones - Generar Comandos Logo para Dibujar un Fractal: Curva de Koch

Resumen

Generación de comandos del lenguaje de programación para la generación de una Curva de Koch.

Videotutorial

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
Koch snowflake (2017). Recuperado desde: https://en.wikipedia.org/wiki/Koch_snowflake
Logo (programming language) (2017). Recuperado desde: https://en.wikipedia.org/wiki/Logo_(programming_language)
Enumerable.Last(TSource) Method (IEnumerable(TSource)) (System.Linq)
https://msdn.microsoft.com/en-us/library/bb358775(v=vs.110).aspx

papert: logo in your browser (2017). Recuperado desde: http://logo.twentygototen.org/



O

jueves, 26 de enero de 2017

Programación Funcional en LINQ No. 2-10 - Series Recursivas y Patrones - Mostrar el Crecimiento del Alga en cada Etapa

Resumen

Presentación de un Sistema-L para conocer el crecimiento recursivo de un sistema celular, en particular de un alga. El ejercicio propuesto indica que por cada nivel de crecimiento se debe obtener el estado de crecimiento del alga.

Videotutorial

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
L-system (2017). Recuperado desde: https://en.wikipedia.org/wiki/L-system
Func(T, TResult) Delegate (System) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/bb549151(v=vs.110).aspx


O

miércoles, 25 de enero de 2017

Programación Funcional en LINQ No. 2-9 - Series Recursivas y Patrones - Generar Estructuras Recursivas: Sistema-L

Resumen

Presentación de un Sistema-L para conocer el crecimiento recursivo de un sistema celular, en particular de un alga.

Videotutorial

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
L-system (2017). Recuperado desde: https://en.wikipedia.org/wiki/L-system
Func(T, TResult) Delegate (System) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/bb549151(v=vs.110).aspx


O

martes, 24 de enero de 2017

Programación Funcional en LINQ No. 2-8 - Matemática y Estadística - Calcular una Suma Acumulativa

Resumen

Explicación del proceso de cálculo de sumas acumulativas para una serie de datos. Implementación de programación funciona usando el lenguaje LINQ.

Videotutorial

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
Enumerable.Take(TSource) Method (IEnumerable(TSource), Int32) (System.Linq) (2016). Recuperado desde: https://msdn.microsoft.com/en-us/library/bb503062(v=vs.110).aspx


O

Programación Funcional en LINQ No. 2-7 - Matemática y Estadística - Encontrar Promedios Móviles

Resumen

Presentación del proceso de cálculo de promedios o medias móviles para una serie de datos usando programación funcional.

Videotutorial

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
Media móvil (2016). Recuperado desde: https://es.wikipedia.org/wiki/Media_m%C3%B3vil
Enumerable.Average Method (System.Linq) (2016). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.linq.enumerable.average(v=vs.110).aspx


O

domingo, 22 de enero de 2017

Programación Funcional en LINQ No. 2-6 - Matemática y Estadística - Encontrar el Número Mínimo de Billetes de Cambio

Resumen

Ejercicio para entender cómo obtener el el número mínimo de billetes de cambio para una cantidad de dinero dada.

Videotutorial

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
Enumerable.OrderByDescending(TSource, TKey) Method (IEnumerable(TSource), Func(TSource, TKey)) (System.Linq) (2016). Recuperado desde: https://msdn.microsoft.com/en-us/library/bb534855(v=vs.110).aspx
Enumerable.ToList(TSource) Method (IEnumerable(TSource)) (System.Linq) (2016). Recuperado desde: https://msdn.microsoft.com/en-us/library/bb342261(v=vs.110).aspx 
List(T).ForEach Method (Action(T)) (System.Collections.Generic) (2016). Recuperado desde: https://msdn.microsoft.com/en-us/library/bwabdf9z(v=vs.110).aspx


O

sábado, 21 de enero de 2017

Programación Funcional en LINQ No. 2-5 - Matemática y Estadística - Encontrar el Dominador de un Arreglo

Resumen

Ejercicio para comprender cómo obtener el elemento dominador de un arreglo de valores numéricos a través una especificación de programación funcional.

Videotutorial

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
Enumerable.ToLookup Method (System.Linq) (2016). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.linq.enumerable.tolookup(v=vs.110).aspx
Enumerable.First(TSource) Method (IEnumerable(TSource), Func(TSource, Boolean)) (System.Linq) (2016). Recuperado desde: https://msdn.microsoft.com/en-us/library/bb535050(v=vs.110).aspx


O

jueves, 19 de enero de 2017

Programación Funcional en LINQ No. 2-3 - Matemática y Estadística - Calcular una Suma Ponderada

Resumen

Uso de la programación funcional con LINQ para calcular la suma ponderada de los resultados de exámenes académicos.

Videotutorial

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
Enumerable.Zip(TFirst, TSecond, TResult) Method (2016). Recuperado desde: https://msdn.microsoft.com/en-us/library/dd267698(v=vs.110).aspx


O

sábado, 10 de diciembre de 2016

Programación Funcional en LINQ No. 2-2 - Matemática y Estadística - Generar Tripletas Pitagóricas

Resumen

Explicación del proceso funcional para la generación de tripletas -o ternas- pitagóricas a través del operador de proyección Select. Se usa la fórmula babilónica como definición matemática para definir tripletas pitagóricas.

Videotutorial

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
Terna pitagórica (2016). Recuperado desde: https://es.wikipedia.org/wiki/Terna_pitag%C3%B3rica
Enumerable.Select Method (System.Linq) (2016). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.linq.enumerable.select(v=vs.110).aspx
Enumerable.Range Method (Int32, Int32) (System.Linq) (2016). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.linq.enumerable.range(v=vs.110).aspx


O