Comunidad de diseño web y desarrollo en internet online

Reto de lógica de programación

Ir a página 1, 2  Siguiente

Foros de discusión > Charla

Citar            
MensajeEscrito el 24 Feb 2009 07:16 am
A ver, sorry que lo ponga en este foro pero si bien empezó siendo de actionscript se acepta cualquier lenguaje mientras no sea pseudo código o la función la tenga built-in.

La idea es generar una función que agregue comas sepadora de miles a un número de cualquier tipo.

Entre cosas que deberian de fijarse esta en la cantidad de línea, la velocidad de ejecución y las validaciones a malos inputs tenga.

A ver que sale :)

Por fernando

Claber

592 de clabLevel

3 tutoriales
3 articulos

 

firefox
Citar            
MensajeEscrito el 24 Feb 2009 07:58 am
Te lo dije por Tweet, si mi AS3 no te sirvio... en PHP es demasiado simple, ya lo habia tenido que hacer una vez...

http://ar.php.net/number-format

El problema consiste en que AS3 no tiene equivalente a esta funcion segun entiendo.

Por tomasdev

220 de clabLevel

1 tutorial

 

Argentina por ahora...

firefox
Citar            
MensajeEscrito el 24 Feb 2009 08:15 am

Por tomasdev

220 de clabLevel

1 tutorial

 

Argentina por ahora...

firefox
Citar            
MensajeEscrito el 24 Feb 2009 08:29 am
Pues si no quieren participar no pongan soluciones de otros. La idea es que se manden a pensar y no que desarrollen su habilidad de búsqueda.

Por cierto, las funciones de actionscript.org son horribles y tiene errores a la vista con solo leerlos.

Si van a buscar que les sirva como idea pero pongan aqui algo original. Vamos! que no es difícil!

Por fernando

Claber

592 de clabLevel

3 tutoriales
3 articulos

 

firefox
Citar            
MensajeEscrito el 24 Feb 2009 12:08 pm

fernando escribió:

Pues si no quieren participar no pongan soluciones de otros. La idea es que se manden a pensar y no que desarrollen su habilidad de búsqueda.

Por cierto, las funciones de actionscript.org son horribles y tiene errores a la vista con solo leerlos.

Si van a buscar que les sirva como idea pero pongan aqui algo original. Vamos! que no es difícil!


No entiendo , ¿es un desafío? o ¿necesitas que te hagan un código? :lol: :lol:
Saludos

Por Ancelot

Claber

496 de clabLevel

1 tutorial

Genero:Masculino  

En el Fin del Mundo

firefox
Citar            
MensajeEscrito el 24 Feb 2009 12:11 pm

Código :

#include <conio.h>
#include <iostream.h>

void main(){

  clrscr();
  char arreglo[10];
  cout <<"Digite la cifra: ";
  cin >>arreglo;
  cout <<"\n";
  for(int i = 0; arreglo[i] != null; i++)
  if( i % 3 == 0 )
  cout << ",";
  cout << arreglo[i];
  getch();
}


Que tal?

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

firefox
Citar            
MensajeEscrito el 24 Feb 2009 04:09 pm
Creo que la idea de i%3 es fija de todos...

Igual creo que el mio funciona bien... no sera lo optimo pero bueno :$

Código :

 1.
      function formatear(e:Number){ // ingreso numero
   2.
              var retornar:String;
   3.
              var decimales:String = "";
   4.
              if((String(e).length - String(e).split(".").join("").length) > 0){
   5.
                      retornar = String(e).substr(0, String(e).indexOf("."));
   6.
                      decimales = String(e).substr(String(e).indexOf("."), String(e).length);
   7.
              }else{
   8.
                      retornar = String(e);
   9.
              }
  10.
              var c:int = 0; // cantidad de comas
  11.
              for(var i:int = 0;(i+c) < retornar.length;i++){
  12.
                      if(i % 3 == 0 && i != 0){
  13.
                              var h:int = i/3;
  14.
                              retornar = retornar.substr(0, -(i+h-1)) + "," + retornar.substr(-(i+h-1), i+h-1);
  15.
                              c++;
  16.
                      }
  17.
              }
  18.
              return retornar+decimales; // devuelve string, con la coma dejaria de ser number
  19.
      }
  20.
      trace(formatear(1));
  21.
      trace(formatear(12.3));
  22.
      trace(formatear(1214124124));
  23.
      trace(formatear(159182619826.498162));
  24.
      trace(formatear(12345));


