Elementos narcisistas da matriz

15

Definição

Os números narcisistas 1 de uma matriz acham que são melhores que seus vizinhos, porque são estritamente mais altos que sua média aritmética.

Os vizinhos são definidos da seguinte maneira:

  • Se o número inteiro estiver no índice 0 (o primeiro), seus vizinhos serão o último e o segundo elementos da lista.

  • Se o número inteiro não for o primeiro nem o último, seus vizinhos serão os dois elementos imediatamente adjacentes.

  • Se o número inteiro estiver no índice -1 (o último), seus vizinhos serão o penúltimo e o primeiro elemento da lista.


Tarefa

Dada uma matriz de números inteiros, sua tarefa é descartar os narcisistas.

  • Os números inteiros podem ser positivos, negativos ou zero.

  • Você pode assumir que a matriz contém pelo menos três elementos.

  • Todas as regras padrão se aplicam. Isso é , então o código mais curto em bytes vence.

Exemplos

Considere a matriz [6, 9, 4, 10, 16, 18, 13]. Em seguida, podemos criar a seguinte tabela:

Elemento | Vizinhos | Média dos vizinhos | É narcisista?
-------- + ------------ + ------------------ + --------- --------
6 13, 9 11 Falso.
9 6, 4 | 5 Verdade.
4 9, 10 | 9,5 Falso.
10 4, 16 | 10 Falso.
16 10, 18 | 14 Verdade.
18 16, 13 | 14,5 | Verdade.
13 18, 6 | 12 Verdade.

Ao filtrar os narcisistas, ficamos com ele [6, 4, 10]. E é isso!

Casos de teste

Entrada -> Saída

[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 - Narcisista não significa matematicamente narcisista .

Mr. Xcoder
fonte

Respostas:

7

Gelatina , 10 bytes

ṙ2+ṙ-<ḤCx@

Experimente online!

Explicação:

ṙ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)
Freira Furada
fonte
6

Python 2 , 60 bytes

lambda x:[b for a,b,c in zip(x[-1:]+x,x,x[1:]+x)if b*2<=a+c]

Experimente online!

Cajado
fonte
6

JavaScript (ES6), 57 56 bytes

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

Editar: salvou 1 byte graças a @ g00glen00b.

Neil
fonte
5

Mathematica, 44 bytes

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

Como funciona

Dados dados como {11,6,9,10}, calcula

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

e seleciona os elementos da entrada original em locais onde esse resultado é no máximo 0.

Misha Lavrov
fonte
5

05AB1E , 22 17 15 14 bytes

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

Experimente online!

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.
Urna de polvo mágico
fonte
1
Economize 1 byte com ʒ¹®1‚¾ + èO;> ‹¼
Emigna 3/17/17
4

Haskell , 51 bytes

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

Experimente online! Exemplo de uso: f [1,2,3]rendimentos [1,2].

Para s = [1,2,3], last s:sé a lista [3,1,2,3]e tail$s++sa lista [2,3,1,2,3]. zip3gera uma lista de triplos a (a,b,c)partir de três listas, truncando as mais longas ao comprimento da menor lista. Ficamos [(3,1,2),(1,2,3),(2,3,1)]com bo elemento de lista original ae cseus vizinhos. A compreensão da lista seleciona tudo bonde b*2<=a+c, isso bnão é narcísico.

Laikoni
fonte
4

Oitava / MATLAB, 48 bytes

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

Experimente online!

Explicação

A matriz de entrada é estendida primeiro com as últimas ( x(end)) e primeiras ( x(1)) entradas nos lados apropriados.

O teste para o narcisismo é feito convresolvendo a matriz estendida com [1, -2, 1]e mantendo apenas a 'valid'peça.

A comparação de cada entrada no resultado da convolução 0fornece um índice lógico (máscara) que é usado para selecionar os números da entrada.

Luis Mendo
fonte
2

J , 16 bytes

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

Experimente online!

Explicação

#~+:<: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
milhas
fonte
2

Japonês , 17 16 15 bytes

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

Tente


Explicação

Entrada implícita da matriz U.

kÈ>

Remova ( k) os elementos que retornam true quando passados ​​por uma função, Ysendo o índice atual, que verifica se o elemento atual é maior que ...

[Y°ÉY]

A matriz [Y-1, Y+1]...

x!gU

Reduzido pela adição ( x) após indexar cada elemento em U...

½*

Multiplicado por .5.


Alternativa, 15 bytes

fÈ+X§UgYÉ +UgYÄ

Tente

Shaggy
fonte
2

R , 51 56 bytes

Obrigado a user2390246 por corrigir meu algoritmo

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

Experimente online!

índices londe c(l[-1],l[1])+c(l[s],l[-s]), as somas vizinhas de l, não são menos que duas vezes l.

Giuseppe
fonte
2

Mathematica, 40 bytes

Pick[#,+##>=3#2&@@@Partition[#,3,1,-2]]&
JungHwan Min
fonte
Eu acho que você precisa em <=vez de <.
22826 Martin Ender
Na verdade não, você precisará >=.
Martin Ender #
@MartinEnder Ah, você está certo. Eu tenho que Picknúmeros não-narcisistas.
JungHwan Min 4/10/2017
1

Python 2 , 64 60 bytes

  • Economizou quatro bytes graças ao xnor ; golfe l[-~j%len(l)](e um espaço) para (l+l)[-~j].
lambda l:[k for j,k in enumerate(l)if(l+l)[-~j]+l[~-j]>=k+k]

Experimente online!

Jonathan Frech
fonte
1

Java 8, 141 137 127 bytes

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 bytes graças a @Nevay .

Explicação:

Experimente aqui.

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
Kevin Cruijssen
fonte
0

JavaScript ES5, 59 bytes

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
fonte
0

PowerShell , 75 bytes

for($i=0;$i-lt$a.Length;$i++){if($a[$i]-le(($a[$i-1]+$a[$i+1])/2)){$a[$i]}}
aceso
fonte