Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas

Chef and Digits (ADIGIT) - Editorial

Link al problemaADIGIT (Practice)
Link al editorial en CodeChefADIGIT - Editorial

Dificultad: Fácil

Problema:
Dados $N$ ($N ≤ 10^5$) dígitos y $M$ ($M ≤ 10^5$) consultas que consisten en un entero $x$ ($1 ≤ x ≤ N$), que llamaremos step (paso), imprimir el resultado de $B1 - B2$, donde:
  • $B1$ := Sumatoria de todos los $b = a_x - a_y$ tal que $x > y$ y $b > 0$
  • $B2$ := Sumatoria de todos los $b = a_x - a_y$ tal que $x > y$ y $b < 0$

Solución:
Veamos el siguiente caso, con entrada a = 0123152397

Calculando los valores para todos los pasos tenemos lo siguiente:

En la tabla anterior he marcado dos casillas, para observar a detalle lo que sucede:
  • Para el paso 4 tenemos: $B1 = (3 -0) + (3 - 1) + (3 - 2) = 6$ y $B2 = 0$ lo cual nos da el valor de $6$
  • Para el paso 8 tenemos: $B1 = (3 - 0) + (3 - 1)+  (3 - 2) + (3 - 1) + (3 - 2) = 9$ y $B2 = (3 - 5) = - 2$, por lo tanto tenemos $B1 - B2 = 11$
Observando las ecuaciones anteriores, podemos notar que el paso 11 se compone del paso 3 en las sumas $(3 - 0) + (3 - 1)+ (3 - 2)$ más otras 3 sumas, así que ¿qué pasaría si los almacenamos para no volver a calcularlo todo? Basándonos en eso, almacenamos los resultados en otro arrelgo.

Ahora, ¿cómo es que sabemos que tenemos un valor ya calculado?, esto es sencillo de encontrar y ocurre cuando los números $a_x$ y $a_y$ son iguales. Si los calculamos de manera secuencial, es decir de 1 hasta N, estaremos garantizando que para cada paso los pasos previos ya estarían precalculados, como solo hay 10 dígitos distintos, en el peor de los casos terminaremos sumando 10 veces. Al terminar el precálculo, para cada consulta que nos hagan la respuesta será obtenida en tiempo constante

Complejidad: $O(10 * N) + O(M)$

Código (C++):
Definiremos un arreglo A, donde A[i] es es valor de paso i-ésimo del problema y s, un arreglo de char, donde s[j] es la posición del dígito j-esimo.
void precalc(){
int t = 0;
for(int step = 0; step < n; step++){
int ans = 0;
for(int i = step-1; i >= 0; i--){
t = (s[step] - '0') - (s[i] - '0');
if(t == 0){
ans += A[i];
A[step] = ans;
break;
}
ans += abs(t);
A[step] = ans;
}
}
}
Haciendo que para responder a las consultas q, solo será necesario imprimir el valor almacenado en A[q-1]
int main(){
scanf("%d%d",&n,&m);
scanf("%s",s);
precalc();
while(m--){
scanf("%d",&q);
printf("%d\n",A[q-1]);
}
return 0;
}

¡Saludos!
@fferegrino :)

Leyendo de la entrada estándar con scanf y fgets

Hace tiempo, les contaba que me inicié en la programación competitiva, en la cual, la mayoría de problemas nos piden leer información de la entrada estándar o stdin seguramente me lo van a creer... yo no sabía cómo hacerlo de una manera "correcta" (._. ), en especial cuando de cadenas se trataba. En este post trataré de explicar cómo es que lo hago (y he aprendido que lo hacen) en C o C++.

La función scanf

Esta función mágica llega a nosotros gracias a la librería <stdio.h> en C o <cstdio> en C++, resulta la manera básica de recuperar valores. Nos sirve para todo tipo de entradas y si no tienes algo muy complicado de leer, esta es tu mejor opción, recuerda que esta función trata de leer el tipo de dato que le especifiques hasta que encuentra un salto de línea o un espacio en blanco. El uso de esta función depende de los especificadores de formato para recuperar los valores que deseas.

Por ejemplo, supongamos que tenemos la siguiente entrada
10 3161565164181
aab baa aba
y este código para leerlo
int a;
long long int b;
char cadena[15];
scanf("%d %lld", &a, &b); 
scanf("%s", cadena); // 'cadena' es ya una referencia a memoria
Una vez que se ejecute, en a tendremos 10, en b tendremos 3161565164181 y cadena será "aab" (¡porque solo lee hasta el espacio en blanco!).

La función fgets

