Contacto | #php_para_torpes | Enlázanos | ¿Quiénes somos?
16 usuarios Online (0)
Darse de alta en la web | Recuperar password   
Inicio / Desafios / Carácter Marciano / Solucion de yandalf

Desafío Carácter Marciano

#3 Solución de yandalf

Código de la Solución Ver código | Comentarios Ver comentarios (0) | Descargar Descargar código

Fecha: 04 septiembre 2006

Tamaño: 52703 caracteres

Comentarios: 0

Solución online:
http://yandalf.php5.cz/caracter_marciano/

Premios
Código premiado Correcto!

Valoración PuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuación 6.00 (1 votos)

"Van las 3 versiones que he realizado, cada version viene delimitada por <?php y ?> y en la cabecera se muestra el nombre de cada archivo. Presentación de las tres soluciones aqui:

http://yandalf.php5.cz/caracter_marciano/"

Valora esta solución

<?php
/***********************************************
* Desafio: Caracter Marciano
* Fichero:desafiov1.php
* Autor: Rafael Jiménez (yandalf)
* Fecha: 04/09/06
* Restricciones: Todas las lineas son iguales
* y tenemos en el \r y el \n como limitadores
* de linea.
************************************************/

    //En PHP5 sería posible utilizar microtime(1) y sería similar,añadida para compatibilidad
    //para más info http://www.php.net/microtime
    
function microtime_float()
    {
       list(
$useg, $seg) = explode(' ', microtime());
       return ((float)
$useg + (float)$seg);
    }
    
    
//Inicializamos el contador de tiempo
    
$inicio=microtime_float();
    
    
//Cabecera del tipo de imagen
    
header("Content-type: image/png");
    
//leemos el contenido del fichero
    
$lineas=file('marcianos.txt');    
    
//Carcateres de cada línea suponiendo que sean todas las líneas de igual longitud
    
$ancho=strlen($lineas[0]);
    
//Número de lineas
    
$alto=count($lineas);
    
//Creamos la imagen a partir del número de lineas y la longitud de cada línea
    
$imagen = imagecreate($ancho,$alto) or die('No puedo crear la imagen');
    
    
//La cadena de caracteres a utilizar
    
$cadena_caracteres='';
    foreach(
$lineas as $linea){        
        
//todos los carcateres, ya que el \r\n servirá como delimitador de línea
        
$cadena_caracteres .= $linea;
    }
    
//Obtenemos el array de todos los elementos para ver las densidades de color (se incluye el \n o \r)
    //ya que array_count_values los considera como iguales
    
$paleta_caracteres=array_count_values(str_split($cadena_caracteres));
    
//Ordenamos de menor a mayor las densidades
    
asort($paleta_caracteres);
    
//Calculamos el aumento de color para diferenciar entre los colores de la imagen
    //El -1 es para evitar que el redondeo pueda generar valores superiores a 255.
    
$aumento_color=round( (255/count($paleta_caracteres)));
    
//Creamos la "paleta" de colores y evitamos el rbg(0,0,0) mediante $contador=1;
    
$contador=1;
    foreach(
$paleta_caracteres as $indice => $valor){
            
$valor_rgb =($aumento_color * $contador++)-1;
            
$paleta_caracteres[$indice]=imagecolorallocate($imagen,$valor_rgb,$valor_rgb,$valor_rgb);
    }
    
//Inicialización de la variables necesaria para ir generando la imagen
    
$coordenada_y=0; //Coordenada y de la imagen
    
