Ver Mensaje Individual
  #1  
Antiguo 15-04-2016
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 549
Reputación: 18
jhonalone Va por buen camino
Función desde ActionScrip2 a Delphi

Hola, amigos.
Tengo un par de funciones en ActionScript2 y me gustaría incluirlas en código Delphi.
LLevo varios días intentando traducirlas, pero no sé nada de ActionScript y (a parte de lo que me está costando) ni siquiera tengo la seguridad de hacerlo correctamente.

Os pediría que, si alguien entiende los dos lenguajes y tiene media hora libre para hacerlo, me facilitara la tarea traduciéndolas, yo sólo soy aficionado y no no tengo ni idea de ActionScript (ni sabía que existía).

Este es el código en ActionScrip2:

Código:
function generar(n)
{
   z="Un texto Unicode que no copio por lo raro que es";
    f = Math.floor;
    r = Math.random;
    B = 4096;
    d1 = [];
    d2 = [];
    m = [];
    s0 = "";
    kr = [];
    kf = [];
    ks = [];
    kt = [];
    rd = r()<.5;
    al = z.length;
    rg = f(al*r());
    for (var j = 0; j<10; j += 9)
   {
        for (var h = 0; h<3; h++)
      {
            if (!h)
         {
                m2(j);
            }
            m1(m, j+3*h, 3*h+3+j);
        }
    }
    for (var j = 0; j<3; j++)
   {
        m[j] = m[9+j*3].concat(m[10+j*3].concat(m[11+j*3]));
    }
    m1(m, 0, 3);
    m[3] = m[0].concat(m[1].concat(m[2]));
    for (var j = 0; j<9; j++)
   {
        d1[j] = j+1;
        for (var h = 0; h<3; h++)
      {
            v = j*3+h;
            w = 9*(v%9)+f(v/9);
            m[0][v] = m[3][w];
            m[1][v] = m[3][w+3];
            m[2][v] = m[3][w+6];
        }
    }
    m1(m, 0, 3);
    m1(d1, 0, 9);
    sl = m[0].concat(m[1].concat(m[2]));
    for (var v = 0; v<al; v++)
   {
        t = (rg+v)%al;
        k0 = z.charCodeAt(t);
        nv = (15 & k0)-n;
        if (k0<=B && nv>=0 && nv<6)
      {
            cn = 0;
            d = k0 >> 8;
            s = (240 & k0) >> 4;
            for (var h = 1+t; h<=s+t; h++)
         {
                k1 = z.charCodeAt(h)-B;
                kf[0] = 15 & k1;
                kf[1] = (240 & k1) >> 4;
                kf[2] = (3840 & k1) >> 8;
                kf[3] = k1 >> 12;
                for (var j = 0; j<4; j += 2)
            {
                    cn += kf[j];
                    if (kf[j+1])
               {
                        ks.push(cn, kf[j+1]);
                        cn++;
                    }
                }
            }
            q = f(r()*2)+nv*2+f(r()*(nv+1));
            for (var h = s+1+t; h<=s+d+t; h++)
         {
                kt[h-s-1-t] = z.charCodeAt(h)-B;
            }
            for (var h = 0; h<kt.length-1; h += 3)
         {
                m1(kt, 2, h+3);
            }
            for (var h = 0; h<q; h++)
         {
                k3 = f(kt[h]/10);
                ks.push(k3, kt[h]-k3*10);
            }
            lg = ks.length;
            break;
        }
    }
    for (var h = 0; h<lg-1; h += 2)
   {
        kr[sl[ks[h]]] = d1[ks[h+1]-1];
    }
    for (var j = 0; j<81; j++)
   {
        s0 += kr[j] ? kr[j] : ".";
    }
    return s0;
    function m1(b, a, c)
   {
        for (var i = c-a; i>1; i--)
      {
            e = a+f(i*r());
            o = b[i-1+a];
            b[i-1+a] = b[e];
            b[e] = o;
        }
        return (b);
    }
    function m2(a)
   {
        for (var j = 0; j<9; j++)
      {
            m[j+a] = [];
            for (var h = 0; h<9; h++)
         {
                m[j+a][h] = a == 0 ? rd ? j*9+h : h*9+j : m[h][j];
            }
        }
    }
}




