Массив вызовов № 3: Скользящие средние

16

Примечание. Это №3 в серии задач по . Для предыдущего вызова нажмите здесь .

Скользящая средняя списка

Скользящее среднее из списка является вычисление приводит к новому, сглаживаются список, созданного путем усреднения небольших перекрывающихся подсписков оригинала.

При создании скользящего среднего мы сначала генерируем список перекрывающихся подсписков, используя определенный «размер окна», каждый раз сдвигая это окно вправо.

Например, учитывая список [8, 4, 6, 2, 2, 4]и размер окна 3, подсписки будут:

[8,  4,  6,  2,  2,  4]          Sublists:
(         )                  <-  [8, 4, 6]
    (         )              <-  [4, 6, 2]
        (         )          <-  [6, 2, 2]
            (         )      <-  [2, 2, 4]

Затем мы вычисляем среднее значение каждого подсписка, чтобы получить результат: [6.0, 4.0, 3.3, 2.7](каждое значение округляется до одного десятичного знака).


Соревнование

Ваша задача - написать программу или функцию, которая, учитывая список L и целое число 1 ≤ n ≤ length (L) , вычисляет скользящее среднее для L, используя размер окна n .

Правила:

  • Ваша программа может использовать целочисленное деление или деление с плавающей запятой. В случае деления с плавающей запятой допускаются небольшие неточности из-за ограничений типа данных, при условии, что значение является правильным.
  • Вы можете отправить полную программу или функцию (но не фрагмент).
  • Вы можете предположить, что список будет содержать только положительные целые числа .
  • Стандартные лазейки запрещены.
  • Это , поэтому выигрывает самый короткий ответ (в байтах)!

Тестовые случаи

Обратите внимание, что для удобства чтения все значения округлены до одного десятичного знака.

n=5, [1, 2, 3, 4, 5, 6, 7, 8]      ->      [3, 4, 5, 6]
n=3, [100, 502, 350, 223, 195]     ->      [317.3, 358.3, 256]
n=1, [10, 10, 10]                  ->      [10, 10, 10]
n=3, [10, 20, 30]                  ->      [20]
n=2, [90, 40, 45, 100, 101]        ->      [65, 42.5, 72.5, 100.5]
FlipTack
источник
Нужно ли округлять значения с плавающей запятой или мы можем оставить их как есть?
Caird Coneheringaahing
3
@cairdcoinheringaahing Обратите внимание, что для удобства чтения все значения округлены до одного десятичного знака . На мой взгляд, вы определенно можете оставить их как есть (по крайней мере, это то, что я понимаю).
г-н Xcoder
@cairdcoinheringaahing Я был довольно либерален с вводом / выводом: целочисленные значения или значения с плавающей запятой хороши, вы можете округлять, если хотите, но не обязаны, и ошибки с плавающей запятой допускаются
FlipTack
Можно ли возвращать дроби вместо чисел с плавающей запятой?
JungHwan Мин
@JungHwanMin Если для точности ваш язык будет хранить значения в виде дробей, а не с плавающей точкой, то их можно распечатать как точные дроби в их простейших формах.
FlipTack

Ответы:

7

Желе , 3 байта

ṡÆm

Попробуйте онлайн!

Довольно просто благодаря

Как это устроено

ṡÆm - Main dyadic link. Arguments: l (list) and n (integer)
ṡ   - Split l into sublists of length n
 Æm - Mean of each
Кэрд
источник
7

Wolfram Language (Mathematica) , 13 байт

Mathematica имеет встроенный для всего

MovingAverage

Попробуйте онлайн!

Принимает список, а затем радиус ...

Юнг Хван Мин
источник
6
MovingAverageಠ _____ ಠ Я отказываюсь верить в это
г-н Xcoder
@cairdcoinheringaahing Принимает числовое значение. MovingAverageвозвращает набор дробей. Теперь, когда это разрешено ФП, этого MovingAverageдолжно быть достаточно.
г-н Xcoder
7

Haskell , 47 байтов

