Secciones de la página

are. tol


Declaraciones


Funciones


Time oriented language


Árbol de ficheros

Funciones

Set AreSub()

Real AreCmp()

Set AreWri()

Set AreFnd()

Set AreRep()

Set AreCic()

Real AreTrc()

Tol

Artículos del sitio

Presentación de Tol

Todos los programas

Simuladores visuales

Sitios que me gustan

Por categorías

Algoritmia

Búsqueda y ordenación

Computación fisiológica

Editorial y edición

Gráficos de datos

Herramientas y utilidades

Hipertexto

Informática forense

Lectura óptica de datos

Metaprogramación

No determinista

Ofimática

Recursión e iteración

Reglas y restricciones

Series y estadística









are.tol de ChRules.Iterative

Funciones para areas de caracteres.

Declaraciones

Funciones

  • Set AreSub(Set linSet, Real x, Real y, Real w, Real h)
    Dado un conjunto de lineas de texto retorna un conjunto de lineas de texto cuya esquina superior izquierda corresponden a la posicion x e y y su ancho y alto a w y h. Esto es si x=3, y=4, w=4 y h=2 entonces de: 123456789 2ABCDEFGH 3ABCDEFGH 4Apor FGH => <por > 5AaquiFGH <aqui> Se asume que el conjunto de textos es rectangular y no vacio.
  • Real AreCmp(Set linSetA, Set linSetB)
    Retorna TRUE si dos areas de texto son iguales, esto es, compara el primer conjunto de lineas con el segundo conjunto de lineas. Esta funcion corta y retorna FALSE en cuanto una comparacion falla Para poder cortar se apoya en la funcion While().
  • Set AreWri(Set linSet, Set newSet, Real x, Real y)
    Dado un conjunto de lineas, setLin, de texto retorna un conjunto de lineas de texto resultado de sobreescribir el conjunto de textos newSet en la posicion determinadas por x e y. Esto es, si x=3, y=4 entonces de: 123456789 123456789 2ABCDEFGH 2ABCDEFGH 3ABCDEFGH 3ABCDEFGH 4ABCDEFGH => <++++> => 4A++++FGH 5ABCDEFGH <++++> 5A++++FGH Esta funcion asume: a) que los conjuntos de textos son rectangulares y no vacios y b) que las coordenadas son razonables, esto es, que x e y no son tales que parte de la escritura de newSet se salga fuera de setLin. Estas suposiciones son razonables si se tiene en cuenta que las coordenadas proceden de un match correcto de la parte de condicion de las reglas de reescritura de areas de caracteres.
  • Set AreFnd(Set linSet, Set fndSet)
    Retorna el conjunto formado por el par de coordenadas (x,y) de la primera ocurrencia del conjunto de textos fndSet en linSet. Si no lo encuentra retorna el conjunto vacio.
  • Set AreRep(Set linSet, Set oldSet, Set newSet)
    Si oldSet aparece en linSet entonces retorna el resultado de reemplazar la primera ocurrencia de oldSet por newSet, si no aparece retorna Empty.
  • Set AreCic(Set linSet, Set parSet)
    Retorna el resultado de cambiar en linSet el primer par de parSet, formado por un cojunto de pares (oldSet, newSet), donde oldSet aparezca en linSet, si no aparece ninguno retorna Empty.
  • Real AreTrc(Set linSet, Real numCel, Text preFil, Real numCol, Real trcCtr)
    Visualiza y guarda la traza de de un estado de 3 formas en lenguaje Html, en Javascript y por pantalla. Dependiendo del parametro trcCtr, si 0 abre los 2 ficheros Html y Javascript, si 1 asume que esta en medio ciclo y si 2 cierra ficheros de forma logica, esto es pone los cierres de las estructuras de programacion de Html y Javascript. En Javascript, cada rectangulo de texto se pone como una sola linea de texto entre comillas, con un separador donde termina realmente cada linea original del rectangulo, luego este separador se por un br, salto de linea Html. El caracter separador se ha de elegir de tal forma que pueda reemplazarse sin probrmas, por ejemplo, el | suele dar problemas pues se usa dentro de las figuras de las areas, el ; da problemas porque es el fin de los caracteres especiales Html como &nbsp; o &gt; o &lt;. En este caso se ha elegido la virgulilla ~.

Funciones

Set AreSub()

//////////////////////////////////////////////////////////////////////////////
Set AreSub(Set  linSet, // Conjunto de linea
           Real x,      // Coordenada X
           Real y,      // Coordenada Y
           Real w,      // Ancho, width
           Real h)      // Alto, height
//////////////////////////////////////////////////////////////////////////////
{
  Real xEnd = Min(x+w-1,TextLength(linSet[1]));
  Real yEnd = Min(y+h-1,Card(linSet));
  
  For(y, yEnd, Text(Real lin) { Sub(linSet[lin], x, xEnd) })
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Dado un conjunto de lineas de texto retorna un conjunto de lineas de texto
cuya esquina superior izquierda corresponden a la posicion x e y y su ancho y
alto a w y h. Esto es si x=3, y=4, w=4 y h=2 entonces de:
   123456789
   2ABCDEFGH 
   3ABCDEFGH
   4Apor FGH => <por >
   5AaquiFGH    <aqui>
Se asume que el conjunto de textos es rectangular y no vacio.",
AreSub);
//////////////////////////////////////////////////////////////////////////////

Real AreCmp()

//////////////////////////////////////////////////////////////////////////////
Real AreCmp(Set linSetA,  // Primer  conjunto de lineas
            Set linSetB)  // Segundo conjunto de lineas
//////////////////////////////////////////////////////////////////////////////
{
  Real carA = Card(linSetA);
  Real carB = Card(linSetB);
  If(NE(carA, carB), FALSE,
  {
    Real end = Copy(FALSE);
    Real ok  = Copy(TRUE);
    Real lin = 1;
    Real While(Not(end),
    {
      If(linSetA[lin]!=linSetB[lin],
         { Real(end:=TRUE); Real(ok:=FALSE); FALSE },
         {
           Real(lin:=lin+1);
           If(LE(lin,carA), TRUE, { Real(end:=TRUE); FALSE })
         })
    });
    Copy(ok)
  })
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna TRUE si dos areas de texto son iguales, esto es, compara el primer
conjunto de lineas con el segundo conjunto de lineas.
Esta funcion corta y retorna FALSE en cuanto una comparacion falla
Para poder cortar se apoya en la funcion While().",
AreCmp);
//////////////////////////////////////////////////////////////////////////////

Set AreWri()

//////////////////////////////////////////////////////////////////////////////
Set AreWri(Set  linSet, // Area que hay que transformar
           Set  newSet, // Area mas pequeña que se va escribir sobre linSet
           Real x,      // Coordenada X del punto donde se empieza a escribir
           Real y)      // Coordenada Y del punto donde se empieza a escribir
//////////////////////////////////////////////////////////////////////////////
{
  Real linLen = TextLength(linSet[1]); // Ancho, se asume rectangulo
  Real newLen = TextLength(newSet[1]); // Ancho, se asume rectangulo

  Set  ini = For(1, y-1, Text(Real pos)
                 { linSet[pos] });

  Set  rep = For(y,   y+Card(newSet)-1, Text(Real pos)
  {
    Sub(linSet[pos],1,x-1)+          // Parte inicial de la linea original
    newSet[pos-y+1]+                 // Nuevo texto
    Sub(linSet[pos],x+newLen,linLen) // Parte final de la linea original
  });

  Set  end = For(y+Card(newSet), Card(linSet), Text(Real pos)
                 { linSet[pos] });

  ini << rep << end
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Dado un conjunto de lineas, setLin, de texto retorna un conjunto de lineas de
texto resultado de sobreescribir el conjunto de textos newSet en la posicion
determinadas por x e y.
Esto es, si x=3, y=4 entonces de:
   123456789              123456789
   2ABCDEFGH              2ABCDEFGH
   3ABCDEFGH              3ABCDEFGH
   4ABCDEFGH => <++++> => 4A++++FGH
   5ABCDEFGH    <++++>    5A++++FGH
Esta funcion asume:
a) que los conjuntos de textos son rectangulares y no vacios y
b) que las coordenadas son razonables, esto es,
   que x e y no son tales que parte de la escritura de newSet
   se salga fuera de setLin.
Estas suposiciones son razonables si se tiene en cuenta que las coordenadas
proceden de un match correcto de la parte de condicion de las reglas de
reescritura de areas de caracteres.",
AreWri);
//////////////////////////////////////////////////////////////////////////////

Set AreFnd()

//////////////////////////////////////////////////////////////////////////////
Set AreFnd(Set linSet, // Conjunto de lineas de texto donde hay que buscar
           Set fndSet) // Conjunto rectangular de lineas de texto a buscar
//////////////////////////////////////////////////////////////////////////////
{
  Real curX   = 1;
  Real curY   = 1;
  Real width  = TextLength(fndSet[1]);
  Real endX   = TextLength(linSet[1]) - width + 1;
  Real height = Card(fndSet);
  Real endY   = Card(linSet)-height+1;
  Real end    = Copy(FALSE);

  Real While(Not(end),
  {
    Real fst = TextFind(linSet[curY], fndSet[1], curX);
    If(LE(fst,0),
    { // No aparece ni la primera linea de fndSet -> Saltar de linea
      Real(curY:=curY+1);
      Real(curX:=1);
      If(LE(curY,endY), TRUE,            // Quedan lineas
                        Real(end:=TRUE)) // Termino
    },
    {
      Set sub = AreSub(linSet, curX, curY, width, height);
      If(AreCmp(sub, fndSet), Real(end:=TRUE), // Lo encontro
      { // Aunque la primera linea coincide el resto no -> Saltar en X
        Real(curX:=curX+1);
        If(LE(curX, endX), TRUE, // Seguir explorando la linea
        {
          // Ya no aparece en esta linea -> Saltar de linea
          Real(curY:=curY+1);
          Real(curX:=1);
          If(LE(curY,endY), TRUE,            // Quedan lineas
                            Real(end:=TRUE)) // Termino con todas las lineas
        })
      })
    })
  });

  If(LE(curY, endY), [[ Copy(curX), Copy(curY) ]], Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna el conjunto formado por el par de coordenadas (x,y) de la primera
ocurrencia del conjunto de textos fndSet en linSet.
Si no lo encuentra retorna el conjunto vacio.",
AreFnd);
//////////////////////////////////////////////////////////////////////////////

Set AreRep()

//////////////////////////////////////////////////////////////////////////////
Set AreRep(Set linSet, // Conjunto de lineas de texto con forma rectangular
           Set oldSet, // Viejo texto rectangular que se va a sustituir
           Set newSet) // Nuevo texto rectangular que se va a escribir
//////////////////////////////////////////////////////////////////////////////
{
  Set xySet = AreFnd(linSet, oldSet);
  If(EQ(Card(xySet),0), Empty, AreWri(linSet, newSet, xySet[1], xySet[2]))
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Si oldSet aparece en linSet entonces retorna el resultado de reemplazar la
primera ocurrencia de oldSet por newSet, si no aparece retorna Empty.",
AreRep);
//////////////////////////////////////////////////////////////////////////////

Set AreCic()

//////////////////////////////////////////////////////////////////////////////
Set AreCic(Set linSet, // Conjunto de lineas de texto rectangular
           Set parSet) // 2 rectangulos (rectangulo viejo, rectangulo nuevo)
//////////////////////////////////////////////////////////////////////////////
{
  Real end   = Copy(FALSE);
  Real par   = 1;
  Real max   = Card(parSet);
  Set  xySet = Copy(Empty);
  Real While(Not(end),
  {
    Set(xySet:=AreFnd(linSet, parSet[par][1]));
    If(GT(Card(xySet),0), Real(end:=TRUE), // Termino con exito
    {
      Real(par:=par+1); // Probar con el siguiente
      If(GT(par,max), Real(end:=TRUE), // Termino sin exito
                      FALSE)           // Cicla
    })
  });

//Text WriteLn("Rule "+FormatReal(par,"%.0lf"));
  If(GT(par,max), Empty, // No lo encontro
     AreWri(linSet, parSet[par][2], xySet[1], xySet[2])) // Lo encontro
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna el resultado de cambiar en linSet el primer par de parSet, formado
por un cojunto de pares (oldSet, newSet), donde oldSet aparezca en linSet,
si no aparece ninguno retorna Empty.",
AreCic);
//////////////////////////////////////////////////////////////////////////////

Real AreTrc()

//////////////////////////////////////////////////////////////////////////////
Real AreTrc(Set  linSet, // Conjunto de lineas, area rectangular
            Real numCel, // Numero de celda, que es el estado o paso
            Text preFil, // Ruta y nombre del fichero sin extension
            Real numCol, // Numero de columnas de la tabla
            Real trcCtr) // 0 abre fichero, 1 ciclo, 2 cierra fichero
//////////////////////////////////////////////////////////////////////////////
{
  Text htmFil = preFil+".htm"; // Fichero Html
  Text srcFil = preFil+".js";  // Fichero Javascript

  Text srcIni = If(trcCtr == 0, // Apertura
  {
    Text htmOpn = "<table border=0 cellspacing=1 "+
                                  "cellpadding=8 bgcolor='#8080f0'>";
    Text WriteFile(htmFil, htmOpn);

    Text srcSep = "\n"+Repeat("/", 78)+"\n\n"; // Separador de arrays
    Text srcVar = GetFilePrefix(srcFil);       // Nombre fichero -> variable
    Text srcOpn = srcSep +
                  "var " + srcVar + " = new Array(\n"; // Array Javascript
    Text WriteFile(srcFil, srcOpn);
     ""      // No hay inicio en la apertura Javascript
  }, ",\n"); // En ciclo javascript cierra la linea anterior del array

  If(trcCtr <= 1, // Para 0 y 1 hay un estado que escribir
  {
    Text areBdy = If(EQ(Card(linSet),0), "EMPTY\n", // Para todas las salidas
                     SetSum(EvalSet(linSet, Text(Text lin) { lin+"\n" })));

                               // Eliminar < y > para Html y Javascript
    Text areRep = ReplaceTable(areBdy, [[ [["<","&lt;"]],[[">","&gt;"]] ]]);

    Text areTit = "State = "+FormatReal(numCel,"%.0lf")+"\n";

    Text srcBdy = "  " + Char(34) + Replace(areRep, "\n", "~") + Char(34);

    Text AppendFile(srcFil, srcIni + srcBdy); // Javascript

    Text htmIni = 
      If(EQ(numCel%numCol, 1), "<tr>\n", "") + // Por si es la uno de la fila
      "<td bgcolor='#ffffff'>\n"+
      "<code><pre>\n";

    Text htmEnd = 
      "</code></pre>\n"+
      "</td>\n"+
      If(EQ(numCel%numCol, 0), "</tr>\n", ""); // Por si es la ultima de fila

    Text AppendFile(htmFil, htmIni + areTit + areRep + htmEnd); // Html
    
    Text panSep = Repeat("_", 78)+"\n";   // Separador para pantalla

    Text Write(panSep + areTit + areBdy); // Por pantalla
    
    TRUE // Seguimos en ciclo
  },
  {
    // 2 o mayor es el fin, no hay estado que escribir, solo se cierra
    Text AppendFile(htmFil, "\n</tr>\n</table>\n"); // Fin estructura Html
    Text AppendFile(srcFil, "\n);\n");              // Fin del array

    // La pagina Html, htmFil, que se ha construido, solo contiene la tabla
    // de estados, ahora se hace una pagina completa con header, body, etc.
    Text htmTab = ReadFile(htmFil); // Lee fichero terminado, tabla completa
    Text htmSee = ReadFile(GetFilePath(htmFil) + // Ruta del fichero con /
                           "/_seed.htm");        // Semilla Html con body

    Text filPre = GetFilePrefix(htmFil);         // Prefijo del fichero
    Text htmTit = FirstToUpper(Replace(filPre, "_", " ")); // Titulo pagina

    Text filOut = Replace(htmFil, ".htm", "_html.htm");
    
    Text htmRep = ReplaceTable(htmSee, [[ [["_TIT_", htmTit]],
                                          [["_TAB_", htmTab]] ]]);
    Text WriteFile(filOut, htmRep);
    FALSE
  })
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Visualiza y guarda la traza de de un estado de 3 formas en lenguaje Html, en
Javascript y por pantalla.
Dependiendo del parametro trcCtr, si 0 abre los 2 ficheros Html y Javascript,
si 1 asume que esta en medio ciclo y si 2 cierra ficheros de forma logica,
esto es pone los cierres de las estructuras de programacion de Html y
Javascript.
En Javascript, cada rectangulo de texto se pone como una sola linea de texto
entre comillas, con un separador donde termina realmente cada linea original
del rectangulo, luego este separador se por un br, salto de linea Html.
El caracter separador se ha de elegir de tal forma que pueda reemplazarse
sin probrmas, por ejemplo, el | suele dar problemas pues se usa dentro de
las figuras de las areas, el ; da problemas porque es el fin de los caracteres
especiales Html como &nbsp; o &gt; o &lt;.
En este caso se ha elegido la virgulilla ~.",
AreTrc);
//////////////////////////////////////////////////////////////////////////////

Time oriented language

//////////////////////////////////////////////////////////////////////////////
// FILE    : are.tol
// AUTHOR  : http://www.asolver.com
// PURPOSE : Funciones para areas de caracteres.
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
// FUNCTIONS
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
Set AreSub(Set  linSet, // Conjunto de linea
           Real x,      // Coordenada X
           Real y,      // Coordenada Y
           Real w,      // Ancho, width
           Real h)      // Alto, height
//////////////////////////////////////////////////////////////////////////////
{
  Real xEnd = Min(x+w-1,TextLength(linSet[1]));
  Real yEnd = Min(y+h-1,Card(linSet));
  
  For(y, yEnd, Text(Real lin) { Sub(linSet[lin], x, xEnd) })
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Dado un conjunto de lineas de texto retorna un conjunto de lineas de texto
cuya esquina superior izquierda corresponden a la posicion x e y y su ancho y
alto a w y h. Esto es si x=3, y=4, w=4 y h=2 entonces de:
   123456789
   2ABCDEFGH 
   3ABCDEFGH
   4Apor FGH => <por >
   5AaquiFGH    <aqui>
Se asume que el conjunto de textos es rectangular y no vacio.",
AreSub);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real AreCmp(Set linSetA,  // Primer  conjunto de lineas
            Set linSetB)  // Segundo conjunto de lineas
//////////////////////////////////////////////////////////////////////////////
{
  Real carA = Card(linSetA);
  Real carB = Card(linSetB);
  If(NE(carA, carB), FALSE,
  {
    Real end = Copy(FALSE);
    Real ok  = Copy(TRUE);
    Real lin = 1;
    Real While(Not(end),
    {
      If(linSetA[lin]!=linSetB[lin],
         { Real(end:=TRUE); Real(ok:=FALSE); FALSE },
         {
           Real(lin:=lin+1);
           If(LE(lin,carA), TRUE, { Real(end:=TRUE); FALSE })
         })
    });
    Copy(ok)
  })
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna TRUE si dos areas de texto son iguales, esto es, compara el primer
conjunto de lineas con el segundo conjunto de lineas.
Esta funcion corta y retorna FALSE en cuanto una comparacion falla
Para poder cortar se apoya en la funcion While().",
AreCmp);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Set AreWri(Set  linSet, // Area que hay que transformar
           Set  newSet, // Area mas pequeña que se va escribir sobre linSet
           Real x,      // Coordenada X del punto donde se empieza a escribir
           Real y)      // Coordenada Y del punto donde se empieza a escribir
//////////////////////////////////////////////////////////////////////////////
{
  Real linLen = TextLength(linSet[1]); // Ancho, se asume rectangulo
  Real newLen = TextLength(newSet[1]); // Ancho, se asume rectangulo

  Set  ini = For(1, y-1, Text(Real pos)
                 { linSet[pos] });

  Set  rep = For(y,   y+Card(newSet)-1, Text(Real pos)
  {
    Sub(linSet[pos],1,x-1)+          // Parte inicial de la linea original
    newSet[pos-y+1]+                 // Nuevo texto
    Sub(linSet[pos],x+newLen,linLen) // Parte final de la linea original
  });

  Set  end = For(y+Card(newSet), Card(linSet), Text(Real pos)
                 { linSet[pos] });

  ini << rep << end
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Dado un conjunto de lineas, setLin, de texto retorna un conjunto de lineas de
texto resultado de sobreescribir el conjunto de textos newSet en la posicion
determinadas por x e y.
Esto es, si x=3, y=4 entonces de:
   123456789              123456789
   2ABCDEFGH              2ABCDEFGH
   3ABCDEFGH              3ABCDEFGH
   4ABCDEFGH => <++++> => 4A++++FGH
   5ABCDEFGH    <++++>    5A++++FGH
Esta funcion asume:
a) que los conjuntos de textos son rectangulares y no vacios y
b) que las coordenadas son razonables, esto es,
   que x e y no son tales que parte de la escritura de newSet
   se salga fuera de setLin.
