En el siguiente video te mostrare como podemos resolver el problema 3n + n, o mejor conocido como la Conjetura de Collatz.
Para el video utilizaremos C# y funciones anónimas que serán llamadas recursivamente.
En el siguiente video te mostrare como podemos resolver el problema 3n + n, o mejor conocido como la Conjetura de Collatz.
En el siguiente video te mostrare como podemos resolver el problema 3n + n, o mejor conocido como la Conjetura de Collatz.
Para el video utilizaremos C# y funciones anónimas que serán llamadas recursivamente.
En el siguiente video resolveré 5 problemas comunes que son puestos a programadores nivel jr que buscan trabajo en .NET
En el siguiente video resolveré 5 problemas comunes que son puestos a programadores nivel JR que buscan trabajo en .NET
Las pruebas están enfocadas a algoritmia y no a un framework en si, así que se vera un poco de estructura de datos y expresiones regulares.
Te explicaré como puedes encontrar la manera de programar Fibonacci y Factorial solo utilizando programación funciona.
En las entrevistas técnicas para programador jr es común que te pidan resolver problemas como fibonacci o factorial, el objetivo de este video es más que nada darte algunos conceptos que son importantes para este tipo de problemas.
Te explicaré como puedes encontrar la manera de programar Fibonacci y Factorial solo utilizando programación funciona.
Existen varias formas de mejorar la lógica al programar, y una de ellas es resolver retos de programación.
Existen varias formas de mejorar la lógica al programar, y una de ellas es resolver retos de programación.
En este video me he puesto a resolver los Retos de Programación del canal de MoureDev.
En este video me enfocare en ir resolviendo el problema por partes, de esta manera podremos ir entendiendo el problema desde perspectivas mas pequeñas.
En esta entrada utilizare el algoritmo de quicksort en javascript que publique anteriormente y lo acomode de una manera especial para poder mostrar poco a poco como se va ordenando un conjunto de números por medio de este método de ordenamiento.
Para el que no conozca la función que estoy utilizando setTimeout, esta simplemente se encarga de ejecutar una función o un código después de pasar cierto tiempo, en este caso puse 500 que es medio segundo. Hago uso de esta función par que se pueda notar el ordenamiento y no sea instantáneo.
A continuación anexo el ejemplo animado, solo denle clic en el botón comenzar:
Y ahora el código que hace posible esta demostración:
CSS
.bloque{ float:left; margin-left:5px; margin-bottom:2px; width:20px; height:20px; text-align::center; padding:5px; background:#fff; }
HTML
<div id="contenido" style=" background:#efefef; height:90px; padding:10px;"></div> <input id="botonsito" type="button" value="Comenzar" onclick="comenzar()" />
Javascript
//arreglo a ordenar arreglo=[10,9,19,8,1,12,14,0,5,6,9,17,10,4,5,3,2,3,4,5,6,7,88,77,66,55,44,33,21,2,33,44,73,78,9,2,3,0,1,8,1,13]; imprimirArreglo(); function comenzar(){ //llamamos la función mandando 0 en el primer parametro //y mandando la longitud del arreglo -1 quicksort(0,(arreglo.length-1)); //desabilitamos boton $("#botonsito").prop("disabled",true) } //funcion que plasma el arreglo para poder ser visualizado function imprimirArreglo(){ //borramos el contenido del div del contenido $("#contenido").html(""); //imprimimos los elementos en forma de div for(i_=0;i_<arreglo.length;i_++){ //anexamos un div con clase bloque $("#contenido").append("<div class='bloque'>"+arreglo[i_]+"</div>"); } } //función quicksort function quicksort(primero,ultimo){ //definimos variables indices i = primero j = ultimo //sacamos el pivote de la mitad del arreglo pivote = arreglo[parseInt((i+j)/2)]; iteracionQS(i,j,pivote,primero,ultimo) } //funcion que suplanta el while y se llama recursivamente function iteracionQS(i,j,pivote,primero,ultimo){ //mientras arreglo[i] sea menor a pivote while(arreglo[i]<pivote) i++; //mientras j sea mayor a pivote while(arreglo[j]>pivote) j--; //si el indice i es menor o igual a j entonces intercambiamos if(i<=j){ //variable temporal auxiliar para guardar valor de arreglo[j] aux=arreglo[j]; //intercambiamos los valores de arreglo[j] y arreglo[i] arreglo[j] = arreglo[i] arreglo[i] = aux // incrementamos y decrementamos i y j i++; j--; imprimirArreglo(arreglo); } //repetimos if(i<j){ //hacemos una pausa de medio segundo setTimeout(function(){ iteracionQS(i,j,pivote,primero,ultimo) },500); }else{ //si primero es menor a j llamamos la funcion nuevamente if(primero<j){ //pausa de medio segundo setTimeout(function(){ quicksort(primero,j); },500); } //si ultimo es mayor que i llamamos la funcion nuevamente if(ultimo>i){ //pausa de medio segundo setTimeout(function(){ quicksort(i,ultimo) } ,500); } } }
De cualquier forma les dejo la liga directa al ejemplo mostrado, por si surge alguna duda.
El algoritmo quicksort es un algoritmo de ordenamiento, como su nombre lo dice, es de los más rápidos y es recomendable su uso (no como el de burbuja).
Ver quicksort animado con jquery.
Aquí anexo el algoritmo de quicksort en javascript:
Función Quicksort
function quicksort(primero,ultimo){ //definimos variables indices i = primero j = ultimo //sacamos el pivote de la mitad del arreglo pivote = arreglo[parseInt((i+j)/2)]; //repetir hasta que i siga siendo menor que j do{ //mientras arreglo[i] sea menor a pivote while(arreglo[i]<pivote) i++; //mientras j sea mayor a pivote while(arreglo[j]>pivote) j--; //si i es menor o igual a j, los valores ya se cruzaron if(i<=j){ //variable temporal auxiliar para guardar valor de arreglo[j] aux=arreglo[j]; //intercambiamos los valores de arreglo[j] y arreglo[i] arreglo[j] = arreglo[i] arreglo[i] = aux // incrementamos y decrementamos i y j i++; j--; } }while(i<j); //si primero es menor a j llamamos la funcion nuevamente if(primero<j){ quicksort(primero,j); } //si ultimo es mayor que i llamamos la funcion nuevamente if(ultimo>i){ quicksort(i,ultimo); } }
Como utilizarlo
//arreglo a ordenar arreglo=[10,9,19,8,1,12,14,24,34,54,5,4,2,99,2,3,1,0]; //llamamos la función mandando 0 en el primer parametro //y mandando la longitud del arreglo -1 quicksort(0,(arreglo.length-1)); //imprimimos para ver el resultado alert(arreglo)
En esta entrada hago uso del algoritmo burbuja en javascript que publique anteriormente, pero lo modifique para poder hacer una demostración utilizando jquery, de cómo va intercambiando los elementos en cada iteración, anexo el algoritmo funcionando, denle al botón comenzar para ver la animación hecha con jquery.
Y ahora el código completo y comentado:
CSS
.bloque{ float:left; margin-left:5px; width:20px; height:20px; text-align::center; padding:5px; background:#fff; }
Código HTML
<div id="contenido" style=" background:#efefef; height:30px; padding:10px;"></div> <input id="botonsito" type="button" value="Comenzar" onclick="comenzar()" />
Código Javascript/Jquery
//variables globales arreglo=[11,15,12,8,1,5,4,2,99,2,3]; var i=0,j=0; var iteracion; //sirve para guardar el evento de tiempo y poder pararlo $(document).ready(function(){ imprimirArreglo(arreglo) }); function comenzar(){ //comienza la iteracion con velocidad de 3 decimas de segundo cada iteración iteracion=setInterval(burbuja,300); //desabilitamos boton $("#botonsito").prop("disabled",true) } //funcion que plasma el arreglo para poder ser visualizado function imprimirArreglo(){ //borramos el contenido del div del contenido $("#contenido").html(""); //imprimimos los elementos en forma de div for(i_=0;i_<arreglo.length;i_++){ //anexamos un div con clase bloque $("#contenido").append("<div class='bloque'>"+arreglo[i_]+"</div>"); } } function burbuja(){ //recorreremos todos los elementos hasta n-1 if(i<arreglo.length){ //recorreremos todos los elementos hasta n-i, tomar en cuenta los ultimos no tiene caso ya que ya estan acomodados. if(j<(arreglo.length-i)){ //comparamos if(arreglo[j]>arreglo[j+1]){ //guardamos el numero mayor en el auxiliar aux=arreglo[j]; //guardamos el numero menor en el lugar correspondiente arreglo[j]=arreglo[j+1]; //asignamos el auxiliar en el lugar correspondiente arreglo[j+1]=aux; } j++; }else{ j=0; i++; } }else{ //aqui se termina el algoritmo por lo cual paramos el setInterval clearInterval(iteracion); } //imprimimos el arreglo en cada iteración imprimirArreglo() }
De cualquier forma les dejo la liga directa al ejemplo mostrado, por si surge alguna duda.
Las funciones setInterval y clearInterval son funciones de javascript, la primera sirve para ejecutar un código cada cierto tiempo, la segunda detiene las iteraciones de la primera.
El algoritmo de ordenamiento burbuja (burbuja mejorada en este caso), es un algoritmo sencillo para ordenar elementos, ha llegado a no ser recomendado por su gran cantidad de iteraciones, pero no está demás conocerlo para comprender algoritmos de ordenamiento de más complejidad y mayor utilidad.
Ver algoritmo burbuja animado utilizando jquery.
A continuación plasmo la función en javascript y como utilizarla:
Función javascript
function burbuja(arreglo){ //recorreremos todos los elementos hasta n-1 for(i=0;i<(arreglo.length-1);i++) //recorreremos todos los elementos hasta n-i, tomar en cuenta los ultimos no tiene caso ya que ya estan acomodados. for(j=0;j<(arreglo.length-i);j++){ //comparamos if(arreglo[j]>arreglo[j+1]){ //guardamos el numero mayor en el auxiliar aux=arreglo[j]; //guardamos el numero menor en el lugar correspondiente arreglo[j]=arreglo[j+1]; //asignamos el auxiliar en el lugar correspondiente arreglo[j+1]=aux; } } return arreglo }
Como utilizarlo
//arreglo a ordenar var arregloAOrdenar=[1000,9,111,8,1,5,4,2,99,2,3]; //invocamos la función arregloAOrdenar=burbuja(arregloAOrdenar); //imprimimos para ver el resultado alert(arregloAOrdenar)
Como vimos en un articulo que publique anteriormente (función fibonacci en javascript), la secuencia fibonacci es una curiosidad de la naturaleza y una de las cuales vemos en carreras afines a ingeniería, y en esta entrada compartiré el código fuente de la representación mas conocida de dicha secuencia, el caracol.
Esta figura es la mas conocida cuando buscamos información sobre la secuencia fibonacci, y pueden ver el algoritmo en ejecución dando clic AQUÍ.
El siguiente código de javascript la muestra en un navegador que soporte HTML5 (por la utilización de canvas):
Código HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>fibonacci cuadros</title> <style> * { margin:0; padding:0; } html, body { width:100%; height:100%; } #miCanvas { position: absolute; top: 0px; left: 0px; margin: 0px; border:1px solid #333 } </style> </head> <body> <canvas id="miCanvas" ></canvas> </body> </html>
Código Javascript
/* Código realizado por: Héctor de León Guevara. Fecha: 06/04/2014 Figura caracol con secuencia fibonacci www.hdeleon.net */ var context //contexto del canvas global //variables para el acomodo var x=700; var y=300; var opcion=0 //variable que indica cual es la posicion ue sigue para dibujar el cuadro var opcionCurva=0; //variable de opcion para la curva //variables de curva var x1_curva; var y1_curva; var x2_curva; var y2_curva; var x3_curva; var y3_curva; //inicia el script window.onload = function() { //creamos canvas var canvas = document.getElementById('miCanvas'); context = canvas.getContext('2d'); //agrega event de resize window.addEventListener('resize', resizeCanvas, false); //redimensiona canvas al tamaño de ventana function resizeCanvas() { canvas.width = window.innerWidth; canvas.height = window.innerHeight; } //redimencionamos canvas resizeCanvas(); //algoritmos fibonacci, se ejecuta 40 veces fibonacci(40) }; function fibonacci(n){ var a=0; var b=1; var numeroTemporal=a //plasmaCuadro(x,y,b,b); for(i=0; i<n;i++){ acomodaCuadro(a,b); numeroTemporal=a; a=b; b=numeroTemporal+b; acomodaCurva(a,b); //dibujamos cuadro plasmaCuadro(x,y,b,b); plasmaCurva(); } } function plasmaCurva(){ //curva context.moveTo(x1_curva,y1_curva); //mover el cursor de canvas a punto inicial context.quadraticCurveTo(x2_curva,y2_curva,x3_curva,y3_curva); //punto de cuadricula y punto final context.strokeStyle = '#555'; context.stroke(); } function plasmaCuadro(x,y,w,h){ context.beginPath(); context.rect(x, y,w, h); context.lineWidth = 1; context.strokeStyle = 'black'; context.stroke(); } //funcion que permite ir acomodando el cuadro para que figure el espiral function acomodaCuadro(a,b){ switch(opcion){ //inicio case 0: opcion++; break; //derecha case 1: x+=b; opcion++; break; //abajo case 2: x-=a; y+=b; opcion++; break; //izquierda case 3: x-=(parseInt(a)+parseInt(b)); y-=a; opcion++; break; //arriba case 4: y-=(parseInt(a)+parseInt(b)); opcion++; break; } if(opcion==5) opcion=1; } function acomodaCurva(a,b){ switch(opcionCurva){ //derecha case 1: x1_curva=x; y1_curva=y; x2_curva=x+b; y2_curva=y; x3_curva=x+b; y3_curva=y+b; break; //abajo case 2: x1_curva=x+b; y1_curva=y; x2_curva=x+b; y2_curva=y+b; x3_curva=x; y3_curva=y+b; break; //izquierda case 3: x1_curva=x+b; y1_curva=y+b; x2_curva=x; y2_curva=y+b; x3_curva=x; y3_curva=y; break; //arriba case 4: x1_curva=x; y1_curva=y+b; x2_curva=x; y2_curva=y; x3_curva=x+b; y3_curva=y; break; } opcionCurva++; if(opcionCurva==5) opcionCurva=1; }
La secuencia de fibonacci es un algoritmo tipico que vemos todos los ingenieros de computación (o ciencia a fin), mientras estamos cursando nuestra carrera.
Esta Sucesión es muy simple de comprender, simplemente comienza por el número 0 seguido del 1, y a partir de estos se suma cada numero con el anterior y se agrega a la secuencia, y repetimos la operación; un ejemplo es el siguiente:
0,1,1,2,3,5,8,13…..
Lo interesante es que esta función se representa en muchos casos en la naturaleza, desde la perfección de un caracol, hasta en la reproducción de los conejos; gran ejemplo que nos hace pensar que la naturaleza es un gran matemático.
Les adjunto el código de javascript para realizar esta famosa secuencia a continuación:
function fibonacci(n){ var a=0; var b=1; for(i=0; i<n;i++){ var numeroTemporal=a; a=b; b=numeroTemporal+b; document.writeln(a+" "); } }
Esta función recibe un número, el cual sera la cantidad de elementos que plasmara la función. Si desean ver en acción la función les anexo el código corriendo el cual plasma los primeros 100 números de la secuencia, solo den clic en el botón de abajo: