Pucha llegue tarde
Solo para saber como me fue...
@pateketrueke ¿Me tomarías el tiempo de mi
reduce()? :D Lo haría yo, pero no se como lo has echo...
Aca dejo mi código, no lo mando por PM porque ya termino el desafío...
Lo hagas o no, gracias de todas formas :D
Utilize:
strlen() y
ord()
Código PHP:
Ver original<?php
function reduce($text) {
// Tamaño de la cadena
// Devolver la misma cadena si hay menos de 3 carácteres
if ($length < 3)
return $text;
// Arreglo con el valor ASCII de cada carácter
for ($i = 0; $i < $length; $i++)
$chars[] = ord($text[$i]);
$char = 0; // Carácter a verificar
$output = ''; // Salida
$previous = $current = $next = $range_start = $num_range_chars = $order = 0;
do {
$previous = $chars[$char - 1]; // Carácter anterior
$current = $chars[$char]; // Carácter actual
$next = $chars[$char + 1]; // Carácter siguiente
// Verificar si ya estamos dentro de un rango
if ($range_start) {
// Si el carácter anterior es mayor o menor
// (De acuerdo al orden de los carácteres)
// es igual al actual, marcar que el carácter actual
// está dentro de un rango de carácteres
if (($previous + $order) == $current) {
++$num_range_chars;
} else {
// Si hemos encontrado un carácter que no pertenece
// al rango que estamos analizando, y el rango actual
// tiene menos de 3 carácteres, agregamos el carácter anterior
// a salida y continuamos (Ya que si estamos analizando un rango,
// y solo encontramos 2 carácteres, el segundo nunca se agregó)
if ($num_range_chars == 2)
$output.= $text[$char - 1];
// Si el carácter actual, no esta dentro del rango,
// pero pudimos terminar de analizar el rango actual,
// agregamos el último carácter a salida
if ($num_range_chars > 2)
$output.= '-' .$text[$char - 1];
// Reseteamos las variables de rango
$range_start = $num_range_chars = 0;
}
}
// Si entre el carácter anterior, actual y el siguiente forman una cadena casi palíndromo
// Ej.: aba, oao, bab (Pero NO aaa, bbb, ccc, etc.)
// Nos aseguramos de terminar el rango que estamos analizando correctamente
// para seguir con el siguiente y detectamos el nuevo orden: decreciente o ascendente
if ($previous != $current && $next != $current && $previous == $next) {
// Señalar final del rango actual, si estamos en uno
if ($num_range_chars > 2)
$output.= '-';
// Agregar carácter a salida
$output.= $text[$char];
// Marcar comienzo de nuevo rango
$range_start = $current;
$num_range_chars = 1;
// Lo mísmo que en la línea 101
if ($current < $next)
$order = 1;
if ($current > $next)
$order = -1;
if ($current == $next)
$range_start = $num_range_chars = 0;
}
// Comenzar a analizar un rango de carácteres
if (!$range_start) {
// Agregar carácter a salida
$output.= $text[$char];
// Fijar comienzo del rango de carácteres
$range_start = $current;
// Marcar carácter que comienza el rango
++$num_range_chars;
// Si hay un carácter despues del actual,
// verificamos si es mayor o menor al actual
// para fijar el orden: decreciente o ascendente
// Si el siguiente carácter es el mismo,
// Reseteamos las variables que marcan un rango
if ($next) {
if ($current < $next)
$order = 1;
if ($current > $next)
$order = -1;
if ($current == $next)
$range_start = $num_range_chars = 0;
}
}
// Pasamos al carácter siguiente
++$char;
// Si hemos llegado al final de la cadena,
// completamos la salida correctamente
if ($char == $length && $num_range_chars > 2)
$output.= '-' .$text[$char - 1];
} while ($char < $length);
// Devolver salida de carácteres
return $output;
}
?>
¡Saludos!