Pero, qué pasa si la entrada es un poco más complicada, como la del problema Wetlands of Florida en la que vienen secuencias de caracteres seguidas inmediatamente por un par de números enteros:
// ...
LLLLLLLLL
3 2
// ...
Para ello se ocupa la función fgets (que es parecida a gets, solo que más segura), en combinación con sscanf que funciona de manera similar a scanf solo que esta "lee" de una secuencia de caracteres y no de stdin. En cuanto a fgets, sus parámetros son: la dirección de memoria, la cantidad de caracteres que esperamos leer como máximo, y el flujo del que los vamos a extraer, de tal manera que tenemos algo así:
int i, j;
char entrada[10];
fgets(entrada,10,stdin);
// Procesamos 'entrada', que contiene la siguiente secuencia de caracteres:
// 'L','W','W','W', 'L', 'L', 'L', 'L', 'W' y '\n' <= ¡Sí! el salto de línea
// Recuperamos los enteros:
fgets(entrada,10,stdin);
sscanf(entrada,"%d %d",&i,&j);
Ya para finalizar es necesario remarcar esto: fgets recupera hasta que encuentra el salto de línea. Repito: fgets recupera hasta que encuentra el salto de línea por lo que es necesario eliminarlo "a manita" con '\0' si es que no es lo que deseamos de él. 
Espero que les sirva como a mi me ha servido, ya que hay que recordar que una parte importante de resolver los problemas es saber interpretar de manera adecuada la entrada que nos dan, así como saber introducirla dentro de nuestra probable solución a este.


¡Saludos!
@fferegrino :)

El Club de Algoritmia de la ESCOM y mi arrepentimiento

[Se supone que la primera regla del club es no hablar de él, pero meh]


A partir de este semestre por fin entré al Club de Algoritmia de la ESCOM, al cual desde mi llegada a la ESCOM tuve ganas de entrar pero por motivos laborales no podía asistir regularmente... tiempo después, cuando ya no tenía tanta carga en el trabajo, ese impedimento más bien se convirtió en un pretexto para mi desidia, sentía que quienes estaban ahí sabían más que yo y que podría no encajar con ellos, que nunca entendería nada de lo que estaban viendo, o que eso de la algoritmia nada más no era para mi.
Que equivocado estaba.

Hay pocas cosas de las que me arrepiento, y créanlo o no, el no haber entrado desde antes a participar en él es una de ellas, todo por mi desidia. Hasta ahora que llevo ya un poco más de un mes asistiendo a las sesiones me doy cuenta de lo equivocado que estaba, he aprendido bastante, los compañeros son de lo mejor y cada vez me motivo más. De vez en vez me haré un tiempo para escribir sobre lo que he visto y me ha fascinado.

Definitivamente enfrentarte a estos tipos de problemas, te abre la mente, te enseña a pensar de maneras distintas para resolver no solo retos de programación, si no de otras áreas. No solo es complicarse la vida o resolver problemas solo por hacerlo como muchos erróneamente dicen.

Seguramente hay personas que piensan lo que yo pensaba pero hay que atreverse, no es tan difícil hacerlo. No te esperes "tanto" (porque nunca es tarde, pero si es posible hay que hacerlo cuanto antes). Si tu, al igual que yo y muchas personas más, tienes interés en la programación competitiva no dudes en acercarte ya sea a este o a uno más cercano a ti. Acá están los capítulos estudiantiles de la ACM en México para que sepas a quién acercarte para ver qué es lo que ofrecen.

¡Saludos!
@fferegrino :)

Codificación voraz de Huffman

La codificación Huffman es un algoritmo usado para la compresión de datos. Dicho algoritmo hace uso de una tabla de códigos para escribir un determinado símbolo, donde la tabla ha sido rellenada basándose en la probabilidad estimada de aparición de cada símbolo. A cada símbolo le corresponde un código (secuencia de 1 y 0) de longitud variable, puesto que los símbolos cuya aparición es menos frecuente reciben códigos más largos, mientras que los que aparecen más reciben códigos más cortos.

Para la ESCOM, el trabajo fue hacer la implementación voraz de dicho algoritmo, la cual tiene como variante que la comstrucción de la tabla de códigos es distinta para cada archivo, tomando solo en cuenta los símbolos contenidos en él y la cantidad de veces que aparecen.

He de decir que es de las prácticas más pesadas que he tenido en todo lo que llevo en la escuela, dentro del programa se hace uso de recursividad, operaciones a nivel de bits y estructuras de datos a más no poder:
  • Se usa una lista para para ir almacenando las frecuencias de cada caracter
  • Se usa un arreglo de árboles para generar el árbol único de códificación
  • Se usa una cola para obtener el código asignado a cada símbolo

