Entradas

Según Bard, para transferir archivos entre nodos Erlang...

Imagen
how to send a file between two nodes in Erlang? Here's how to send a file between two nodes in Erlang: 1. Establish Node Connectivity: Start both Erlang nodes with unique names: Erlang erl -sname node1 erl -sname node2 Usa el código con precaución. Más información Connect them using net_kernel:connect_node/1 : Erlang (node1@host) 1 > net_kernel:connect_node('node2@host'). true Usa el código con precaución. Más información Verify connectivity with net_adm:ping/1 : Erlang (node1@host) 2 > net_adm:ping('node2@host'). pong Usa el código con precaución. Más información 2. Transfer the File Using RPC: On the sending node (node1): Read the file contents: Erlang {ok, Bin} = file:read_file( "path/to/file" ). Usa el código con precaución. Más información Call file:write_file/2 on the receiving node: Erlang rpc:call('node2@host', file, write_file, [ "path/to/new_file" , Bin]). Usa el código con precaución. Más informaci

OpenGL en Haskell (material opcional)

Imagen
 Es posible utilizar OpenGL en Haskell, pero les mentiría si les digo que es  un resultado garantizado... Depende de varias cosas. Y solo puedo dar notas para Ubuntu 18 al respecto.  Primero, hacer esto: sudo apt install freeglut3-dev Luego, hacer esto: cabal update  (cabal es un instalador de paquetes para ghc) Luego, hacer lo siguiente: cabal install GLUT (Se consume algo de espacio, para ser al menos medio giga... :( ) De salir todo bien, ahora inspeccionar el siguiente sitio:   https://archives.haskell.org/code.haskell.org/GLUT/examples/RedBook/   ...... Wuiiiii Tomar de aquí algún archivo y compilarlo. Por ejemplo, Robot.hs ghc -o robot Robot.hs (imagen de una versión mía modificada de Robot.hs) El código de Robot.hs lo coloco aquí, redundantemente. {-    Robot.hs (adapted from robot.c which is (c) Silicon Graphics, Inc.)    Copyright (c) Sven Panne 2002-2005 <sven.panne@aedion.de>    This file is part of HOpenGL and distributed under a BSD-style license    See the file l

De un video de motos (solo a quien le interese, sin relación con el curso)

De tipos de motores de moto: https://youtu.be/EfZvGxijwRI?si=B-jeoeClGM1V7OSN (Para quienes gustan de este medio de transporte. Saludos.)

El problema de la edición de una cadena

Imagen
 En el problema de la edición de una cadena se tienen dos cadenas y se quiere conocer que tan disímiles o tan parecidas son de acuerdo con alguna medida. En esta implementación tenemos una respuesta...   d ms "" = length ms d "" ms = length ms d (a:ms) (b:ns) | a==b = d ms ns d (a:ms) (b:ns) | a/=b = 1+minimum [d ms (b:ns), d (a:ms) ns, d ms ns] y éste algoritmo es ¡triplemente recursivo! Para intentar ver sus llamadas, creamos un tipo de dato: data T = H String | Tri T T T deriving Show y aquí conformamos una construcción de las llamadas: si [] ms = H ms si ms [] = H ms si (a:bs) (c:cs) = Tri (si bs (c:cs)) (si bs cs) (si (a:bs) cs) En general, no es fácil ver árboles, pero lo siguiente puede ser pasado a LaTeX para visualizar algunos resultados (primero se genera la cadena, y se hace copy/paste a un archivo LaTeX; sería posible escribir el resultado directamente a un archivo, pero queda como opcional, pues aún no hemos visto cómo hacerlo). showTC (H i) = "\\T

¡Pi en Haskell!

El número pi siempre está presente en Matemáticas y Computación.  Aquí está el cálculo de algunos de sus dígitos utilizando la fórmula de Leibniz pi/4=1-1/3+1/5-1/7+1/9.... Ver https://en.wikibooks.org/wiki/Calculus/Leibniz%27_formula_for_pi  pii n =   let     ls=1:(map (+2) ls)     inter = 1:(-1):inter   in     4*(sum (zipWith (*) (take n inter) (map (\x -> 1/x) (take n ls)))) La fórmula de Leibniz es mona, pero por aquí encontré que con éste algoritmo  https://en.wikipedia.org/wiki/Chudnovsky_algorithm se pueden hallar trillones de dígitos de pi. Ésta es la versión de este algoritmo en Python....   import decimal def binary_split ( a , b ): if b == a + 1 : Pab = - ( 6 * a - 5 ) * ( 2 * a - 1 ) * ( 6 * a - 1 ) Qab = 10939058860032000 * a ** 3 Rab = Pab * ( 545140134 * a + 13591409 ) else : m = ( a + b ) // 2 Pam , Qam , Ram = binary_split ( a , m ) Pmb , Qmb , Rmb = binary_sp

El fascinante triángulo de Pascal.

El triángulo de Pascal aparece en diversos contextos, ver:  https://en.wikipedia.org/wiki/Pascal%27s_triangle Para ver que la construcción where no sólo es estética, calcular take 25 (map pasTri [1..]) take 25 (map pasTri2 [1..]) de los programas de abajo y comparar la eficiencia de las versiones... pasTri es en efecto exponencial, y pasTri2 es lineal. pasTri 1 = [1] pasTri 2 = [1,1] pasTri n | n>2 = zipWith (+) (pasTri (n-1)++[0]) ([0]++pasTri(n-1)) pasTri2 1 = [1] pasTri2 2 = [1,1] pasTri2 n | n>2 = zipWith (+) (ls++[0]) ([0]++ls)           where             ls = pasTri2 (n-1) -- Observar que... -- [1,1] --   [1,1] -- ------- -- [1,2,1] --   [1,2,1] -- --------- -- [1,3,3,1] --   [1,3,3,1] -- ------------   -- [1,4,6,4,1]    

Impresión, inserción y creación aleatoria de árboles binarios

Para tener algunas funciones extras en árboles binarios (con una  representación ligeramente alternativa a la nuestra) sería bueno visitar el siguiente sitio: https://www.anardil.net/2018/binary-tree-in-haskell.html