2 votos

Cómo determinar si todos los elementos de una lista son iguales

Actualmente estoy trabajando en una calculadora AppleScript que extrapola secuencias lineales aritméticas (suena elegante pero realmente no lo es). Uno de los procesos que debe realizar es encontrar la diferencia común entre cada elemento. Al enchufar esta diferencia ( d ) en la ecuación de progresión aritmética junto con el término que desea conocer ( n ) predecirá el n término en cualquier secuencia.

Para determinar la diferencia común, primero hay que encontrar la diferencia local entre cada par de números de la secuencia. A continuación, compara cada diferencia; si son todas iguales, la secuencia es lineal y la diferencia común es igual a la diferencia local. Si no, la secuencia no es lineal y no hay diferencia común. He averiguado cómo encontrar las diferencias locales de cada número, pero esto último parece ser un reto mayor. El código que he hecho para determinar las diferencias locales escupe una lista de números. Mi proceso teórico simplemente compararía el primer elemento con todos los demás, y si cada comparación devuelve como verdadero, entonces establece la diferencia común a la misma que la diferencia local. A continuación se muestra mi manera de encontrar la diferencia local de una lista de números:

set sequence to {1, 2, 3, 4, 4}
set x to 0
set dif_check to {}
repeat ((number of items of sequence) - 1) times
   set x to (x + 1)
   set selected_item to (item x of sequence)
   set local_dif to ((item (x + 1) of sequence) - selected_item)
   set dif_check to dif_check & {local_dif}
end repeat
return dif_check
--> result: {1, 1, 1, 0}
(* Since every item in the resulting list isn't equal, it would be nonlinear and the common difference would just be n/a. *)

¿Cómo puedo determinar si todos los elementos de una lista son iguales? Lo he intentado numerosas veces, incluyendo este script con el que experimenté, pero me di cuenta de que no me acercaba a la resolución:

set dif_check to {1, 1, 1, 0}
set first_term to (first item of dif_check)
set x to 1
set common_dif_check to {}
repeat ((number of items of dif_check) - 1) times
   set x to (x + 1)
   (item x of dif_check) = first_term
   set common_dif_check to common_dif_check & {result}
end repeat
return common_dif_check
--> result: {true, true, false}
(* This takes the first item of the list and compares it with every item after, returning a true or false and adding the result to another list. I thought this would have solved it, but instead just turns out as the same situation as before. *)

Para reiterar, ¿cómo puedo determinar si todos los elementos de una lista son iguales? Cualquier ayuda con esto sería muy apreciada. Gracias de antemano.

2voto

wch1zpink Puntos 11

No estoy seguro de si esto ayudará, pero el siguiente código eliminará los elementos duplicados de una lista y creará una nueva lista a partir de los resultados. Entonces contará los elementos de la nueva lista y si los elementos de esa nueva lista son mayores que 1 eso significa que todos los elementos de la lista original no eran iguales

property difCheck : {1, 1, 1, 0}
property allItemsAreTheSame : missing value

set itemCount to count of removeDuplicates(difCheck)

if itemCount is greater than 1 then
    set allItemsAreTheSame to false
else
    set allItemsAreTheSame to true
end if

on removeDuplicates(theList)
    script k
        property |List| : theList
        property tmpList : {}
    end script
    repeat with itemRef in k's |List|
        set theItem to itemRef's contents
        if k's tmpList does not contain theItem then ¬
            set k's tmpList's end to theItem
    end repeat
    return k's tmpList
end removeDuplicates

0voto

kuzzooroo Puntos 249

Sólo se necesitan un par de modificaciones.

set dif_check to {1, 1, 1, 0}
set first_term to (first item of dif_check)
set x to 1
set terms_are_same to true
repeat ((number of items of dif_check) - 1) times
    set x to (x + 1)
    if ((item x of dif_check) ≠ first_term) then
        set terms_are_same to false
    end if
end repeat
return terms_are_same

El truco consiste en utilizar una variable que se ponga a cero a menos que una de las comparaciones falle.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X