El código, que se encuentra en el proyecto analizando-algo en GitHub, está muy comentado tratando de hacerlo lo más entendible posible. 

¡Saludos!
@fferegrino :)

Prácticas de análisis de algoritmos [ESCOM]

A lo largo del semestre, en la materia de Análisis de Algoritmos que llevo con el profesor Edgardo Franco tenemos que realizar varias prácticas. Las prácticas consisten en programar algoritmos conocidos para analizar su comportamiento, tanto en tiempo como en memoria consumida, mientras resuelven problemas de "gran" tamaño.

Muchas (si no es que todas D:) estarán hechas para C, para Linux, esto debido a la librería empleada para medir los tiempos que consume la ejecución del algoritmo. Para facilitar la compilación cada práctica cuenta con un archivo Makefile, el cual contiene todas las instrucciones para compilar y ejecutar las prácticas. Dado que tenemos que analizar los tiempos de ejecución y a veces estos pueden ser muchos, para la ejecución de cada programa redireccionamos la salida estandar para que escribiera directamente a un archivo que podemos manejar sencillamente en una hoja de cálculo. Esto se puede ver en el archivo .sh que acompaña a cada práctica.

Todas las prácticas tienen comentarios, unas más, otras menos, pero los tienen. Aún así si queda alguna duda pues no dudes en preguntar. Otra cosa importante es que estas son solo las propuestas de solución que presentamos, no las copies directamente, basate en ellas o usa porciones del código, eso se vale. El link de descarga está al final del artículo ;).

Hasta el momento hemos realizado 3 prácticas:

Práctica 1: "Pruebas a posteriori (Algoritmos de ordenamiento)"

Con base en el archivo de entrada proporcionado que tiene 200,000 números diferentes. Ordenarlo bajo los siguientes métodos de ordenamiento y comparar experimentalmente las complejidades de estos.
  • Burbuja (Bubble Sort)
  • Burbuja Simple
  • Burbuja Mejorada
  • Inserción (Insertion Sort)
  • Selección (Selection Sort )
  • Shell (Shell Sort)
  • Ordenamiento con árbol binario de busqueda (Binary Search Tree)

Práctica 2: "Análisis temporal y notación de orden (Algoritmos de busqúeda)"

Con base en el ordenamiento obtenido a partir del archivo de entrada de la práctica 01 que tiene 200,000 números diferentes. Realizar la búsqueda de elementos bajo 3 métodos de búsqueda y variantes con procesos ligeros, realizar el análisis teórico y experimental de las complejidades; así como encontrar las cotas de los algoritmos.
  • Búsqueda lineal o secuencial (No recursiva)
  • Búsqueda binaria o dicotómica (No recursiva)
  • Búsqueda en un árbol binario de búsqueda (No recursiva)
  • Modificar los tres algoritmos para trabajar con procesos ligeros (Hilos).

Práctica 3: "Divide y vencerás (Rotación de una imagen)"

Implementar el algoritmo de rotación de imágenes que emplea la técnica divide y vencerás. La imágen a girar es cuadrada, y es un .bmp de 24 bits.

Descargas:
Como desde hace tiempo, puedes seguir el proyecto en GitHub analizando-algo (recomendado)
O descargar cada una de las tres prácticas de manera individual:
Práctica 3
Práctica 2
Práctica 3


¡Saludos!
@fferegrino :)

Mis apps para Windows/Windows Phone 8

Últimamente he andado muy ocupado (no tanto), haciendo unas cuantas aplicaciones para Windows Phone 8 y Windows 8 esperando ser parte del programa Microsoft Student Partners 2013.  Al momento llevo 6 aplicaciones publicadas entre la Windows Store y la Windows Phone Store. De algunas ya les he contado y de otras no. En fin, son estas:

Cuantos días
¿Alguna vez has querido saber cuantos días faltan para una fecha importante? Ahora lo puedes saber, con Cuantos días para Windows Phone 8 ten siempre a la vista cuantos días faltan para tu cumpleaños, el re-estreno tu serie favorita o cualquier otra cosa.


C0NV3R7
Un sencillo convertidor entre sistemas numéricos. Convierte de los sistemas binario, octal, decimal y hexadecimal.
De esta ya les había hablado.



RecetApprio(La obra maestra)
Un recetario hecho para ti, que no tienes ganas ni dinero para cocinar algo "gourmet". Recetas simples y sencillas, elaboradas por un experto en la materia de alimentar personas de forma deliciosa, rápida y barata.
En esta conté con la colaboración en el diseño de Julio Montaño, al cual agradezco mucho :). Además aprovecha de los servicios en la nube de Windows Azure.


