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 .

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)


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.


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.



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.


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.


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

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


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.





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


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])



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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.