Desafío Carácter Marciano
#3 Solución de yandalf
Ver código
|
Ver comentarios (0)
|
Descargar código
Fecha: 04 septiembre 2006
Tamaño: 52703 caracteres
Comentarios: 0
Solución online:
http://yandalf.php5.cz/caracter_marciano/
Premios
Correcto!
Valoració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);
?>