n!a|length a<n=[]|_:t<-a=div(sum$take n a)n:n!t

Попробуйте онлайн!

Сохранено два байта благодаря xnor!

Линн
источник
1
tail aможно извлечь в охрану.
XNOR
Гах, я знал, что я что-то упустил. Спасибо!
Линн
7

Дьялог АПЛ, 4 байта

1 байт сохранен благодаря @Graham

2 байта сохранены благодаря @ jimmy23013

Я упоминал, что APL не является языком игры в гольф?

⊢+/÷

с nсправа, или

+/÷⊣

с Lсправа.

Попробуйте онлайн!

Как?

÷- разделить Lнаn

⊢+/- уменьшить +на окнахn

Уриэль
источник
Почему бы не разделить L на n до сокращения. Сохраняет байт
Грэм
⊢ + / ÷
jimmy23013
Или + / ÷
@ jimmy23013 большое спасибо! Я попробовал это раньше, но, должно быть, неправильно набрал аргументы, потому что это не сработало.
Уриэль
4

Perl 6 , 33 байта

{@^a.rotor($^b=>1-$b)».sum X/$b}

Проверь это

Expanded:

{  # bare block with placeholder parameters 「@a」, 「$b」

  @^a                # declare and use first param

  .rotor(            # split it into chunks
    $^b              # declare and use second param
    =>               # pair it with
    1 - $b           # one less than that, negated

  )».sum             # sum each of the sub lists

  X/                 # cross that using &infix:«/»

  $b                 # with the second param
}
Брэд Гилберт b2gills
источник
4

C  86   84  83 байта

i,j,s;f(a,l,n)int*a;{for(i=-1;i+++n<l;s=!printf("%d ",s/n))for(j=n;j--;)s+=a[i+j];}

Попробуйте онлайн!

раскатали:

i, j, s;
f(a, l, n)int*a;
{
    for(i=-1; i+++n<l; s=!printf("%d ", s/n))
        for(j=n; j--;)
            s += a[i+j];
}
Steadybox
источник
4

J, 7 5 байт

]+/\%

Попробуйте онлайн!

Принимает nза правый аргумент, а список за левый. Благодарю решение Уриэля за идею делать только суммирование в инфиксе.

объяснение

]+/\%
    %  Divide list by n
]+/\   Sum on overlapping intervals of size n

Предыдущее решение (7 байт)

