Desafío 5
Trabajar con matrices es cómodo y rápido. Muchas funciones que funcionan con un solo valor también se pueden aplicar a una matriz completa. Además, funciones como V Max , V Mean y V Quantile se pueden aplicar a una función de la matriz (columnas, en estas situaciones). El desafío de este mes tiene como objetivo llevar esto al siguiente nivel. Buscaremos extender esta funcionalidad a funciones que no están disponibles en JSL y hacerlo tanto para matrices como para listas.
- Escriba una función llamada mad que tome un vector como entrada y devuelva la desviación absoluta mediana (la mediana de las diferencias absolutas con respecto a la mediana de los datos). Por ejemplo, mad ([1,2,3,1000]) devuelve 1. Si hay un número par de observaciones, tome el valor promedio en el medio para calcular la mediana.
- Escriba una función trimmedMean ( vecIn , pctLo , pctHi ) que tome un vector ( vecIn ) y un valor entre 0 y 0,5 correspondiente al porcentaje de observaciones por debajo ( pctLo ) y por encima ( pctHi ) de la media que se eliminan antes de calcular la media. El porcentaje de valores recortados debe ser el número más grande que no exceda el porcentaje de entrada.
- Escriba una función listContains ( listIn , valueString ) que tome una lista de cadenas ( listIn ) y una cadena ( valueString ) y devuelva una lista de valores de matriz donde cada elemento de la matriz corresponde a una posición inicial de valueString en el jésimo elemento de listIn (es decir, un elemento de listIn puede contener valueString más de una vez). Devuelve el valor faltante si el elemento no contiene la cadena.
- Escriba una función applyFunction ( listIn , fn , argList ) que tome una lista de entrada ( listIn ) y le aplique la función fn con argumentos argList . Suponga que la lista solo contendrá números o cadenas. La función debería funcionar tanto para funciones integradas como para funciones proporcionadas por el usuario. Podría devolver un valor único, una matriz o una lista de valores según la función de entrada. Para simplificar, suponga que cualquier función proporcionada para applyFunction solo necesitará operar en un carácter, cadena, números, matriz o lista (restringida a caracteres, cadenas, números, matrices o elementos de lista).
Puntuación: dos puntos por los elementos 1 y 2, seis puntos por los elementos 3 y 4. Cuatro puntos extra si puedes escribir los elementos 3 o 4 sin utilizar un bucle (de ningún tipo) o una tabla de datos.
La fecha límite para participar es el lunes 17 de agosto a las 11:59 p. m., hora del este de EE. UU .
11 de agosto de 2020: Ha habido un poco de confusión sobre algunos aspectos del desafío. Déjame ver si puedo aclarar las cosas:
- Para trimmedMean , pctLo y pctHi son valores fraccionarios limitados por debajo por 0 y por arriba por 0,5. Si, por ejemplo, pctLo = 0,23, entonces se elimina el 23% de los valores de la cola inferior.
- Para listContains , si listIn = {"ABCD","DEFG", "GHIJ"} y valueString = "D", entonces se devuelve [4,1,.]
- Para applyFunction , tanto listIn como argList son argumentos para fn . La principal diferencia es que listIn nunca estará vacío, pero argList puede estar vacío. Por ejemplo, si listIn = {"ABCD","DEFG","GHIJ"} y fn = Contiene , entonces argList debe ser una lista que contenga al menos una subcadena para buscar. Sin embargo, si fn = Longitud , argList estaría vacía. En los casos en los que fn se pueda aplicar a elementos individuales, hágalo. Por ejemplo, si fn = Char , en lugar de devolver la lista citada, cite los elementos individuales de la lista.
Espero que esto aclare las cosas. Si no es así, por favor hágamelo saber.

El desafío de este mes se vuelve meta.
Automatización y secuencias de comandosRe: Reto 5Lo siento a todos. Las cosas han estado muy ocupadas para mí y este desafío resultó ser más complicado de lo que esperaba. Ya casi he terminado con la redacción y debería tener algo para el final de la semana. Con suerte, un nuevo desafío poco después de eso.
Re: Reto 5¿Alguna noticia sobre esto?
Re: Reto 5¡Gracias!
Re: Reto 5@David_Burnham Estaba asumiendo el 2do.
Re: Reto 5Es tiempo de hacer tal vez una última pregunta.ArgList: es una lista de argumentos o una lista JMP real:
applyFunction(inList,fn,a,b,c,flag)
o
applyFunction(inList,fn,{a,b,c},flag)
¡Si no tengo noticias tuyas, asumiré que puede ser cualquiera de las dos cosas!
Re: Reto 5¡No hay problemas! Esto ayuda a dilucidar los problemas al intentar hacer esto. Agreguemos una bandera como último argumento de applyFunction para indicar si debe aplicarse en forma de lista o de elemento.
aplicarFunción ( en lista , fn , listaarg , bandera )
Re: Reto 5Eso está perfectamente claro y estoy feliz de trabajar con esas suposiciones.
Sin embargo (¡lo siento!), inmediatamente puedo pensar en un escenario contrario: las funciones JMP Elementos y contenidos de Concat procesar listas completas en lugar de elementos individuales.Y mientras que yo quisiera Suma para aplicar a toda la lista, me gustaría Redondo para aplicar a los elementos.(¿No podríamos tener un parámetro de bandera para indicar si la función opera a nivel de lista o a nivel de elementos individuales)?
Lo siento de nuevo, siento que estoy siendo un fastidio.
Re: Reto 5Gracias David,
Utilicemos los siguientes supuestos:
- fn es una cuerda.
- lista en Es una lista compuesta enteramente de números o enteramente de cadenas. Si los números, fn realizará su operación en todo el vector de valores de entrada. Si es carácter, realizará la operación en los elementos individuales.
- El orden en que aparecen los argumentos listaarg es el mismo orden que se utilizará en fn .
Esperemos que eso aclare un poco las cosas. Nuevamente, si no, hágamelo saber.
Re: Reto 5Gracias por las aclaraciones Don.Para aplicar función, es fn expresado como una cadena?Si fn Puede ser cualquier función, ¿cómo sabemos si se puede aplicar o no a elementos individuales? - applyFunction simplemente ve el nombre de una función como parámetro de entrada, ¿no tiene conocimiento de lo que la función es capaz de hacer?Y si Lista en es una lista de números, entonces tendría sentido sumar la lista completa, pero alternativamente cada elemento podría ser una lista, en cuyo caso podría tener sentido devolver una lista de sumas.