function resolver(m)
{
   if (m == ".................................................................................")
      m = "13..........13..........13.............................13..........13..........13";
    tablas();
    s = []; q = []; ct = 0; act = []; aq = [];
    for (var j = 0; j<81; j++)
   {
        s[j] = 511;
    }
    e = m.split("");
    for (var h = 0; h<e.length; h++)
   {
        if (e[h]>="1" && e[h]<="9")
      {
            colocar(s, h, e[h]);
        }
    }
    q[0] = resolver2(s).slice();
    cons(q[0]);
    while (ct<81 && ct>-1)
   {
        if (ct2<0)
      {
            return q[ct].slice(81, 162).join("");
        }
        colocar(q[ct], ct2, act[ct].pop());
        if (!resolver2(q[ct]))
      {
            q[ct] = aq[ct].slice();
            while (!act[ct][0] && ct>-1)
         {
                ct--;
                ct2 = q[ct][162];
                q[ct] = aq[ct].slice();
            }
        }
      else
      {
            ct++;
            q[ct] = q[ct-1].slice();
            cons(q[ct]);
        }
    }
    return "sin solución";
    function resolver2(s)
   {
        do
      {
            sp = [];
            for (var j = 0; j<81; j++)
         {
                if (!s[j+81])
            {
                    if (t4[s[j]] == 0)
               {
                        return false;
                    }
                    if (t4[s[j]] == 1)
               {
                        sp.push(j, t3[s[j]]);
                    }
                }
            }
            for (var j = 0; j<27; j++)
         {
                s1 = [];
                s2 = 0;
                for (var h = 0; h<9; h++)
            {
                    if (!s[t1[j][h]+81])
               {
                        s1[s2] = t1[j][h];
                        s2++;
                    }
                }
                s5 = s1.length;
                if (!s5)
            {
                    continue;
                }
                r1 = 0;
                r2 = s[s1[0]];
                for (var h = 1; h<s5; h++)
            {
                    r1 = (s[s1[h]] & r2) | r1;
                    r2 = (s[s1[h]] ^ r2) & ~r1;
                }
                if (s5 != t4[r1]+t4[r2])
            {
                    return false;
                }
                if (r2)
            {
                    for (var h = 0; h<9; h++)
               {
                        if (s[s1[h]] & r2)
                  {
                            s3 = s1[h];
                            s4 = t3[s[s1[h]] & r2];
                            if (s4.length>1)
                     {
                                return false;
                            }
                            if (s3)
                     {
                                sp.push(s3, s4);
                            }
                        }
                    }
                }
            }
            for (var v = 0; v<sp.length; v += 2)
         {
                for (var j = 0; j<21; j++)
            {
                    sa = t[sp[v]][j];
                    if (sa != sp[v] && s[sa+81] == sp[v+1]) {
                        return false;
                    }
                }
                colocar(s, sp[v], sp[v+1]);
            }
        } while (sp[0]);
        return s;
    }
    function cons(s)
   {
        min = 9;
        ct2 = -1;
        for (var j = 0; j<81; j++)
      {
            if (!s[j+81] && t4[s[j]]<min)
         {
                min = t4[s[j]];
                ct2 = j;
            }
            if (min == 2)
         {
                break;
            }
        }
        s[162] = ct2;
        aq[ct] = s.slice();
        act[ct] = t3[s[ct2]].split("");
    }
    function colocar(s, a, b)
   {
        s[81+a] = b;
        for (var h = 0; h<21; h++)
      {
            s[t[a][h]] &= ~(1 << (b-1));
        }
    }
    function tablas()
   {
        t = [];
        t1 = [];
        t2 = [];
        t3 = [];
        t4 = [];
        for (var j = 0; j<512; j++)
      {
            rt = "";
            for (var h = 0; h<9; h++)
         {
                if (j & (1 << h))
            {
                    rt += h+1;
                }
            }
            t3[j] = rt;
            t4[j] = t3[j].length;
        }
        for (var j = 0; j<81; j++)
      {
            t[j] = [];
            t2[j] = [Math.floor(j/9), 9+j%9, 3*Math.floor(j/27)+Math.floor(j%9/3)+18];
            for (var v = 0; v<3; v++)
         {
                if (!t1[t2[j][v]])
            {
                    t1[t2[j][v]] = [];
                }
                t1[t2[j][v]].push(j);
            }
        }
        for (var j = 0; j<81; j++)
      {
            t[j] = t1[t2[j][0]].concat(t1[t2[j][1]]).concat(t1[t2[j][2]]);
            n = 0;
            t[j].sort(16);
            while (n<t[j].length-1)
         {
                t[j][n+1] == t[j][n] ? t[j].splice(n, 1) : n++;
            }
        }
    }
}
Son 2 funciones para generar y resolver Sudokus tomadas de este link

Este es el código que tengo traducido en 3 días. Ni siquiera sé si está correcto.

Código Delphi [-]
function generar(n);
var
    z : string; //" -aquí va la cadena unicode, debereis bajar el FLA pues solo copiando NO funcionará- ";
    //f :  Math.floor;
    //r = Math.random;
    B : integer = 4096;
    d1 : Array of integer;
    d2 : Array of integer;
    m  :  Array of integer;
    s0 : String = '';
    kr : Array of String;
    kf : Array of Byte;
    ks : Array of Byte;
    kt : Array of Byte;
    k3 : integer;//Array of Byte;
    rd : real48;
    al : integer;
    rg : real48;
    t  : integer;
    h  : integer;
    j  : integer;

 function m2(a: integer);
 var j,h: integer;
   begin
        for j := 0 to 8
        do begin
             m[j+a] = 0;
             for h := 0 to 8
             do begin
                  if a = 0 then m[j+a][h] := j*9+h
                           else if a = rd then m[j+a][h] := h*9+j
                                          else m[j+a][h] := m[h][j];
                end;
           end;
    end;

 function m1(var b: Array of integer;  a, c : Integer);
 var i,e,o : integer;
   begin
        for i := c-a downto 1
        do begin
            e := a+random(round(i*random()));
            o := b[i-1+a];
            b[i-1+a] = b[e];
            b[e] = o;
           end;
   end;

begin
    z := 'la cadena unicode aqui';
    rd := random(0.5);
    al := length(z);;
    rg := random(round(al*random()));

    j:=0;
    while j < 10 // No puedo/no sé usar el for con saltos de 9 en nueve
    do begin
        for h := 0 to 2
        do begin
          //  if not h then m2(j);  no entiendo la negaciónb de h y por eso lo quito

            m1(m, j+3*h, 3*h+3+j);
            end;
       j := j+9;
       end;
// Seguiré traduciendo...
end; // Generar

Gracias, al menos, por leerme.
Lo dicho: si alguien puede ayudarme se lo agradezco.
Mientras, seguiré peleándome con la traducción.

Saludos a todos.
Responder Con Cita