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"

domingo, 21 de noviembre de 2010

Proyecto fnal (2)

Bueno, edite el proyecto final que tenia.
Aqui dejo el video explicandolo:




Y tengo una hyper duda (y que da error en el juego): tengo el clip "Bala", este tiene ciertas acciones, pero cuando hago los duplicados (balas que se disparan al apretar space) estas no hacen las acciones de bala.
Mi duda es como hacerlas

Les dejo la aplicación (que nunca me cargo en facebook)
http://apps.facebook.com/psycochallenge/
(que tambien vienen el link para las descarga)


Aqui les dejo el fla. y el codigo, para que me ayuden en mi duda.
Descargar Proyecto

Bueno, la explicación general del proyecto esta en la entrada pasada.

Saludos!

jueves, 18 de noviembre de 2010

Facebook App: Nave Espacial

Bueno, explicare más o menos lo que consta mi trabajo. Es una aplicación flash, que trata de una nave que va en el espacio matando a sus enemigos.
Lo elementos de lo que consta el juego (lo que llevo) son:

Nave:
Este objeto se mueve con
las flechas del teclado.
Dispara el elemento (clip de pelicula) "disparo".






Nave Enemiga:
Tiene trayectoria aleatoria (en el eje y)
Se reproduce el elemento cada cierto
tiempo.


Disparo


Bueno ahora pondre lo codigos que use en cada uno de los elementos como en el flash. Empezare con la nave:

Nave:
onClipEvent(load)
{
function reset()
{
this._x = 100;
this._y = 150;
}
reset()
}

En la nave esta este script, se hace una uncion reset que se utilizaría por ejemplo: "Una nave enemiga choco contigo", ahi tendriamos que usar este script para volver a poner la nave en posición x = 100, y = 150.

Disparo (bala):

onClipEvent(enterFrame){
this.onEnterFrame = function()
{
this._x += 12;
if (this._x > 550)
{
this.removeMovieClip();
}
}
}

En este elemento ponemos su velocidad (desplazamiento) en el eje x que seria igual a 12 fps (corrijanme si estoy mal).
Luego se hace una comparación que podría decirse : si el disparo esta en posición mayor a los x = 550 entonces borra disparo" (o asi lo interpreto yo); esto quiere decir, que despues de hacer nuestro disparo este se desplazara cierta cantidad en x y al llegar a cierto punto (en este caso la posicion 550 en x) el elemento se borrara (no tiene caso que siga al infinito...)

Nave enemiga:

onClipEvent(load)
{
function reset()
{
var timer = 12;
this._y = Math.random() * 300
this._x = 550
mySpeed = Math.ceil(Math.random() * 6) + 1;
}
reset();
}

Primero se declara una función reset() que servirá para ubicar en cierta posición nuestra nave. Lo que hace esta función es ubicar a nuestra nave en la posición 550 (al final de nuestro flash, de ahi salen las naves...) y una posición en y aleatoria; con la linea this._y = Math.random() * 300 nuestra nave se puede posicionar en diferentes puntos en el plano y (asi da la sensación de diferentes naves saliendo en la pantalla).

Otras lineas:
onClipEvent(enterFrame)
{
this._x -= mySpeed;
if (this._x < -10) //Cuando la nave enemiga sale de la pantalla hacia la izquierda
{
reset(); //Se llama para ubicar una nave nueva
}


if (timer >= 12)
{
var dir = Math.ceil(Math.random() * 2) //variable dirección
//Aqui Math.random consigue solo numeros comprendidos entre 0 y 1, cuando lo multiplicamos por 2, Math.ceil decrementa o incrementa el valor hacia el valor más próximo (para dejar enteros), por eso en este caso solo obtendríamos números 1 y 2
timer = 0; // se iguala la variable timer a 0
}
if (dir == 1)
{
//if dir = 1,
this._y -= 3; //la nave se mueve hacia arriba
}
else if(dir == 2)
{
this._y += 3; //la nave se mueve hacia abajo
}
timer++ //incrementamos a timer 1; cuando timer sea igual a 12 obtendremos una nueva dirección
}

Flash:

var i = 0; //esta variable la utilizaremos más adelante
this.onEnterFrame = function()
{
_root["Bala" + i]._x += 25; //aquí llamo a los duplicados de mi bala, asi cuando los invoque estos tendrian una velocidad de 25 en eje x

//Aqui comienza lo del teclado:
if (Key.isDown(Key.RIGHT))//Cuando se aprieta la tecla derecha
{
if (Nave.hitTest(550, Nave._y, true))//más adelante explicare esto
{
Nave._x -= 5;
}
Ship._x += 10; //velocidad de la nave
} else if (Key.isDown(Key.LEFT))//Cuando se aprieta la tecla izquierda
{
if (Nave.hitTest(0, Nave._y, true))
{
Ship._x += 5;
}
Ship._x -= 10;//velocidad
} else if (Key.isDown(Key.UP))//cuando se aprieta la tecla arriba
{
if (Nave.hitTest(Nave._x - 40, 0, true))
{
Ship._y += 5;
}
Ship._y -= 10;
} else if (Key.isDown(Key.DOWN))//cuando se aprieta la tecla abajo
{
if (Nave.hitTest(Nave._x - 40, 300, true))
{
Ship._y -= 5;
}
Ship._y += 10;
}
if (Key.isDown(Key.SPACE))//cuando se aprieta la barra espaciadora
{
i++;//aqui incrementamos la variable "i" del principio
_root.attachMovie("Bala", "Bala" + i, _root.getNextHighestDepth());//haremos una copia de Disparo(bala) y lo ataremos a la posición de la nave
_root["Bala" + i]._x = Nave._x + 25;//posición de la bala con respecto a nuestra nave
_root["Bala" + i]._y = Nave._y;
}
}

hitTest:
Explicare lo del hitTest (que lamentablemente no he podido hacerlo funcionar en el flash).

Se utiliza el hitTest, en el caso de nuestro flash, para saber si 2 clip de pelicula estan cerca o se sobreponen, en este caso se libera una acción.
El hitTest lo podriamos usar en nuestro flash si se sobreponen la bala con la nave enemiga, en este caso podriamos pedir que se eliminara el clip de la nave enemiga, asi daría el efecto de haberla destruido.

Aqui les dejo un ejemplo del flash (que le falta, lo admito.), pero que me sirvio de mucho para aprender un poco del javascript.


La aplicación se subio a facebook con la instrucciones sacados de mi compañero Avedaño

La aplicación se hizo con respecto a un tutorial en internet Click Aqui


Cualquier duda, sugerencia o aclaración comenten.