Sfida 5
Lavorare con le matrici è comodo e veloce. Molte funzioni che operano su un singolo valore possono essere applicate anche a un'intera matrice. Inoltre, funzioni come V Max , V Mean e V Quantile possono essere applicate a una funzione della matrice (colonne, in queste situazioni). La sfida di questo mese mira a portare tutto ciò al livello successivo. Cercheremo di estendere questa funzionalità a funzioni che non sono disponibili in JSL e di farlo sia per matrici che per liste.
- Scrivi una funzione denominata mad che prenda un vettore come input e restituisca la deviazione assoluta mediana (la mediana delle differenze assolute rispetto alla mediana dei dati). Ad esempio, mad ([1,2,3,1000]) restituisce 1. Se è presente un numero pari di osservazioni, prendi il valore medio al centro per calcolare la mediana.
- Scrivere una funzione trimmedMean ( vecIn , pctLo , pctHi ) che accetta un vettore ( vecIn ) e un valore compreso tra 0 e 0,5 corrispondente alla percentuale di osservazioni sotto ( pctLo ) e sopra ( pctHi ) la media che vengono rimosse prima che venga calcolata la media. La percentuale dei valori ritagliati deve essere il numero più grande che non supera la percentuale di input.
- Scrivere una funzione listContains ( listIn , valueString ) che accetta un elenco di stringhe ( listIn ) e una stringa ( valueString ) e restituisce un elenco di valori di matrice in cui ciascun elemento della matrice corrisponde a una posizione iniziale di valueString nel jesimo elemento di listIn (ovvero, un elemento di listIn può contenere valueString più di una volta). Restituisce il valore mancante se l'elemento non contiene la stringa.
- Scrivi una funzione applyFunction ( listIn , fn , argList ) che accetta un elenco di input ( listIn ) e applica ad esso la funzione fn con argomenti argList . Supponiamo che l'elenco conterrà solo numeri o stringhe. La funzione dovrebbe funzionare sia per le funzioni integrate che per quelle fornite dall'utente. Potrebbe restituire un singolo valore, una matrice o un elenco di valori a seconda della funzione di input. Per semplicità, presupponiamo che qualsiasi funzione fornita a applyFunction dovrà operare solo su un carattere, una stringa, un numero, una matrice o un elenco (limitata a carattere, stringa, numero, matrice o elementi dell'elenco).
Punteggio: due punti per gli elementi 1 e 2, sei punti per gli elementi 3 e 4. Quattro punti extra se riesci a scrivere l'elemento 3 o 4 senza utilizzare un loop (di qualsiasi tipo) o una tabella dati.
La scadenza per le iscrizioni è alle 23:59, ora degli Stati Uniti orientali, di lunedì 17 agosto .
11 agosto 2020: c'è stata un po' di confusione su alcuni aspetti della sfida. Vediamo se riesco a chiarire le cose:
- Per trimmedMean , pctLo e pctHi sono valori frazionari delimitati inferiore da 0 e superiore da 0,5. Se, ad esempio, pctLo = 0,23, viene rimosso il 23% dei valori dalla coda inferiore.
- Per listContains , se listIn = {"ABCD","DEFG", "GHIJ"} e valueString = "D", viene restituito [4,1,.].
- Per applyFunction , sia listIn che argList sono argomenti di fn . La differenza principale è che listIn non sarà mai vuoto, ma argList potrebbe esserlo. Ad esempio, se listIn = {"ABCD","DEFG","GHIJ"} e fn = Contiene , argList dovrebbe essere un elenco che contiene almeno una sottostringa da cercare. Se fn = Length , tuttavia, argList sarebbe vuoto. Nei casi in cui è possibile applicare fn ai singoli elementi, farlo. Ad esempio, se fn = Char , invece di restituire l'elenco tra virgolette, cita i singoli elementi dell'elenco.
Spero che questo renda le cose più chiare. In caso contrario, per favore fatemelo sapere.

La sfida di questo mese diventa meta.
Automazione e scriptingRi: Sfida 5Scusate tutti. Le cose sono state davvero impegnative per me e questa sfida si è rivelata più complicata di quanto mi aspettassi. Ho quasi finito di scrivere e dovrei avere qualcosa entro la fine della settimana. Si spera, una nuova sfida poco dopo.
Ri: Sfida 5Qualche novità al riguardo?
Ri: Sfida 5Grazie!
Ri: Sfida 5@David_Burnham Supponevo il 2°.
Ri: Sfida 5Giusto il tempo forse per stringere un'ultima domanda.ArgList - è un elenco di argomenti o un elenco JMP effettivo:
applyFunction(inList,fn,a,b,c,flag)
O
applyFunction(inList,fn,{a,b,c},flag)
Se non ho tue notizie, presumo che possa essere entrambe le cose!
Ri: Sfida 5Nessun problema! Questo aiuta a chiarire i problemi legati al tentativo di farlo. Aggiungiamo un flag come ultimo argomento a applyFunction per indicare se deve essere applicato in termini di elenco o di elementi.
applyFunction ( inList , ecc , argList , bandiera )
Ri: Sfida 5Questo è perfettamente chiaro e sono felice di lavorare con questi presupposti.
Tuttavia (scusate!) mi viene subito in mente un contro-scenario: le funzioni JMP Concatena elementi e contiene elaborare interi elenchi anziché singoli elementi.E mentre vorrei Somma da applicare all'intera lista, vorrei Girare da applicare agli elementi.(Non potremmo avere un parametro flag per indicare se la funzione opera a livello di lista o a livello di singoli elementi).
Scusa ancora, mi sento come se fossi un dolore.
Ri: Sfida 5Grazie Davide,
Usiamo le seguenti ipotesi:
- ecc è una stringa.
- elencoIn è una lista composta interamente da numeri o interamente da stringhe. Se i numeri, ecc eseguirà la sua operazione sull'intero vettore dei valori di input. Se carattere, eseguirà l'operazione sui singoli elementi.
- L'ordine in cui compaiono gli argomenti argList è lo stesso ordine in cui essere utilizzato ecc .
Spero che questo renda le cose un po' più chiare. Ancora una volta, in caso contrario, fatemelo sapere.
Ri: Sfida 5Grazie per i chiarimenti Don.Per applyFunction, is ecc espresso come una stringa?Se ecc può essere qualsiasi funzione, come facciamo a sapere se può essere applicata o meno ai singoli elementi? - applyFunction vede semplicemente il nome di una funzione come parametro di input, non sa cosa è in grado di fare la funzione?E se ElencoIn è una lista di numeri, allora avrebbe senso sommare l'intera lista, ma in alternativa ogni elemento potrebbe essere una lista, nel qual caso potrebbe avere senso restituire una lista di somme.