for ($i=0; $i< strlen($cadena_caracteres)-1; $i+=$contador){
        
//Hay que tener en cuenta que trabajamos en $ancho( coordenada_x) X $alto(coordenada_y)
        //Por ejemplo en una matriz 3x3 el (1,1) sería el 4 elemento
        
$coordenada_x= $i-($ancho * $coordenada_y);
        
//Contador para la coordenada_x
        
$contador=0;
        
//Indice para ir recorriendo los caracteres dentro de $cadena_caracteres
        
$indice=$i;
        
        
//sino buscamos hasta que exista un caracter diferente al anterior
        
while($cadena_caracteres[$indice]==$cadena_caracteres[$indice+1]){
            
$contador++;
            
$indice++;
        }
        
//Buscamos el salto de linea
        
if($cadena_caracteres[$indice]=="\r" || $cadena_caracteres[$indice]=="\n"){
            
//Pasamos a la siguiente linea, es decir a la siguiente fila de la matriz
            
$coordenada_y++;
            
//Pasamos los caracteres "\r" y "\n"
            
$contador++;
        }
        
//recogemos el color del caracter
        
if($cadena_caracteres[$indice]!="\r" && $cadena_caracteres[$indice]!="\n"){
            
$color=$paleta_caracteres[$cadena_caracteres[$indice]];
            if(
$indice > $i){
                
//dibujamos una línea si hay varios caracteres iguales
                
imageline($imagen, $coordenada_x, $coordenada_y, ($coordenada_x + $contador), $coordenada_y, $color);
            }else{
                
//dibujamos un pixel si hay un caracter diferente detras de otro
                
imagesetpixel($imagen, $coordenada_x, $coordenada_y, $color);
            }
            
//Pasamos al siguiente caracter
        
}        
        
$contador++;        
    }
    
//Generamos el tiempo en generar la imagen
    
$color_texto=imagecolorallocate($imagen,0,0,200);
    
$tiempo=microtime_float()-$inicio.' seg';
    
imagestring($imagen, 1, 10, $coordenada_y-10,$tiempo,$color_texto);
    
imagepng($imagen);
    
imagedestroy($imagen);
?>

<?php
/***********************************************
* Desafio: Caracter Marciano
* Fichero:desafiov2.php
* Autor: Rafael Jiménez (yandalf)
* Fecha: 04/09/06
* Restricciones: Todas las lineas son iguales
* y tenemos en cuenta la longitud de linea como
* limitador excluyendo el \r y el \n
************************************************/
    
    /*
     Nota: las líneas mas cortas poseeran al final una linea negra fruto del color
     de fondo por defecto al crear una imagen nueva
    */     
    
    /*
     En PHP5 sería posible utilizar microtime(1) y sería similar,añadida para compatibilidad
     para más info http://www.php.net/microtime
    */
    
function microtime_float()
    {
       list(
$useg, $seg) = explode(' ', microtime());
       return ((float)
$useg + (float)$seg);
    }
    
    
//Inicializamos el contador de tiempo
    
$inicio=microtime_float();
    
//Cabecera del tipo de imagen
    
header('Content-type: image/png');
    
//leemos el contenido del fichero
    
$lineas=file('marcianos.txt');
    
//Inicializamos las variables para las densidades
    
$cadena_caracteres='';
    foreach(
$lineas as $linea){
        
//Caracteres excluyendo el \r y el \n
        
$cadena_caracteres .= trim($linea,"\r\n");
    }
    
$ancho=strlen(trim($lineas[0],"\r\n"));
    
//Número de lineas
    
$alto=count($lineas);
    
//Creamos la imagen a partir del número de lineas y la longitud de cada línea
    
$imagen = imagecreate($ancho,$alto) or die('No puedo crear la imagen');
    
//Obtenemos el array de todos los elementos para ver las densidades de color
    
$paleta_caracteres=array_count_values(str_split($cadena_caracteres));
    
//Ordenamos de menor a mayor las densidades
    
asort($paleta_caracteres);
    
/*
     Calculamos el aumento de color para diferenciar entre los colores de la imagen
     El -1 es para evitar que el redondeo pueda generar valores superiores a 255.
    */
    
$aumento_color=round( (255/count($paleta_caracteres)))-1;
    
//Creamos la "paleta" de colores en escla de grises (los 3 valores rgb iguales)
    
