Массив вызовов № 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]

Нужно ли округлять значения с плавающей запятой или мы можем оставить их как есть?
Caird Coneheringaahing

3
@cairdcoinheringaahing Обратите внимание, что для удобства чтения все значения округлены до одного десятичного знака . На мой взгляд, вы определенно можете оставить их как есть (по крайней мере, это то, что я понимаю).
г-н Xcoder

@cairdcoinheringaahing Я был довольно либерален с вводом / выводом: целочисленные значения или значения с плавающей запятой хороши, вы можете округлять, если хотите, но не обязаны, и ошибки с плавающей запятой допускаются
FlipTack

Можно ли возвращать дроби вместо чисел с плавающей запятой?
JungHwan Мин

@JungHwanMin Если для точности ваш язык будет хранить значения в виде дробей, а не с плавающей точкой, то их можно распечатать как точные дроби в их простейших формах.
FlipTack

Ответы:



7

Wolfram Language (Mathematica) , 13 байт

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

MovingAverage

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

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


6
MovingAverageಠ _____ ಠ Я отказываюсь верить в это
г-н Xcoder

@cairdcoinheringaahing Принимает числовое значение. MovingAverageвозвращает набор дробей. Теперь, когда это разрешено ФП, этого MovingAverageдолжно быть достаточно.
г-н Xcoder


7

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

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

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

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

⊢+/÷

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

+/÷⊣

с Lсправа.

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

Как?

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

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


Почему бы не разделить L на n до сокращения. Сохраняет байт
Грэм


Или + / ÷

@ 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
}


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

Октава , 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-скрипка) .


2

Japt v2.0a0, 7 байт

ãV ®x÷V

Попытайся


объяснение

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

ãV

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

®

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

÷V

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

x

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














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

Похоже, вам не нужен массив 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)


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.