Foros del Web » Programando para Internet » PHP »

Generar palabras

Estas en el tema de Generar palabras en el foro de PHP en Foros del Web. Buenas! Tengo un problemilla técnico que no se muy bien cómo resolver, a ver si me podéis echar un cable. Estoy intentando generar "palabras" en ...
  #1 (permalink)  
Antiguo 12/03/2013, 03:08
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años, 1 mes
Puntos: 33
Generar palabras

Buenas!

Tengo un problemilla técnico que no se muy bien cómo resolver, a ver si me podéis echar un cable.

Estoy intentando generar "palabras" en serie, y como es un proceso bastante largo, lo hago mediante un cron. A grosso modo, hago lo siguiente:

Código:
$items = array(/*caracteres ascii, sin números*/);

for($i=0;$i<84;$i++)
  for($j=0;$j<84;$j++)
    for($k=0;$k<84;$k++)
      generar($items[$i].$items[$j].$items[$k]);
Pero claro, al hacerlo "por partes", debería poder guardar el progreso en alguna parte, para que la siguiente vez el array empezara por el índice correspondiente (o más cercano posible).

El tema está en que no se cómo hacerlo... había pensado guardar los índices en un fichero cada X vueltas (o cada vez que saliera del bucle de "k")... pero no se...

¿Alguna sugerencia?

Gracias
  #2 (permalink)  
Antiguo 12/03/2013, 08:07
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Generar palabras

Cita:
Pero claro, al hacerlo "por partes", debería poder guardar el progreso en alguna parte, para que la siguiente vez el array empezara por el índice correspondiente (o más cercano posible).
No lo entiendo?

Código PHP:
Ver original
  1. $items = array(a,b,c);
  2.  
  3. for($i=0;$i<count($items);$i++){
  4.   for($j=0;$j<count($items);$j++){
  5.     for($k=0;$k<count($items);$k++){
  6.       generar($items[$i].$items[$j].$items[$k]);
  7.     }
  8.  }
  9. }

No se de donde sacas el 84...

Pero esto lo haria recorriendo todos los items que tengas...tengas los que tengas.

Los indices haran esto:

$i-$j-$k
0--0--0
0--0--1
0--0--2
0--1--0
0--1--1
0--1--2
0--2--0
0--2--1
0--2--2
1--0--0
1--0--1
1--0--2
1--1--0
1--1--1
1--1--2
1--2--0
1--2--1
1--2--2
2--0--0
2--0--1
2--0--2
2--1--0
2--1--1
2--1--2
2--2--0
2--2--1
2--2--2

y terminara el bucle, despues de haber pasado por todas las combinaciones posibles. (3^3=27 combinaciones), si son 84 items tendras 84^3
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 12/03/2013 a las 08:19
  #3 (permalink)  
Antiguo 12/03/2013, 08:43
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años, 1 mes
Puntos: 33
Respuesta: Generar palabras

Buenas

Lo de hacer "por partes" me refiero a que tengo este procedimiento en un cron que se ejecuta cada X, y me gustaría poder guardar y cargar el estado para no perder demasiado tiempo de ejecución (tengo el time_limit a 10 en el hosting).

Entonces, yo había pensado hacer algo como:

Código:
//cargaEstado();

for($i=0;$i<count($items);$i++){
  for($j=0;$j<count($items);$j++){
    for($k=0;$k<count($items);$k++){
      generar($items[$i].$items[$j].$items[$k]);
    }

    guardaEstado($i, $j, $k);
 }
}
Así cada vuelta podría guardar el estado del bucle para la próxima ejecución, y ejecutar el bucle hasta que PHP lance el error. Entonces luego, al volver a ejecutarse, volvería a empezar desde donde quedó la última vez, no se si me explico bien...

Donde necesito la ayuda es para ver cómo gestiono el tema de guardar/cargar el estado...

Espero que me haya explicado bien.

Salduos y gracias
  #4 (permalink)  
Antiguo 12/03/2013, 11:45
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Generar palabras

Si lo gestionas con sessiones se me ocurre algo así:

