Нарцисистські елементи масиву


15

Визначення

Нарцисистські 1 цілі масиви вважають, що вони кращі за своїх сусідів, оскільки вони суворо вищі за середнє арифметичне.

Сусіди визначаються так:

  • Якщо ціле число знаходиться в індексі 0 (перший), то його сусідами є останній та другий елементи списку.

  • Якщо ціле число не є першим чи останнім, то його сусідами є два негайно суміжних елемента.

  • Якщо ціле число знаходиться в індексі -1 (останньому), то його сусідами є другий-останній і перший елементи списку.


Завдання

З огляду на масив цілих чисел, ваше завдання - відкинути нарцисичні.

  • Цілі числа можуть бути додатними, від’ємними або нульовими.

  • Можна припустити, що масив містить щонайменше три елементи.

  • Діють усі стандартні правила. Це , тому виграє найкоротший код у байтах.

Приклади

Розглянемо масив [6, 9, 4, 10, 16, 18, 13]. Тоді ми можемо побудувати наступну таблицю:

Елемент | Сусіди | Середні сусіди | Нарцисистський?
-------- + ------------ + ------------------ + --------- --------
6 | 13, 9 | 11 | Помилковий.
9 | 6, 4 | 5 | Правда.
4 | 9, 10 | 9.5 | Помилковий.
10 | 4, 16 | 10 | Помилковий.
16 | 10, 18 | 14 | Правда.
18 | 16, 13 | 14.5 | Правда.
13 | 18, 6 | 12 | Правда.

Відфільтрувавши нарцисистів, ми залишилися [6, 4, 10]. І це все!

Випробування

Вхід -> Вихід

[5, -8, -9] -> [-8, -9]
[8, 8, 8, 8] -> [8, 8, 8, 8]
[11, 6, 9, 10] -> [6, 10]
[1, 2, 0, 1, 2] -> [1, 0, 1]
[6, 9, 4, 10, 16, 18, 13] -> [6, 4, 10]
[6, -5, 3, -4, 38, 29, 82, -44, 12] -> [-5, -4, 29, -44]

1 - Нарцисист не означає математично нарцисист .

Відповіді:


7

Желе , 10 байт

ṙ2+ṙ-<ḤCx@

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

Пояснення:

ṙ2+ṙ-<ḤCx@
ṙ2         Rotate the original list two elements to the left
  +        Add each element to the respective element of the original list
   ṙ-      Rotate the result one element to the right
     <Ḥ    Check if each element is less than the double of its respective element on the original list
       C   Subtract each 1/0 boolean from 1 (logical NOT in this case)
        x@ Repeat each element of the original list as many times as the respective element of the logical NOT (i.e. keep elements of the original list where the respective element from the result is 1)


6

JavaScript (ES6), 57 56 байт

a=>a.filter((e,i)=>e+e<=a[(i||l)-1]+a[++i%l],l=a.length)

Редагувати: збережено 1 байт завдяки @ g00glen00b.


5

Математика, 44 байти

Pick[#,#<=0&/@(2#-(r=RotateLeft)@#-#~r~-1)]&

Як це працює

Даний вхід, наприклад {11,6,9,10}, обчислює

2*{11,6,9,10} - {6,9,10,11} - {10,11,6,9}

і вибирає елементи вихідного вводу в місцях, де цей результат не більше 0.



4

Haskell , 51 байт

f s=[b|(a,b,c)<-zip3(last s:s)s$tail$s++s,b*2<=a+c]

Спробуйте в Інтернеті! Приклад використання: f [1,2,3]врожайність [1,2].

Бо s = [1,2,3], last s:sце список [3,1,2,3]і tail$s++sсписок [2,3,1,2,3]. zip3формує список трійки (a,b,c)з трьох заданих списків, прив'язуючи довші до довжини найкоротшого списку. Ми отримуємо [(3,1,2),(1,2,3),(2,3,1)], bбудучи оригінальним елементом списку aта cйого сусідами. Список осягнення вибирає все , bде b*2<=a+c, тобто bНЕ самозакоханий.


4

Октава / MATLAB, 48 байт

@(x)x(conv([x(end),x,x(1)],[1,-2,1],'valid')>=0)

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

Пояснення

Вхідний масив спочатку розширюється останнім ( x(end)) та першим (x(1) ) записами на відповідних сторонах.

Тест на нарцисизм робиться шляхом convрозширення масиву [1, -2, 1]і збереження лише його 'valid'частини.

Порівнюючи кожен запис результату згортки з 0логічним показником (маскою), який використовується для вибору чисел із вхідних даних.



2

Japt , 17 16 15 байт

kÈ>½*[Y°ÉY]x!gU

Спробуй це


Пояснення

Неявне введення масиву U.

kÈ>

Вилучіть ( k) елементи, які повертають істину при проходженні через функцію, Yбудучи поточним індексом, що перевіряє, чи поточний елемент більший за ...

[Y°ÉY]

Масив [Y-1, Y+1]...

x!gU

Зменшується додаванням ( x) після індексації кожного елемента в U...

½*

Помножено на .5.


Альтернативно, 15 байт

fÈ+X§UgYÉ +UgYÄ

Спробуй це


2

R , 51 56 байт

Дякую користувачеві2390246 за виправлення мого алгоритму

function(l)l[c(l[-1],l[1])+c(l[s<-sum(l|1)],l[-s])>=2*l]

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

індекси, lде c(l[-1],l[1])+c(l[s],l[-s])суми сусідів lне менше двох разів l.





1

Java 8, 141 137 127 байт

import java.util.*;a->{List r=new Stack();for(int i=0,l=a.length;i<l;)if(2*a[i]<=a[(i-1+l)%l]+a[++i%l])r.add(a[i-1]);return r;}

-10 байт завдяки @Nevay .

Пояснення:

Спробуйте тут.

import java.util.*;    // Required import for List and Stack

a->{                   // Method with integer-array parameter and List return-type
  List r=new Stack();  //  Return-list
  for(int i=0,         //  Index integer, starting at 0
      l=a.length;      //  Length of the input array
      i<l;)            //  Loop over the input array
    if(2*a[i]<=        //   If two times the current item is smaller or equal to:
        a[(i-1+l)%l]   //   The previous integer in the list
        +a[++i%l])     //   + the next integer in the list
      r.add(a[i-1]);   //    Add the current integer to the result-list
                       //  End of loop (implicit / single-line body)
  return r;            //  Return result-List
}                      // End of method


0

JavaScript ES5, 59 байт

F=a=>a.filter((x,i)=>2*x<=a[-~i%(l=a.length)]+a[(i-1+l)%l])

console.log(""+F([5, -8, -9])==""+[-8, -9])
console.log(""+F([8, 8, 8, 8])==""+[8, 8, 8, 8])
console.log(""+F([11, 6, 9, 10])==""+[6, 10])
console.log(""+F([1, 2, 0, 1, 2])==""+[1, 0, 1])
console.log(""+F([6, 9, 4, 10, 16, 18, 13])==""+[6, 4, 10])
console.log(""+F([6, -5, 3, -4, 38, 29, 82, -44, 12])==""+[-5, -4, 29, -44])




Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.