Narcystyczne elementy tablicy

15

Definicja

Narcystyczne liczby całkowite 1 tablicy uważają, że są lepsze niż ich sąsiedzi, ponieważ są ściśle wyższe niż ich średnia arytmetyczna.

Sąsiedzi są zdefiniowani w następujący sposób:

  • Jeśli liczba całkowita ma indeks 0 (pierwszy), to sąsiedzi są ostatnim i drugim elementem listy.

  • Jeśli liczba całkowita nie jest pierwszą ani ostatnią, wówczas jej sąsiadami są dwa bezpośrednio przylegające elementy.

  • Jeśli liczba całkowita ma indeks -1 (ostatni), to jej sąsiedzi są przedostatnimi i pierwszymi elementami listy.


Zadanie

Biorąc pod uwagę szereg liczb całkowitych, Twoim zadaniem jest odrzucić te narcystyczne.

  • Liczby całkowite mogą być dodatnie, ujemne lub zerowe.

  • Możesz założyć, że tablica zawiera co najmniej trzy elementy.

  • Obowiązują wszystkie standardowe zasady. To jest , więc wygrywa najkrótszy kod w bajtach.

Przykłady

Rozważ tablicę [6, 9, 4, 10, 16, 18, 13] . Następnie możemy zbudować następującą tabelę:

Element | Sąsiedzi | Średnia sąsiadów | Czy narcystyczny?
-------- + ------------ + ------------------ + --------- --------
6 | 13, 9 | 11 | Fałszywy.
9 | 6, 4 | 5 | Prawdziwe.
4 | 9, 10 | 9,5 | Fałszywy.
10 | 4, 16 | 10 | Fałszywy.
16 | 10, 18 | 14 | Prawdziwe.
18 | 16, 13 | 14,5 | Prawdziwe.
13 | 18, 6 | 12 | Prawdziwe.

Odfiltrowując te narcystyczne, pozostaje nam [6, 4, 10]. I to wszystko!

Przypadki testowe

Wejście -> Wyjście

[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 - Narcissist nie oznacza matematycznie narcystycznego .

Pan Xcoder
źródło

Odpowiedzi:

7

Galaretka , 10 bajtów

ṙ2+ṙ-<ḤCx@

Wypróbuj online!

Wyjaśnienie:

ṙ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
źródło
6

Python 2 , 60 bajtów

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

Wypróbuj online!

Pręt
źródło
6

JavaScript (ES6), 57 56 bajtów

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

Edycja: Zapisano 1 bajt dzięki @ g00glen00b.

Neil
źródło
5

Mathematica, 44 bajty

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

Jak to działa

Biorąc pod uwagę dane wejściowe, takie jak {11,6,9,10}, oblicza

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

i wybiera elementy pierwotnego wkładu w miejscach, w których wynik ten wynosi najwyżej 0.

Misza Ławrow
źródło
5

05AB1E , 22 17 15 14 bajtów

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

Wypróbuj 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 Magicznej Ośmiornicy
źródło
1
Zaoszczędź 1 bajt z ®¹®11 + + èO;> ‹¼
Emigna
4

Haskell , 51 bajtów

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

Wypróbuj online! Przykład użycia: f [1,2,3]plony [1,2].

Dla s = [1,2,3], last s:slista [3,1,2,3]i tail$s++slista [2,3,1,2,3]. zip3generuje listę potrójnych (a,b,c)z trzech podanych list, skracając dłuższe do długości najkrótszej listy. Otrzymujemy [(3,1,2),(1,2,3),(2,3,1)], bbędąc oryginalnym elementem listy ai cjego sąsiadami. Lista rozumienie wybiera wszystko bgdzie b*2<=a+c, to bnie jest narcystyczne.

Laikoni
źródło
4

Octave / MATLAB, 48 bajtów

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

Wypróbuj online!

Wyjaśnienie

Tablica wejściowa jest najpierw rozszerzana o wpisy last ( x(end)) i first ( x(1)) po odpowiednich stronach.

Test na narcyzm wykonuje się przez convprzeszlifowanie rozszerzonej tablicy [1, -2, 1]i zachowanie tylko 'valid'części.

Porównanie każdego wpisu w wyniku splotu 0daje indeks logiczny (maskę), który służy do wybierania liczb z wejścia.

Luis Mendo
źródło
2

J , 16 bajtów

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

Wypróbuj online!

Wyjaśnienie

#~+:<: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
mile
źródło
2

Japt , 17 16 15 bajtów

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

Spróbuj


Wyjaśnienie

Domniemane wejście tablicy U.

kÈ>

Remove ( k) elementy, które zwracają wartość true po przejściu przez funkcję, Ybędąc bieżącym indeksem, które sprawdzają, czy bieżący element jest większy niż ...

[Y°ÉY]

Tablica [Y-1, Y+1]...

x!gU

Zmniejszone przez add ( x) po zindeksowaniu każdego elementu do U...

½*

Pomnożone przez .5.


Alternatywnie, 15 bajtów

fÈ+X§UgYÉ +UgYÄ

Spróbuj

Kudłaty
źródło
2

R , 51 56 bajtów

Dziękuję użytkownikowi 2390246 za poprawienie mojego algorytmu

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

Wypróbuj online!

indeksy, w lktórych c(l[-1],l[1])+c(l[s],l[-s])sumy sąsiadów lsą nie mniejsze niż dwa razy l.

Giuseppe
źródło
2

Mathematica, 40 bajtów

Pick[#,+##>=3#2&@@@Partition[#,3,1,-2]]&
JungHwan Min
źródło
Myślę, że potrzebujesz <=zamiast <.
Martin Ender
Właściwie nie, będziesz potrzebować >=.
Martin Ender
@MartinEnder Ah, masz rację. Mam Pickliczby nie narcystyczne.
JungHwan Min
1

Python 2 , 64 60 bajtów

  • Zaoszczędzono cztery bajty dzięki xnor ; gra w golfa l[-~j%len(l)](i spacja) (l+l)[-~j].
lambda l:[k for j,k in enumerate(l)if(l+l)[-~j]+l[~-j]>=k+k]

Wypróbuj online!

Jonathan Frech
źródło
1

Java 8, 141 137 127 bajtów

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 bajtów dzięki @Nevay .

Wyjaśnienie:

Wypróbuj tutaj.

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
źródło
0

JavaScript ES5, 59 bajtów

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
źródło
0

PowerShell , 75 bajtów

for($i=0;$i-lt$a.Length;$i++){if($a[$i]-le(($a[$i-1]+$a[$i+1])/2)){$a[$i]}}
oświetlony
źródło