de http://pastebin.com/ma6f4190 by me

Por tomasdev

220 de clabLevel

1 tutorial

 

Argentina por ahora...

firefox
Citar            
MensajeEscrito el 24 Feb 2009 04:40 pm
Ammm eso no es un reto.. hay muchas formas de tratar un numero y formatearlo como currency.
cualquiera con un poco de lógica de programación te lo resuelve..

Un reto es algo que lógicamente a veces parece imposible.. pero que no lo es.

Por phoxer

Claber

827 de clabLevel

4 tutoriales

Genero:Masculino  

Ing en Sistemas

firefox
Citar            
MensajeEscrito el 24 Feb 2009 05:17 pm
No creo que sea muy complicado.
Veré si hago una version As3 (No te la aseguro)

Por JaLeRu

Claber

1913 de clabLevel

7 tutoriales

Genero:Masculino  

Existo

firefox
Citar            
MensajeEscrito el 24 Feb 2009 05:36 pm
Paso numero uno , entrenar un chango



paso numero dos darle un lapiz



paso numero tres

gane :D

Por FeNtO

BOFH

5091 de clabLevel

18 tutoriales

1 ejemplo

  Bastard Operators From Hell

FeNtO DataCenter

firefox
Citar            
MensajeEscrito el 24 Feb 2009 06:06 pm
Je todos dicen que es muy fácil pero no veo a nadie poniendo un código.

Si es un reto no porque sea imposible resolverlo si no el reto esta en hacerlo de manera más corta y rápida que la otra persona.

No necesito que me hagan ningún código, gracias!

@LongeVie Gracias por tomarte el tiempo. Tu script esta genial pero si ingresas un decimal le agrega comas tb

@Loon Gracias tb por tomarte el tiempo. El script funciona super bien pero creo que se puede optimizar aún más. Como te decia, si tienes una cadena de texto aparte te puedes olvidar de la variable "c" ya que tu cadena anterior no cambiaria de length jamás.


Como pregunta aparte, porque es tan difícil querer hacer cosas en esta comunidad? Porque a todo le encuentran peros?

Por fernando

Claber

592 de clabLevel

3 tutoriales
3 articulos

 

firefox
Citar            
MensajeEscrito el 24 Feb 2009 06:12 pm


Mi otro server no andaaaa!!! malditos..
Pero ahi tenes "el desafio" completo.. :wink:

Por phoxer

Claber

827 de clabLevel

4 tutoriales

Genero:Masculino  

Ing en Sistemas

firefox
Citar            
MensajeEscrito el 24 Feb 2009 06:47 pm
Este reto esta sensssichiiito. De hecho ayer en la noche lo hice, lo escibrí en el notepad pero al hacer copy/paste mientras hablaba con una amiga, volví a hacer copy/paste y perdí mi code. Hoy lo volví a hacer de nuez ¬¬, pero desde ayer iba a decir que estaba refácil.

Como digo lo hice al aire, el code lo podría mejorar, pero lo hice al vapor, en la primera testeanda funcionó y ya no lo pulí. Pero esta funcionando, si alguien quiere pulirlo adelante, el nucleo donde agrego las comas, me parece muy óptimo, en los adornos y demás que le puse esta un desmaye, pero no era el caso pulirlo(pa no perder tiempo de trabajo xD).

Pero en realidad a mi un reto para que me llame la atención tiene que poner a trabajar mas mi mente. No es que en clab sea difícil ser algo, es que mas bien hay que acostumbrarnos a lo que nos gusta.

Copien el code y péguenlo en una página HTML y va a funcionar. Respeta decimales, comas y signo negativo. Si escriben un NaN(Not a Number), les da un cariñoso saludo.

Código :

