<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-11038010</id><updated>2026-10-22T16:30:55.910-05:00</updated><category term="java"/><category term="algoritmo"/><category term="ordenación"/><category term="UVA"/><category term="evaluador de expresiones"/><category term="fuerza bruta"/><category term="backtracking"/><category term="compiladores"/><category term="AntLR"/><category term="lenguajes"/><category term="problema"/><category term="reflexión"/><category term="tiobe"/><category term="groovy"/><category term="mochila"/><category term="números vampiros"/><category term="índice lenguajes"/><category term="MD5"/><category term="ajedrez"/><category term="algoritmos voraces"/><category term="burbuja"/><category term="caballo"/><category term="combinación"/><category term="grafo"/><category term="gramáticas"/><category term="java 7"/><category term="multiplicación"/><category term="máquina virtual"/><category term="número primo"/><category term="números"/><category term="primo"/><category term="problema caballo"/><category term="problema reinas"/><category term="programación"/><category term="programación dinámica"/><category term="retroceso"/><category term="suma"/><category term="transformación de cadenas"/><category term="árboles"/><category term="Bubble Sort"/><category term="Dijkstra"/><category term="Dilbert"/><category term="El Don"/><category term="Heap Sort"/><category term="Merge Sort"/><category term="Montículos"/><category term="OpenXava"/><category term="Quick Sort"/><category term="QuickSort"/><category term="Radix Sort"/><category term="Shaker Sort"/><category term="algoritmos"/><category term="análisis léxico"/><category term="análisis semántico"/><category term="análisis sintáctico"/><category term="archivos"/><category term="arreglos"/><category term="c"/><category term="c++"/><category term="cliente"/><category term="cola de equipo"/><category term="colas"/><category term="cálculo"/><category term="descarga"/><category term="descargar archivos"/><category term="enteros"/><category term="eweek"/><category term="expresión regular"/><category term="frecuencias"/><category term="guía de estilo"/><category term="heurística"/><category term="inserción"/><category term="lenguaje"/><category term="mit"/><category term="multiprocesamiento"/><category term="número"/><category term="números de smith"/><category term="open courseware"/><category term="permutación"/><category term="php"/><category term="pila"/><category term="red"/><category term="reinas"/><category term="salario"/><category term="selección"/><category term="servidor"/><category term="shell sort"/><category term="sockets"/><category term="visualbasic"/><title type='text'>Apuntes de Algoritmos y Programación</title><subtitle type='html'>Soluciones a problemas comunes de programación en lenguaje java.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>63</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-11038010.post-6200333978595617976</id><published>2011-08-11T20:00:00.005-05:00</published><updated>2011-08-12T09:28:36.368-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="algoritmos"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="java 7"/><category scheme="http://www.blogger.com/atom/ns#" term="multiprocesamiento"/><category scheme="http://www.blogger.com/atom/ns#" term="QuickSort"/><title type='text'>Multiprocesamiento recursivo en JAVA 7</title><content type='html'>Una de las estrategias de diseño de algoritmos más comunes es la de &quot;divide y vencerás&quot;, en la cual, un problema de tamaño relativamente grande se divide recursivamente en problemas más pequeños que son resueltos de la misma manera hasta que se encuentre un tamaño de problema mínimo que se resuelva de forma directa.  Un ejemplo típico de problemas que pueden ser resueltos con este enfoque es el algoritmo de ordenación rápida o QuickSort (&lt;a href=&quot;http://jorgep.blogspot.com/search/label/Quick%20Sort&quot;&gt;ver entrada dedica a este algoritmo aquí&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
En la nueva versión de JAVA se ha hecho disponible una nueva funcionalidad que permite la ejecución de algoritmos del estilo &quot;divide y vencerás&quot; en múltiples hilos de ejecución que son asignados entre los diferentes procesadores de la máquina.  En el siguiente ejemplo se presenta una versión modificada levemente del algoritmo de ordenación rápida para utilizar esta funcionalidad:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;import java.util.concurrent.*;

public class Ordenador extends RecursiveAction {
    int[] v;        // El arreglo a ordenar
    int   inicio;   // Posici&amp;#243;n inicial desde la que se va a ordenar
    int   fin;      // Posici&amp;#243;n final hasta la que se va a ordenar
    
    Ordenador(int[] x, int i, int f) {
        v      = x;
        inicio = i;
        fin    = f;
    }
    
    // Este es el m&amp;#233;todo que se ejecuta cada vez que se crea un hilo de ejecuci&amp;#243;n recursiva
    public void compute() {         
        if(inicio &amp;gt;= fin ) return ; // Cuando el arreglo tiene un elemento est&amp;#225; ordenado y termina el proceso.
        int pivote = inicio;        // Se selecciona como pivote el primer elemnto
        int izq = inicio + 1 ;      // Apuntador izquierdo
        int der = fin ;             // Apuntador derecho
        while(izq &amp;lt; der) {          // Este ciclo se realiza mientras los apuntadores no se hayan cruzado
            while(izq&amp;lt;=fin      &amp;amp;&amp;amp; v[izq]&amp;lt; v[pivote]) izq++;    //  Si el elemento izquierdo es menor que el pivote avanza
            while(der&amp;gt;=inicio+1 &amp;amp;&amp;amp; v[der]&amp;gt;=v[pivote]) der--;    //  Si el elemento derecho es mayor que el pivote, retrocede
            if(izq &amp;lt; der ) {        //  Si los apuntadores no se han cruzado se intercambian los elementos derecho e izquierdo
                int tmp = v[der];
                v[der] = v[izq]; 
                v[izq] = tmp;
            }   // fin if
        }   // fin while
        // Se intercambian el valor del pivote con el valor del apuntador derecho
        int tmp   = v[der];
        v[der]    = v[pivote];
        v[pivote] = tmp;
        //  Se llaman recursivamente los objetos que van a ordenar los dos subvectores
        invokeAll(new Ordenador(v, inicio, der-1), 
                  new Ordenador(v, der+1, fin));
    }
    
    public void quickSort(int inicio, int fin) {
        if(inicio &amp;gt;= fin ) return ; // Cuando el arreglo tiene un elemento est&amp;#225; ordenado
        int pivote = inicio;        // Se selecciona como pivote el primer elemnto
        int izq = inicio + 1 ;
        int der = fin ;
        while(izq &amp;lt; der) {
            while(izq&amp;lt;=fin      &amp;amp;&amp;amp; v[izq]&amp;lt; v[pivote]) izq++;
            while(der&amp;gt;=inicio+1 &amp;amp;&amp;amp; v[der]&amp;gt;=v[pivote]) der--;
            if(izq &amp;lt; der ) {
                int tmp = v[der];
                v[der] = v[izq]; 
                v[izq] = tmp;
            }
        }
        int tmp   = v[der];
        v[der]    = v[pivote];
        v[pivote] = tmp;
        quickSort(inicio, der-1);
        quickSort(der+1, fin);
    }
}
&lt;/pre&gt;&lt;br /&gt;
Para probar el uso de esta clase se crea una clase diferente que contenga el método main, así como la creación del vector y la invocación del proceso.  En este programa se prueban los tiempos de ejecución obtenidos para diferentes tamaños de problema con los métodos recursivo tradicional y el nuevo método multiproceso de Java 7:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;import java.util.*;
import java.util.concurrent.*;

public class TestFork {
    static Random rnd = new Random();       // Generador de n&amp;#250;meros aleatorios
    // M&amp;#233;todo para crear un vector de n&amp;#250;meros enteros aleatorios
    public static int[] getVector(int N) {  
        int[] v = new int[N];
        for(int i=0; i&amp;lt;N; i++) v[i]=rnd.nextInt(2*N);
        return v;
    }
    
    public static void main(String[] args) {
        final int MAX_SIZE = 500_000_000;
        int size = 1;                                           // tama&amp;#241;o del vector a crear
        System.out.println(&amp;quot;Prueba con m&amp;#233;todo recursivo tradicional&amp;quot;);
        while(size &amp;lt; MAX_SIZE) {                                // Mientras el tama&amp;#241;o no es mayor al m&amp;#225;ximo
            int[] v = getVector(size);      
            Ordenador     ord = new Ordenador(v,0,v.length-1);  // Se crea el objeto Ordenador
            long  t1 = System.currentTimeMillis();              // Tiempo de inicio del proceso
            ord.quickSort(0, v.length-1);                       // Invocaci&amp;#243;n de la ordenaci&amp;#243;n con el m&amp;#233;todo recursivo simple
            long  t2 = System.currentTimeMillis();              // Tiempo final del proceso
            double t = (t2-t1)/1000.0;                          // Tiempo real
            System.out.printf(&amp;quot;%,20d %20.4f %n&amp;quot;, size, t);      // Tama&amp;#241;o del vector y el tiempo requerido para ordenarlo con el viejo modelo
            size*=2;
        } // fin while
        
        System.out.println(&amp;quot;\nPrueba con m&amp;#233;todo recursivo multiproceso&amp;quot;);
        System.out.println(&amp;quot;Numero de procesadores disponibleS: &amp;quot;+Runtime.getRuntime().availableProcessors());
        size=1;
        while(size &amp;lt; MAX_SIZE) {                                // Mientras el tama&amp;#241;o no es mayor al m&amp;#225;ximo
            int[] v = getVector(size);      
            Ordenador     ord = new Ordenador(v,0,v.length-1);  // Se crea el objeto Ordenador
            long  t1 = System.currentTimeMillis();              // Tiempo de inicio del proceso
            v = getVector(size);                                // Crea un vector del mismo tama&amp;#241;o
            ForkJoinPool pool = new ForkJoinPool();             // Pool de procesos
            pool.invoke(ord);                                   // Invocación del pool de procesos
            long  t2 = System.currentTimeMillis();              // Tiempo final del proceso
            double t = (t2-t1)/1000.0;                          // Tiempo real
            System.out.printf(&amp;quot;%,20d %20.4f %n&amp;quot;, size, t);      // Tama&amp;#241;o del vector y el tiempo requerido para ordenarlo con el viejo modelo
            size*=2;
        } // fin while
    }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/6200333978595617976/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2011/08/multiprocesamiento-recursivo-en-java-7.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/6200333978595617976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/6200333978595617976'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2011/08/multiprocesamiento-recursivo-en-java-7.html' title='Multiprocesamiento recursivo en JAVA 7'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-998196326705410330</id><published>2011-08-03T21:31:00.001-05:00</published><updated>2011-08-03T23:25:03.915-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="evaluador de expresiones"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="java 7"/><title type='text'>Evaluador de expresiones en posfijo</title><content type='html'>Este programa presenta un pequeño evaluador de expresiones en posfijo que son leídas una a una.  Se pretende con él dar una breve introducción al curso de Estructuras de Datos 2, y de paso, revisar las nuevas funcionalidades de JAVA 7, entre las cuales están el uso del operador diamante y la evaluación de cadenas de caracteres en la instrucción switch.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;import javax.swing.*; 
import java.util.*;
public class Evaluador {
    public static void main(String[] args) {
        int n;  // n&amp;#250;mero de cadenas a evaluar
        String respuesta = JOptionPane.showInputDialog(&amp;quot;Cu&amp;#225;ntos elementos va a procesar&amp;quot; ); 
        n = Integer.parseInt(respuesta); 
        // Evaluar las cadenas
        for(int i=0; i&amp;lt;n; i++) {
            Stack&amp;lt;Double&amp;gt; pila = new java.util.Stack&amp;lt;&amp;gt;();   // Nuevo en JAVA 7 - Operador diamante
            // Leer expresion
            String expresion = JOptionPane.showInputDialog(&amp;quot;Expresi&amp;#243;n a evaluar&amp;quot; ); 
            // Evaluar expresion
            expresion        = expresion.trim();        // Elimina espacios al comienzo y al final
            String[]     exp = expresion.split(&amp;quot;\\s+&amp;quot;); // Para separar por secuencias de uno o m&amp;#225;s espacios
            for(String x: exp) {                        // Para cada cadena &#39;x&#39; del arreglo exp
                try {
                    double valor = Double.parseDouble(x);
                    pila.push(valor);                   // Meter valor en la pila
                }
                catch(NumberFormatException ex) {       // Excepcion si la cadena &#39;x&#39; no se pudo pasar a n&amp;#250;mero
                    double b = pila.pop();
                    double a = pila.pop();
                    switch(x) {         // NUEVO EN JAVA 7 - Evaluaci&amp;#243;n de cadenas en los switch
                        case &amp;quot;+&amp;quot;    :   pila.push(a+b); break;
                        case &amp;quot;-&amp;quot;    :   pila.push(a-b); break;
                        case &amp;quot;*&amp;quot;    :   pila.push(a*b); break;
                        case &amp;quot;/&amp;quot;    :   pila.push(a/b); break;
                    } // end switch
                } // end catch
            } // end for
            // Mostrar respuesta
            JOptionPane.showMessageDialog(null,pila.pop(), &amp;quot;Respuesta&amp;quot;, JOptionPane.PLAIN_MESSAGE);
        } // end for
    }
}
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/998196326705410330/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2011/08/evaluador-de-expresiones-en-posfijo.html#comment-form' title='7 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/998196326705410330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/998196326705410330'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2011/08/evaluador-de-expresiones-en-posfijo.html' title='Evaluador de expresiones en posfijo'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-6596079713869164002</id><published>2011-08-02T09:11:00.001-05:00</published><updated>2011-08-02T09:13:16.147-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="lenguajes"/><category scheme="http://www.blogger.com/atom/ns#" term="tiobe"/><category scheme="http://www.blogger.com/atom/ns#" term="índice lenguajes"/><title type='text'>Índice TIOBE de Lenguajes de Programación para Julio de 2011</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Ya se encuentra disponible el índice de popularidad de lenguajes de programación TIOBE para agosto de 2011. &amp;nbsp;La información completa se encuentra en la página&amp;nbsp;&lt;a href=&quot;http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html&quot;&gt;http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-kktMTcjj3ds/TjgE1ODhAMI/AAAAAAAAAfA/Q6hJo7L2S2U/s1600/TIOBE+Index+Julio+2011.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-kktMTcjj3ds/TjgE1ODhAMI/AAAAAAAAAfA/Q6hJo7L2S2U/s1600/TIOBE+Index+Julio+2011.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/6596079713869164002/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2011/08/indice-tiobe-de-lenguajes-de.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/6596079713869164002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/6596079713869164002'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2011/08/indice-tiobe-de-lenguajes-de.html' title='Índice TIOBE de Lenguajes de Programación para Julio de 2011'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-kktMTcjj3ds/TjgE1ODhAMI/AAAAAAAAAfA/Q6hJo7L2S2U/s72-c/TIOBE+Index+Julio+2011.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-3745799903065117176</id><published>2011-07-28T09:13:00.000-05:00</published><updated>2011-07-28T09:13:45.878-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="arreglos"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="números vampiros"/><title type='text'>Verificación de Números Vampiros</title><content type='html'>Con este programa se pretende evaluar si cuatro dígitos recibidos forman un número vampiro:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;public class Test1 {
    public static void testVampiro(int d1, int d2, int d3, int d4) {
        // Este m&amp;#233;todo recibe cuatro d&amp;#237;gitos y verifica en todas las posibles parejas de n&amp;#250;meros
        // si la multiplicaci&amp;#243;n de dos de ellas es igual a alguno de los n&amp;#250;meros que se generan
        // con los 4 d&amp;#237;gitos
        
        int[] v = { d1, d2, d3, d4 } ; // Se crea un vector con los 4 d&amp;#237;gitos le&amp;#237;dos
        int[] posibles = new int[24] ; // Con 4 d&amp;#237;gitos solo se pueden formar 24 posibles valores 
        int   cont     = 0;
        int   a,b,c;
        boolean haySolucion = false;
        
        for(int i=0; i&amp;lt;v.length; i++) {
            for(int j=0; j&amp;lt;v.length; j++) {
                if(v[i]==v[j]) continue;  // No se pueden repetir
                for(int k=0; k&amp;lt;v.length; k++) {
                    if(v[k]==v[i]||v[k]==v[j]) continue;    // No se puede repetir
                    for(int l=0; l&amp;lt;v.length; l++) {
                        if(v[l]==v[i]||v[l]==v[j]|| v[l]==v[k]) continue;   // No se puede repetir
                        posibles[cont++] = v[i]*1000+v[j]*100+v[k]*10+v[l];
                    } // fin for l
                } // fin for k
            } // fin for j
        } // fin for i
        // Para probar los numeros posibles usar esta instrucci&amp;#243;n:
        // for(int x: posibles) System.out.println(x);
        
        // Para generar las parejas se hace el siguiente ciclo:
        ciclo:
        for(int i=0; i&amp;lt;v.length; i++) {
            for(int j=0; j&amp;lt;v.length; j++) {
                if(v[i]==v[j]) continue;  // No se pueden repetir
                a = v[i]*10 + v[j];       // Se obtiene el primer valor de dos d&amp;#237;gitos
                for(int k=0; k&amp;lt;v.length; k++) {
                    if(v[k]==v[i]||v[k]==v[j]) continue;    // No se puede repetir
                    for(int l=0; l&amp;lt;v.length; l++) {
                        if(v[l]==v[i]||v[l]==v[j]|| v[l]==v[k]) continue;   // No se puede repetir
                        b = v[k]*10+v[l];   // Se obtiene el segundo valor de dos digitos
                        c = a*b ;           // Se obtiene la multiplicaci&amp;#243;n de los dos valores
                        // Se verifica si el n&amp;#250;mero generado est&amp;#225; entre los posibles resultados
                        // y de ser as&amp;#237; se escribe la respuesta y se termina el proceso
                        for(int x: posibles) {
                            if(c==x) {
                                System.out.println(&amp;quot;Respuesta encontrada: &amp;quot;+a+&amp;quot; x &amp;quot; +b+&amp;quot; = &amp;quot;+c);
                                haySolucion=true;
                                break ciclo;
                            }  // fin if
                        } // fin for x
                    } // fin for l
                } // fin for k
            } //fin for j
        } // fin for i
        if(!haySolucion) System.out.println(&amp;quot;No hay un numero vampiro con los digitos &amp;quot; + d1+&amp;quot;, &amp;quot;+d2+&amp;quot;, &amp;quot;+d3+&amp;quot; y &amp;quot;+d4);
        
    }
    public static void main(String[] args) {
        testVampiro(1,2,3,4);
        testVampiro(1,3,9,5);
        testVampiro(3,9,1,5);
    }
}
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/3745799903065117176/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2011/07/verificacion-de-numeros-vampiros.html#comment-form' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/3745799903065117176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/3745799903065117176'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2011/07/verificacion-de-numeros-vampiros.html' title='Verificación de Números Vampiros'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-5873393141448271899</id><published>2011-02-21T08:43:00.001-05:00</published><updated>2011-02-21T08:48:39.455-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="reflexión"/><title type='text'>Cálculo del Tiempo de Ejecución de un Método</title><content type='html'>Para facilitar el análisis de un programa, se puede utilizar una forma genérica, mediante el uso del paquete java.lang.reflect para calcular el tiempo de ejecución de cualquier función.&lt;br /&gt;
&lt;br /&gt;
En este caso, el método &lt;i&gt;ejecutar&lt;/i&gt; recibe el nombre de la clase, el nombre del método y el parámetro que recibe dicho método y retorna el tiempo que tarda el método en ser ejecutado.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;import java.lang.reflect.*;

public static double ejecutar(String nombreClase, String nombreMetodo, Object parametro) throws Exception {
        double t1, t2;
        t1 = System.currentTimeMillis();
        Class    clase = Class.forName(nombreClase);
        Method  metodo = clase.getMethod(nombreMetodo,parametro.getClass());
        metodo.invoke(null, parametro);
        t2 = System.currentTimeMillis();
        return (t2-t1)/1000.0;
    }
&lt;/pre&gt;&lt;br /&gt;
En este ejemplo se va a calcular el tiempo requerido por el método de ordenación por inserción de la clase Algoritmos sobre un array de 10000 elementos:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;public class TestEjecutar {
    public static void main(String[] args) throws Exception {
        int[] v = Algoritmos.crearVector(10000);
        System.out.println(Algoritmos.ejecutar(&quot;Algoritmos&quot;, &quot;ordenacionInsercion&quot;, v));
    }
}
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/5873393141448271899/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2011/02/calculo-del-tiempo-de-ejecucion-de-un.html#comment-form' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/5873393141448271899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/5873393141448271899'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2011/02/calculo-del-tiempo-de-ejecucion-de-un.html' title='Cálculo del Tiempo de Ejecución de un Método'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-56035679333682048</id><published>2011-02-14T09:56:00.001-05:00</published><updated>2011-02-14T10:03:57.454-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="compiladores"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="máquina virtual"/><title type='text'>Maquina Virtual en JAVA</title><content type='html'>Para crear la primera versión de una máquina virtual en lenguaje JAVA, basándonos en el modelo de Von Neumann, requerimos definir las estructuras de memoria que contendrán la lista de instrucciones a ser ejecutadas, la pila, la lista de constantes, la lista de variables y la tabla de valores de dichas variables.  &lt;br /&gt;
&lt;br /&gt;
Para la lista de instrucciones a ser ejecutada se crea una clase llamada Instrucción que cuenta básicamente con dos atributos, el tipo de instrucción y el índice del elemento en su respectiva tabla que va a ser operado con dicha instrucción.  Los diferentes tipos de instrucción se definen con una enumeración así:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;package maquinavirtual;
public enum TipoInstruccion {
    PUSH,
    vPUSH,
    nPUSH,
    STORE,
    ADD,
    SUB,
    DIV,
    MUL,
    GT,
    GE,
    LE,
    LT,
    EQ,
    NE,
    JZERO,
    GOTO,
    WRITE
}
&lt;/pre&gt;&lt;br /&gt;
Por su parte, la clase Instrucción queda definida de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;package maquinavirtual;
public class Instruccion {
    TipoInstruccion tipo;
    int             operando;

    Instruccion(TipoInstruccion t, int op) {
        tipo=t;
        operando=op;
    }

    Instruccion(TipoInstruccion t) {
        this(t,-1);
    }

    public String toString() {
        return String.format(&amp;quot;%-10s %d&amp;quot;, tipo, operando);
    }
}
&lt;/pre&gt;&lt;br /&gt;
La clase MaquinaVirtual, definida a continuación, define un lista o vector de objetos de la clas Instruccion que representará la lista de instrucciones a ser ejecutada; una pila de objetos Double para manejar la pila; una lista de String para la lista de variables definidas; una lista de Doubles para las constantes y un Mapa de Integer y Double para manejar los valores de las diferentes variables.&lt;br /&gt;
&lt;br /&gt;
Esta clase tiene dos métodos principales: el método cargarArchivo que se encarga de leer un archivo de texto que trae codificado un programa en el lenguaje de la máquina virtual y alimenta la lista de variables, la lista de constantes y la lista de instrucciones a ser ejecutadas; y por otra parte está el método ejecutar que se encarga de leer la lista de instrucciones y recorrerla ejecutándolas.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush : java&quot;&gt;package maquinavirtual;

import java.util.*;
import java.io.*;

public class MaquinaVirtual {
    Stack&amp;lt;Double&amp;gt;                     pila = new Stack&amp;lt;Double&amp;gt;();       // Pila
    Vector&amp;lt;Instruccion&amp;gt; listaInstrucciones = new Vector&amp;lt;Instruccion&amp;gt;(); // Programa a ejecutar
    Vector&amp;lt;Double&amp;gt;      listaNumeros       = new Vector&amp;lt;Double&amp;gt;();      // Tabla de numeros
    Vector&amp;lt;String&amp;gt;      listaVariables     = new Vector&amp;lt;String&amp;gt;();      // Tabla de variables
    Map&amp;lt;Integer,Double&amp;gt; tablaVariables     = new HashMap&amp;lt;Integer,Double&amp;gt;();  // Valores de las variables

    public void mostrarValores() {
        System.out.println(&amp;quot;\nLista de Instrucciones&amp;quot;);
        for(Instruccion i: listaInstrucciones) System.out.println(i);
        System.out.println(&amp;quot;\nLista de Variables&amp;quot;);
        for(String i: listaVariables) System.out.println(i);
        System.out.println(&amp;quot;\nLista de Numeros&amp;quot;);
        for(Double i: listaNumeros) System.out.println(i);
    }

    public void ejecutar() {
        for(int i=0; i&amp;lt;listaInstrucciones.size(); i++) {
            Instruccion  inst = listaInstrucciones.elementAt(i);
            //System.out.println(&amp;quot;Inst: &amp;quot; +inst);
            TipoInstruccion t = inst.tipo;
            int            op = inst.operando;
            double          a, b;
            switch(t) {
                case ADD:   b=pila.pop(); a=pila.pop(); pila.push(a+b); break;
                case SUB:   b=pila.pop(); a=pila.pop(); pila.push(a-b); break;
                case MUL:   b=pila.pop(); a=pila.pop(); pila.push(a*b); break;
                case DIV:   b=pila.pop(); a=pila.pop(); pila.push(a/b); break;
                case GT:    b=pila.pop(); a=pila.pop(); pila.push(a&amp;gt;b ?1.0:0.0); break;
                case GE:    b=pila.pop(); a=pila.pop(); pila.push(a&amp;gt;=b?1.0:0.0); break;
                case LT:    b=pila.pop(); a=pila.pop(); pila.push(a&amp;lt;b ?1.0:0.0); break;
                case LE:    b=pila.pop(); a=pila.pop(); pila.push(a&amp;lt;=b?1.0:0.0); break;
                case EQ:    b=pila.pop(); a=pila.pop(); pila.push(a==b?1.0:0.0); break;
                case NE:    b=pila.pop(); a=pila.pop(); pila.push(a!=b?1.0:0.0); break;
                case WRITE: System.out.println(pila.pop()); break;
                case nPUSH: pila.push(listaNumeros.elementAt(op)); break;
                case vPUSH: pila.push(tablaVariables.get(op)); break;
                case STORE: tablaVariables.put(op, pila.pop()); break;
                case GOTO:  i=(int) (listaNumeros.get(op)-2); break;
                case JZERO: if(pila.pop()==0.0) i=(int) (listaNumeros.get(op)-2); break;

            }
        }
    }

    public void cargarArchivo(String nombreArchivo) {
        try {
            BufferedReader in = new BufferedReader(new FileReader(nombreArchivo));
            Instruccion     inst=null;
            TipoInstruccion t=null;
            int             posicion=-1;
            while(true) {
                String linea = in.readLine();
                if(linea==null) break;
                String[] elementos = linea.trim().split(&amp;quot;\\s+&amp;quot;);

                try {
                    t = TipoInstruccion.valueOf(elementos[0].toUpperCase());
                    if(elementos.length==1) {
                        inst = new Instruccion(t);
                        listaInstrucciones.add(inst);
                    }
                    else if(elementos.length==2) {
                        // El segundo componente es un n&amp;#195;&amp;#186;mero
                        if(elementos[1].matches(&amp;quot;\\d+(\\.\\d*)?&amp;quot;)) {
                            Double numero = Double.parseDouble(elementos[1]);
                            if(!listaNumeros.contains(numero)) listaNumeros.add(numero);
                            posicion=listaNumeros.indexOf(numero);
                            if(t==TipoInstruccion.PUSH) t=TipoInstruccion.nPUSH;
                        }
                        // Si el segundo componente es una variable
                        else if(elementos[1].matches(&amp;quot;\\p{Alpha}\\w*&amp;quot;)) {
                            if(!listaVariables.contains(elementos[1])) listaVariables.add(elementos[1]);
                            posicion=listaVariables.indexOf(elementos[1]);
                            if(t==TipoInstruccion.PUSH) t=TipoInstruccion.vPUSH;
                        }
                        else {
                            System.err.println(&amp;quot;Elemento desconocido: &amp;quot; +  elementos[1]);
                            System.exit(0);
                        }
                        inst = new Instruccion(t, posicion);
                        listaInstrucciones.add(inst);
                    }
                }
                catch(IllegalArgumentException ex) {
                    System.err.println(&amp;quot;Error, instruccion no reconocida: &amp;quot; + elementos[0]);
                    System.exit(0);
                }
            }
        }
        catch(Exception x) {
            System.err.println(&amp;quot;Error de algun tipo: &amp;quot; + x.getMessage());
        }
    }

}

&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/56035679333682048/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2011/02/maquina-virtual-en-java.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/56035679333682048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/56035679333682048'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2011/02/maquina-virtual-en-java.html' title='Maquina Virtual en JAVA'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-2633867205853752822</id><published>2011-02-03T09:35:00.002-05:00</published><updated>2011-02-03T09:35:48.023-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="tiobe"/><title type='text'>Indice Tiobe para Enero de 2011</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_mSkuIl8eJxg/TUq9M7JCokI/AAAAAAAAAZs/Hlnb450Hq94/s1600/Tiobe+2011-01.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/_mSkuIl8eJxg/TUq9M7JCokI/AAAAAAAAAZs/Hlnb450Hq94/s1600/Tiobe+2011-01.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/2633867205853752822/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2011/02/indice-tiobe-para-enero-de-2011.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/2633867205853752822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/2633867205853752822'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2011/02/indice-tiobe-para-enero-de-2011.html' title='Indice Tiobe para Enero de 2011'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_mSkuIl8eJxg/TUq9M7JCokI/AAAAAAAAAZs/Hlnb450Hq94/s72-c/Tiobe+2011-01.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-6083151376374557788</id><published>2011-01-12T13:52:00.001-05:00</published><updated>2011-01-12T13:54:31.603-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenXava"/><title type='text'>Aplicaciones Web con OpenXava</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_mSkuIl8eJxg/TS34ylMBKQI/AAAAAAAAAVc/tKO5hfEY53E/s1600/OpenXava.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;http://3.bp.blogspot.com/_mSkuIl8eJxg/TS34ylMBKQI/AAAAAAAAAVc/tKO5hfEY53E/s400/OpenXava.png&quot; width=&quot;270&quot; /&gt;&lt;/a&gt;&lt;/div&gt;De acuerdo con Wikipedia, OpenXava es un marco de trabajo de código abierto para desarrollar aplicaciones de gestión de una forma efectiva. Permite el desarrollo rápido y fácil de mantenimientos y listados pero, a su vez, es lo suficientemente flexible para desarrollar complejas aplicaciones de gestión de la vida real como contabilidad, facturación, gestión de personal, nóminas, gestión de almacenes, etc.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Actualmente OpenXava genera aplicaciones web Java (J2EE/JavaEE), que pueden ser desplegadas en cualquier portal Java (JSR-168) como una aplicación de portlets.OpenXava es una herramienta libre.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Para poder trabajar con la aplicación de demostración es necesario descargar el programa desde el sitio web &amp;nbsp;&lt;a href=&quot;http://www.openxava.org/web/guest/home&quot;&gt;http://www.openxava.org/web/guest/home&lt;/a&gt;&amp;nbsp;y, preferiblemente el ambiente de desarrollo de Eclipse para J2EE desde el sitio&amp;nbsp;&lt;a href=&quot;http://www.eclipse.org/downloads/&quot;&gt;http://www.eclipse.org/downloads/&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Siguiendo las instrucciones del mismo sitio web, es fácil poner en producción la aplicación web de ejemplo, así como es sorprendente ver que toda la aplicación de ejemplo queda reducida a estas dos clases en JAVA, ya que OpenXava provee automáticamente el resto:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;package org.openxava.escuela.modelo;
 
import javax.persistence.*;
import org.openxava.annotations.*;
 
@Entity
public class Alumno {
    @Id @Column(length=2) @Required private int numero;
    @Column(length=40) @Required private String nombre;
    @ManyToOne @DescriptionsList private Profesor profesor;
 
    public int getNumero() { return numero; }
    public void setNumero(int numero) { this.numero = numero; }
    public String getNombre() { return nombre; }
    public void setNombre(String nombre) { this.nombre = nombre; }
    public Profesor getProfesor() { return profesor; }
    public void setProfesor(Profesor profesor){ this.profesor = profesor; }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;package org.openxava.escuela.modelo;
 
import java.util.*;
import javax.persistence.*;
import org.openxava.annotations.*;
 
@Entity
public class Profesor {
    @Id @Column(length=5) @Required private String codigo;
    @Column(length=40) @Required private String nombre;
    @OneToMany(mappedBy=&quot;profesor&quot;) private Collection&amp;lt;Alumno&amp;gt; alumnos;
 
    public String getCodigo() { return codigo; }
    public void setCodigo(String codigo) { this.codigo = codigo;}
    public void setAlumnos(Collection&amp;lt;Alumno&amp;gt; alumnos) { this.alumnos = alumnos; }
    public void setNombre(String nombre) { this.nombre = nombre; }
    public String getNombre() { return nombre; }
    public Collection&amp;lt;Alumno&amp;gt; getAlumnos() { return alumnos; }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;En el siguiente video se puede encontrar una breve introducción a OpenXava provista por el grupo de AltainetGroup:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;iframe frameborder=&quot;0&quot; height=&quot;300&quot; src=&quot;http://player.vimeo.com/video/7785566&quot; width=&quot;400&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;a href=&quot;http://vimeo.com/7785566&quot;&gt;Openxava + mysql + Eclipse&lt;/a&gt; from &lt;a href=&quot;http://vimeo.com/user2569448&quot;&gt;alta inet&lt;/a&gt; on &lt;a href=&quot;http://vimeo.com/&quot;&gt;Vimeo&lt;/a&gt;.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/6083151376374557788/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2011/01/aplicaciones-web-con-openxava.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/6083151376374557788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/6083151376374557788'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2011/01/aplicaciones-web-con-openxava.html' title='Aplicaciones Web con OpenXava'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_mSkuIl8eJxg/TS34ylMBKQI/AAAAAAAAAVc/tKO5hfEY53E/s72-c/OpenXava.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-7042673371773519111</id><published>2010-12-22T12:15:00.000-05:00</published><updated>2010-12-22T12:15:18.884-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="eweek"/><category scheme="http://www.blogger.com/atom/ns#" term="lenguajes"/><category scheme="http://www.blogger.com/atom/ns#" term="tiobe"/><category scheme="http://www.blogger.com/atom/ns#" term="índice lenguajes"/><title type='text'>Top de lenguajes de programación para 2011</title><content type='html'>De acuerdo con el portal especializado &lt;a href=&quot;http://www.eweek.com/c/a/Application-Development/Java-C-C-Top-18-Programming-Languages-for-2011-480790/&quot;&gt;eweek.com&lt;/a&gt;, y con base en la información de &lt;a href=&quot;http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html&quot;&gt;TIOBE&lt;/a&gt;&amp;nbsp;anteriormente relatada,&amp;nbsp;la siguiente es la lista de los 18 principales lenguajes de programación para el año 2011:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;JAVA&lt;/li&gt;
&lt;li&gt;C&lt;/li&gt;
&lt;li&gt;C++&lt;/li&gt;
&lt;li&gt;C#&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;Perl&lt;/li&gt;
&lt;li&gt;PHP&lt;/li&gt;
&lt;li&gt;VisualBasic&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Ruby&lt;/li&gt;
&lt;li&gt;Objective C&lt;/li&gt;
&lt;li&gt;ActionScript&lt;/li&gt;
&lt;li&gt;Groovy&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;li&gt;Scale&lt;/li&gt;
&lt;li&gt;Erlang&lt;/li&gt;
&lt;li&gt;Clojure&lt;/li&gt;
&lt;li&gt;Visual F++&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/7042673371773519111/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2010/12/top-de-lenguajes-de-programacion-para.html#comment-form' title='5 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/7042673371773519111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/7042673371773519111'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2010/12/top-de-lenguajes-de-programacion-para.html' title='Top de lenguajes de programación para 2011'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-2388752430286497161</id><published>2010-12-20T23:26:00.000-05:00</published><updated>2010-12-20T23:26:21.779-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="frecuencias"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="UVA"/><title type='text'>Cálculo de Frecuencias - Problema UVA 499</title><content type='html'>Este problema busca calcular el o los caracteres que más se repiten en una cadena.  El enunciado está expuesto en la página&amp;nbsp;&lt;a href=&quot;http://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;amp;Itemid=8&amp;amp;category=6&amp;amp;page=show_problem&amp;amp;problem=440&quot;&gt;http://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;amp;Itemid=8&amp;amp;category=6&amp;amp;page=show_problem&amp;amp;problem=440&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;import java.io.*;

class Main {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String args[]) throws Exception {
        Main myWork = new Main();   // create a dinamic instance
        myWork.Begin();             // the true entry point
        System.exit(0);
    }

    void Begin() throws Exception {
        while(true) {
            String linea = in.readLine();
            if(linea==null) break;
            System.out.println(procesarCadena(linea));
        }
    }

    public String procesarCadena(String cadena) {
        cadena=cadena.replaceAll(&amp;quot;[^\\p{Alpha}]&amp;quot;, &amp;quot;&amp;quot;);
        char[] arreglo = cadena.toCharArray();
        byte[] contador = new byte[256];
        for(char c: arreglo) contador[c]++;
        int max=0;
        for(int i=0; i&amp;lt;contador.length; i++) if(contador[i]&amp;gt;max) max=contador[i];
        String respuesta=&amp;quot;&amp;quot;;
        for(int i=0; i&amp;lt;contador.length; i++) if(contador[i]==max) respuesta+=(char) i;
        return respuesta+&amp;quot; &amp;quot;+max;
    }
}
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/2388752430286497161/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2010/12/calculo-de-frecuencias-problema-uva-499.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/2388752430286497161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/2388752430286497161'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2010/12/calculo-de-frecuencias-problema-uva-499.html' title='Cálculo de Frecuencias - Problema UVA 499'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-373260362656913478</id><published>2010-12-17T14:12:00.000-05:00</published><updated>2010-12-17T14:12:27.896-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="cálculo"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="salario"/><title type='text'>Calculo de Salarios - Problema UVA 10295</title><content type='html'>Este problema calcula el valor del salario para un cargo teniendo en cuenta la ocurrencia de determinadas palabras claves dentro del texto de la descripción del cargo.  El enunciado del problema se encuentra en la dirección&amp;nbsp;&lt;a href=&quot;http://uva.onlinejudge.org/index.php?option=onlinejudge&amp;amp;page=show_problem&amp;amp;problem=1236&quot;&gt;http://uva.onlinejudge.org/index.php?option=onlinejudge&amp;amp;page=show_problem&amp;amp;problem=1236&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;import java.io.*;
import java.util.*;

class Main {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String args[]) throws Exception {
        Main myWork = new Main();   // create a dinamic instance
        myWork.Begin();             // the true entry point
        System.exit(0);
    }

    void Begin() throws Exception {
        Map&amp;lt;String, Integer&amp;gt; mapa = new HashMap&amp;lt;String, Integer&amp;gt;();
        String[] tmp = in.readLine().split(&amp;quot;\\s+&amp;quot;);
        int cantidadPalabras = Integer.parseInt(tmp[0]);
        int cantidadTextos   = Integer.parseInt(tmp[1]);
        for(int i=0; i&amp;lt;cantidadPalabras; i++) {
            tmp = in.readLine().split(&amp;quot;\\s+&amp;quot;);
            String keyword = tmp[0];
            int      costo = Integer.parseInt(tmp[1]);
            mapa.put(keyword, costo);
        }
        for(int i=0; i&amp;lt;cantidadTextos; i++) {
            String texto = &amp;quot;&amp;quot;;
            while(true) {
                String linea = in.readLine();
                if(linea.charAt(0)==&#39;.&#39; &amp;amp;&amp;amp; linea.length()==1) break;
                texto+=(&amp;quot; &amp;quot; + linea);
            }
            int salario = 0;
            tmp = texto.split((&amp;quot;\\s+&amp;quot;));
            for(String x: tmp) if(mapa.containsKey(x)) salario+=mapa.get(x);
            System.out.println(salario);
        }
    }
}
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/373260362656913478/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2010/12/calculo-de-salarios-problema-uva-10295.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/373260362656913478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/373260362656913478'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2010/12/calculo-de-salarios-problema-uva-10295.html' title='Calculo de Salarios - Problema UVA 10295'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-6940795466806447335</id><published>2010-12-16T19:06:00.003-05:00</published><updated>2010-12-17T06:27:30.924-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="números de smith"/><category scheme="http://www.blogger.com/atom/ns#" term="UVA"/><title type='text'>Números de Smith - Problema UVA 10042</title><content type='html'>Básicamente, este problema busca encontrar números en los que la suma de sus dígitos sea igual a la suma de sus factores primos.  El enunciado está en el enlace&amp;nbsp;&lt;a href=&quot;http://uva.onlinejudge.org/index.php?option=onlinejudge&amp;amp;page=show_problem&amp;amp;problem=983&quot;&gt;http://uva.onlinejudge.org/index.php?option=onlinejudge&amp;amp;page=show_problem&amp;amp;problem=983&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;import java.io.*;

class Main {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String args[]) throws Exception {
        Main myWork = new Main();   // create a dinamic instance
        myWork.Begin();             // the true entry point
    }

    public int sumaDivisores(int n) {
        double raiz = Math.sqrt(n);
        int tmp = n;
        int respuesta=0;
        while(n%2==0) { respuesta+=2; n&amp;gt;&amp;gt;=1; }
        for(int i=3; i&amp;lt;=raiz; i+=2) {
            if(n%i==0) {
                respuesta+=sumaDigitos(i);
                n = n/i;
                i-=2;
            }
        }
        if(n!=tmp &amp;amp;&amp;amp; n!=1) respuesta+=sumaDigitos(n);
        return respuesta;
    }

    public int sumaDigitos(int n) {
        int respuesta=0;
        while(n&amp;gt;0) {
            respuesta+=(n%10);
            n = n/10;
        }
        return respuesta;
    }

    public boolean esPrimo(long n) {
        double raiz = Math.sqrt(n);
        if(n==2) return true;
        if(n%2==0) return false;
        for(int i=3; i&amp;lt;=raiz; i+=2) if(n%i==0) return false;
        return true;
    }

    void Begin() throws Exception {
        int cont = 0;
        int numeroCasos = Integer.parseInt(in.readLine());
        while(cont&amp;lt;numeroCasos) {
            int numero = Integer.parseInt(in.readLine());
            while(true) {
                numero++;
                if(esPrimo(numero)) continue;
                if(sumaDigitos(numero)==sumaDivisores(numero)) {
                    System.out.println(numero);
                    cont++;
                    break;
                }
            }
        }
    }
}
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/6940795466806447335/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2010/12/numeros-de-smith-problema-uva-10042.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/6940795466806447335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/6940795466806447335'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2010/12/numeros-de-smith-problema-uva-10042.html' title='Números de Smith - Problema UVA 10042'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-1442479392787843268</id><published>2010-12-15T20:32:00.000-05:00</published><updated>2010-12-15T20:32:32.316-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="UVA"/><category scheme="http://www.blogger.com/atom/ns#" term="árboles"/><title type='text'>Suma de Árbol - Problema UVA 112 - Versión 2</title><content type='html'>Esta nueva versión trata de mejorar el desempeño reemplazando el uso de StringBuffers por operaciones con Strings, pero sigue dando más de los tres segundos en la evaluación de UVA:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;import java.io.*;
import java.util.*;

class Main {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String args[]) throws Exception {
        Main myWork = new Main();   // create a dinamic instance
        myWork.Begin();             // the true entry point
    }

    void Begin() throws Exception {
        String       archivo = &amp;quot;&amp;quot;;
        String         linea = null;
        final int       SIZE = 256;
        int    valorBusqueda = 0;
        int[]          arbol;
        int[]          sumas;
        Scanner        input = null;
        while(true) {
            linea = in.readLine();
            if(linea==null) break;
            archivo+=linea;
        }
        while(archivo.length()&amp;gt;0) {
            input             = new Scanner(archivo);
            valorBusqueda     = input.nextInt();
            archivo           = archivo.replaceFirst(valorBusqueda+&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);
            String tmpCadena  = getCadena(archivo);
            archivo           = archivo.substring(tmpCadena.length());
            arbol             = new int[SIZE];
            sumas             = new int[SIZE];
            procesar(tmpCadena, arbol, sumas, 0);
            if(buscar(valorBusqueda, sumas)) System.out.println(&amp;quot;yes&amp;quot;);
            else System.out.println(&amp;quot;no&amp;quot;);
        }
    }

    void procesar(String cadena, int[] arbol, int[] sumas, int nodo) {
       if(cadena.matches(&amp;quot;\\s*\\(\\s*\\)&amp;quot;)) return;
       cadena        = cadena.trim().substring(1,cadena.length()-1);
       String numStr = &amp;quot;&amp;quot;;
       int       pos = 0;
       while(cadena.charAt(pos)!=&#39;(&#39;) numStr+=cadena.charAt(pos++);
       cadena       = cadena.substring(numStr.length());
       arbol[nodo]  = Integer.parseInt(numStr.trim());
       sumas[nodo]  = arbol[nodo]+sumas[(nodo-1)/2];
       String h1Str = getCadena(cadena);
       cadena       = cadena.substring(h1Str.length());
       h1Str        = h1Str.trim();
       String h2Str = getCadena(cadena);
       cadena       = cadena.substring(h2Str.length());
       h2Str        = h2Str.trim();
       procesar(h1Str, arbol, sumas, 2*nodo+1 );
       procesar(h2Str, arbol, sumas, 2*nodo+2 );
       if(sumas[2*nodo+1]&amp;gt;0 || sumas[2*nodo+2]&amp;gt;0) sumas[nodo]=0;
    }

    String getCadena(String sb) {
        int       numIzq = 0;
        int          pos = 0;
        String respuesta = &amp;quot;&amp;quot;;
        do {
            while (sb.charAt(pos) == &#39; &#39;) respuesta += sb.charAt(pos++);
            if (sb.charAt(pos) == &#39;(&#39;) numIzq++;
            if (sb.charAt(pos) == &#39;)&#39;) numIzq--;
            respuesta += sb.charAt(pos++);
        } while (numIzq &amp;gt; 0);
        return respuesta;
    }

    boolean buscar(int valor, int[] vector) {
        for(int x: vector) if(valor==x) return true;
        return false;
    }
}
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/1442479392787843268/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2010/12/suma-de-arbol-problema-uva-112-version.html#comment-form' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/1442479392787843268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/1442479392787843268'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2010/12/suma-de-arbol-problema-uva-112-version.html' title='Suma de Árbol - Problema UVA 112 - Versión 2'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-8234585904228759682</id><published>2010-12-14T21:40:00.001-05:00</published><updated>2010-12-14T21:52:18.905-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="UVA"/><category scheme="http://www.blogger.com/atom/ns#" term="árboles"/><title type='text'>Suma de Árbol - Problema UVA 112</title><content type='html'>En este problema se ingresan uno o varios árboles binarios en notación de lenguaje LISP y se espera determinar si alguna de las ramas que inician en la raiz y terminan en una hoja suman un valor dado para cada árbol.&lt;br /&gt;
&lt;br /&gt;
El enunciado se encuentra en la dirección&amp;nbsp;&lt;a href=&quot;http://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;amp;Itemid=8&amp;amp;category=3&amp;amp;page=show_problem&amp;amp;problem=48&quot;&gt;http://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;amp;Itemid=8&amp;amp;category=3&amp;amp;page=show_problem&amp;amp;problem=48&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;import java.io.*;
import java.util.*;

class Main {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String args[]) throws Exception {
        Main myWork = new Main();   // create a dinamic instance
        myWork.Begin();             // the true entry point
    }

    void Begin() throws Exception {
        String archivo = &quot;&quot;;
        while(true) {
            String linea = in.readLine();
            if(linea==null) break;
            archivo+=linea;
        }
        while(archivo.length()&amp;gt;0) {
            Scanner input = new Scanner(archivo);
            int valorBusqueda = input.nextInt();
            archivo = archivo.replaceFirst(valorBusqueda+&quot;&quot;,&quot;&quot;);
            StringBuffer tmp = new StringBuffer(archivo);
            String tmpCadena = getCadena(tmp);
            int[]   arbol = new int[256];
            int[]   sumas = new int[arbol.length];
            //System.out.println(tmpCadena);
            procesar(tmpCadena, arbol, sumas, 0);
            if(buscar(valorBusqueda, sumas)) System.out.println(&quot;yes&quot;);
            else System.out.println(&quot;no&quot;);
            archivo = tmp.toString();
        }
    }

    void procesar(String cadena, int[] arbol, int[] sumas, int nodo) {
       if(cadena.matches(&quot;\\(\\s*\\)&quot;)) return;
       cadena = cadena.trim();
       StringBuffer tmp1 = new StringBuffer(cadena);
       tmp1.deleteCharAt(tmp1.length()-1);
       tmp1.deleteCharAt(0);
       String numStr = &quot;&quot;;
       while(tmp1.charAt(0)!=&#39;(&#39;) { numStr+=tmp1.charAt(0); tmp1.deleteCharAt(0); }
       arbol[nodo]=Integer.parseInt(numStr);
       sumas[nodo]=arbol[nodo]+sumas[(nodo-1)/2];
       String h1Str = getCadena(tmp1);
       String h2Str = getCadena(tmp1);
       procesar(h1Str, arbol, sumas, 2*nodo+1 );
       procesar(h2Str, arbol, sumas, 2*nodo+2 );
       if(sumas[2*nodo+1]&amp;gt;0 || sumas[2*nodo+2]&amp;gt;0) sumas[nodo]=0;
    }

    String getCadena(StringBuffer sb) {
       int       numIzq = 0;
       String respuesta = &quot;&quot;;
       do {
           while(sb.charAt(0)==&#39; &#39;) sb.deleteCharAt(0);
           if(sb.charAt(0)==&#39;(&#39;) numIzq++;
           if(sb.charAt(0)==&#39;)&#39;) numIzq--;
           respuesta+=sb.charAt(0);
           sb.deleteCharAt(0);
       } while(numIzq&amp;gt;0);
        return respuesta;
    }

    boolean buscar(int valor, int[] vector) {
        for(int x: vector) if(valor==x) return true;
        return false;
    }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Esta solución funciona con todos los casos de prueba pero se excede en el tiempo máximo de evaluación de tres segundos.  Se esperan comentarios y sugerencias.</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/8234585904228759682/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2010/12/suma-de-arbol-problema-uva-112.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/8234585904228759682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/8234585904228759682'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2010/12/suma-de-arbol-problema-uva-112.html' title='Suma de Árbol - Problema UVA 112'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-5276987174995358026</id><published>2010-12-13T18:27:00.002-05:00</published><updated>2010-12-14T18:38:21.674-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cola de equipo"/><category scheme="http://www.blogger.com/atom/ns#" term="colas"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="UVA"/><title type='text'>Cola de Equipo - Problema UVA 540</title><content type='html'>El problema de colas de equipo se puede resolver en java utilizando una cola de colas.  El enunciado del mismo se encuentra en el enlace&amp;nbsp;&lt;a href=&quot;http://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;amp;Itemid=8&amp;amp;category=7&amp;amp;page=show_problem&amp;amp;problem=481&quot;&gt;http://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;amp;Itemid=8&amp;amp;category=7&amp;amp;page=show_problem&amp;amp;problem=481&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;import java.io.*;
import java.util.*;

class Main {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String args[]) throws Exception {
        Main myWork = new Main();   // create a dinamic instance
        myWork.Begin();             // the true entry point
    }

    void Begin() throws Exception {
        int cont = 0;
        while(true) {
            cont++;
            // Cada caso comienza con un numero de equipos t entre 1 y 1000
            int t = Integer.parseInt(in.readLine());
            if(t==0) break;                     // Si t=0, el proceso termina
            System.out.println(&amp;quot;Scenario #&amp;quot; + cont);
            // En este mapa se relaciona cada elemento con el equipo al que pertenece
            Map&amp;lt;Integer, Integer&amp;gt; mapa = new HashMap&amp;lt;Integer, Integer&amp;gt;();
            // Para cada uno de los equipos
            for (int i=0; i&amp;lt;t; i++) {
                String[] tmp = in.readLine().split(&amp;quot;\\s+&amp;quot;);
                // El primer n&amp;#250;mero de la l&amp;#237;nea es la cantidad de miembros del equipo
                int numMiembros = Integer.parseInt(tmp[0]);
                for (int j = 1; j&amp;lt;=numMiembros; j++) {
                    mapa.put(Integer.parseInt(tmp[j]), i);  // Cada miembro se guarda en el mapa
                }
            }
            String instruccion;
            Queue&amp;lt;Queue&amp;gt; colaE = new LinkedList&amp;lt;Queue&amp;gt;();   // Cola de colas
            do {
                // Cada rengl&amp;#243;n es una instruccion ENQUEUE, DEQUEUE o STOP
                String[] tmp = in.readLine().split(&amp;quot;\\s+&amp;quot;);
                instruccion = tmp[0];
                // Si es ENQUEUE la segunda parte de la instrucci&amp;#243;n es el valor a encolar
                if(instruccion.equals(&amp;quot;ENQUEUE&amp;quot;)) {
                    int valor  = Integer.parseInt(tmp[1]);  // Valor a encolar
                    int equipo = mapa.get(valor);           // Equipo al que pertenece
                    boolean flag = true;
                    // Identifica si en la cola hay alg&amp;#250;n miembro de su equipo
                    for (Queue&amp;lt;Integer&amp;gt; x : colaE) {    
                        if (x.isEmpty()) colaE.remove(x);
                        if (!x.isEmpty()) {
                            // Si hay un miembro del equipo se agrega al final de esa subcola
                            if (mapa.get(x.peek()) == equipo) {
                                x.add(valor);
                                flag = false;
                                break;
                            }
                        }
                    }
                    if(flag) {
                        // Si no hay miembros del equipo en la cola, crea una nueva subcola y se agrega
                        Queue&amp;lt;Integer&amp;gt; temporal = new LinkedList&amp;lt;Integer&amp;gt;();
                        temporal.add(valor);
                        colaE.add(temporal);
                    }
                }
                // Si es DEQUEUE se eliminan las subcolas vac&amp;#237;as y se retira el primer elemento
                if (instruccion.equals(&amp;quot;DEQUEUE&amp;quot;)) {
                    while (colaE.peek().size() == 0) colaE.remove();
                    System.out.println(colaE.peek().poll());
                }
                if(instruccion.equals(&amp;quot;STOP&amp;quot;)) System.out.println();
            } while (!instruccion.equals(&amp;quot;STOP&amp;quot;));
        }
    }
}
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/5276987174995358026/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2010/12/cola-de-equipo-problema-uva-540.html#comment-form' title='5 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/5276987174995358026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/5276987174995358026'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2010/12/cola-de-equipo-problema-uva-540.html' title='Cola de Equipo - Problema UVA 540'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-2817985118947108357</id><published>2010-12-13T01:00:00.007-05:00</published><updated>2010-12-13T07:06:52.759-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="groovy"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="UVA"/><title type='text'>Paréntesis Balanceados - Problema UVA 673 - Groovy</title><content type='html'>La solución en groovy al problema de paréntesis balanceados presentado anteriormente, simplifica parte del código, en lo concerniente a la definición de clases, importación de librerías de clases y la declaración de variables.  Sin embargo, el código central de evaluación de una cadena es prácticamente el mismo que en java, con la excepción de la utilización de un arreglo para manejar la pila y la palabra &quot;times&quot; para la ejecución de un ciclo por un determinado número de veces:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: groovy&quot;&gt;def evaluarCadena = { cadena -&amp;gt;
    pila = []
    for(c in cadena) {
        if(c==&#39;[&#39; || c==&#39;(&#39;) { pila = pila + c; continue }
        if(pila.size()==0) return false
        x = pila[-1]            // Obtiene el &amp;#250;ltimo elemeno
        pila[-1]=&amp;quot;#&amp;quot;            // Reemplaza el &amp;#250;ltimo por &amp;quot;#&amp;quot;
        pila = pila-pila[-1]    // Elimina de la colecci&amp;#243;n todos los &amp;quot;#&amp;quot;
        if(c==&#39;)&#39; &amp;amp;&amp;amp; x!=&#39;(&#39; ) return false
        if(c==&#39;]&#39; &amp;amp;&amp;amp; x!=&#39;[&#39; ) return false
    }
    if(pila.size() &amp;gt; 0) false
    else true
}

input = new BufferedReader(new InputStreamReader(System.in))
numeroCasos = Integer.parseInt(input.readLine());
numeroCasos.times {
    boolean respuesta = evaluarCadena(input.readLine());
    if(respuesta==true) System.out.println(&amp;quot;Yes&amp;quot;);
    if(respuesta==false) System.out.println(&amp;quot;No&amp;quot;);
}
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/2817985118947108357/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2010/12/parentesis-balanceados-problema-uva-673_13.html#comment-form' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/2817985118947108357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/2817985118947108357'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2010/12/parentesis-balanceados-problema-uva-673_13.html' title='Paréntesis Balanceados - Problema UVA 673 - Groovy'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-4809194251934460814</id><published>2010-12-12T20:46:00.000-05:00</published><updated>2010-12-12T20:46:08.903-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="algoritmos voraces"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="pila"/><category scheme="http://www.blogger.com/atom/ns#" term="UVA"/><title type='text'>Paréntesis Balanceados - Problema UVA 673</title><content type='html'>Este problema busca identificar si una cadena conformada exclusivamente por paréntesis redondos y cuadrados está correctamente formada.  La descripción del problema se encuentra en el sitio de UVA en la dirección: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=8&amp;page=show_problem&amp;problem=614&lt;br /&gt;
&lt;br /&gt;
Para resolver el problema se recurre a una pila como estructura de datos en la que se guardan los paréntesis izquierdos que se van leyendo, y que deben ser extraídos correctamente cuando aparezcan los paréntesis derechos en la expresión a evaluar.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;import java.io.*;
import java.util.*;

class Main {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String args[]) throws Exception {
        Main myWork = new Main();   // create a dinamic instance
        myWork.Begin();             // the true entry point
    }

    void Begin() throws Exception {
        // En la primera l&amp;#237;nea de la entrada se lee el n&amp;#250;mero de casos a evaluar
        int numeroCasos = Integer.parseInt(in.readLine());

        // Cada caso se eval&amp;#250;a en forma individual
        for(int i=0; i&amp;lt;numeroCasos; i++) {
            boolean respuesta = evaluarCadena(in.readLine().toCharArray());
            if(respuesta==true) System.out.println(&amp;quot;Yes&amp;quot;);
            if(respuesta==false) System.out.println(&amp;quot;No&amp;quot;);
        }
    }

    boolean evaluarCadena(char[] cadena) {
        // Una pila es la estructura ideal para la evaluaci&amp;#243;n de cadenas balanceadas
        Stack&amp;lt;Character&amp;gt; cola = new Stack&amp;lt;Character&amp;gt;();
        for(char c: cadena) {
            // los par&amp;#233;ntesis izquierdos se agregan a la pila, mientras que los derechos
            // requieren sacar el elemento opuesto de la pila, de lo contrario hay error.
            if(c==&#39;[&#39; || c==&#39;(&#39;) { cola.push(c); continue; }
            if(cola.isEmpty()) return false;
            if(c==&#39;)&#39; &amp;amp;&amp;amp; cola.pop()!=&#39;(&#39;) return false;
            if(c==&#39;]&#39; &amp;amp;&amp;amp; cola.pop()!=&#39;[&#39;) return false;
        }
        if(!cola.isEmpty()) return false;
        else return true;
    }
}
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/4809194251934460814/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2010/12/parentesis-balanceados-problema-uva-673.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/4809194251934460814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/4809194251934460814'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2010/12/parentesis-balanceados-problema-uva-673.html' title='Paréntesis Balanceados - Problema UVA 673'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-2661992475688746743</id><published>2010-12-06T18:00:00.008-05:00</published><updated>2010-12-06T22:38:55.354-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="lenguajes"/><category scheme="http://www.blogger.com/atom/ns#" term="tiobe"/><category scheme="http://www.blogger.com/atom/ns#" term="índice lenguajes"/><title type='text'>Indice Tiobe para Noviembre de 2010</title><content type='html'>El índice &lt;a href=&quot;http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html&quot;&gt;TIOBE&lt;/a&gt; para el mes de noviembre no muestra variaciones en la popularidad de los dos primeros puestos que&amp;nbsp;continúan&amp;nbsp;siendo para JAVA y C. &amp;nbsp;Destacan el descenso de un puesto de PHP con respecto al año inmediatamente anterior, y el de dos puestos para VisualBasic y JavaScript.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/_mSkuIl8eJxg/TP2qsRk4tUI/AAAAAAAAAMk/2Zcd4gmi3kE/s1600/TIOBE+Software-+Tiobe+Index.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/_mSkuIl8eJxg/TP2qsRk4tUI/AAAAAAAAAMk/2Zcd4gmi3kE/s1600/TIOBE+Software-+Tiobe+Index.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/2661992475688746743/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2010/12/indice-tiobe-para-noviembre-de-2010.html#comment-form' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/2661992475688746743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/2661992475688746743'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2010/12/indice-tiobe-para-noviembre-de-2010.html' title='Indice Tiobe para Noviembre de 2010'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_mSkuIl8eJxg/TP2qsRk4tUI/AAAAAAAAAMk/2Zcd4gmi3kE/s72-c/TIOBE+Software-+Tiobe+Index.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-8089914879385849780</id><published>2010-12-06T12:00:00.003-05:00</published><updated>2010-12-06T12:00:01.437-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Dilbert"/><category scheme="http://www.blogger.com/atom/ns#" term="El Don"/><title type='text'>El Don</title><content type='html'>Un apunte de humor para todos los que esperan sus reportes de notas:&lt;br /&gt;
&lt;br /&gt;
&lt;object width=&quot;640&quot; height=&quot;505&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/TGG4NLzT4Po?fs=1&amp;amp;hl=es_ES&amp;amp;rel=0&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/TGG4NLzT4Po?fs=1&amp;amp;hl=es_ES&amp;amp;rel=0&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;640&quot; height=&quot;505&quot;&gt;&lt;/embed&gt;&lt;/object&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/8089914879385849780/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2010/12/el-don.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/8089914879385849780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/8089914879385849780'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2010/12/el-don.html' title='El Don'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-8059049686934524101</id><published>2010-12-06T10:05:00.001-05:00</published><updated>2010-12-06T10:22:16.469-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="evaluador de expresiones"/><category scheme="http://www.blogger.com/atom/ns#" term="groovy"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Evaluación de Expresiones en Groovy</title><content type='html'>En groovy es posible evaluar una expresión escrita en una cadena de caracteres utilizando tan sólo la instrucción &quot;evaluate&quot;.  A continuación se presenta un ejemplo que muestra un pequeño formulario utilizando las características de SwingBuilder de groovy:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: groovy&quot;&gt;import groovy.swing.SwingBuilder
import javax.swing.*
import java.awt.*

swing = new SwingBuilder()
swing.edt {
    frame(title:&#39;Frame&#39;, defaultCloseOperation:JFrame.EXIT_ON_CLOSE, pack:true, show:true) {
        gridLayout(cols:2, rows:4)
        label(&amp;quot;Expresion a evaluar&amp;quot;);       JTextField txtExp  = textField(&amp;quot;&amp;quot;)
        label(&amp;quot;Valor de la variable X   &amp;quot;); JTextField txtVal  = textField(&amp;quot;&amp;quot;)
        label(&amp;quot;Respuesta&amp;quot;);                 JTextField txtResp = textField(&amp;quot;&amp;quot;)
        button(
            text:&#39;Ok&#39;,
            actionPerformed: {
                x = Double.parseDouble(txtVal.getText())
                X = x
                txtResp.setText(evaluate(txtExp.getText())+&amp;quot;&amp;quot;)
            }
        )
    }
}
&lt;/pre&gt;&lt;br /&gt;
Para probar el funcionamiento basta con escribir una expresión en java como por ejemplo: Math.pow(x,2)-3*x+1, un valor para la variable x y darle click al botón &quot;Ok&quot;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/8059049686934524101/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2010/12/evaluacion-de-expresiones-en-groovy.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/8059049686934524101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/8059049686934524101'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2010/12/evaluacion-de-expresiones-en-groovy.html' title='Evaluación de Expresiones en Groovy'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-5864372135169434195</id><published>2010-12-03T11:33:00.003-05:00</published><updated>2010-12-03T11:59:59.249-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="groovy"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="número primo"/><category scheme="http://www.blogger.com/atom/ns#" term="primo"/><title type='text'>Números Primos en Groovy</title><content type='html'>En este programa se genera una lista de 10 números primeros utilizando el lenguaje Groovy.  Es importante recordar que Groovy es un lenguaje de desarrollo rápido que utiliza la funcionalidad y genera código que corre sobre la máquina virtual de java (&lt;a href=&quot;http://es.wikipedia.org/wiki/Groovy_(lenguaje_de_programaci%C3%B3n)&quot;&gt;Información en wikipedia&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: groovy&quot;&gt;def esPrimo = {
    n -&amp;gt; if(n==2) return true
    if(n%2==0) return false
    raiz = Math.sqrt(n)
    for(i=3; i&amp;lt;=raiz; i+=2) if(n%i==0) return false
    return true
}
Random rnd = new Random()
listaPrimos = []
while(listaPrimos.size &amp;lt; 10) {
    numero = rnd.nextInt(1000000)
    if(esPrimo(numero)) listaPrimos.add numero
}
println listaPrimos
&lt;/pre&gt;&lt;br /&gt;
El programa muestra varias cosas interesantes sobre la funcionalidad de groovy como son las siguientes:&lt;br /&gt;
- No se definen clases pues el objetivo del programa no implica la creación de objetos&lt;br /&gt;
- No se requieren los punto y comas (;) al final de cada instrucción&lt;br /&gt;
- No se deben declarar las variables&lt;br /&gt;
- Existe el tipo de datos lista, que internamente se forma a partir de un LinkedList&lt;br /&gt;
- No se debe importar el paquete java.util&lt;br /&gt;
- Los métodos no se deben declarar ni en su valor de retorno ni en los parámetros que reciben</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/5864372135169434195/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2010/12/numeros-primos-en-groovy.html#comment-form' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/5864372135169434195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/5864372135169434195'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2010/12/numeros-primos-en-groovy.html' title='Números Primos en Groovy'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-2505021880702537041</id><published>2010-11-28T23:50:00.001-05:00</published><updated>2010-11-30T08:05:43.319-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="programación dinámica"/><category scheme="http://www.blogger.com/atom/ns#" term="transformación de cadenas"/><title type='text'>Transformacion de Cadenas - El camino a seguir</title><content type='html'>En el siguiente programa se complementa la clase ProblemaDistanciaCadenas para agregar un método que recorre la matriz de distancias para encontrar el camino de transformaciones que lleva de una cadena a la otra.  Este método, que recibe el nombre de getCamino, recorre hacia atrás la matriz, mirando los elementos adyacentes que sean menores o que el elemento actual.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;public class ProblemaDistanciaCadenas {
    String cadena1;
    String cadena2;
    int[][] distancia;

    ProblemaDistanciaCadenas(String c1, String c2) {
        cadena1=c1;
        cadena2=c2;
        distancia=new int[cadena1.length()+1][cadena2.length()+1];
    }

    public void mostrarMatriz() {
        System.out.print(&amp;quot;      &amp;quot;);
        for(int i=0; i&amp;lt;cadena2.length(); i++) System.out.printf(&amp;quot;%6s&amp;quot;, cadena2.charAt(i));
        System.out.println();
        for(int i=0; i&amp;lt;distancia.length; i++) {
            if(i==0) System.out.print(&amp;quot;  &amp;quot;);
            else System.out.printf(&amp;quot;%2s&amp;quot;, cadena1.charAt(i-1));
            for(int j=0; j&amp;lt;distancia[i].length; j++) {
                System.out.printf(&amp;quot;%,4d  &amp;quot;, distancia[i][j]);
            }
            System.out.println();
        }
    }

    private int minimo(int... v) {
        int menor = Integer.MAX_VALUE;
        for(int x: v) if(x&amp;lt;menor) menor=x;
        return menor;
    }

    private void calcularDistancias() {
        char[] cad1 = cadena1.toCharArray();
        char[] cad2 = cadena2.toCharArray();
        for(int i=0; i&amp;lt;=cad1.length; i++) distancia[i][0]=i;
        for(int j=0; j&amp;lt;=cad2.length; j++) distancia[0][j]=j;
        for(int i=1; i&amp;lt;=cad1.length; i++) {
            for(int j=1; j&amp;lt;=cad2.length; j++) {
                int cambio=0;
                if(cad1[i-1]!=cad2[j-1]) cambio=1;
                distancia[i][j] = minimo(distancia[i-1][j]+1,           // borrar
                                         distancia[i][j-1]+1,           // insertar
                                         distancia[i-1][j-1]+cambio);   // cambiar
            }
        }
    }

    public int getDistancia() {
        int respuesta = distancia[distancia.length-1][distancia[0].length-1];
        return respuesta;

    }

    public void getCamino() {
        int i=distancia.length-1;
        int j=distancia[0].length-1;
        String[] ruta = new String[Math.max(cadena1.length(), cadena2.length())+1];
        int k=ruta.length;
         while(i+j&amp;gt;0) {
            if(i&amp;gt;0 &amp;amp;&amp;amp; distancia[i-1][j]  &amp;lt; distancia[i][j]) {
                ruta[--k] = &amp;quot;Elimina &#39;&amp;quot; + cadena1.charAt(--i)+&amp;quot;&#39;&amp;quot;;
            }
            else if(j&amp;gt;0 &amp;amp;&amp;amp; distancia[i][j-1]  &amp;lt; distancia[i][j]) {
                ruta[--k] = &amp;quot;Inserta &#39;&amp;quot; + cadena2.charAt(--j)+&amp;quot;&#39;&amp;quot;;
            }
            else if(i &amp;gt; 0 &amp;amp;&amp;amp; j &amp;gt; 0 &amp;amp;&amp;amp; distancia[i - 1][j - 1] &amp;lt; distancia[i][j]) {
                ruta[--k] = &amp;quot;Reemplaza &#39;&amp;quot; + cadena1.charAt(--i) + &amp;quot;&#39; por &#39;&amp;quot; + cadena2.charAt(--j) + &amp;quot;&#39;&amp;quot;;
                continue;
            }
            else if(i &amp;gt; 0 &amp;amp;&amp;amp; j &amp;gt; 0 &amp;amp;&amp;amp; distancia[i - 1][j - 1] == distancia[i][j]) {
                ruta[--k] = &amp;quot;Avanza sin cambios&amp;quot;;
                i--;
                j--;
            }
        }
       for(String x: ruta) System.out.println(x);
    }

    public static void main(String [] args) {
        ProblemaDistanciaCadenas pdc = new ProblemaDistanciaCadenas(&amp;quot;algoritmos&amp;quot;, &amp;quot;logaritmo&amp;quot;);
        pdc.calcularDistancias();
        pdc.getCamino();
    }
}
&lt;/pre&gt;&lt;br /&gt;
La complejidad continúa siendo cuadrática pues la nueva función agregada solo recorre tantos elementos como filas o columnas tenga la matriz y no toda la matriz.</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/2505021880702537041/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2010/11/transformacion-de-cadenas-el-camino.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/2505021880702537041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/2505021880702537041'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2010/11/transformacion-de-cadenas-el-camino.html' title='Transformacion de Cadenas - El camino a seguir'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-7112953551117294401</id><published>2010-11-27T06:49:00.001-05:00</published><updated>2010-11-27T07:38:08.390-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="programación dinámica"/><category scheme="http://www.blogger.com/atom/ns#" term="transformación de cadenas"/><title type='text'>Transformación de Cadenas</title><content type='html'>Este algoritmo responde a la pregunta de cuántas transformaciones unitarias se deben hacer para convertir una cadena de caracteres en otra.  Las transformaciones unitarias pueden ser de tres tipos: insertar, eliminar o reemplazar un caracter.&lt;br /&gt;
&lt;br /&gt;
El algoritmo a implementar es conocido como la &lt;a href=&quot;http://es.wikipedia.org/wiki/Distancia_de_Levenshtein&quot;&gt;Distancia de Levenshtein&lt;/a&gt;, el cual implementa una solución por programación dinámica en la cual, con la ayuda de una matriz que tiene tantas filas como la cantidad de caracteres de una cadena más uno, y tantas columnas como la cantidad de caracteres de la otra cadena más uno, se calcula el número de transformaciones que se deben hacer para &amp;nbsp;transformar los N prefijos de la primera cadena en los M prefijos de la segunda cadena.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;public class ProblemaDistanciaCadenas {
    String cadena1;
    String cadena2;
    int[][] distancia;

    ProblemaDistanciaCadenas(String c1, String c2) {
        cadena1=c1;
        cadena2=c2;
        distancia=new int[cadena1.length()+1][cadena2.length()+1];
    }

    public void mostrarMatriz() {
        System.out.print(&quot;      &quot;);
        for(int i=0; i&amp;lt;cadena2.length(); i++) System.out.printf(&quot;%6s&quot;, cadena2.charAt(i));
        System.out.println();
        for(int i=0; i&amp;lt;distancia.length; i++) {
            if(i==0) System.out.print(&quot;  &quot;);
            else System.out.printf(&quot;%2s&quot;, cadena1.charAt(i-1));
            for(int j=0; j&amp;lt;distancia[i].length; j++) {
                System.out.printf(&quot;%,4d  &quot;, distancia[i][j]);
            }
            System.out.println();
        }
    }

    private int minimo(int... v) {
        int menor = Integer.MAX_VALUE;
        for(int x: v) if(x&amp;lt;menor) menor=x;
        return menor;
    }

    private void calcularDistancias() {
        char[] cad1 = cadena1.toCharArray();
        char[] cad2 = cadena2.toCharArray();
        for(int i=0; i&amp;lt;=cad1.length; i++) distancia[i][0]=i;
        for(int j=0; j&amp;lt;=cad2.length; j++) distancia[0][j]=j;
        for(int i=1; i&amp;lt;=cad1.length; i++) {
            for(int j=1; j&amp;lt;=cad2.length; j++) {
                int cambio=0;
                if(cad1[i-1]!=cad2[j-1]) cambio=1;
                distancia[i][j] = minimo(distancia[i-1][j]+1,           // borrar
                                         distancia[i][j-1]+1,           // insertar
                                         distancia[i-1][j-1]+cambio);   // cambiar
            }
        }
    }

    public int getDistancia() {
        int respuesta = distancia[distancia.length-1][distancia[0].length-1];
        return respuesta;

    }

    public static void main(String [] args) {
        ProblemaDistanciaCadenas pdc = new ProblemaDistanciaCadenas(&quot;Hola&quot;, &quot;Colas&quot;);
        pdc.calcularDistancias();
        pdc.mostrarMatriz();
        System.out.println(pdc.getDistancia());
    }
}&lt;/pre&gt;&lt;br /&gt;
La complejidad del algoritmo es cuadrática, o más exactamente, O(NxM), donde N es el tamaño de la primera cadena y  M el de la segunda.</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/7112953551117294401/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2010/11/transformacion-de-cadenas.html#comment-form' title='5 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/7112953551117294401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/7112953551117294401'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2010/11/transformacion-de-cadenas.html' title='Transformación de Cadenas'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-163924328970686240</id><published>2010-11-26T06:00:00.010-05:00</published><updated>2010-11-26T09:30:20.103-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ajedrez"/><category scheme="http://www.blogger.com/atom/ns#" term="algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="backtracking"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="problema reinas"/><title type='text'>Problema de las Reinas - Version 2</title><content type='html'>&lt;div style=&quot;text-align: right;&quot;&gt;&lt;span class=&quot;zemanta-img separator zemanta-action-dragged&quot;&gt;&lt;a href=&quot;http://commons.wikipedia.org/wiki/File:Eight_queens.png&quot; style=&quot;clear: right; display: block; float: right; margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Problem of eight queens&quot; height=&quot;123&quot; src=&quot;http://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Eight_queens.png/300px-Eight_queens.png&quot; style=&quot;border: none; font-size: 0.8em;&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;zemanta-img-attribution&quot; style=&quot;clear: right; float: right; margin-left: 1em; margin-right: 1em; width: 300px;&quot;&gt;Image via &lt;a href=&quot;http://commons.wikipedia.org/wiki/File:Eight_queens.png&quot;&gt;Wikipedia&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;Teniendo en cuenta que en cada fila del tablero de ajedrez solo puede ir una reina, entonces es posible modelar el problema utilizando un solo vector, en el que hay tantas posiciones como filas, y el valor para cada posición es la columna en la cual se encuentra ubicada la reina de dicha fila.&lt;br /&gt;
&lt;br /&gt;
La sugerencia (sin código) &amp;nbsp;para realizar esta solución está en el blog de &lt;a href=&quot;http://www.prothotype.com/blog/archives/147/las-8-reinas-al-desnudo/&quot;&gt;prothotype&lt;/a&gt;. &amp;nbsp;La estrategia a utilizar está basada en backtracking y recursividad al igual que la solución presentada anteriormente.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;public class ProblemaReinas2 {
    final int numFilas;
    int[]   tablero;
    int     contador;
    int     correctas=0;

    public ProblemaReinas2(int nf) {
        numFilas    = nf;
        tablero     = new int[nf];
        for(int i=0; i&amp;lt;tablero.length; i++) tablero[i]=-1;
    }

    public void mostrarTablero() {
        for(int i=0; i&amp;lt;tablero.length; i++) {
            for(int j=0; j&amp;lt;tablero.length; j++) {
                if(tablero[i]==j) System.out.printf(&quot;  %2d  |&quot;, tablero[i]+1);
                else System.out.printf(&quot;      |&quot;);
            }
            System.out.println();
            for(int j=0; j&amp;lt;tablero.length; j++) System.out.print(&quot;------+&quot;);
            System.out.println();
        }
        System.out.println();
    }

    public boolean resolverProblema(int fila, int columna) {
        //mostrarTablero();
        contador++;
        tablero[fila]=columna;
        correctas++;
        if(correctas==numFilas) return true;
        int[] posibles = buscarPosibles(fila+1);
        for(int c: posibles) {
            if(resolverProblema(siguienteFila(), c)) return true;
        }
        tablero[fila]=-1;
        correctas--;
        return false;
    }

    public int siguienteFila() {
        for(int i=0; i&amp;lt;tablero.length; i++) if(tablero[i]==-1) return i;
        return -1;
    }

    int[] buscarPosibles(int num) {
        int[] resp = new int[numFilas];
        int pos=numFilas;
        for(int i=0; i&amp;lt;resp.length; i++) resp[i]=i;
        for(int i=0; i&amp;lt;numFilas; i++) {
            if(tablero[i]!=-1) {
                resp[tablero[i]]=-1;
                pos--;
            }
        }
        for(int i=0; i&amp;lt;resp.length; i++) {
            if(resp[i]==-1) continue;
            for(int j=0; j&amp;lt;num; j++) {
                double fabs = Math.abs((num-j)*1.0/(resp[i]-tablero[j]));
                if(fabs==1.0 &amp;amp;&amp;amp; resp[i]!=-1) {
                    resp[i]=-1;
                    pos--;
                    break;
                }
            }
        }
        int[] tmp = new int[pos];
        int i=0;
        for(int x: resp) if(x!=-1) tmp[i++] = x;
        return tmp;
    }

    public static void main(String[] args) {
        java.util.Random rnd  = new java.util.Random();
        int numFilas      = 8;
        int filaInicial   = rnd.nextInt(numFilas);
        int colInicial    = rnd.nextInt(numFilas);
        ProblemaReinas2 pr = new ProblemaReinas2(numFilas);
        pr.resolverProblema(filaInicial, colInicial);
        pr.mostrarTablero();
        System.out.printf(&quot;Cantidad de veces que entra al ciclo: %,d %n&quot;,  pr.contador);
    }
}
&lt;/pre&gt;&lt;div class=&quot;zemanta-pixie&quot; style=&quot;height: 15px; margin-top: 10px;&quot;&gt;&lt;a class=&quot;zemanta-pixie-a&quot; href=&quot;http://www.zemanta.com/&quot; title=&quot;Enhanced by Zemanta&quot;&gt;&lt;img alt=&quot;Enhanced by Zemanta&quot; class=&quot;zemanta-pixie-img&quot; src=&quot;http://img.zemanta.com/zemified_e.png?x-id=09bb85aa-e336-4ac4-baa5-40b3048f9523&quot; style=&quot;border: none; float: right;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/163924328970686240/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2010/11/problema-de-las-reinas-version-2.html#comment-form' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/163924328970686240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/163924328970686240'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2010/11/problema-de-las-reinas-version-2.html' title='Problema de las Reinas - Version 2'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11038010.post-3546659749512721240</id><published>2010-11-25T09:01:00.001-05:00</published><updated>2010-11-25T09:03:53.189-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ajedrez"/><category scheme="http://www.blogger.com/atom/ns#" term="algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="backtracking"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="problema"/><category scheme="http://www.blogger.com/atom/ns#" term="problema reinas"/><category scheme="http://www.blogger.com/atom/ns#" term="reinas"/><title type='text'>Problema de las Reinas</title><content type='html'>&lt;div style=&quot;text-align: right;&quot;&gt;&lt;a href=&quot;http://commons.wikipedia.org/wiki/File:Ocho_reinas_reina_atacarr.JPG&quot; style=&quot;clear: right; display: block; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img alt=&quot;Ocho reinas reina atacarr&quot; height=&quot;211&quot; src=&quot;http://upload.wikimedia.org/wikipedia/commons/d/d6/Ocho_reinas_reina_atacarr.JPG&quot; style=&quot;border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; font-size: 0.8em;&quot; width=&quot;205&quot; /&gt;&lt;/a&gt;&lt;/div&gt;El siguiente programa muestra como resolver el problema de las 8 reinas, generalizado para cualquier tamaño de tablero.  El problema en sí trata de encontrar una forma de posicionar n reinas en un tablero de ajedrez de tamaño n x n, de tal manera que ninguna de las reinas ataque a ninguna de las otras.  Una reina ataca todas las casillas que se encuentren en la misma fila, en la misma columna, o en las diagonales de la casilla en que está ubicada.&lt;br /&gt;
&lt;br /&gt;
Este problema utiliza un esquema igual al utilizado en la solución del problema del salto del caballo, modelando el tablero como una matriz de n x n y utilizando un enfoque de backtracking para marcar una casilla, generar una lista de las siguientes casillas que no están amenazadas y revisar dicha lista en forma recursiva; si no se llega a la respuesta correcta, se devuelve el proceso para continuar con las siguiente casillas de la lista.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;public class ProblemaReinas {
    final int numFilas;
    final int numColumnas;
    int[][] tablero;
    int     contador;

    public ProblemaReinas(int nf) {
        numFilas    = nf;
        numColumnas = nf;
        tablero     = new int[nf][nf];
    }

    public void mostrarTablero() {
        for(int i=0; i&amp;lt;tablero.length; i++) {
            for(int j=0; j&amp;lt;tablero[i].length; j++) {
                if(tablero[i][j]&amp;gt;0) System.out.printf(&quot;  %2d  |&quot;, tablero[i][j]);
                else System.out.printf(&quot;      |&quot;, tablero[i][j]);
            }
            System.out.println();
            for(int j=0; j&amp;lt;tablero[i].length; j++) System.out.print(&quot;------+&quot;);
            System.out.println();
        }
    }

    public boolean resolverProblema(int f, int c, int num) {
            contador++;
            tablero[f][c] = num;
            if(num==numFilas) return true;
            int[][] posibles = buscarPosibles();
            for(int i=0; i&amp;lt;posibles.length; i++) {
                if(resolverProblema(posibles[i][0], posibles[i][1], num+1)) return true;
            }
            tablero[f][c]=0;
            return false;
    }

    int[][] buscarPosibles() {
        int[][] resp = new int[numFilas*numColumnas][2];
        int[] sumaFilas = new int[numColumnas];
        int[] sumaColumnas = new int[numFilas];
        int     pos  = 0;
        for(int i=0; i&amp;lt;numFilas; i++) {
            for(int j=0; j&amp;lt;numColumnas; j++) {
                if(tablero[i][j]&amp;gt;0) {
                    sumaFilas[i]++;
                    sumaColumnas[j]++;
                }
            }
        }
        for(int i=0; i&amp;lt;numFilas; i++) {
            if(sumaFilas[i]&amp;gt;0) continue;
            for(int j=0; j&amp;lt;numColumnas; j++) {
                if(sumaColumnas[j]&amp;gt;0) continue;
                if(i&amp;gt;0 &amp;amp;&amp;amp; j&amp;gt;0             &amp;amp;&amp;amp; tablero[i-1][j-1] &amp;gt; 0) continue;
                if(i&amp;gt;0 &amp;amp;&amp;amp; j&amp;lt;numColumnas-1 &amp;amp;&amp;amp; tablero[i-1][j+1] &amp;gt; 0) continue;
                if(i&amp;lt;numFilas-1 &amp;amp;&amp;amp; j&amp;gt;0    &amp;amp;&amp;amp; tablero[i+1][j-1] &amp;gt; 0) continue;
                if(i&amp;lt;numFilas-1 &amp;amp;&amp;amp; j&amp;lt;numColumnas-1 &amp;amp;&amp;amp; tablero[i+1][j+1] &amp;gt; 0) continue;
                resp[pos][0]=i;
                resp[pos][1]=j;
                pos++;
            }
        }
        int[][] tmp = new int[pos][2];
        for(int i=0; i&amp;lt;pos; i++) { tmp[i][0] = resp[i][0]; tmp[i][1]=resp[i][1]; }
        return tmp;
    }

    boolean esValido(int f, int c) {
        if(f&amp;lt;0 || f&amp;gt;numFilas-1 || c&amp;lt;0 || c&amp;gt;numColumnas-1) return false;
        if(tablero[f][c]!=0) return false;
        return true;
    }

    public static void main(String[] args) {
        java.util.Random rnd  = new java.util.Random();
        int numFilas      = 8;
        int filaInicial   = rnd.nextInt(numFilas);
        int colInicial    = rnd.nextInt(numFilas);
        ProblemaReinas pr = new ProblemaReinas(8);
        pr.resolverProblema(filaInicial, colInicial,1);
        pr.mostrarTablero();
        System.out.printf(&quot;Cantidad de veces que entra al ciclo: %,d %n&quot;,  pr.contador);
    }
}&lt;/pre&gt;&lt;div class=&quot;zemanta-pixie&quot; style=&quot;height: 15px; margin-top: 10px;&quot;&gt;&lt;a class=&quot;zemanta-pixie-a&quot; href=&quot;http://www.zemanta.com/&quot; title=&quot;Enhanced by Zemanta&quot;&gt;&lt;img alt=&quot;Enhanced by Zemanta&quot; class=&quot;zemanta-pixie-img&quot; src=&quot;http://img.zemanta.com/zemified_e.png?x-id=f2ff446a-84fb-4e8c-9ee9-3a2f4d76a4d5&quot; style=&quot;border: none; float: right;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgep.blogspot.com/feeds/3546659749512721240/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://jorgep.blogspot.com/2010/11/problema-de-las-reinas.html#comment-form' title='5 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/3546659749512721240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11038010/posts/default/3546659749512721240'/><link rel='alternate' type='text/html' href='http://jorgep.blogspot.com/2010/11/problema-de-las-reinas.html' title='Problema de las Reinas'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry></feed>