Smooth un grafico a linee


13

Dato un input di un numero intero n e un elenco di numeri interi positivi m 1 , m 2 , ..., genera un elenco di numeri interi m 1 ' , m 2 ' , ... dove m x ' è definita come la media di m xn attraverso m x + n .

Quando si calcolano queste medie, ignorare gli indici che sono fuori dai limiti (e regolare di conseguenza la divisione della somma). n sarà sempre ≥ 1 ma mai la metà della lunghezza di m (arrotondato per difetto) o più. Ciò significa che la lunghezza minima di m è 4. Gli elementi in m saranno numeri interi positivi, ma l'output deve essere accurato con almeno 3 cifre decimali.

Gli elementi di input / output che sono liste possono essere stringhe separate da spazi bianchi / virgola o matrici / liste / ecc. Per input, se la tua soluzione è una funzione, puoi anche prendere un primo argomento di n e argomenti aggiuntivi come m x (questo vale anche per gli argomenti della riga di comando).

Ecco una rappresentazione visiva di n=1:

1 4 5 7 10
__/ | | |
L avg(1,4) = 2.5
    | | |
\___/ | |
  L avg(1,4,5) = 3.333
      | |
  \___/ |
    L avg(4,5,7) = 5.333
        |
    \___/
      L avg(5,7,10) = 7.333

      \___
        L avg(7,10) = 8.5

Final output: 2.5 3.333 5.333 7.333 8.5

Dato che si tratta di , vince il codice più breve in byte.

Casi di test ( questi sono stati fatti manualmente; per favore avvisami di eventuali errori ):

In                             Out
----------------------------------------------------------------------
n=1, m=12 6 3 9                9 7 6 6
n=1, m=1 4 5 7 10              2.5 3.333 5.333 7.333 8.5
n=1, m=1 3 3 7 4 2 4 2         2 2.333 4.333 4.666 4.333 3.333 2.666 3
n=2, m=1 3 5 9 10 14 15 16 23  3 4.5 5.6 8.2 10.6 12.8 15.6 17 18
n=3, m=1 1 1 1 1 1 1 1         1 1 1 1 1 1 1 1
n=3, m=1 2 3 4 5 6 7 8         2.5 3 3.5 4 5 5.5 6 6.5

Per essere chiari, questo equivale a anteporre e aggiungere zeri e quindi calcolare i mezzi di ciascuna sottosequenza contigua di lunghezza 3?
El'endia Starman l'

@ El'endiaStarman No. avg(0,1,2)non è la stessa avg(1,2). Per i "casi limite" (ha), non dovresti fare la media di molti elementi dell'elenco di input.
Maniglia della porta

Ah, giusto, lo vedo adesso.
El'endia Starman l'


Questa sarebbe stata una sfida migliore senza la limitazione che m_isono positivi.
Peter Taylor,

Risposte:


1

Pyth, 20 byte

m.O:vzeS,0-dQh+dQUvz

Suite di test

Abbastanza semplice, basta tagliare la sezione appropriata fuori dall'elenco, quindi nella media.


@ThomasKwa L'ho provato, ma sembra che tu debba memorizzare Eal di fuori della mappa perché continuerà a provare a leggere un nuovo valore se è dentro. Questo richiede lo stesso numero di byte.
FryAmTheEggman,

3

MATL , 30 28 26 24 byte

2*1+:g2X53$X+1Mbgbb3$X+/

Testato su Matlab e su Ottava. Utilizza la versione corrente (9.1.0) della lingua / compilatore.

L'input è: prima il numero che controlla la lunghezza della finestra, quindi l'array con il formato [1 4 5 7 10].

EDIT (20 maggio 2016): provalo online! Il codice nel link haX+ sostituito da Y+per conformarsi alla versione 18.0.0 della lingua.

Esempio

>> matl
 > 2*1+:g2X53$X+1Mbgbb3$X+/
 >
> 1
> [1 4 5 7 10]
2.5 3.333333333333333 5.333333333333333 7.333333333333333               8.5

>> matl
 > 2*1+:g2X53$X+1Mbgbb3$X+/
 >
> 2
> [1 3 5 9 10 14 15 16 23]
3               4.5               5.6 8.199999999999999              10.6               2.8              15.6        17                18

Spiegazione

Il codice Matlab equivalente sarebbe

n = 1; %// first input: number controlling window length
x = [1 4 5 7 10]; %// second input: array
result = conv(x,ones(1,2*n+1),'same')./conv(ones(size(x)),ones(1,2*n+1),'same');

Il codice MATL fa uso delle funzionalità aggiunte recentemente di input implicito e appunti automatici di input di funzione:

2*1+          % get implicit input "n". Multipliy by 2 and add 1
:g            % create a vector of 2*n+1 "true" values (will act as "one" values)
2X5           % 'same' string literal
3$X+          % get implicit input "x" (array). Convolution using three inputs
1M            % push all three inputs from last function
bgbb          % convert first input to "true" values. Will act as "one" values
3$X+          % convolution using three inputs
/             % divide element-wise. Implicitly print

2

CJam, 31 30 byte