Estas suposiciones son razonables si se tiene en cuenta que las coordenadas
proceden de un match correcto de la parte de condicion de las reglas de
reescritura de areas de caracteres.",
AreWri);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Set AreFnd(Set linSet, // Conjunto de lineas de texto donde hay que buscar
           Set fndSet) // Conjunto rectangular de lineas de texto a buscar
//////////////////////////////////////////////////////////////////////////////
{
  Real curX   = 1;
  Real curY   = 1;
  Real width  = TextLength(fndSet[1]);
  Real endX   = TextLength(linSet[1]) - width + 1;
  Real height = Card(fndSet);
  Real endY   = Card(linSet)-height+1;
  Real end    = Copy(FALSE);

  Real While(Not(end),
  {
    Real fst = TextFind(linSet[curY], fndSet[1], curX);
    If(LE(fst,0),
    { // No aparece ni la primera linea de fndSet -> Saltar de linea
      Real(curY:=curY+1);
      Real(curX:=1);
      If(LE(curY,endY), TRUE,            // Quedan lineas
                        Real(end:=TRUE)) // Termino
    },
    {
      Set sub = AreSub(linSet, curX, curY, width, height);
      If(AreCmp(sub, fndSet), Real(end:=TRUE), // Lo encontro
      { // Aunque la primera linea coincide el resto no -> Saltar en X
        Real(curX:=curX+1);
        If(LE(curX, endX), TRUE, // Seguir explorando la linea
        {
          // Ya no aparece en esta linea -> Saltar de linea
          Real(curY:=curY+1);
          Real(curX:=1);
          If(LE(curY,endY), TRUE,            // Quedan lineas
                            Real(end:=TRUE)) // Termino con todas las lineas
        })
      })
    })
  });

  If(LE(curY, endY), [[ Copy(curX), Copy(curY) ]], Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna el conjunto formado por el par de coordenadas (x,y) de la primera
ocurrencia del conjunto de textos fndSet en linSet.
Si no lo encuentra retorna el conjunto vacio.",
AreFnd);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Set AreRep(Set linSet, // Conjunto de lineas de texto con forma rectangular
           Set oldSet, // Viejo texto rectangular que se va a sustituir
           Set newSet) // Nuevo texto rectangular que se va a escribir
//////////////////////////////////////////////////////////////////////////////
{
  Set xySet = AreFnd(linSet, oldSet);
  If(EQ(Card(xySet),0), Empty, AreWri(linSet, newSet, xySet[1], xySet[2]))
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Si oldSet aparece en linSet entonces retorna el resultado de reemplazar la
primera ocurrencia de oldSet por newSet, si no aparece retorna Empty.",
AreRep);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Set AreCic(Set linSet, // Conjunto de lineas de texto rectangular
           Set parSet) // 2 rectangulos (rectangulo viejo, rectangulo nuevo)
//////////////////////////////////////////////////////////////////////////////
{
  Real end   = Copy(FALSE);
  Real par   = 1;
  Real max   = Card(parSet);
  Set  xySet = Copy(Empty);
  Real While(Not(end),
  {
    Set(xySet:=AreFnd(linSet, parSet[par][1]));
    If(GT(Card(xySet),0), Real(end:=TRUE), // Termino con exito
    {
      Real(par:=par+1); // Probar con el siguiente
      If(GT(par,max), Real(end:=TRUE), // Termino sin exito
                      FALSE)           // Cicla
    })
  });

//Text WriteLn("Rule "+FormatReal(par,"%.0lf"));
  If(GT(par,max), Empty, // No lo encontro
     AreWri(linSet, parSet[par][2], xySet[1], xySet[2])) // Lo encontro
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna el resultado de cambiar en linSet el primer par de parSet, formado
por un cojunto de pares (oldSet, newSet), donde oldSet aparezca en linSet,
si no aparece ninguno retorna Empty.",
AreCic);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real AreTrc(Set  linSet, // Conjunto de lineas, area rectangular
            Real numCel, // Numero de celda, que es el estado o paso
            Text preFil, // Ruta y nombre del fichero sin extension
            Real numCol, // Numero de columnas de la tabla
            Real trcCtr) // 0 abre fichero, 1 ciclo, 2 cierra fichero
//////////////////////////////////////////////////////////////////////////////
{
  Text htmFil = preFil+".htm"; // Fichero Html
  Text srcFil = preFil+".js";  // Fichero Javascript

  Text srcIni = If(trcCtr == 0, // Apertura
  {
    Text htmOpn = "<table border=0 cellspacing=1 "+
                                  "cellpadding=8 bgcolor='#8080f0'>";
    Text WriteFile(htmFil, htmOpn);

    Text srcSep = "\n"+Repeat("/", 78)+"\n\n"; // Separador de arrays
    Text srcVar = GetFilePrefix(srcFil);       // Nombre fichero -> variable
    Text srcOpn = srcSep +
                  "var " + srcVar + " = new Array(\n"; // Array Javascript
    Text WriteFile(srcFil, srcOpn);
     ""      // No hay inicio en la apertura Javascript
  }, ",\n"); // En ciclo javascript cierra la linea anterior del array

  If(trcCtr <= 1, // Para 0 y 1 hay un estado que escribir
  {
    Text areBdy = If(EQ(Card(linSet),0), "EMPTY\n", // Para todas las salidas
                     SetSum(EvalSet(linSet, Text(Text lin) { lin+"\n" })));

                               // Eliminar < y > para Html y Javascript
    Text areRep = ReplaceTable(areBdy, [[ [["<","&lt;"]],[[">","&gt;"]] ]]);

    Text areTit = "State = "+FormatReal(numCel,"%.0lf")+"\n";

    Text srcBdy = "  " + Char(34) + Replace(areRep, "\n", "~") + Char(34);

    Text AppendFile(srcFil, srcIni + srcBdy); // Javascript

    Text htmIni = 
      If(EQ(numCel%numCol, 1), "<tr>\n", "") + // Por si es la uno de la fila
      "<td bgcolor='#ffffff'>\n"+
      "<code><pre>\n";

    Text htmEnd = 
      "</code></pre>\n"+
      "</td>\n"+
      If(EQ(numCel%numCol, 0), "</tr>\n", ""); // Por si es la ultima de fila

    Text AppendFile(htmFil, htmIni + areTit + areRep + htmEnd); // Html
    
    Text panSep = Repeat("_", 78)+"\n";   // Separador para pantalla

    Text Write(panSep + areTit + areBdy); // Por pantalla
    
    TRUE // Seguimos en ciclo
  },
  {
    // 2 o mayor es el fin, no hay estado que escribir, solo se cierra
    Text AppendFile(htmFil, "\n</tr>\n</table>\n"); // Fin estructura Html
    Text AppendFile(srcFil, "\n);\n");              // Fin del array

    // La pagina Html, htmFil, que se ha construido, solo contiene la tabla
    // de estados, ahora se hace una pagina completa con header, body, etc.
    Text htmTab = ReadFile(htmFil); // Lee fichero terminado, tabla completa
    Text htmSee = ReadFile(GetFilePath(htmFil) + // Ruta del fichero con /
                           "/_seed.htm");        // Semilla Html con body

    Text filPre = GetFilePrefix(htmFil);         // Prefijo del fichero
    Text htmTit = FirstToUpper(Replace(filPre, "_", " ")); // Titulo pagina

    Text filOut = Replace(htmFil, ".htm", "_html.htm");
    
    Text htmRep = ReplaceTable(htmSee, [[ [["_TIT_", htmTit]],
                                          [["_TAB_", htmTab]] ]]);
    Text WriteFile(filOut, htmRep);
    FALSE
  })
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Visualiza y guarda la traza de de un estado de 3 formas en lenguaje Html, en
Javascript y por pantalla.
Dependiendo del parametro trcCtr, si 0 abre los 2 ficheros Html y Javascript,
si 1 asume que esta en medio ciclo y si 2 cierra ficheros de forma logica,
esto es pone los cierres de las estructuras de programacion de Html y
Javascript.
En Javascript, cada rectangulo de texto se pone como una sola linea de texto
entre comillas, con un separador donde termina realmente cada linea original
del rectangulo, luego este separador se por un br, salto de linea Html.
El caracter separador se ha de elegir de tal forma que pueda reemplazarse
sin probrmas, por ejemplo, el | suele dar problemas pues se usa dentro de
las figuras de las areas, el ; da problemas porque es el fin de los caracteres
especiales Html como &nbsp; o &gt; o &lt;.
En este caso se ha elegido la virgulilla ~.",
AreTrc);
//////////////////////////////////////////////////////////////////////////////

Árbol de ficheros

ChRules.Iterative programa de aplicacion iterativa de reglas de areas de caracteres

  • make.tol aplica unas bases de reglas de reescritura a varios escenarios
  • make.bat mandato de ejecucion del programa de aplicacion de reglas
  • tol directorios que contienen fichero de codigo fuente Tol
    • cmm funciones comunes
    • app directorio funciones y datos de areas, reglas y motor de reglas
      • are.tol funciones de areas sobre las que se aplican las reglas
      • rul.tol funciones de reglas que transforman de areas de caracteres
      • eng.tol funciones del motor iterativo de aplicacion de reglas
      • bub.tol para realizar un orden parcial con metodo de burbuja
      • cel.tol automata celular con reglas de reproduccion y muerte
      • lab.tol base de reglas para que un robot salga de un laberinto
      • fll.tol base de reglas para rellenar, fill, superficies cerradas
      • pon.tol base de reglas de un pingpong electronico, pong
    • inc.tol para la inclusion de funciones, areas y bases de reglas
  • simulator directorio del simulador en Javascript del motor iterativo de reglas
    • css directorio para css, Cascading Style Sheets, del simulador
      • simulator.css css para simular areas de aplicacion de las reglas
    • src directorio de codigo fuente Javascript del simulador de reglas
      • simulator.js simula el funcionamiento del motor de aplicacion de reglas
      • simulatorarray.js array con ejemplos de evolucion para cada base de reglas
  • automata_celular_al_azar.html automata celular de reglas al azar de reproduccion y muerte
  • automata_celular_determinista.html automata celular determinista de reglas de reproduccion y muerte
  • burbuja_y_sedimentos.html orden parcial con metodo de burbuja simulando una sedimentacion
  • laberinto_2_cabezones.html laberinto con 2 robots que se autobloquean y no pueden salir
  • laberinto_2_negociadores.html laberinto con 2 robots y reglas para resolver su mutuo bloqueo
  • laberinto_mas_grande.html robot que sale del laberinto aplicando reglas de la mano derecha
  • laberinto_mano_izquierda_html robot que busca la salida aplicando reglas de la mano izquierda
  • laberinto_mini_1_robot.html pequeño laberinto con un robot y reglas de la mano derecha
  • partida_de_pong_al_15.html partida de pong donde el 15% de las veces las reglas son al azar
  • partida_de_pong_al_20.html partida de pong donde el 20% de las veces las reglas son al azar
  • partida_de_pong_azarosa.html partida de pingpong electronico, pong, con reglas aleatorias
  • partida_de_pong_eterna.html ciclo eterno de una partida de pong, con reglas deterministas
  • rellena_caja_al_azar.html reglas para llenar superficies aplicadas a una caja con lineas
  • rellena_k_al_azar.html rellenado de superficies aplicado al interior de una letra K
  • simulator.html simulador del motor iterativo de reglas de areas de caracteres
  • chrules_iterative.pdf funciones del motor de aplicacion de reglas de caracteres

2015 asolver.com | Aviso legal | XHTML | Δ Θ Ξ | Creative Commons | Mapa y funciones del sitio

Tol