<script>
function AddComma()
{
   var lAmountArray = String(document.getElementById("dano-rlz").value.split(",").join("")).split(".",2)
   var lAmountInt = parseInt(lAmountArray[0]);
   if(isNaN(lAmountInt) || (lAmountArray[1] != undefined && isNaN(parseInt(lAmountArray[1]))) ) { if(document.getElementById("dano-rlz").value.length > 0){ document.getElementById("erg-wey").value="Weysote ese no es número!!!";} return null;}
        document.getElementById("erg-wey").value="";
   var lMinus = "";
   if(lAmountInt < 0) { lMinus = "-"; }
   var lNewString = new String(Math.abs(lAmountInt));
   var lArray = [];
   while(lNewString.length > 3)
   {
      var nn = lNewString.substr(lNewString.length-3);
      lArray.unshift(nn);
      lNewString = lNewString.substr(0,lNewString.length-3);
   }
   if(lNewString.length > 0) { lArray.unshift(lNewString); }
   lNewString = lArray.join(",");
   if(lAmountArray[1] != undefined ){ lNewString += "." + parseInt(lAmountArray[1]); }
   document.getElementById("dano-rlz").value = lMinus + lNewString;
}
setInterval("AddComma()",100);
</script>
<input id="dano-rlz" style="width: 300px; padding: 8px; font-size: 16pt; color:#7d8fbF; border: 2px solid #7d8fbF;" maxlength="20" />
<br />
<input id="erg-wey" style="width: 500px; padding: 8px; font-size: 26pt; color:#DF0000; border: none;" maxlength="20" />


Si te creas un reto de crear el mejor efecto visual con puro AS o algo así, me llamaría la atención y el fin de semana podría dedicar un par de horas a el, y no simples dos minutos como en este. Buena la idea, solo que en verdad es un tema que no le vemos mucha complejidad.

saludos :wink:

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 24 Feb 2009 06:52 pm
Holy shit, Dano. Eso que hiciste te quedó genial. Me encanta.

Por Freddie

BOFH

53 tutoriales
597 articulos
43 ejemplos

Genero:Masculino   Admin

Conserje de Cristalab

firefox
Citar            
MensajeEscrito el 24 Feb 2009 06:56 pm
@phoxer muy bueno, gracias. Deberia aceptar números negativos. Además seria genial que pusieras la función para que todos la vean.

@Dano muy bonito. El reto viene no de hacerlo si de hacerlo de mejor manera que los demás.

Por fernando

Claber

592 de clabLevel

3 tutoriales
3 articulos

 

firefox
Citar            
MensajeEscrito el 24 Feb 2009 07:14 pm

Código ActionScript :

function addComas(value:Number):String{
   var tmp:Array = value.toString().split(".");
   while(/(\d+)(\d{3})/.test(tmp[0])) tmp[0] = tmp[0].replace(/(\d+)(\d{3})/, "$1,$2");
   return tmp[0] + ((tmp.length > 1) ? "." + tmp[1]: "");
}

Por fernando

Claber

592 de clabLevel

3 tutoriales
3 articulos

 

firefox
Citar            
MensajeEscrito el 24 Feb 2009 07:21 pm
Weysote ese no es número!!!


:P

¿Que hace que un script sea mejor que otro, aparte de lo evidente? el numero de lineas de codigo no creo que sea la respuesta.

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

firefox
Citar            
MensajeEscrito el 24 Feb 2009 07:22 pm
@LongeVie El tiempo de ejecución y la protección contra datos inválidos

Por fernando

Claber

592 de clabLevel

3 tutoriales
3 articulos

 

firefox
Citar            
MensajeEscrito el 24 Feb 2009 07:24 pm

fernando escribió:

@LongeVie El tiempo de ejecución y la protección contra datos inválidos
Weysote ese no es número!!!

Por Freddie

BOFH

53 tutoriales
597 articulos
43 ejemplos

Genero:Masculino   Admin

Conserje de Cristalab

firefox
Citar            
MensajeEscrito el 24 Feb 2009 07:50 pm
Creo que alguien nos quería presumir que aprendió expresiones regulares. :lol: (ntc just kidding)

fernando escribió:

@LongeVie El tiempo de ejecución y la protección contra datos inválidos