BombFlipper
Diviértete con este juego que combina el buscaminas y el sudoku para entretenerte como no tienes idea, ejercita tu cerebro tratando de llegar al nivel más alto que puedas y cuando estés ahí comparte tu récord con tus amigos.


El Agente
Diviértete ayudando a este despistado agente a recuperar los papeles que el viento se llevó, pero cuidado, hay algunos papeles que quizá no desee recuperar.


Ojalá puedan descargarlas y valorarlas, así mismo si estás interesado en el desarrollo de alguna de ellas mándame un correo y con gusto vemos cómo hacerle.

¡Saludos!
@fferegrino :)

Invertir una cadena [C#]

Durante la plática de reclutamiento para Microsoft que hubo hace unos días en la ESCOM hicieron una prueba a los asistentes, la prueba consistía en escribir el código de dos funciones:
Una capaz de invertir una cadena, es decir, pasar de "this is a string" a "gnirts a si siht"
Otra muy similar pero solo debía invertir las palabras, pasando de "this is a string" a "siht si gnirts"
Basándonos en un prototipo de función más o menos así:
char* reverse(const char* str)

El lenguaje a usar era cualquiera con el que te sintieras cómodo, C#, C, Java... en fin. La idea era que usaras la menor cantidad de herramientas provistas por el framework o por el lenguaje que escogiste (¡no se valía el .Reverse()!), es decir que todo lo hicieras "artesanalmente". Eso si, no recuerdo muy bien cuanto tiempo dieron para escribir.

Por suerte yo me había encontrado con un problema similar unos días antes, así que creo que no me fue tan mal en esta. Mi solución la propuse en dos lenguajes, C para la primera y (por cuestiones de tiempo) C# para la segunda. Ahora vengo acá a colocar mis soluciones un poco más pensadas y totalmente funcionales escritas en C#:

using System;
using System.Linq;
using System.Text;

namespace ReverseStringsMsft
{
class Program
{
static void Main(string[] args)
{
string s = "this is a string";
string res = Reverse(s);
string resWord = ReverseWords(s);
Console.WriteLine(s);
Console.WriteLine(res);
Console.WriteLine(resWord);
Console.Read();
}

/// <summary>
/// Invierte una cadena
/// </summary>
/// <param name="str">La cadena que será invertida</param>
/// <returns>Una nueva instancia de String</returns>
public static string Reverse(string str)
{
if (str == null)
return null;
// Convertir a un arreglo
char[] cr = str.ToArray();
// Llamamos a la funcion para toda la cadena
Reverse(cr, 0, cr.Length - 1);
return new string(cr);
}

/// <summary>
/// Invierte las subcadenas (separadas por espacios) contenidas dentro de una cadena
/// </summary>
/// <param name="str">La cadena que será invertida</param>
/// <returns>Una nueva instancia de String</returns>
public static string ReverseWords(string str)
{
if (str == null)
return null;
// Convertir a un arreglo
char[] cr = str.ToArray();
int wordStart = 0;
int end;
// Recorremos la cadena para encontrar espacios
for (int i = 0; i < cr.Length; i++)
{
char c = cr[i];
// Por cada espacio o cada vez que lleguemos al final de la cadena
// llamaremos a la funcion especialmente para la ubicacion de
// la palabra encontrada
if (c == ' ' || i == cr.Length - 1)
{
end = i - 1;
Reverse(cr, wordStart, end);
wordStart = i + 1;
}
}
return new string(cr);
}

/// <summary>
/// Cambia de posición los caracteres desde <paramref name="start"/> a
/// <paramref name="end"/> hasta que todos estén invertidos
/// </summary>
/// <param name="str">El arreglo a ser invertido</param>
/// <param name="start">Inicio</param>
/// <param name="end">Final</param>
private static void Reverse(char[] str, int start, int end)
{
for (; start < end; start++, end--)
{
// Cambiamos uno a uno los caracteres desde la posicion
// inicial hasta la final, y aumentamos las variables para irlos
// intercambiando como deseamos
char aux = str[start];
str[start] = str[end];
str[end] = aux;
}
}

}
}


¡Saludos!
@fferegrino :)

C0NV3R7, convertidor entre bases numéricas


Esta vez vengo a contarles que el otro día mientras divagaba mi mente en la clase de Fundamentos de diseño digital se me ocurrió una "idea" para una app. Y es que digo "idea" porque no es nada nuevo, en clase estábamos viendo los distintos sistemas numéricos y la conversión entre ellos. Y pues de eso se trata la app: de un conversor numérico entre bases, pones un número y en seguida consigues su equivalente en octal, binario, decimal y hexadecimal.

