Ver la Versión Completa : Ejercicios de verano (elementos comunes entre dos arrays)
WillyWeb
28/06/18, 13:40:47
Esta vez el tema trata de arrays y ¿bucles? ...
¿Cómo encuentro los elementos comunes entre dos arrays?
array1 = grande,lo,tengo,más,lo,quisiera,que,entre,las,pier nas,no,me,cupiera
array2 = no,seas,mal,pensado,que,sólo,quiero,más,grande,mi, caballo
Puntos extra al proceso más rápido y al que use menos acciones. Y nada de JS ni otras zarandajas. Tasker puro y duro.
No veo a los amigos del grupo de Telegram ... ¿qué estáis haciendo? ¿es que entre todos no vais a ser capaces de aportar una solución? :silbando:
Caravantes
28/06/18, 23:59:19
Esta vez el tema trata de arrays y ¿bucles? ...
Con permiso, voy a concretar un poco más el objetivo. Al final de la tarea debe haber un array3 que contenga las palabras comunes de array1 y de array2. Y por acotar el problema, daremos por supuesto que ninguno de los arrays iniciales tiene palabras repetidas.
Al lío.
WillyWeb
29/06/18, 07:50:42
Al final de la tarea debe haber un array3 que contenga las palabras comunes de array1 y de array2.
Sí, eso es lo que pedía el Taskero.
... daremos por supuesto que ninguno de los arrays iniciales tiene palabras repetidas.
Si necesitas esa "ventaja" no seré yo el que te ponga palos en las ruedas, pero estaría bien resolver ese "pequeño" contratiempo. :silbando:
Caravantes
29/06/18, 12:05:34
Ha tenido poca dificultad
A1: Establece Array [ Matriz de Variables (array):%array1 Values:grande,lo,tengo,más,lo,quisiera,que,entre,l as,pier nas,no,me,cupiera Separador:, ]
A2: Establece Array [ Matriz de Variables (array):%array2 Values:no,seas,mal,pensado,que,sólo,quiero,más,gra nde,mi, caballo Separador:, ]
A3: For [ Variable:%index1 Ítems:1:%array1(#) ]
A4: For [ Variable:%index2 Ítems:1:%array2(#) ]
A5: Array Push [ Matriz de Variables (array):%array3 Posición:%index1 Valor:%array1(%index1) Rellenar Espacios:Apagado ] Si (if) [ %array1(%index1) ~ %array2(%index2) ]
A6: End For
A7: End For
A8: Flash [ Texto:%array3() Largo:Apagado ]
El Flash final muestra cuatro palabras: grande,más,que,no
Quitando la "ventaja" establecida, podríamos encontrarnos con una situación de este tipo:
array1 = uno,dos,tres,cuatro,dos,cuatro,cinco,dos
array2 = alfa,beta,dos,landa,sigma,dos,cinco
Y el problema puede ser distinto si se permite que en resultado (array3) una palabra aparezca repetida o no se permite. Con la tarea que yo he hecho y estos datos, la palabra "dos" aparecería seis veces en el resultado (array3). La dificultad adicional sería añadir algo para evitar esas repeticiones en el resultado.
Rizando el rizo, también se podría cuestionar si queremos considerar como palabras iguales o distintas las que se diferencian solo en las maýusculas/minúsculas (BETA/Beta/beta), y también si queremos considerar como palabras iguales aquellas que solo se diferencian en tildes (música/musica).
Todavía se me ocurren algunas otras posibilidades mas retorcidas: ¿Se consideran válidos dos elementos iguales que tienen longitud cero) (array1 = uno,,tres . array2 = alfa,,landa). ¿Se consideran válidos dos elementos iguales que solo tienen espacios (uno o más espacios) (array1 = uno, ,tres . array2 = alfa, ,landa). Ya no os aburro más con mis tontás :estrellas:
WillyWeb
29/06/18, 13:31:26
Caravantes, no pretendo hundirte pero mi tarea tiene dos acciones menos y tarda una décima parte del tiempo que la tuya. ;-)
WillyWeb (212)
A1: Establece Array [ Matriz de Variables (array):%aaa Values:grande,lo,tengo,más,lo,quisiera,que,entre,l as,piernas,no,me,cupiera Separador:, ]
A2: Establece Array [ Matriz de Variables (array):%bbb Values:no,seas,mal,pensado,que,sólo,quiero,más,gra nde,mi,caballo Separador:, ]
A3: For [ Variable:%ppp Ítems:%aaa() ]
A4: Array Push [ Matriz de Variables (array):%ccc Posición:999 Valor:%ppp Rellenar Espacios:Apagado ] Si (if) [ %bbb(#?%ppp) > 0 ]
A5: End For
A6: Flash [ Texto:%ccc() Largo:Apagado ]
Flash final: grande,más,que,no
Añadiendo a ambas tareas un par de acciones para cronometrar la duración del proceso me sale un tiempo de 400 a 450 mseg en la tuya y de 35 a 40 mseg en la mía ... :silbando:
Y el tema de los duplicados creo que lo puedo solucionar con una acción ... no te digo más.
Caravantes
29/06/18, 20:18:15
Caravantes, no pretendo hundirte pero mi tarea tiene dos acciones menos y tarda una décima parte del tiempo que la tuya.
Es un planteamiento genial.
Por un momento pensé que habías hecho un poco de trampa metiendo expresiones regulares en la comparación de A4, pero no: es Tasker puro. Ya hemos hablado de esto aquí https://www.htcmania.com/showthread.php?t=1371677
Buena cabeza la tuya que te acuerdas de todos los trucos y sabes encontrar la forma de aplicarlos idóneamente.
Por cierto, he intentado hacer algo similar utilizando solo comodines, y no me funciona: no detecta ninguna coincidencia entre los elementos de las dos matrices. Llevo un rato tratando de encontrar el problema y no atino. La tarea es igual a la tuya, solo se diferencia en la condición de A4.
A1: Establece Array [ Matriz de Variables (array):%aaa Values:grande,lo,tengo,más,lo,quisiera,que,entre,l as,piernas,no,me,cupiera Separador:, ]
A2: Establece Array [ Matriz de Variables (array):%bbb Values:no,seas,mal,pensado,que,sólo,quiero,más,gra nde,mi, caballo Separador:, ]
A3: For [ Variable:%ppp Ítems:%aaa() ]
A4: Array Push [ Matriz de Variables (array):%ccc Posición:999 Valor:%ppp Rellenar Espacios:Apagado ] Si (if) [ *,%ppp,* ~ ,bbb(), ]
A5: End For
A6: Flash [ Texto:%ccc() Largo:Apagado ]
La comparación es
*,%ppp,* ~ ,bbb(),
Cuando estamos procesando el primer elemento del primer array (grande), la comparación debería ser así
*,grande,* ~ ,no,seas,mal,pensado,que,sólo,quiero,más,grande,mi ,caballo,
Los asteriscos de la parte izquierda deberían hacer positiva la coincidencia del texto (incluyendo ambas comas, la previa y la posterior), pero por alguna razón la coincidencia jamas se produce y la tarea no detecta las palabras comunes como "grande". ¿Alguien sabe por qué?
SmartPhoneLover
29/06/18, 20:51:22
No sé, quizás este super mal encaminado, pero puede que tengas que tener en cuenta el número del elemento del array (#) en la expresión -> *,%ppp* ~ ,bbb(#)
Es decir, que tengas que incluir la posición actual analizada dentro del bucle For mediante la reutilización de una variable ya existente, o incorporando una dentro del mismo bucle.
Caravantes
29/06/18, 21:45:54
puede que tengas que tener en cuenta el número del elemento del array (#) en la expresión
Gracias por la idea.
La cuestión es que yo he tratado de plantear esta comparación sin tener en cuenta que sean arrays, teniendo en cuenta solo la comparación de dos variables "simples".
A la izquierda tengo
*,%ppp,*
cuyo valor es
*,grande,*
Y al otro lado tengo
,bbb(),
cuyo valor es una cadena de caracteres
,no,seas,mal,pensado,que,sólo,quiero,más,grande,mi ,caballo,
Desde mi punto de vista, es irrelevante que esta segunda cadena sea un array (o que contenga algunas comas), la comparación debería funcionar del modo "normal".
Si el valor/texto de la izquierda está precedido de un asterisco y seguido de otro asterisco, creo que la comparación debería ser positiva puesto que ese valor/texto está exactamente contenido en (dentro de) el valor/texto que hay a la derecha de la comparación. Pero no funciona, y seguramente sea por algo que se me escapa.
WillyWeb
30/06/18, 10:27:23
La comparación es
*,%ppp,* ~ ,bbb(),
Los asteriscos de la parte izquierda deberían hacer positiva la coincidencia del texto (incluyendo ambas comas, la previa y la posterior), pero por alguna razón la coincidencia jamas se produce y la tarea no detecta las palabras comunes como "grande". ¿Alguien sabe por qué?
Es que lo estás poniendo al revés. Prueba así ...
,bbb(), ~ *,%ppp,*
Pero no te funcionará como esperas porque las palabras de un array no siempre tiene comas a los dos lados. ;-)
EDITO
Al publicar mi respuesta me he fijado mejor y he visto que has añadido comas a los dos lados del array. Puede que sí funcione ... :pensando:
WillyWeb
30/06/18, 10:37:53
Comprobado ...
WillyWeb (333)
A1: Establece Array [ Matriz de Variables (array):%aaa Values:grande,lo,tengo,más,lo,quisiera,que,entre,l as,piernas,no,me,cupiera Separador:, ]
A2: Establece Array [ Matriz de Variables (array):%bbb Values:no,seas,mal,pensado,que,sólo,quiero,más,gra nde,mi,caballo Separador:, ]
A3: For [ Variable:%ppp Ítems:%aaa() ]
A4: Array Push [ Matriz de Variables (array):%ccc Posición:999 Valor:%ppp Rellenar Espacios:Apagado ] Si (if) [ ,%bbb(), ~ *,%ppp,* ]
A5: End For
A6: Flash [ Texto:%ccc() Largo:Apagado ]
Flash final: grande,más,que,no
Y parece que el tiempo de ejecución mejora un poco. Ahora no llega casi nunca a los 40 mseg.
:oskitar:
De lo que eres capaz por no perder una competición.
Caravantes
30/06/18, 11:24:22
Es que lo estás poniendo al revés.
No veo por qué piensas eso. Que yo sepa no hay nada que obligue a establecer un orden concreto en los elementos a comparar; debería funcionar poniéndolo "al derecho" y "al revés".
Cuando activas la comparación, en la parte izquierda aparece un porcentaje (%) y yo interpreto eso como una sugerencia para que ahí pongas una variable (aunque no es obligatorio); en la parte derecha no aparece nada, lo cual podría interpretarse como una sugerencia para "comparar una variable contra un valor fijo (no variable)", aunque la parte derecha también admite variables, claro.
Hablando del símbolo porcentaje, me he dado cuenta de un error que estaba cometiendo. En la parte derecha
,bbb(),
me faltaba añadir ese caracter indicativo de variable
,%bbb(),
Ya lo he añadido y resulta que la tarea sigue sin funcionar como espero. Sigue sin detectar coincidencia alguna entre los dos arrays iniciales.
A1: Establece Array [ Matriz de Variables (array):%aaa Values:grande,lo,tengo,más,lo,quisiera,que,entre,l as,piernas,no,me,cupiera Separador:, ]
A2: Establece Array [ Matriz de Variables (array):%bbb Values:no,seas,mal,pensado,que,sólo,quiero,más,gra nde,mi, caballo Separador:, ]
A3: For [ Variable:%ppp Ítems:%aaa() ]
A4: Array Push [ Matriz de Variables (array):%ccc Posición:999 Valor:%ppp Rellenar Espacios:Apagado ] Si (if) [ *,%ppp,* ~ ,%bbb(), ]
A5: End For
A6: Flash [ Texto:%ccc() Largo:Apagado ]
Para tratar de acotar y simplificar el posible problema de los asteriscos me he hecho otra tarea más sencilla concentrada en investigar ese asunto de la forma más sencilla y sin arrays:
A1: Establecer variable [ Nombre:%ppp A:grande Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
A2: Flash [ Texto:A comparacion directa sencilla (grande) Largo:Apagado ] Si (if) [ %ppp ~ grande ]
A3: Flash [ Texto:B comparacion incorrecta (AAgrandeZZ) Largo:Apagado ] Si (if) [ %ppp ~ AAgrandeZZ ]
A4: Flash [ Texto:C comparacion con asteriscos (AAgrandeZZ) Largo:Apagado ] Si (if) [ *%ppp* ~ AAgrandeZZ ]
Bueno, pues resulta que solo es positiva la comparación del primer Flash (A2)
La comparación del segundo Flash (A3) no funciona, como es lógico.
Y la comparación del tercer Flash (A4) tampoco funciona, aunque yo creo que en teoría debería de ser positiva.
Ya estoy pensando en que tal vez la última revisión de tasker haya dejado descolocada la comparación con asteriscos.
Caravantes
30/06/18, 12:52:00
Comprobado ...
Ok, tienes razón, a mí también me funciona.
Ayer probé a cambiar el orden de la comparación tal como sugeriste
,bbb(), ~ *,%ppp,*
y no funcionaba porque seguía olvidando el porcentaje de variable.
,%bbb(), ~ *,%ppp,*
He reescrito mi tarea de comprobación adicional añadiendo otra acción con la comparación realizada en el orden "inverso":
A1: Establecer variable [ Nombre:%ppp A:grande Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
A2: Flash [ Texto:2 comparacion directa sencilla (grande) Largo:Apagado ] Si (if) [ %ppp ~ grande ]
A3: Flash [ Texto:3 comparacion incorrecta (AAgrandeZZ) Largo:Apagado ] Si (if) [ %ppp ~ AAgrandeZZ ]
A4: Flash [ Texto:4 comparacion con asteriscos (AAgrandeZZ) Largo:Apagado ] Si (if) [ *%ppp* ~ AAgrandeZZ ]
A5: Flash [ Texto:5 inversion con asteriscos (AAgrandeZZ) Largo:Apagado ] Si (if) [ AAgrandeZZ ~ *%ppp* ]
Efectivamente, la condición del último Flash se cumple, y la del anterior no se cumple. Ambas condiciones varían solo en el orden de los términos a comparar.
Vuelvo a revisar la documentación correspondiente
https://tasker.joaoapps.com/userguide/es/matching.html
y no veo ninguna indicación de que el patrón (elemento con asteriscos) deba estar a la derecha.
Por contra, vuelvo a reiterar lo que ya dije antes: por la izquierda aparece (por defecto) un porcentaje, lo cual parece una sugerencia para poner ahí una variable. En la parte derecha no aparece nada. Es por eso que yo siempre procuro poner a la izquierda la variable que estoy chequeando. Cierto que normalmente chequeamos la variable contra un patrón, cuando esta vez añado los asteriscos a la variable convirtiendo esa parte izquierda en el patrón.
Así pues, pregunto: Willy, ¿Ha sido eso lo que te ha llevado a pensar que el problema podría estar en el orden de los términos a comparar? ¿Tienes algún otro criterio o truco nemotécnico para esto?
WillyWeb
30/06/18, 12:55:05
Ya estoy pensando en que tal vez la última revisión de tasker haya dejado descolocada la comparación con asteriscos.
Bueno, pues resulta que solo es positiva la comparación del primer Flash (A2)
Ese tipo de comparaciones siempre ha funcionado así. La he usado infinidad de veces en versiones anteriores de Tasker y siempre ha hecho lo mismo. Los posibles comodines siempre deben estar en el lado derecho.
http://tasker.dinglisch.net/userguide/en/flowcontrol.html
Matches (~)
The right parameter is a pattern which the left parameter is matched against.
Mira el mensaje justo anterior al tuyo y comprobarás que invirtiendo los parámetros (al contrario de lo que dices que te "sugiere" Tasker) la tarea funciona correctamente.
EDITO
Mientras escribía esto tú has publicado otro mensaje en el que confirmas que invirtiendo los parámetros te funciona bien.
WillyWeb
30/06/18, 12:59:18
Así pues, pregunto: Willy, ¿Ha sido eso lo que te ha llevado a pensar que el problema podría estar en el orden de los términos a comparar? ¿Tienes algún otro criterio o truco nemotécnico para esto?
Solamente lo que pone el manual de usuario ...
http://tasker.dinglisch.net/userguide/es/flowcontrol.html
Coincide (~)
El parámetro de la derecha es un patrón que se compara con el parámetro de la izquierda.
http://tasker.dinglisch.net/userguide/en/flowcontrol.html
Matches (~)
The right parameter is a pattern which the left parameter is matched against.
:oh:
Caravantes
30/06/18, 13:03:16
Matches (~)
The right parameter is a pattern which the left parameter is matched against
[Coincidencia (~)
El parámetro derecha es un modelo contra el que se compara el parámetro de la izquierda.]
Efectivamente, eso lo aclara. Muchas gracias.
Sí, ya había visto tu mensaje en el que habías comprobado que la tarea funcionaba bien (incluso más rápido, según dices), y yo también lo había confirmado ("Ok, tienes razón, a mí también me funciona.").
Gracias nuevamente.
SmartPhoneLover
30/06/18, 14:20:30
Chicos habeis probado las formas que se ofrecen en este (https://www.reddit.com/r/tasker/comments/8uon38/q_find_common_elements_in_two_arrays/) hilo? Sobretodo la del comando 'comm'.
Args: https://www.computerhope.com/unix/ucomm.htm
WillyWeb
30/06/18, 15:07:46
Entonces la idea sería convertir esos arrays en archivos con una palabra por línea y usar un comando de consola tal que así ... comm -12 lista1.txt lista2.txt ... para conseguir la lista de palabras que está en ambos archivos. :pensando:
Ya tienes tarea. ;-)
GraphicAdventure
10/07/18, 19:45:12
Caravantes, si te hubieras acordado como se comparan las variables internas (PACTIVE, WIFII,...) es posible que te hubieras dado cuenta.
WillyWeb
10/07/18, 19:57:26
¿Alguien ha probado ese comando que decía SmartPL?
comm -12 lista1.txt lista2.txt
vBulletin® v3.8.1, Copyright ©2000-2026, Jelsoft Enterprises Ltd.