ri_S*l~1$++\2*)ew{S-_:+\,d/}%`

Il formato di input è n [m1 m2 ... mx].

Esegui tutti i casi di test. (Converte automaticamente la suite di test nel formato di input richiesto.)

Funziona pre e accodando gli nspazi, quindi prendendo tutte le sottostringhe di lunghezza 2n+1e rimuovendo nuovamente gli spazi prima di calcolare i loro mezzi.


1

Julia, 57 byte

f(n,m)=[mean(m[max(1,i-n):min(end,i+1)])for i=1:endof(m)]

Questa è una funzione che accetta due numeri interi e restituisce una matrice di float.

L'approccio qui è molto semplice. Costruiamo un nuovo array prendendo la media delle sezioni dell'array di input, troncando davanti e dietro.


0

Haskell, 97 95 byte

import Data.List
n#x|t<-2*n+1=[sum a/sum(1<$a)|a<-take t<$>take t(inits x)++tails x,length a>n]

Esempio di utilizzo: 2 # [1,3,5,9,10,14,15,16,23]-> [3.0,4.5,5.6,8.2,10.6,12.8,15.6,17.0,18.0].

Come funziona:

t<-2*n+1                      -- assign t to the maximum number of elements of a
                              -- of sublist
     take t(inits x)          -- build the sublists from t elements of the inits
                ++tails x     -- of the input and the tails of the input,
                              -- e.g. x=[1,2,3,4], t=3:
                              -- [[],[1],[1,2]] ++ [[1,2,3,4],[2,3,4],[3,4],[4],[]]
  a<-take t<$>                -- take at most t elements from every sublist
                ,length a>n   -- keep those with a minimum length of n+1
sum a/sum(1<$a)               -- calculate average, "sum(1<$a)" is the length of a

0

Pyth, 22 byte

.OMsM.:++J*]YKE]MQJhyK

Spiegazione:

.OM sM .: +               Means of flattens of sublists of length 2K+1 of
            + J *         
                  ] Y     J is E copies of [].
                  K E     Save E to a variable to use it later.
               ]MQ        the input
            J             Put J on both sides of ]MQ.
          h y K           2K+1

Provalo qui .


0

JavaScript (ES6), 104

Esecuzione totale / esecuzione della dimensione del campione. In Javascript, la lettura di un valore al di fuori dei limiti di un array fornisce un valore indefinito, che può essere convertito in 0 usando ~~

(l,n,p=0)=>l.map((v,i)=>(p+=~l[i-n-1]-~l[i+n])/(n+1+Math.min(n,l.length-1-i,i)),l.map((v,i)=>p+=i<n&&v))

Ungolfed

(l, n) => {
    p = 0;
    for (i = 0; i < n; i++) p += v;
    r = [];
    for (i = 0; i < l.length; i++) {
        p += (l[i + n] || 0) - (i > n ? l[i - n - 1] : 0);
        r.push(p / Math.min(n, l.length - i - 1, i);
    }
    return r;
}

Test

f=(n,l,p=0)=>l.map((v,i)=>(p+=~l[i-n-1]-~l[i+n])/(n+1+Math.min(n,l.length-1-i,i)),l.map((v,i)=>p+=i<n&&v))

console.log=x=>O.textContent+=x+'\n';


;[
  [1,[12,6,3,9],[9,7,6,6]]
, [1,[1,4,5,7,10],[2.5,3.333,5.333,7.333,8.5]]
, [1,[1,3,3,7,4,2,4,2],[2,2.333,4.333,4.667,4.333,3.333,2.667,3]]
, [2,[1,3,5,9,10,14,15,16,23],[3,4.5,5.6,8.2,10.6,12.8,15.6,17,18]]
, [3,[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1]]
, [3,[1,2,3,4,5,6,7,8],[2.5,3,3.5,4,5,5.5,6,6.5]]
].forEach(t=>{
  var n=t[0],l=t[1],x=t[2],r=f(n,l)
  // verify (limited to 3 decimals)
  var ok = r.every((v,i)=>v.toFixed(3)==x[i].toFixed(3))
  
  console.log((ok?'OK   ':'Fail ')+n+' '+l+' -> '+r+' ('+x+')')
})
<pre id=O></pre>


0

JavaScript (ES6), 82 byte

codice:

F=(n,a)=>a.map((e,i)=>(s=a.slice(i<n?0:i-n,i+n+1))&&s.reduce((l,c)=>l+c)/s.length)

test:

F=(n,a)=>a.map((e,i)=>(s=a.slice(i<n?0:i-n,i+n+1))&&s.reduce((l,c)=>l+c)/s.length)

document.write('<pre>' +
  [
    [1, [12, 6, 3, 9], [9, 7, 6, 6] ],
    [1, [1, 4, 5, 7, 10], [2.5, 3.333, 5.333, 7.333, 8.5] ],
    [1, [1, 3, 3, 7, 4, 2, 4, 2], [2, 2.333, 4.333, 4.667, 4.333, 3.333, 2.667, 3] ],
    [2, [1, 3, 5, 9, 10, 14, 15, 16, 23], [3, 4.5, 5.6, 8.2, 10.6, 12.8, 15.6, 17, 18] ],
    [3, [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1] ],
    [3, [1, 2, 3, 4, 5, 6, 7, 8], [2.5, 3, 3.5, 4, 5, 5.5, 6, 6.5] ]
  ].map(t => {
    var [n, m, e] = t;
    var r = F(n, m);
    // verify to precision of 3 decimals
    var test = r.every((v, i) => v.toPrecision(3) === e[i].toPrecision(3));

    return 'F(' + n + ', [' + m + '])\t' + (test ? 'Pass' : 'Fail') +
      '\n\t{' + r + '} ' + (test ? '=' : '≠') + ' {' + e + '}';
  }).join('\n\n') +
  '</pre>');

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.