En realidad el código es más que sencillo. La gran novedad es que en esta traté de emplear a fondo el patron de diseño MVVM, dejando toda la lógica de la aplicación en un ensamblado aparte, que usé para las plataformas Windows 8 y Windows Phone 8. En realidad la aplicación es tan sencilla que la interfaz usada en una es igual a la otra.

Pongo el link a las aplicaciones en la Windows Store y en la Windows Phone Store


Además del código del que salieron ambas aplicaciones:

C0NV3R7.rar

PD: Todo lo que he aprendido sobre Windows Phone fue gracias a estos vídeos hechos por Rodrigo Díaz Concha. Chéquenlos, están muy buenos.

¡Saludos!
@fferegrino :)

BombFlipper - Windows 8

Sé que tengo rato programando para Windows 8 y la verdad es que es divertido. Durante unos de esos arranques se me ocurrió hacer una versión de un minijuego incluído dentro de otro juego, el no tan famoso Voltorb Flip. No todo fue miel sobre hojuelas, puesto que sería mi primera aplicación hecha desde cero. 

La más dura decisión fue sobre qué tecnología escoger, dura decisión entre C# y XAML o HTML y JavaScript. De C# conozco mucho más que de JS, pero de HTML sé mucho más que de XAML Sinceramante para la interfaz prefería usar la magia de HTML con el poder de CSS, debido a la experiencia que tengo usándolo (además de que la otra opción era completamente desconocida para mi). Sin embargo, para la parte de la lógica solo pensaba en usar C# debido a la cantidad de cálculos necesarios para implementar el juego.

Al final me decidí por C# y su acompañante, porque se me hizo la opción más sólida y por que representaba un reto aprender sobre el desarrollo de interfaces, y es que, aunque el producto final no es de lo más pulcro considero que fue un buen aprendizaje.

Aún queda mucho por hacer, más que anda en la interfaz de usuario porque ni a mi me resulta muy amigable, los invito a descargar el juego en la liga que está más abajo. Si lo prueban les pudo que me comenten aquí o al correo su opinión y sugerencias.



¡Saludos!
@fferegrino :)

BluepointerV2



Hace algunos días les contaba de la aplicación Bluepointer que hice para una asignatura en la escuela, hoy he decidido mejorarla para hacerla más útil.

He retirado el control tipo "swipe" y puesto botones en su lugar. Además de añadirle funcionalidad para navegar hasta el inicio o final de la presentación y poder cerrarla desde el dispositivo.

La aplicación la pueden encontrar ya en la tienda Google Play en el siguiente enlace.


Si tienen sugerencias con respecto a la app, no duden en comentárlas.

¡Saludos!
@fferegrino :)

El agente [Videojuego]


Como parte de una iniciativa de Microsoft para impulsar el desarrollo de videojuegos para la plataforma de Windows 8, recibí una invitación para participar en un curso en línea sobre el tema. Dentro del curso se incluyeron sesiones tanto de programación de videojuegos, creación de historias y realización de animaciones.

La meta del curso era tener publicado el juego en la Windows Store, para esto teníamos que plantear una idea, desarrollar a los personajes, dibujarlos, animarlos, programarlos... de ahí entrar en todo el proceso que requiere la tienda para publicar cualquier aplicación en ella. El premio era un reconocimiento por la participación.

Ahí además fue que conocí la poderosa herramienta Construct 2, herramienta en la cual hice El Agente, un juego inspirado en el trabajo que desempeño diario (no he escrito sobre esto, ya sé). La idea es que un hombre de negocios perdió todos sus documentos importantes debido al viento, tu labor es recuperarlos casi todos, puedes inventarte una excusa para aquellos que no te benefician tanto.

Ya por último coloco el link a la tienda de Windows para que lo descarguen y lo jueguen;

Y aquí está el arte del juego

¡Saludos!
@fferegrino :)

Bluepointer

Bluepointer es un control remoto de diapositivas, usando esta aplicación es sencillo controlar una presentación en Powerpoint. La aplicación se comunica con la PC vía bluetooth. Esta es la tercera y última aplicación que desarrollé para la unidad de aprendizaje Application development for mobile devices (o móviles simplemente) en la ESCOM. 

La idea surgió ya que la sugerencia del profesor era conectar un microcontrolador (a través de un módulo bluetooth) con el teléfono, pero al encontrar dificultades para conseguir el mentado módulo, decidí irme por algo más sencillo ya que para mi lo principal era hacer uso de las capacidades que un dispositivo móvil nos ofrece, como la conectividad.

