2 votos

Generar cadena de caracteres para acortar artículo en sitio web

Buenas colegas estoy haciendo un algoritmo que me genere una secuencia de caracteres de cuatro lugares dado una cadena de [a..zA..Z0..9] para tener una referencia acortada para mis artículos en mi sitio. Actualmente utilizo un algoritmo ineficiente que ya me a puesto acortadores de 3 lugares sin llenar la cantidad de los de uno. Dado que tengo mi array base de 62 cuando el mismo llegue a 4 lugares entonces el último acortador que sería 9999 tendría el artículo número 626262*62= 14776336 cantidad que creo nunca alcanzar en el sitio ;) Esta es la idea y mi problema radica a partir de la segunda secuencia para comenzar la tercera es decir cuando termina 99 y comienza aaa. Este es mi código en php:

function __gen(){ # Genera le shortlink adecuadamente
        $base = array(
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
            'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
            'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
        );
        $ini = 0;        
        $spacers = 0;
        $Bbeta = '';
        $beta = '';
        for ($i=0; $i <= count($base); $i++) { 
            #1 compara si existe el shortlink nuevo
            $beta = $Bbeta.$base[$i];
            /*if ($this->__exist($beta) == 0) { //Este método me retorna la cantidad de veces que existe el acortador en mi db 
                return $beta;
            }*/
            #2 compara si se terminó la fase de comprobación y setea el inicio
            if($i == count($base)-1){
                if ($ini = count($base)) {
                    $spacers++;                                         
                }               
                $Bbeta = $base[$ini];
                $ini++;
                $i = 0;             
                #3 valora si se aumenta o no el spacers opción relacionada con el caracter ultimo '9'
                #Compara todos los caracteres a ver si son 9 y en caso de serlo entonces aumentar spacers               
            }
            var_dump($beta);
        }
}  

como verán mi problema es a partir de mi paso #3 comparo que todo sea 9 en el string y luego como sigo mi secuencia para que continué de la siguiente forma: aaa .. aa9 aba .. ab9 a9a .. a99 baa .. ba9 bba .. bb9 y así hasta llegar a 999 para luego pasar a cuatro lugares de aaaa a 9999. Saludos Dairon

0voto

aFrost Puntos 265

Así a simple vista veo que esto te puede dar problemas

if ($ini = count($base)) {

Ahí estás haciendo una asignación de $ini con la cuenta de $base, seguramente te falte un igual

if ($ini == count($base)) {

0voto

ArtEze Puntos 285

Es fácil, para eso hay que pensar, lo hago en binario, base 2. Hay que buscar una fórmula matemática que funcione lo mismo del binario, pero para base 62... Por cierto, Flickr usa base 58 porque hay letras que un humano no puede distinguir, y queda así.

123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ

Pero voy a poner un ejemplo en binario.

1 dígito = 2 posibilidades = posición 0 = 0 1.

2 = 4 = 0+2 es 2 = 00 01 10 11

3 = 8 = 2+4 es 6 = 000 001 010 011 100 101 110 111

Con 4 dígitos, serán 16 posibilidades, 6+8 es 14. Es decir, para binario se forma siempre la fórmula 2^x-2 = 0 2 6 14 30.

Veamos qué pasa en trinario, es decir, base 3.

1 = 3 = 0

2 = 3*3 es 9 = 0+3 es 3

3 = 3^3 es 27 = 3+9 es 12

4 = 3^4 es 81 = 12+27 es 39

5 = 3^5 es 243 = 39+81 es 120

Queda así, 0 3 12 39 120, en OEIS, se puede encontrar la secuencia, https://oeis.org/A029858

La fórmula sería esta en base 3: a(n) = (3^n - 3)/2

Entonces puedo suponer que en base 62 queda así: a(n) = (62^n - 62)/2, siendo n, la cantidad de dígitos. Habría que comprobarlo uno mismo.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X