|
||
|
|
|
|||||||
| Tasker Para hablar de todo lo relacionado con la aplicación tasker |
![]() |
|
|
Herramientas |
|
#1
|
||||
|
||||
|
Esta vez el tema trata de arrays y ¿bucles? ...
¿Cómo encuentro los elementos comunes entre dos arrays?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?
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) Última edición por WillyWeb Día 28/06/18 a las 19:02:59. |
|
|
|
#2
|
||||
|
||||
|
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.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
|
#3
|
||||
|
||||
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
|
#4
|
||||
|
||||
|
Ha tenido poca dificultad
Código:
A1: Establece Array [ Matriz de Variables (array):%array1 Values:grande,lo,tengo,más,lo,quisiera,que,entre,las,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,grande,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 ] 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
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
| Gracias de parte de: | ||
|
#5
|
||||
|
||||
|
Caravantes, no pretendo hundirte pero mi tarea tiene dos acciones menos y tarda una décima parte del tiempo que la tuya.
Código:
WillyWeb (212) A1: Establece Array [ Matriz de Variables (array):%aaa Values:grande,lo,tengo,más,lo,quisiera,que,entre,las,piernas,no,me,cupiera Separador:, ] A2: Establece Array [ Matriz de Variables (array):%bbb Values:no,seas,mal,pensado,que,sólo,quiero,más,grande,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 ] 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 ... ![]() Y el tema de los duplicados creo que lo puedo solucionar con una acción ... no te digo más.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
| Gracias de parte de: | ||
|
#6
|
||||
|
||||
|
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. Código:
A1: Establece Array [ Matriz de Variables (array):%aaa Values:grande,lo,tengo,más,lo,quisiera,que,entre,las,piernas,no,me,cupiera Separador:, ] A2: Establece Array [ Matriz de Variables (array):%bbb Values:no,seas,mal,pensado,que,sólo,quiero,más,grande,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 ] *,%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é?
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
|
#7
|
||||
|
||||
|
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. |
| Gracias de parte de: | ||
|
#8
|
||||
|
||||
|
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.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
|
#9
|
||||
|
||||
|
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é? ![]() ,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 ...
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) Última edición por WillyWeb Día 30/06/18 a las 10:30:07. |
|
#10
|
||||
|
||||
|
Comprobado ...
Código:
WillyWeb (333) A1: Establece Array [ Matriz de Variables (array):%aaa Values:grande,lo,tengo,más,lo,quisiera,que,entre,las,piernas,no,me,cupiera Separador:, ] A2: Establece Array [ Matriz de Variables (array):%bbb Values:no,seas,mal,pensado,que,sólo,quiero,más,grande,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 ] Y parece que el tiempo de ejecución mejora un poco. Ahora no llega casi nunca a los 40 mseg. ![]() De lo que eres capaz por no perder una competición.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
|
#11
|
||||
|
||||
|
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. Código:
A1: Establece Array [ Matriz de Variables (array):%aaa Values:grande,lo,tengo,más,lo,quisiera,que,entre,las,piernas,no,me,cupiera Separador:, ] A2: Establece Array [ Matriz de Variables (array):%bbb Values:no,seas,mal,pensado,que,sólo,quiero,más,grande,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 ] Código:
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 ] 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.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
|
#12
|
||||
|
||||
|
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": Código:
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* ] 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?
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
|
#13
|
||||
|
||||
http://tasker.dinglisch.net/userguid...owcontrol.htmlMira 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.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) Última edición por WillyWeb Día 30/06/18 a las 12:57:12. |
|
#14
|
||||
|
||||
|
http://tasker.dinglisch.net/userguid...owcontrol.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/userguid...owcontrol.html Matches (~) The right parameter is a pattern which the left parameter is matched against.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
|
#15
|
||||
|
||||
|
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.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
|
#16
|
||||
|
||||
|
Chicos habeis probado las formas que se ofrecen en este hilo? Sobretodo la del comando 'comm'.
Args: https://www.computerhope.com/unix/ucomm.htm Última edición por SmartPhoneLover Día 30/06/18 a las 14:23:12. |
|
#17
|
||||
|
||||
|
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.
![]() Ya tienes tarea.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
|
#18
|
||||
|
||||
|
Caravantes, si te hubieras acordado como se comparan las variables internas (PACTIVE, WIFII,...) es posible que te hubieras dado cuenta.
|
|
#19
|
||||
|
||||
|
¿Alguien ha probado ese comando que decía SmartPL?
comm -12 lista1.txt lista2.txt
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
|
|
![]() |
Estás aquí
|
||||||
|
||||||