$contador=1;
    foreach(
$paleta_caracteres as $indice => $valor){
            
$valor_rgb = $aumento_color * $contador++;
            
$paleta_caracteres[$indice]=imagecolorallocate($imagen,$valor_rgb,$valor_rgb,$valor_rgb);
    }
    
/*
     Longitud de la cadena de caracteres, el -1 es debido a que compararmos el caracter n con el n+1
     y asi evitamos sobreflujo en el array
    */
    
$longitud=strlen($cadena_caracteres)-1;
    
//Coordenada y de la imagen que comienza en 0
    
$coordenada_y=0;
    for (
$i=0; $i< $longitud; $i+=$contador){
        
//Limite de la línea
        
$limite=$ancho-1;
        
/* Averiguamos la coordenada x en función del ancho de linea y de la línea en la que estemos
           Asi en una matriz de 3x3 con un total de 9 elementos e inicio en el (0,0) el elemento 4 sería
           en coordenadas el (1,1):
           Coordenada x= 4 - 3 * 1
           */
        
$total=$coordenada_x= $i-($ancho * $coordenada_y);
        
//Contador para la coordenada_x y para aumentar el bucle for
        
$contador=0;
        
//Indice para ir recorriendo los caracteres dentro de $cadena_caracteres
        
$indice=$i;
        
//sino buscamos hasta que exista un caracter diferente al anterior
        
while( ($cadena_caracteres[$indice]==$cadena_caracteres[$indice+1]) && ($total < $limite-1) ){
            
$contador++;
            
$indice++;
            
$total++;
        }
        
//recogemos el color del caracter
        
$color=$paleta_caracteres[$cadena_caracteres[$i]];
        if(
$indice > $i){
            
//dibujamos una línea si hay varios caracteres iguales
            
imageline($imagen, $coordenada_x, $coordenada_y, $total, $coordenada_y, $color);
        }else{
            
//dibujamos un pixel si hay un caracter diferente detras de otro
            
imagesetpixel($imagen, $coordenada_x, $coordenada_y, $color);
        }
        
        if(
$total == $limite){
            
//Pasamos a la siguiente linea, es decir a la siguiente fila de la matriz
            
$coordenada_y++;
        }
        
//Pasamos al siguiente caracter        
        
$contador++;    
    }
    
//Generamos el tiempo en generar la imagen
    
$color_texto=imagecolorallocate($imagen,0,0,200);
    
$tiempo=microtime_float()-$inicio.' seg';
    
imagestring($imagen, 1, 10, $coordenada_y-10,$tiempo,$color_texto);
    
imagepng($imagen);
    
imagedestroy($imagen);     
?>
<?php
/***********************************************
* Desafio: Caracter Marciano
* Fichero:desafiov3.php
* Autor: Rafael Jiménez (yandalf)
* Fecha: 04/09/06
* Restricciones: Las lineas pueden ser desiguales
* y tenemos como limitadores la longitud de cada
* linea.
************************************************/
    
    /*
     Nota: las líneas mas cortas poseeran al final una linea negra fruto del color
     de fondo por defecto al crear una imagen nueva
    */     
    
    /*
     En PHP5 sería posible utilizar microtime(1) y sería similar,añadida para compatibilidad
     para más info http://www.php.net/microtime
    */
    
function microtime_float()
    {
       list(
$useg, $seg) = explode(' ', microtime());
       return ((float)
$useg + (float)$seg);
    }
    
    
//Inicializamos el contador de tiempo
    
$inicio=microtime_float();
    
//Cabecera del tipo de imagen
    
header('Content-type: image/png');
    
//leemos el contenido del fichero
    
$lineas=file('marcianos2.txt');
    
//Inicializamos las variables para las densidades
    