Lo cual me convierte en un triunfal ganador. Wiiii! Desde que vi expresiones regulares, supe que el triunfo sería mío. Las expresiones regulares SIEMPRE toman mas tiempo que cualquier otro proceso. Desafortunadamente muchos creen que por ser difíciles son c00l, pero la realidad es que solo hay que utilizarlas cuando REALMENTE son necesarias.

Simplemente para confirmar mi heroico triunfo puse tu script junto al mío y los ejecuté. Afortunadamente Actionscript corre bajo el mismo estandar de JS(ecma). A tu código solo le quité el datatype que sabemos JS no lo acepta. De ahí en fuera es idéntico y SI FUNCIONA. A mi código le quite los adornos y el tierno mensaje de error, para estar en igualdad de circunstancias.

Cree un ciclo de 10,000 ejecuciones para realmente probar de forma ruda el code y los resultados hablan por si solos:
Dano, siempre oscila entre 192 y 198 microsegundos
fernando, siempre oscila entre 250 y 270.

Por lo tanto el mío tarda tiene un menor tiempo de ejecución, ambos validamos datos, tu con la ventaja del typeado estricto de AS3. Pero igual eso es secundario, porque yo podría migrar igual el mío a AS y poner typeado. El tiempo de ejecución menor, es lo que me da el triunfo.

Muchas gracias a todos, este triunfo se lo dedico a mi familia, un saludo a mi mamá que me esta viendo.

Y bueno, después de todo el rollo, mejor compilemos(buueeno ejecutemos):

Código :

<script>
function addComasFernando(value){ 
   var tmp= value.toString().split("."); 
   while(/(\d+)(\d{3})/.test(tmp[0])) tmp[0] = tmp[0].replace(/(\d+)(\d{3})/, "$1,$2"); 
   return tmp[0] + ((tmp.length > 1) ? "." + tmp[1]: ""); 
} 
function addComasDano(lvalue)
{
   var lAmountArray = String(lvalue).split(".",2);
   var lAmountInt = parseInt(lAmountArray[0]);
   var lMinus = "";
   if(lAmountInt < 0) { lMinus = "-"; }
   var lNewString = new String(Math.abs(lAmountInt));
   var lArray = [];
   while(lNewString.length > 3)
   {
      var nn = lNewString.substr(lNewString.length-3);
      lArray.unshift(nn);
      lNewString = lNewString.substr(0,lNewString.length-3);
   }
   if(lNewString.length > 0) { lArray.unshift(lNewString); }
   lNewString = lArray.join(",");
   if(lAmountArray[1] != undefined ){ lNewString += "." + parseInt(lAmountArray[1]); }
   return lMinus + lNewString;
  
}
var i;
var fernando_time = new Date();
for(i=0; i<10000; i++)
{
   addComasFernando(10000000000);
}
ms_fernando = new Date() - fernando_time;

var dano_time = new Date();
for(i=0; i<10000; i++)
{
   addComasDano(10000000000);
}
ms_dano = new Date() - dano_time;


alert("Microsegunos de gran rey Dano: " + ms_dano + "\n Microsegundos de fernando: " + ms_fernando);
</script>

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 24 Feb 2009 07:55 pm
jeje no lo he probado pero muy bueno. aunque aun no se cante victoria :)

animense a mandar sus opciones!

Por fernando

Claber

592 de clabLevel

3 tutoriales
3 articulos

 

firefox
Citar            
MensajeEscrito el 24 Feb 2009 07:55 pm
Ahora si tiene tintes de competencia.

Dano (y)

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

firefox
Citar            
MensajeEscrito el 24 Feb 2009 08:21 pm
Es que depende del navegador y del sistema operativo. El regexp correo mas rapido en ff3.

No tenia idea que para javascript era mas rapido el manejo de cadenas. En todo caso aqui esta una función con manejo de cadenas que gana en todos los navegadores:

Código Javascript :

function addComasFernando(value){ 
   var tmp = Math.abs(value).toString().split(".");
   for(var i=tmp[0].length, res="";i>0;i-=3) res = tmp[0].substring(i-3, i) + ((i<tmp[0].length) ? ",": "") + res;
   return ((value < 0) ? "-" + res: res) + ((tmp.length > 1) ? "." + tmp[1]: "");
} 

