Масив викликів №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 ≤ довжина (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 coinheringaahing

3
@cairdcoinheringaahing Зауважте, що для зручності читання всі значення округлюються до одного десяткового знака . На мою думку, ви точно можете залишити їх такими, якими вони є (принаймні, це я розумію).
Містер Xcoder

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

Чи добре повертати дроби замість чисел з плаваючою точкою?
JungHwan Мін

@JungHwanMin Якщо для точності ваша мова буде зберігати значення як дроби, а не плаваючі, добре друкувати їх як точні дроби в їх найпростіших формах.
FlipTack

Відповіді:



7

Мова Вольфрама (Mathematica) , 13 байт

У Mathematica є вбудований для всього

MovingAverage

Спробуйте в Інтернеті!

Знімає список, а потім радіус ...


6
MovingAverageಠ _____ ಠ Я відмовляюся вірити в це
містер Xcoder

@cairdcoinheringaahing Приймає числове значення. MovingAverageповертає набір дробів. Тепер, коли це дозволив ОП, MovingAverageсправді повинно вистачити.
Містер Xcoder


7

Діалог APL, 4 байти

1 байт збережено завдяки @Graham

2 байти збережено завдяки @ jimmy23013

Я згадав, що APL не є мовою для гольфу?

⊢+/÷

з nправоруч, або

+/÷⊣

з Lправоруч.

Спробуйте в Інтернеті!

Як?

÷- ділити Lнаn

⊢+/- зменшити +на windowsn


Чому перед скороченням не поділити L на n. Зберігає байт
Грем



@ jimmy23013 дякую багато! Я спробував це раніше, але, мабуть, набрав аргументи неправильно, оскільки це не спрацювало.
Уріель



4

Perl 6 , 33 байти

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

Перевірте це

Розширено:

{  # 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як правий аргумент, а список як лівий. Заслуга рішення Uriel за ідею робити лише підсумовування в інфіксі.

Пояснення

]+/\%
    %  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 - середнє значення кожного.

3

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

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

Спробуйте в Інтернеті!

Пояснення

Convolution ( 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 + зоопарк, 13 байт

zoo::rollmean

zooПакет (S3 інфраструктура для регулярних і нерегулярних тимчасових рядів) має багато корисних функцій. Ви можете спробувати тут (R-скрипка) .


2

Japt v2.0a0, 7 байт

ãV ®x÷V

Спробуй це


Пояснення

Неявне введення масиву Uта цілого числа V.

ãV

Отримайте підрозділи UдовжиноюV

®

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

÷V

Розділіть кожен елемент на V.

x

Підсумовуйте всі елементи.









0

JavaScript (ES6), 53 байти

(l,n)=>l.map(e=>(s+=e-=a[i-n]||0)/n,s=i=0).slice(n-1)





0

K (oK), 13 11 bytes

Solution:

{+/+x':y%x}

Try it online!

Examples:

{+/+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

Explanation:

oK has a built-in for creating a sliding window, then sum up resulting arrays and divide by sliding window size to get mean:

{+/+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

Looks like you don't need the flip array +, and if K has commute like APL you can move x%[commute] to left and drop the parens
Uriel

The flip is needed to ensure the sum is across rather than down each list, and fairly sure there's no commute operator, at least nothing to suggest it in the manual. Cheers though!
streetster

0

DataWeave, 50 bytes

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 bytes

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

Explanation:

Try it here.

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.