General

Guía para primero

Mario RományDavid Charte

Actualizada a 22 de septiembre de 2017

Esta es una guía orientada al nuevo estudiante del doble grado, escrita con la intención de ahorrarle el largo camino que el resto de alumnos hemos seguido hasta asentar una manera de trabajar y estudiar eficiente. La escribimos pensando en el artículo que nos hubiera gustado leer al empezar la carrera y la publicamos a principios de septiembre, justo con ese propósito en mente.

Pero, ¿no me basta con lo que me enseñen en la universidad?

Sí, el temario de las asignaturas que vas a cursar es el necesario para aprobarlas. Puedes pasar todo este texto por alto y seguir sacando buena nota. Todo lo que te vamos a contar a continuación va dirigido a que puedas organizar mejor tu trabajo, ahorrar mucho tiempo y evitarte pequeños desastres. Probablemente, llegarías tú mismo a estas conclusiones después de un tiempo en la carrera; sólo vamos a acelerar ese proceso. Además, la mayoría de las herramientas que destacamos seguro que acabarás teniendo que usarlas en algún momento, como estudiante o en tu carrera profesional, así que mejor que cojas algo de práctica antes.

Esto probablemente no sea suficiente. Durante la carrera habrá momentos en los que tendrás que buscarte la vida y encontrar más formas de conseguir información, realizar alguna tarea, etc. Tendrás también que aprender a buscar bibliografía y otras herramientas por tu propia cuenta.

Seguir leyendo...

Programación

Iterating in Ruby: Enumerable and Enumerators

David Charte

The syntax of a programming language is one of the key points when it comes to the difficulty in its learning process. Here we examine the traditional syntaxes for iterating through a collection of any type, and place them face to face with a newer, more semantic one based on objects called Enumerators.

Introduction

Let’s imagine we’ve got a collection of items, such as an array, a hash or a set. We may want to be able to iterate through all its elements, either with a determinate order or without it. To achieve this task in most programming languages we usually resort to loop structures, for example a for loop. In this case, we will need to use a special syntax in order to describe the conditions in which the iterations will be made. For example, in a C-like language:

for (int i = 0; i < arr_size; i++) {
    // Code goes here
}

Seguir leyendo...

Estructuras de Datos

Segment trees y Range minimum query

Andrés Herrera

En los cursos de estructuras de datos y algoritmos el número de estructuras de datos que se suelen estudiar es bastante reducido. Generalmente se introducen heaps, árboles binarios de búsqueda balanceados (AVL), tablas Hash y algunos algoritmos sobre grafos. Sin embargo, el mundo de las estructuras de datos es mucho más amplio 1 y probablemente requeriría una asignatura de estructuras de datos avanzadas como sucede en algunas universidades. El MIT, por ejemplo, proporciona vídeos con el contenido de esta asignatura. Por ello, intentaré escribir entradas en el blog que profundicen en esta temática.

En este caso trataremos los segment trees o árboles de segmentos. Introduciremos en primer lugar un problema importante de la teoría de algoritmos, range minimum query problem, que servirá como motivación para los segment trees. Posteriormente se explicará el funcionamiento de estos, proporcionando para cada operación su correspondiente código en Python. Por último, se proponen como ejercicio algunos problemas resolubles mediante segment trees.

Seguir leyendo...

Análisis

Teorema de Dini

Andrés Herrera

Convergencia Puntual y Convergencia Uniforme

En el Análisis Matemático es frecuente que la función solución a determinado problema sea desconocida o no la podamos expresar en términos de las funciones elementales que conocemos. Incluso en las funciones más simples, como la exponencial o el logaritmo, nos encontramos esta situación. Conocemos su existencia y propiedades características pero tenemos ciertas dificultades a la hora de evaluarlas en un punto. Es frecuente para ello utilizar los famosos polinomios de Taylor, en cuyo caso estamos aproximando la función por polinomios.

En más situaciones es habitual disponer de funciones que se aproximan cada vez más a la solucion del problema. Para formalizar este hecho surge el concepto de convergencia para sucesiones de funciones. Podemos distinguir dos tipos de convergencia: convergencia puntual y convergencia uniforme.

Definición 1
Sea y una sucesión de funciones con . Se dice que converge puntualmente en si la sucesión converge. Podemos considerar el conjunto de los elementos en los que hay convergencia puntual y definir la función límite:

Seguir leyendo...

Álgebra

Álgebra de tipos

Mario Román

En este post formularemos un álgebra para los tipos de los lenguajes de programación. Veremos operaciones que se aplican sobre ellos para obtener nuevos tipos y qué leyes siguen estas operaciones. Usaremos como base el sistema de tipos de Haskell, pero estos mismos conceptos podrían aplicarse a cualquier lenguaje con un sistema algebraico de tipos. Para iniciarse en el sistema de tipos de Haskell sugiero leer antes la Introducción a Haskell.

Notando tipos en Haskell

En Haskell, los tipos se escriben como un conjunto de constructores, que actúan como funciones teniendo como codominio el tipo definido. Por ejemplo,

data Colour = RGB Int Int Int
            | HSV Int Int Int

este código define un tipo Colour con dos formas de construirlo, como RGB y como HSV. Ambos constructores usan como argumento tres enteros. Con tres enteros podremos construir un color de dos formas distintas.

Seguir leyendo...