Por fernando

Claber

592 de clabLevel

3 tutoriales
3 articulos

 

firefox
Citar            
MensajeEscrito el 24 Feb 2009 08:23 pm
Aun se puede depurar mas... vamos! quien mas manda sus opciones :)

Por fernando

Claber

592 de clabLevel

3 tutoriales
3 articulos

 

firefox
Citar            
MensajeEscrito el 24 Feb 2009 08:24 pm

fernando escribió:

Es que depende del navegador y del sistema operativo. El regexp correo mas rapido en ff3.

No tenia idea que para javascript era mas rapido el manejo de cadenas. En todo caso aqui esta una función con manejo de cadenas que gana en todos los navegadores:

Código Javascript :

function addComasFernando(value){ 
   var tmp = Math.abs(value).toString().split(".");
   for(var i=tmp[0].length, res="";i>0;i-=3) res = tmp[0].substring(i-3, i) + ((i<tmp[0].length) ? ",": "") + res;
   return ((value < 0) ? "-" + res: res) + ((tmp.length > 1) ? "." + tmp[1]: "");
} 
And Dano got served!

Por Freddie

BOFH

53 tutoriales
597 articulos
43 ejemplos

Genero:Masculino   Admin

Conserje de Cristalab

firefox
Citar            
MensajeEscrito el 24 Feb 2009 08:36 pm

fernando escribió:

Código ActionScript :

function addComas(value:Number):String{
   var tmp:Array = value.toString().split(".");
   while(/(\d+)(\d{3})/.test(tmp[0])) tmp[0] = tmp[0].replace(/(\d+)(\d{3})/, "$1,$2");
   return tmp[0] + ((tmp.length > 1) ? "." + tmp[1]: "");
}


Fernando tu script tiene un error con numeros grandes... que pasa si hay que hacer un programa para la cuenta de bill Gate??? U_U

Tu script con un numero mayor a 20 como 123456789012345678901
te da como resultado : 123,456,789,012,345,680,000 (error)

y si le sumamos mas dijitos, digamos 25 digitos?? 1234567890123456789012345
da como resultado un bonito : 1.23456789012345e+24

Sin embargo mi swf si acepta numeros negativos... y del tamaño que quieras.. :wink:
(no probe el de dano sinceramente )

proba el numero de 25 dijitos en mi swf.. incluso negativo -1234567890123456789012345678
(si acepta negativos)

saludos :)

Por phoxer

Claber

827 de clabLevel

4 tutoriales

Genero:Masculino  

Ing en Sistemas

firefox
Citar            
MensajeEscrito el 24 Feb 2009 08:39 pm

phoxer escribió:

fernando escribió:

Código ActionScript :

function addComas(value:Number):String{
   var tmp:Array = value.toString().split(".");
   while(/(\d+)(\d{3})/.test(tmp[0])) tmp[0] = tmp[0].replace(/(\d+)(\d{3})/, "$1,$2");
   return tmp[0] + ((tmp.length > 1) ? "." + tmp[1]: "");
}


Fernando tu script tiene un error con numeros grandes... que pasa si hay que hacer un programa para la cuenta de bill Gate??? U_U

Tu script con un numero mayor a 20 como 123456789012345678901
te da como resultado : 123,456,789,012,345,680,000 (error)

y si le sumamos mas dijitos, digamos 25 digitos?? 1234567890123456789012345
da como resultado un bonito : 1.23456789012345e+24

Sin embargo mi swf si acepta numeros negativos... y del tamaño que quieras.. :wink:
(no probe el de dano sinceramente )

proba el numero de 25 dijitos en mi swf.. incluso negativo -1234567890123456789012345678
(si acepta negativos)

saludos :)


Tienes razón dude! :) Gracias! En todo caso ya vimos que regexp no es la mejor solución.

Gracias!

Por fernando

Claber

592 de clabLevel

3 tutoriales
3 articulos

 

firefox
Citar            
MensajeEscrito el 24 Feb 2009 08:47 pm

fernando escribió:


Tienes razón dude! :) Gracias! En todo caso ya vimos que regexp no es la mejor solución.

