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; 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; 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 do begin
for h := 0 to 2
do begin
m1(m, j+3*h, 3*h+3+j);
end;
j := j+9;
end;
end;
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.