Éléments de tableau narcissique

15

Définition

Les entiers narcissiques 1 d'un tableau pensent qu'ils sont meilleurs que leurs voisins, car ils sont strictement supérieurs à leur moyenne arithmétique.

Les voisins sont définis comme suit:

  • Si l'entier est à l'index 0 (le premier), ses voisins sont le dernier et le deuxième élément de la liste.

  • Si l'entier n'est ni le premier ni le dernier, ses voisins sont les deux éléments immédiatement adjacents.

  • Si l'entier est à l'index -1 (le dernier), ses voisins sont l'avant-dernier et les premiers éléments de la liste.


Tâche

Étant donné un tableau d'entiers, votre tâche consiste à éliminer les narcissiques.

  • Les entiers peuvent être positifs, négatifs ou nuls.

  • Vous pouvez supposer que le tableau contient au moins trois éléments.

  • Toutes les règles standard s'appliquent. Il s'agit de , donc le code le plus court en octets l'emporte.

Exemples

Considérez le tableau [6, 9, 4, 10, 16, 18, 13]. Ensuite, nous pouvons construire le tableau suivant:

Élément | Voisins | Moyenne des voisins | Est narcissique?
-------- + ------------ + ------------------ + --------- --------
6 | 13, 9 | 11 | Faux.
9 | 6, 4 | 5 | Vrai.
4 | 9, 10 | 9.5 | Faux.
10 | 4, 16 | 10 | Faux.
16 | 10, 18 | 14 | Vrai.
18 | 16, 13 | 14,5 | Vrai.
13 | 18, 6 | 12 | Vrai.

En filtrant les narcissiques, nous nous retrouvons avec [6, 4, 10]. Et c'est tout!

Cas de test

Entrée -> Sortie

[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 - Narcissique ne signifie pas mathématiquement narcissique .

M. Xcoder
la source

Réponses:

7

Gelée , 10 octets

ṙ2+ṙ-<ḤCx@

Essayez-le en ligne!

Explication:

ṙ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)
Leaky Nun
la source
6

JavaScript (ES6), 57 56 octets

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

Edit: 1 octet enregistré grâce à @ g00glen00b.

Neil
la source
5

Mathematica, 44 octets

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

Comment ça fonctionne

Étant donné une entrée telle que {11,6,9,10}, calcule

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

et sélectionne les éléments de l'entrée d'origine aux endroits où ce résultat est au plus égal à 0.

Misha Lavrov
la source
5

05AB1E , 22 17 15 14 octets

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

Essayez-le en ligne!

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.
Urne de poulpe magique
la source
1
Économisez 1 octet avec ʒ¹®1‚¾ + èO;> ‹¼
Emigna
4

Haskell , 51 octets

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

Essayez-le en ligne! Exemple d'utilisation: f [1,2,3]rendements [1,2].

Car s = [1,2,3], last s:sc'est la liste [3,1,2,3]et tail$s++sla liste [2,3,1,2,3]. zip3génère une liste de triplets à (a,b,c)partir de trois listes données, en tronquant les plus longs à la longueur de la liste la plus courte. Nous obtenons [(3,1,2),(1,2,3),(2,3,1)], en bétant l'élément de liste d'origine et aet cses voisins. La compréhension de la liste sélectionne alors tout bb*2<=a+c, ce bn'est pas narcissique.

Laikoni
la source
4

Octave / MATLAB, 48 octets

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

Essayez-le en ligne!

Explication

Le tableau d'entrée est d'abord étendu avec les dernières ( x(end)) et premières ( x(1)) entrées sur les côtés appropriés.

Le test de narcissisme se fait en convolving le tableau étendu avec [1, -2, 1]et en ne gardant que la 'valid'partie.

La comparaison de chaque entrée du résultat de convolution avec 0donne un index logique (masque) qui est utilisé pour sélectionner les nombres dans l'entrée.

Luis Mendo
la source
2

J , 16 octets

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

Essayez-le en ligne!

Explication

#~+:<: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
miles
la source
2

Japt , 17 16 15 octets

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

Essayez-le


Explication

Entrée implicite du tableau U.

kÈ>

Remove ( k) les éléments qui retournent true lorsqu'ils sont passés par une fonction, avec Yétant l'index courant, qui vérifient si l'élément courant est supérieur alors ...

[Y°ÉY]

Le tableau [Y-1, Y+1]...

x!gU

Réduit par addition ( x) après l'indexation de chaque élément dans U...

½*

Multiplié par .5.


Alternative, 15 octets

fÈ+X§UgYÉ +UgYÄ

Essayez-le

Hirsute
la source
2

R , 51 56 octets

Merci à user2390246 d'avoir corrigé mon algorithme

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

Essayez-le en ligne!

index lc(l[-1],l[1])+c(l[s],l[-s]), les sommes voisines de l, ne sont pas inférieures à deux fois l.

Giuseppe
la source
2

Mathematica, 40 octets

Pick[#,+##>=3#2&@@@Partition[#,3,1,-2]]&
JungHwan Min
la source
Je pense que vous avez besoin <=au lieu de <.
Martin Ender
En fait non, vous en aurez besoin >=.
Martin Ender
@MartinEnder Ah, vous avez raison. Je dois Pickdes numéros non narcissiques.
JungHwan Min
1

Python 2 , 64 60 octets

  • Enregistré quatre octets grâce à xnor ; golf l[-~j%len(l)](et un espace) à (l+l)[-~j].
lambda l:[k for j,k in enumerate(l)if(l+l)[-~j]+l[~-j]>=k+k]

Essayez-le en ligne!

Jonathan Frech
la source
1

Java 8, 141 137 127 octets

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 octets grâce à @Nevay .

Explication:

Essayez-le ici.

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
la source
0

JavaScript ES5, 59 octets

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
la source
0

PowerShell , 75 octets

for($i=0;$i-lt$a.Length;$i++){if($a[$i]-le(($a[$i-1]+$a[$i+1])/2)){$a[$i]}}
allumé
la source