La aplicación en sí es sencilla, una vez establecida la conexión entre el dispositivo (cliente) y la pc (servidor), lo único que realiza el cliente es enviar "comandos" que resultan ser simples enteros para indicarle al servidor qué acción debe realizar, además, como parte de la funcionalidad extra que me solicitó el profesor, desde el teléfono se pueden enviar mensajes de texto hacia la PC, para lo cual se escribe un arreglo de bytes en el flujo de salida.

Acá un vídeo de la aplicación en todo su esplendor:



Y desde luego, el link hacia la app:


Código fuente de la aplicación para Android (en GitHub): bluepointer-android
Código fuente del servidor (en GitHub): bluepointer-java-server

¡Saludos!
@fferegrino :)

El problema del agente viajero y los algoritmos genéticos


Algoritmos genéticos
De las clases aprendí que los algoritmos genéticos son métodos de búsqueda y optimización inspirados en la evolución y en la base genética que esta implica. Para el uso de un algoritmo se genera un conjunto de soluciones posibles (nombraremos a cada una de estas soluciones "individuos") a nuestro problema (llamada población), esta población es mutada y recombinada mediante acciones aleatorias, como sucede en la evolución, además son sometidos a una evaluación para decidir cuales son los más aptos y separarlos del resto, que será descartado. En fin.


Llegó momento de entregar el proyecto final de la unidad de aprendizaje Genetic Algorithms, y como proyecto final elegí el clásico problema del agente viajero (Traveling Salesman Problem, TSP), y digo clásico porque en verdad resulta ser de los más usados para ejemplificar una de las muchas aplicaciones de este tipo de algoritmos.

TSP
El problema, más o menos, enuncia que: Un agente viajero tiene que visitar n ciudades sin pasar por la misma ciudad más que una vez, así mismo desea recorrer las ciudades trasladandose lo menos posible entre ellas, esto quiere decir que desea encontrar la ruta más corta para pasar por todas y cada una de ellas solamente una vez.

El problema es sencillo y se puede resolver con un algoritmo genético simple, basta con que se emplee técnicas permutativas (evitando así que se de una solución en la que se repitan ciudades para una ruta).

Solución
Para llegar a la solución de este problema escribí una pequeña aplicación en C#, en donde se emplea un algoritmo genético para llegar al resultado. 

Para la cruza se emplea el método de Cruza Cíclica, la mutación se realiza intercambiando dos genes seleccionados aleatoriamente y en la selección se elige a la mitad de individuos con mejores soluciones.

Código
Ahora sí, lo más interesante, además de lo ya mencionado dentro de la aplicación se usa la API de gráficos. Me da la impresión de que por ahí puede haber un poco de desperdicio de memoria pero pues ¡meh!
Traté de comentar el código todo lo que pude a manera de que quede claro así que espero les sirva y cualquier comentario y/o aclaración por correo, Twitter o en la sección de comentarios.

Encuéntralo en GitHub: Traveling Salesman Problem - C#

¡Saludos!
@fferegrino :)

Envío de correos "desde la base de datos" con .NET

Seguro hay otras maneras de hacerlo, pero cuando tienes que hacerlo rápido no hay muchas opciones, hablo de enviar correos periódicamente desde datos tomados de la base de datos.

Forma de uso
La solución que aquí propongo es de cierta manera "dinámica", ya que podemos usar este programita para enviar tantos correos como deseemos, lo único que necesitamos hacer es enviarle como parámetro el stored procedure del cual consultará los datos, el procedimiento le deberá devolver estas tres columnas al programa:

  • DESTINATARIOS: Una columna que contiene los correos a los cuales será enviado el mensaje. Los correos deberán ir separados por un ;.
  • ASUNTO: Contiene el asunto con el que será enviado el correo.
  • MENSAJE: El mensaje que contendrá el correo, puede ser HTML (recomiendo sea básico).



Como mencioné al principio de todo: probablemente haya mejores maneras de hacerlo ya que de esta manera dejamos toda la carga a la BD ya que es ella quien tendría que formar el mensaje, el dinamismo del que hablo radica en que nosotros podemos, con la ayuda del stored procedure sacar cualquier información que necesitemos de la base.

La forma de usar el programa es la siguiente:
$ SendMails storedProcedure
La mejor parte es que gracias a las tareas de Windows podemos programar el programa para que se ejecute periódicamente, tantas veces como deseamos y con un procedimiento distinto para enviar correos distintos cada ocasión.

Para configurarlo necesitamos poner nuestra cadena de conexión en el archivo app.config, así como los parámetros para enviar el correo, como el host, usuario, puerto...
<configuration>
<appSettings>