Gracias!


No es que no sea la mejor solución, para ciertas cosas como validaciones por ejemplo sirve y mucho
yo a mi script le encontré un error que tenia gracias a este post, ya lo arregle :)

Por phoxer

Claber

827 de clabLevel

4 tutoriales

Genero:Masculino  

Ing en Sistemas

firefox
Citar            
MensajeEscrito el 24 Feb 2009 08:51 pm
Buenísimo phoxer :) porque no compartes tu función y asi la probamos junto con el resto?

Por fernando

Claber

592 de clabLevel

3 tutoriales
3 articulos

 

firefox
Citar            
MensajeEscrito el 24 Feb 2009 09:02 pm

fernando escribió:

Buenísimo phoxer :) porque no compartes tu función y asi la probamos junto con el resto?

Pues si.. ya que mi servidor no anda, la tenia publicada en mi pagina!!! :cry:

Esta es la clase:

Código ActionScript :

/**
by .:[PHOXER]:.
http://www.phoxer.com
v 1.5; 
*/
package phoxer.Strings{
   public class Money{
      public var simbolo:String="$";
      public var numDiv:String=",";
      public var decDiv:String=".";
      public var decimales:Boolean=true;
      
      public function parseMoney(num:Number):String{
         var sptNum:Array= String(num).split(".");
         return parse(sptNum);
      }
      
      public function parseMoneyByString(num:String):String{
         var sptNum:Array= String(num).split(".");
         return parse(sptNum);
      }
      
      private function parse(sptNum:Array):String{
         sptNum[0]=(sptNum[0]==undefined)? "0":sptNum[0];
         if(decimales){
            sptNum[1]=(sptNum[1]==undefined)? String(decDiv+"00"):String(decDiv+sptNum[1]).substr(0,3);
         }else{
            sptNum[1]="";
         }
         var result:String="";
         
         if(sptNum[0]!="0"){
            var numArray:Array=String(sptNum[0]).split("");
            numArray.reverse();
            var preNum:Array= new Array();
            var i:int=0;
            for each(var a:String in numArray){
               if(i<3 || a=="-"){
                  preNum.push(a);
               }else{
                  preNum.push(numDiv);
                  preNum.push(a);
                  i=0;
               }
               i++
            }
            preNum.reverse();
            var numero:String="";
            for each(var b:String in preNum){
               numero+=b;
            }
            result=numero+sptNum[1];
         }else{
            result=sptNum[0]+sptNum[1];
         }
         return simbolo+result;
      }
      
      public function decodeMoney(num:String):Number{
         var preNum:String=String(num.split(numDiv).join("")).split(simbolo).join("");
         return Number(preNum);
      }
   }
}


y se implementa asi:

Código ActionScript :

import phoxer.Strings.Money;

var mny:Money= new Money();
mny.decimales=true;
mny.simbolo="$";

trace(mny.parseMoney(0.00));  //$0.00
trace(mny.parseMoney(1000.45)); //$1,000.45
trace(mny.parseMoney(1650.045)); //$1,650.04
trace(mny.parseMoney(.5483)); //$0.54
trace(mny.parseMoney(003.5483)); //$300,000.36
trace(mny.parseMoney(-003.5483)); //$-3.54
trace(mny.parseMoney(-84030.5483)); //$-84,030.54

//numeros grandes
trace(mny.parseMoneyByString("12345678901234567890123456")); //$12,345,678,901,234,567,890,123,456.00
trace(mny.parseMoneyByString("-12345678901234567890123456")); //$-12,345,678,901,234,567,890,123,456.00

//Convertir a numero (todabia no para numeros grandes)
trace(mny.decodeMoney("$1,650.04")); //1650.04
trace(mny.decodeMoney("$-3.54"));  //-3.54
trace(mny.decodeMoney("$-8,403")); //-8403


Si quieren se puede hacer algun tip, la tengo hace bastante para proyectos con carros de compras...
si alguien quiere mejorarla mejor :)

Por phoxer

Claber

827 de clabLevel

4 tutoriales

Genero:Masculino  

Ing en Sistemas

firefox
Ir a página 1, 2  Siguiente
Foros de discusión > Charla

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.