(+/%#)\
      \  Apply to overlapping intervals of size n
(+/%#)   Mean
 +/        Sum
   %       Divided by
    #      Length
капуста
источник
3

Pyth , 5 байт

.O.:F

Попробуй это здесь!

Как это работает

.O.: F - Полная программа.

    F - Уменьшить ввод (вложенный список) с ...
  .: - ... Списки.
.O - Среднее по каждому.
Мистер Xcoder
источник
3

Октава , 33 31 байт

@(x,n)conv(x,~~(1:n)/n,'valid')

Попробуйте онлайн!

объяснение

Свертка ( conv) по сути является движущейся взвешенной суммой. Если веса выбраны как [1/n, ..., 1/n](полученные как ~~(1:n)/n), результатом является скользящее среднее, из которого 'valid'сохраняется только часть.

Луис Мендо
источник
2

R , 72 байта

function(l,n)(k=sapply(0:sum(l|1),function(x)mean(l[x+1:n])))[!is.na(k)]

Попробуйте онлайн!

Вычисляет окна meanвсех размеров n; когда окно выходит за границы l, результаты NAмы фильтруем.

Пакет R + zoo, 13 байт

zoo::rollmean

zooПакет (S3 инфраструктура для регулярных и нерегулярных временных рядов) имеет много полезных функции. Вы можете попробовать это здесь (R-скрипка) .

Giuseppe
источник
2

Japt v2.0a0, 7 байт

ãV ®x÷V

Попытайся


объяснение

Неявный ввод массива Uи целого числа V.

ãV

Получить подразделы Uс длинойV

®

Карта над подразделами.

÷V

Разделите каждый элемент на V.

x

Суммируйте все элементы.

мохнатый
источник
1

Протон , 46 байт

n=>l=>[sum(l[h to h+n])/n for h:0..len(l)-n+1]

Попробуйте онлайн!

Обратите внимание, что он принимает ввод через синтаксис функций каррирования и возвращает список дробей.

Мистер Xcoder
источник
1

CJam, 14 12 байтов

-2 байта благодаря @aditsu

{_@ew::+\f/}
Esolanging Fruit
источник
0

Jq 1,5 , 61 байт

def f(N;L):[L|range(0;1+length-N)as$i|.[$i:$i+N]|add/length];

расширенный

def f(N;L):
  [   L
    | range(0;1+length-N) as $i        # generate
    | .[$i:$i+N]                       # sublists
    | add/length                       # compute mean
  ];

Попробуйте онлайн!

jq170727
источник
0

JavaScript (ES6), 53 байта

(l,n)=>l.map(e=>(s+=e-=a[i-n]||0)/n,s=i=0).slice(n-1)
Нил
источник
0

Stacked , 22 байта

[infixes[:sum\#'/]map]

Попробуйте онлайн!

объяснение

infixesгенерирует все окна заданной длины. Затем мы отображаем нашу собственную среднюю функцию для каждого инфикса.

Конор О'Брайен
источник
0

K (ок) , 13 11 байт

Решение:

{+/+x':y%x}

Попробуйте онлайн!

Примеры:

{+/+x':y%x}[3;8 4 6 2 2 4]
6 4 3.3333 2.6667
{+/+x':y%x}[5;1 2 3 4 5 6 7 8]
3 4 5 6

Объяснение:

oK имеет встроенную функцию для создания скользящего окна, затем суммирует полученные массивы и делит на размер скользящего окна, чтобы получить среднее значение:

{+/+x':y%x} / the solution
{         } / lambda function taking x and y as implicit parameters
       y%x  / y (list) by x (sliding array size)
    x':     / sliding window of size x over list y
   +        / flip array (rotate by 90 degrees)
 +/         / sum up array
streetster
источник
Похоже, вам не нужен массив flip +, и, если K имеет коммутирующую функцию, как APL, вы можете переместиться x%[commute]влево и отбросить парены
Uriel
Обратный необходимо обеспечить сумма по а не вниз каждому списку, и абсолютно уверено , что нет никакого оператора коммутирует, по крайней мере , ничего не предложить его в руководстве . Ура, хотя!
streetster
0

DataWeave , 50 байтов

fun s(l,w)=0 to(sizeOf(l)-w)map avg(l[$ to $+w-1])
%dw 2.0
output application/json

fun sma(list: Array<Number>, window: Number) =
  0 to (sizeOf(list) - window)  // generate starting indices of sublists
  map list[$ to $ + window - 1] // generate sublists
  map avg($)                    // calculate averages

---
sma([90, 40, 45, 100, 101], 2)
menduz
источник
0

Java 8, 111 байт

a->n->{int l=a.length-n+1,i=0,j;float[]r=new float[l];for(;i<l;r[i++]/=n)for(j=i;j<i+n;r[i]+=a[j++]);return r;}

Объяснение:

Попробуй это здесь.

a->n->{                 // Method with array and int parameters and float-array return-type
  int l=a.length-n+1,   //  New length of the return-array
      i=0,j;            //  Index-integers
  float[]r=new float[l];//  Return-array
  for(;i<l;             //  Loop (1) from 0 to `l` (exclusive)
      r[i++]/=n)        //    After every iteration, divide the current item by input `n`
    for(j=i;j<i+n;      //   Inner loop (2) from `i` to `i+n` (exclusive)
      r[i]+=a[j++]      //    Sum the result at index `i` with the items of the input-array
    );                  //   End of inner loop (2)
                        //  End of loop (1) (implicit / single-line body)
  return r;             //  Return the resulting float-array
}                       // End of method
Кевин Круйссен
источник