sábado, 7 de mayo de 2011

Optimización de matriz

Bueno esta entrada es meramente educativa, no es un programa solo es una solucíon a un problema de matrices.
El problema consta de una matriz en la cúal hemos eliminado elementos, los elementos restantes los queremos pasar a una matriz nueva pero que este lo más cuadrada posible (no se si me explico)y deben sobrar un número minimo de espacios de esta matriz.

En la solucíon que doy, los números maximos de casillas restantes llegan hasta 2.

Empecemos!

La solución que doy se podría escribir en pseudocodigo de la siguiente manera:

N=numeros a imprimir
Sqrt(N)=flotante(x);
Sqrt(N)=entero(y);
if(x==y){
hacer arreglo cuadrado perfecto de "y*y"
else;
sqrt(N)=a;
N/a=b;
a*b=c;
c - N = d
if(d<=2){
arreglo a*b seria el optimo
else;
do{
a-1=a;
b+1=b;
a*b = c;
c - N = d;
}while(d>2)
arreglo a*b seria el optimo


Ejemplo:
Tenemos 284 números que queremos pasar a la nueva matriz, entonces:

N=284;
Sqrt(284)=16.85; //que será nuestro variable flotante "x"
Sqrt(284)=16; //que será nuestro variable entero en "y"
if(x==y){ //realizamos una comparación, en este caso saldra negativa la afirmación
hacer arreglo cuadrado y*y //esto se ignora
else;
Sqrt(284)= 16 //valor entero que será la variable "a"
284/16 = 17+ 1 = 18 //valor entero que será la variable "b"
16*18 = 288 //valor entero que será nuestra varable "c"
284 - 288 = 4 //este será nuestra variable "d"
if(d<=2){ //esto es para saber si realizar la suma y resta del final

arreglo a*b sería el optimo //esto se ignora

else;

do{
16-1 = 15 //esto será la nuevo variable "a"
18+1 = 19 //esto será la nueva variable "b"
15*19 = 285;
285 - 284 = 1 //este sería nuestro valor "d"
}while(d>2)

arreglo a*b sería el optimo

//como se ve, el final con una simple resta y suma tendriamos el resultado 15x19 = 285, esta sería una matriz optima para nuestros 284 datos y como vimos no se pasa de los 2 espacios.

otro ejemplo:

Tenemos 22 números que queremos pasar a la nueva matriz, entonces:

N=22;
Sqrt(22)=4.6; //que será nuestro variable flotante "x"
Sqrt(22)=4; //que será nuestro variable entero en "y"

if(x==y){ //realizamos una comparación, en este caso saldra negativa la afirmación
hacer arreglo cuadrado y*y //esto se ignora
else;
Sqrt(22)= 4 //valor entero que será la variable "a"
22/4 = 5+ 1 = 6 //valor entero que será la variable "b"
4*6 = 24 //valor entero que será nuestra varable "c"
24 - 22 = 2 //este será nuestra variable "d"

if(d<=2){ //esto es para saber si realizar la suma y resta del final
arreglo a*b sería el optimo //este sería nuestro arreglo más optimo
else;
do{
4-1 = 3 //se ignora
6+1 = 7 //se ignora
3*7 = 21
21-22 = -1;
}while(d>2);

//la suma y resta del final se ignora, sino tendriamos una matriz 3*7 = 21 y no cumpliriamos con la matriz más optima


Como vimos en el ejemplo, como la multiplicacion de las variables "a" y "b" no pasa de los 2 espacios, no realizamos nunguna suma y resta a la matriz, y nos saldria directamente la más optima.

Ultimo ejemplo:

Tenemos 25 números que queremos pasar a la nueva matriz, entonces:

N=25;
Sqrt(25)=5; //que será nuestro variable flotante "x"
Sqrt(25)=5; //que será nuestro variable entero en "y"

if(x==y){ //realizamos una comparación, en este caso saldra positiva la afirmación

hacer arreglo cuadrado y*y //esta sería nuestra matriz más optima

//todo lo demas se ignora

Como vimos en el ejemplo, como al raiz cuadrada de los elementos da un numero entero, nuestra matriz puede ser perfectamente cuadrada.

Ejemplo Bonus con número al azar:

Tenemos 159 números que queremos pasar a la nueva matriz, entonces:

N=159;
Sqrt(159)=12.60; //que será nuestro variable flotante "x"
Sqrt(159)=12; //que será nuestro variable entero en "y"

if(x==y){ //realizamos una comparación, en este caso saldra negativa la afirmación
hacer arreglo cuadrado y*y //esto se ignora
else;
Sqrt(159)= 12 //valor entero que será la variable "a"
159/12 = 13 + 1 = 14 //valor entero que será la variable "b"
12*14 = 168 //valor entero que será nuestra varable "c"
168 - 159 = 9 //este será nuestra variable "d"

if(d<=2){ //esto es para saber si realizar la suma y resta del final
arreglo a*b sería el optimo //esto se ignora
else;
do{
12-1 = 11;
14+1 = 15;
11*15 = 165;
165 - 159 = 6; // en este caso sera 165, entonces tendriamos que hacer las operaciones otra vez }while(d>2);

10*16 = 160 //en la siguiente vuelta sadria estos resultados, este sería nuestro optimo

Como vimos en el ejemplo, como la multiplicacion de las variables "a" y "b" pasa de los 2 espacios, realizamos otra suma y resta a la matriz, y hasta que nos salga la más optima.

Actualización**: modifique la solucion original ya que salian algunos inconvenientes, este debe de funcionar al 100%, no lo he probado con todos los números, si hay algun error hacermelo saber, para modificar la solución.

Aclaro, es una solución personal que surgio, puede estar mal como puede estar bien, es de humanos equivocarse.

En realidad hay otra solución a partir de esta en que saldrian los valores más directos y modificando unas cuantas lineaa, pero no dare todo en bandeja de plata, hay que pensar gente!!

Espero que les haya ayudado, Saludos!

martes, 3 de mayo de 2011

Comparación de números

Es un programa sencillo que hice solo para un ejemplo.
El programa Recibe números en un vector A[i] (que sera nuestro universo), luego en un vector B[j] introduciremos los datos que queramos comprar con el vector A[i] para encontrar coincidencias y al final solo imprimimos

#include

int main(){
int N, n, j, i, cont;
printf("numeros a ingresar: ");
scanf("%d", &N);
int A[N];
for(i=0;i(<)N;i++){
printf("número A[%d] = ", i);
scanf("%d", &A[i]);
}
printf("cuantos números quieres comparar: ");
scanf("%d", &n);
int B[n];
for (i=0;i(<)n;i++){
printf("número B[%d] = ", i);
scanf("%d", &B[j]);
}
for(i=0;i (<) n;i++){
cont=0;
for(j=0;j (<) N;j++){
if(B[j]==A[i]){
cont=cont+1;
}
}
printf("el numero %d se repitio %d veces", B[j], cont);
}
return 0;
system("pause");
}

Para compilarlo utilice ubuntu con los siguientes comandos:

gcc (nombredearchivo).c

que genera un archivo a.out y lo ejecutaremos de la siguiente forma:

./a.out

Saludos!!

domingo, 27 de febrero de 2011

Firefox 4.0 "Minefield"en Ubuntu

Al querer borrar algunos archivos innecesarios, encontre este script que descargue hace poco (no recuerdo de donde). Entonces para no perderlo y compartirlo con los demas aquí les dejo el script para instalar firefox 4 Minefield beta en ubuntu.


Para instalarlo solo es cuestión de ejecutar el archivo .sh en terminal. Yo use este comando en ubuntu 10.10

$./Firefox\ 4.0\ installer.sh

Este post solo lo hago por diversión y para que le llegara a servir a alguien en el futuro.

Saludos!.

miércoles, 2 de febrero de 2011

Eliminar multiples opciones en el grub - Ubuntu

Bueno, a algunos nos ha pasado y he oido todo tipo de comentarios sobre al respecto: el grub se instalo mal, ubuntu me hace diferentes particiones, etc...

La razón por la que aparecen las múltiples opciones en el grub se trata sobre las actualizaciones del kernel. Algunas veces cuando instalamos actualizaciones, también se actualiza la versión del kernel de ubuntu, por consecuencia en el grub nos aparecen las opciones de acceder con el kernel actualizado o a la antigua versión.

Hay múltiples formas de dejar nuestro grub con solo una opción, dire la más sencilla: Usando Ubuntu Tweak.

¿Que es ubuntu tweak?
Bueno, algunos (por no decir todos) hemos usado alguna vez windows y sabemos que el windows debe limpiarse cada cierto tiempo y dar mantenimiento con algunos programas; Bueno Ubuntu tweak es el programa para personalizar y dar algo de mantenimiento a nuestro ubuntu. Tiene múltiples opciones como limpiador, manejador de ventanas, gestor de energía, etc...

La opción que nos interesa es "Package Cleaner" (limpiador de paquetes). Aqui nos vienen diferentes opciones para dar una limpiadita a nuestro ubuntu.

Escogeremos "Clean Kernels", con esta opción eliminaremos las versiones antiguas al kernel que este usando, asi se quitaran las demas opciones del grub.


*Nota: Queda a criterio del usuario, algunos programas tienen problemas con las nuevas versiones o funcionan mejor con versiones antiguas del kernel.

Bueno, aqui expuse con pocas palabras la opción más sencilla; pronto pondré 2 opciones más que son: Usando comandos en la termina y configurando el archivo menu.lts

Saludos!

domingo, 2 de enero de 2011

Probando Drivel

Bueno gente, esta es una entrada prueba con el programa "Drivel". Lo estoy utilizando en ubuntu 10.10 y sirve para publicar entradas de Blogger y otros "blogs"