Нарциссические элементы массива

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 - Нарцисс не означает математически нарциссический .

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

Ответы:

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

Mathematica, 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.

Миша лавров
источник
5

05AB1E , 22 17 15 14 байтов

vy¹®1‚N+èO;>‹—

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

vy             # For each...
  ¹            # Push array.
   ®1‚         # Push [1,-1]
      N+       # Add current index.
        è      # Push surrounding values of current index.
         O;    # Summed in half.
           >‹  # A <= B?
             — # If true, print current.
Урна волшебного осьминога
источник
1
Сохранить 1 байт с помощью ʒ¹®1 ¾ + èO;> ‹¼
Emigna
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есть не нарциссическое.

Laikoni
источник
4

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

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

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

объяснение

Входной массив сначала расширяется записями last ( x(end)) и first ( x(1)) с соответствующих сторон.

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

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

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

J , 16 байт

#~+:<:1&|.+_1&|.

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

объяснение

#~+:<:1&|.+_1&|.  Input: array A
           _1&|.  Rotate A right by 1
      1&|.        Rotate A left by 1
          +       Add
  +:              Double each in A
    <:            Less than or equal to
#~                Copy the true values from A
миль
источник
2

Japt , 17 16 15 байт

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

Попытайся


объяснение

Неявный ввод массива U.

kÈ>

Remove ( k) элементы, которые возвращают true при передаче через функцию с 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.

Giuseppe
источник
2

Mathematica, 40 байт

Pick[#,+##>=3#2&@@@Partition[#,3,1,-2]]&
Юнг Хван Мин
источник
Я думаю, что вам нужно <=вместо <.
Мартин Эндер
На самом деле нет, вам нужно >=.
Мартин Эндер
@MartinEnder Ах, ты прав. Я должен к Pickне нарциссическим номерам.
JungHwan Мин
1

Python 2 , 64 60 байт

  • Сохранено четыре байта благодаря xnor ; игра в гольф l[-~j%len(l)](и пространство), чтобы (l+l)[-~j].
lambda l:[k for j,k in enumerate(l)if(l+l)[-~j]+l[~-j]>=k+k]

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

Джонатан Фрех
источник
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])

DanielIndie
источник
0

PowerShell , 75 байт

for($i=0;$i-lt$a.Length;$i++){if($a[$i]-le(($a[$i-1]+$a[$i+1])/2)){$a[$i]}}
освещенный
источник