Cómo implementar MapThread con el mapeo lista básica?
-
21-09-2019 - |
Pregunta
Mathematica tiene una función MapThread
que se comporta de esta manera:
MapThread[ f , { {a,b,c} , {d,e,f} } ]
-> { f[a,d] , f[b,e] , f[c,f] }
Me gustaría implementar esto en TeX, que cuenta con instalaciones de programación muy primitivas. He instalaciones básicas para la iteración en las listas, pero sin indexación lógica en ellos. Teniendo en cuenta esta restricción, es que hay un algoritmo para recorrer de forma sincrónica, aunque varias listas?
Podría escribir algo como lo siguiente: (pseudocódigo)
ii = 0; jj = 0;
for elem1 in list1
ii = ii+1
for elem2 in list2
jj = jj+1
if ii == jj
return ( elem1 , elem2 )
fi
end
end
pero parece terriblemente ineficiente. Tenga en cuenta que la gran restricción es que no puedo acceder a elementos de las listas numérica, así que algo como lo siguiente es demasiado "alto nivel":
for ii = 1:length(list1)
func ( list1(ii) , list2(ii) )
end
La razón de esta restricción está en su lugar es que con el fin de poner en práctica list1(ii)
que había necesidad de escribir algo como lo siguiente en primer lugar:
jj = 0
for elem1 in list1
jj = jj+1
if ii=jj
return elem1
fi
end
O es el caso ineficaz probablemente el mejor que va a ser capaz de hacer con un lenguaje tan primitivo?
Solución
En pseudocódigo, siempre y cuando se puede comprobar si una lista está vacía, puede hacerlo de esta manera:
while (list1 is not empty) and (list2 is not empty)
x1 = first(list1);
x2 = first(list2);
list1 = rest(list1);
list2 = rest(list2);
func(x1, x2);
end while
Es todavía no va a ganar ningún concurso de belleza, pero que va a hacer el trabajo sin ser abrumadoramente ineficiente.