<add key="mailHost" value="smtp.gmail.com"/>
<add key="mailUser" value="ejemplo@gmail.com"/>
<add key="port" value="587"/>
<add key="ssl" value="true"/>
<add key="user" value="ejemplo@gmail.com"/>
<add key="password" value="random*Pass"/>

</appSettings>
<connectionStrings>
<add name="CON" connectionString="Data Source=localhost\SQL;Initial Catalog=DB;User ID=US;Password=PSWD"
providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>

SendMailsApp (Se incluyen las librerías de Microsoft Practices necesarias para que el programa funcione).

¿Tienes alma de desarrollador?

Si necesitas algo más especializado te dejo el código la solución del programa hecho en C# y con Visual Studio  para que lo modifiques a tu gusto.

Cualquier duda o comentario siempre es bienvenido :)

SendMailsSource (Se necesitan algunas librerías de Microsoft Practices incluídas en el enlace de arriba).

¡Saludos!
@fferegrino :)

ediThor se muda a GitHub


Tiene rato ya que les había contado de ediThor, el editor de texto concurrente que en equipo programamos unos compañeros y yo para una asignatura en la UPIITA.

Pues resulta que en aquellos tiempos era un novato (más) en esto de compartir código en línea, ahora que ya me "enseñaron" a usar GitHub, he decidido mudar el proyecto a un repositorio en la plataforma. Cabe destacar que no es el ediThor (beta) del que se habla en la entrada anterior porque decidí reescribirlo todo (porque de igual manera el nivel de mi nuestra programación estaba bastante decadente en esos tiempos), eso sí, lo de beta aún no se le quita, "está chavo todavía" diría yo.

Pues así las cosas, si algún javamaniaco quisiera unirse al desarrollo del proyecto ya sabe en donde encontrarme. Con gusto colaboramos.

El repositorio es:



¡Saludos!
@fferegrino :)

La importancia de programar con estilo


Y al decir "programar con estilo" no me refiero a que estén todo el tiempo con los meñiques levantados, o sólo hacerlo las tardes a las 5 p.m.

Programar con estilo es hacer nuestros programas legibles, lo más documentados que podamos y siguiendo las convenciones que algunas comunidades de programadores suelen adoptar para que nuestro código sea "universal".

Si bien dicen que cada programador tiene su forma de hacer lo suyo (en lo cual creo que tienen razón), esto a veces se convierte en un problema cuando de optimizar, corregir o ampliar el código se trata. En el mejor de los casos recordaremos por completo lo que la variable asdflkj significa en nuestro código, pero imagínate que ya no recuerdas y tienes que andarle buscando por todos lados lo que realmente quisiste hacer. O PEOR AÚN: Imagínate que lo que tu desarrollaste hace tiempo ahora es responsabilidad de alguien más, ¡pobre de él!

"Pues mientras funcione", aplica, sí. Hay veces en las que es necesaria hacer una corrección rápida (bomberazo, le dicen), pero al final del día no olvides regresar y hacerlo de la manera correcta. Créeme te facilitarás la vida a ti y probablemente a tus colegas.

Creo que el problema viene desde las escuelas, por lo general al momento de entregar nuestros proyectos, tareas, prácticas, etc. nos conformamos con el "pues, funciona", esto debido a que pocas veces se trabaja varias veces sobre la misma cosa. Son entregas únicas y es por eso que prestamos muy poca atención a la manera en las que las hacemos. El ideal sería que al inicio del curso definiéramos sobre qué vamos a estar trabajando (una especie de proyecto a largo plazo) para forzarnos a darle mantenimiento al código, a mejorarlo  y por tanto hacer las cosas bien.

Ayudará bastante si en un momento dado entramos al mundo laboral en el cual sí se desarrolla constantemente sobre un mismo programa, el cual debería estar bien documentado y entendible para que pueda ser trabajado por varias manos, manos a las cuales les resulte sencillo manipularlo y no se pierda tiempo en preguntarle al de al lado "¿y esto qué hace?" o quedarnos rascando la cabeza un buen rato preguntándonos "¿para qué usé esto?".

Para nuestra fortuna existen algunas guías de estilo que nos muestran algunas de las convenciones acordadas, las cuales podemos no aceptar por completo desde el inicio sí es importante tenerlas en cuenta. Claro que uno puede inventar sus propias normas, lo importante es respetarlas siempre.

Amigo programador, te dejo unas guías de estilo que me encontré por ahí (cofcofintercofcofnetcof), recuerda que seguro hay alguna para tu lenguaje favorito.