$cadena_caracteres='';
    foreach(
$lineas as $linea){
        
//Caracteres excluyendo el \r y el \n
        
$linea_limpia=trim($linea,"\r\n");
        
$cadena_caracteres .= $linea_limpia;
        
//Carcateres de cada línea
        
$ancho[]=strlen($linea_limpia);
    }
    
$ancho_max=max($ancho);
    
//Número de lineas
    
$alto=count($lineas);
    
//Creamos la imagen a partir del número de lineas y la longitud de cada línea
    
$imagen = imagecreate($ancho_max,$alto) or die('No puedo crear la imagen');
    
//Obtenemos el array de todos los elementos para ver las densidades de color
    
$paleta_caracteres=array_count_values(str_split($cadena_caracteres));
    
//Ordenamos de menor a mayor las densidades
    
asort($paleta_caracteres);
    
/*
     Calculamos el aumento de color para diferenciar entre los colores de la imagen
     El -1 es para evitar que el redondeo pueda generar valores superiores a 255.
    */
    
$aumento_color=round( (255/count($paleta_caracteres)))-1;
    
//Creamos la "paleta" de colores en escla de grises (los 3 valores rgb iguales)
    
$contador=1;
    foreach(
$paleta_caracteres as $indice => $valor){
            
$valor_rgb = $aumento_color * $contador++;
            
$paleta_caracteres[$indice]=imagecolorallocate($imagen,$valor_rgb,$valor_rgb,$valor_rgb);
    }
    
//Coordenada y de la imagen que comienza en 0
    
$coordenada_y=0;
    
/*
     Longitud de la cadena de caracteres, el -1 es debido a que compararmos el caracter n con el n+1
     y asi evitamos sobreflujo en el array
    */
    
$longitud=strlen($cadena_caracteres)-1;
    
//Acumulador de los anchos de cada línea
    
$ancho_total=0;
    for (
$i=0; $i< $longitud; $i+=$contador){
        
//Limite de la línea
        
$limite=$ancho[$coordenada_y]-1;
        
//Averiguamos la coordenada x en función del nº de caracteres y el sumatorio de todos los anchos
        
$total=$coordenada_x= $i-$ancho_total;
        
//Contador para la coordenada_x y para aumentar el bucle for
        
$contador=0;
        
//Indice para ir recorriendo los caracteres dentro de $cadena_caracteres
        
$indice=$i;
        
//sino buscamos hasta que exista un caracter diferente al anterior
        
while( ($cadena_caracteres[$indice]==$cadena_caracteres[$indice+1]) && ($total < $limite-1) ){
            
$contador++;
            
$indice++;
            
$total++;
        }
        
//recogemos el color del caracter
        
$color=$paleta_caracteres[$cadena_caracteres[$i]];
        if(
$indice > $i){
            
//dibujamos una línea si hay varios caracteres iguales
            
imageline($imagen, $coordenada_x, $coordenada_y, ($coordenada_x + $contador), $coordenada_y, $color);
        }else{
            
//dibujamos un pixel si hay un caracter diferente detras de otro
            
imagesetpixel($imagen, $coordenada_x, $coordenada_y, $color);
        }
        
        if(
$total == $limite){
            
//Acumulamos el ancho para averiguar la coordenada x en función del nº de caracteres
            
$ancho_total+=$ancho[$coordenada_y];
            
//Pasamos a la siguiente linea, es decir a la siguiente fila de la matriz
            
$coordenada_y++;
        }
        
//Pasamos al siguiente caracter        
        
$contador++;    
    }
    
//Generamos el tiempo en generar la imagen
    
$color_texto=imagecolorallocate($imagen,0,0,200);
    
$tiempo=microtime_float()-$inicio.' seg';
    
imagestring($imagen, 1, 10, $coordenada_y-10,$tiempo,$color_texto);
    
imagepng($imagen);
    
imagedestroy($imagen);     
?>

Web alojada en Zilos

php-hispano.net 2002 - 2008 | XHTML 1.0
Datos Legales | Webmaster