Código PHP:
Ver original
  1. if(!isset($_SESSION["i"])){
  2.     $_SESSION["i"]=0;
  3. }
  4. if(!isset($_SESSION["j"])){
  5.     $_SESSION["j"]=0;
  6. }
  7. if(!isset($_SESSION["k"])){
  8.     $_SESSION["k"]=0;
  9. }
  10.  
  11. for($i=$_SESSION["i"];$i<count($items);$i++){
  12.   for($j=$_SESSION["j"];$j<count($items);$j++){
  13.     for($k=$_SESSION["k"];$k<count($items);$k++){
  14.       $_SESSION["k"]++;
  15.       generar($items[$i].$items[$j].$items[$k]);
  16.     }
  17.     $_SESSION["j"]++;
  18.  }
  19. $_SESSION["i"]++;
  20. }
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #5 (permalink)  
Antiguo 12/03/2013, 14:15
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años, 1 mes
Puntos: 33
Respuesta: Generar palabras

ya había pensado algo así, el problema es que luego se vuelven a iniciar a un valor concreto, cuando debería ser 0... es decir (suponiendo que el max sea 2):

Código:
secuencia completa:


i:0; j:0; k:0
i:0; j:0; k:1
i:0; j:0; k:2
i:0; j:1; k:0
i:0; j:1; k:1
i:0; j:1; k:2
i:0; j:2; k:0
i:0; j:2; k:1
i:0; j:2; k:2
i:1; j:0; k:0
i:1; j:0; k:1
i:1; j:0; k:2
i:1; j:1; k:0
i:1; j:1; k:1
i:1; j:1; k:2
i:1; j:2; k:0
i:1; j:2; k:1
i:1; j:2; k:2
i:2; j:0; k:0
i:1; j:0; k:1
i:2; j:0; k:2
i:2; j:1; k:0
i:2; j:1; k:1
i:2; j:1; k:2
i:2; j:2; k:0
i:2; j:2; k:1
i:2; j:2; k:2
Código:
guardado1: i:0;j:1;k:2
Al pasar, por ejemplo a i=1, volveríamos a hacer "j=1", cuando debería ser "j=0"...

Y he ahí mi problema... pensé poner algún tipo de flags o similar, pero no se muy bien cómo apañarlo...

Graicas por contestar
  #6 (permalink)  
Antiguo 12/03/2013, 15:10
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: Generar palabras

Serializa y deserializa el estado de los índices a un fichero.Ten en cuenta que los bucles los tendrás que modificar, para que comiencen en el último estado, y terminen en ese último estado + 84 (si vas a generar de 84 en 84).
  #7 (permalink)  
Antiguo 13/03/2013, 01:16
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años, 1 mes
Puntos: 33
Respuesta: Generar palabras

Algo así había pensado... mi primera idea fue guardar los índices en un fichero e ir cargando/guardando...

A ver si luego hago un par de experimentos y os comento cómo me ha quedado...

Gracias por responder.
  #8 (permalink)  
Antiguo 13/03/2013, 02:43
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años, 1 mes
Puntos: 33
Respuesta: Generar palabras

Perdón por el doble post.

Creo que he encontrado el modo...

Código PHP:
Ver original
  1. $items = array();
  2. $data = explode("|", file_get_contents('file_stat.dat'));
  3.  
  4. for($i=$data[1];$i<count($items);$i++){
  5.   for($j=$data[2];$j<count($items);$j++){
  6.     for($k=0;$k<count($items);$k++){
  7.       generar($items[$i].$items[$j].$items[$k]);
  8.     }
  9.  
  10.     guardar($i, $j, $k);
  11.     $data[2] = 0;
  12.  }
  13.  
  14.   $data[1] = 0;
  15.  
  16. }

No se porqué, pero tiene que empezar por el $data[1], sino se va un índice a la izquierda...
  #9 (permalink)  
Antiguo 13/03/2013, 04:34
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Generar palabras

Código PHP:
Ver original
  1. if(!isset($_SESSION["i"])){
  2.     $_SESSION["i"]=0;
  3. }
  4. if(!isset($_SESSION["j"])){
  5.     $_SESSION["j"]=0;
  6. }
  7. if(!isset($_SESSION["k"])){
  8.     $_SESSION["k"]=0;
  9. }
  10.  
  11. for($i=$_SESSION["i"];$i<count($items);$i++){
  12.   for($j=$_SESSION["j"];$j<count($items);$j++){
  13.     for($k=$_SESSION["k"];$k<count($items);$k++){
  14.       $_SESSION["k"]++;
  15.       generar($items[$i].$items[$j].$items[$k]);
  16.     }
  17.     $_SESSION["j"]++;
  18.  }
  19. $_SESSION["i"]++;
  20. }

estoy usando las variable de session para iniciar los bucles y esta solo son cero la primera vez...
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Etiquetas: palabras
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:36.