Guía 1 C++Guía 2 C++Guía 3 C++Guía 1 C#Guía 2 C#Guía 1 JavaGuía 2 JavaGuía 1 PHPGuía 2 PHPGuía Phyton.

¡Saludos!

@fferegrino :)

De C a HTML con Flex (como Norman manda)

Ya hace unos días les había hablado de flex y la práctica que teníamos que hacer. Bien, resulta que apenas se entrega. Y no es como inicialmente la había hecho:

Lo que había hecho fue de manera individual y esta que subo hoy es en equipo (Mi equipo: Byron, Gaby y Robert).
Las funciones que escriben el archivo html están por separado. Para mejor explicación visita el post anterior.

Descargas
PracticaC2HTML.tar.gz
PracticaC2HTML.zip


¡Saludos!
@fferegrino :)

De C a HTML con Flex

De nuevo por acá, esta vez gracias a otra de mis asignaturas en la ESCOM. Toca el turno a Teoría computacional, fue el turno de usar Flex, herramienta que en lo particular no conocía. Lo que teníamos que hacer era usar Flex para escribir un programa que de un archivo con código en lenguaje C nos lo "transfiriera" a un archivo con formato html estilizado con CSS.

La idea era encontrar palabras reservadas, tipos de datos, identificadores, directivas, operadores, y cualquier otro tipo de cadenas permitidas con el analizador léxico y asignarles cierto estilo en un documento html. 

Trato de explicar gráficamente: la imagen de la izquierda es código en C, después de introducir este archivo en el programita nos debe entregar algo como la captura derecha, que es un na representación estilizada con CSS del archivo que introdujimos.



¿Qué es Flex?
Resulta que Flex, en términos prácticos (Wikipediazo), es un programa para generar analizadores léxicos. Uno mete la especificación de un analizador léxico y Flex regresa como salida la implementación en C de lo que nosotros introdujimos. En realidad es muy sencillo utilizarlo, solo hay que tener en cuenta la estructura del archivo que vamos a usar como entrada al programa, esta es sencilla y muy fácil de recordar, un archivo "lex", se divida en tres secciones (separadas por líneas que solo contienen '%%' como texto en ellas). Las líneas son:
1.- Sección de declaraciones
Lugar para incluir cabeceras, macros, variables globales... también es posible definir patrones a usar en la sección de reglas
%%
2.- Sección de reglas
Aquí es donde se asocian los patrones(expresiones regulares) a buscar con sentencias(código) de C. Cada vez que el analizador encuentra un a cadena que coincide con el patrón, se ejecuta el código en C
%%
3.- Sección de código en C
Contiene sentencias en C y funciones que serán copiadas íntegramente en el archivo que Felx genere, comúnmente se colocan aquí las funciones que se llamarán en la sección de reglas.

Descargas
Al compilar el programa en Flex nos devuelve un código compilable pero ahora en lenguaje C, el cual ya debería de hacer lo que nosotros le indicamos. En el descargable básico viene el archivo cToHtml.l que es el archivo en lenguaje Lex, el archivo de estilos estilos.css que es la hoja de estilos que se usa para formatear el documento de salida y el archivo Makefile que nos facilita la compilación y el archivo Leeme.txt PARA QUE LO LEAN, en donde viene como se usa el programa final. En el descargable completo, viene, además de lo indicado arriba, el archivo lex.yy.c que es el código que se genera al compilar en Flex y el archivo salida.html que es un ejemplo de lo que entrega nuestro programa si hacemos pasar por el a lex.yy.c.

Recuerda que para cualquier duda, comentario o invitación a una cerveza, está la sección de comentarios, mi cuenta en Twitter o mi correo. 

¡Saludos! @fferegrino :)

Sistema solar usando Java 3D API



Para una de las prácticas de la clase de programación orientada a objetos, (sí, la estoy cursando), tuvimos que hacer un un ejemplo de sistema solar. Esta es mi implementación, está un tanto rebuscada pero traté de hacerla lo más entendible, porque han de saber (y no le digan a nadie) que no muchos le entienden al maestro. 

Hay varias clases, una que representa a un planeta, otra que es la rotación del planeta, la distancia al centro, la traslación al rededor de este centro. De este ejemplo se pueden derivar mejoras y ampliaciones.

El descargable es una carpeta que contiene un proyecto en NetBeans, cabe aclarar que dado que usa las librerías de Java3D, hay que agregarlas manualmente. Para que el código compile.

SistemaSolar.rar


¡Saludos!
@fferegrino :)

Una filosofía de vida


 ( ._.) Muy pocas veces la aplico (SIEMPRE).


¡Saludos!

@fferegrino :)