Elemen array narsis

15

Definisi

NarsisBilangan bulat 1 berpendapat bahwa mereka lebih baik daripada tetangga mereka, karena mereka lebih tinggi dari rata-rata aritmatika mereka.

Tetangga didefinisikan sebagai berikut:

  • Jika bilangan bulat berada di indeks 0 (yang pertama), maka tetangganya adalah elemen terakhir dan kedua dari daftar.

  • Jika integer bukan yang pertama atau yang terakhir, maka tetangganya adalah dua elemen yang berbatasan langsung.

  • Jika bilangan bulat berada pada indeks -1 (yang terakhir), maka tetangganya adalah elemen kedua terakhir dan pertama dari daftar.


Tugas

Diberikan array bilangan bulat, tugas Anda adalah membuang yang narsis.

  • Bilangan bulat bisa positif, negatif atau nol.

  • Anda dapat mengasumsikan bahwa array mengandung setidaknya tiga elemen.

  • Semua aturan standar berlaku. Ini adalah , jadi kode terpendek dalam byte menang.

Contohnya

Pertimbangkan array [6, 9, 4, 10, 16, 18, 13]. Maka kita dapat membangun tabel berikut:

Elemen | Tetangga | Tetangga Tetangga | Apakah Narsisistik?
-------- + ------------ + ------------------ + --------- --------
6 | 13, 9 | 11 | Salah.
9 | 6, 4 | 5 | Benar.
4 | 9, 10 | 9.5 | Salah.
10 | 4, 16 | 10 | Salah.
16 | 10, 18 | 14 | Benar.
18 | 16, 13 | 14.5 | Benar.
13 | 18, 6 | 12 | Benar.

Dengan menyaring yang narsis, kita dibiarkan [6, 4, 10]. Dan itu dia!

Uji Kasus

Input -> Output

[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 - Narsisis tidak berarti secara narsistik matematis .

Tuan Xcoder
sumber

Jawaban:

7

Jelly , 10 byte

ṙ2+ṙ-<ḤCx@

Cobalah online!

Penjelasan:

ṙ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)
Biarawati Bocor
sumber
6

Python 2 , 60 byte

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

Cobalah online!

tongkat
sumber
6

JavaScript (ES6), 57 56 byte

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

Sunting: Disimpan 1 byte berkat @ g00glen00b.

Neil
sumber
5

Mathematica, 44 byte

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

Bagaimana itu bekerja

Masukan yang diberikan seperti {11,6,9,10}, menghitung

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

dan memilih elemen input asli di tempat-tempat di mana hasil ini paling banyak 0.

Misha Lavrov
sumber
5

05AB1E , 22 17 15 14 byte

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

Cobalah 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.
Guci Gurita Ajaib
sumber
1
Hemat 1 byte dengan ʒ¹®1‚¾ + èO;> ‹¼
Emigna
4

Haskell , 51 byte

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

Cobalah online! Contoh penggunaan: f [1,2,3]hasil [1,2].

Sebab s = [1,2,3], last s:sadalah daftar [3,1,2,3]dan tail$s++sdaftar [2,3,1,2,3]. zip3menghasilkan daftar tiga kali lipat (a,b,c)dari tiga daftar yang diberikan, memotong yang lebih panjang ke panjang daftar terpendeknya. Kami dapatkan [(3,1,2),(1,2,3),(2,3,1)], dengan bmenjadi elemen daftar asli dan adan ctetangganya. Pemahaman daftar kemudian memilih semua di bmana b*2<=a+c, itu btidak narsis.

Laikoni
sumber
4

Oktaf / MATLAB, 48 byte

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

Cobalah online!

Penjelasan

Array input pertama kali diperluas dengan entri terakhir ( x(end)) dan pertama ( x(1)) di sisi yang sesuai.

Tes untuk narsisme dilakukan dengan convmendapatkan array yang diperluas dengan [1, -2, 1]dan hanya menyimpan 'valid'bagian.

Membandingkan setiap entri dalam hasil konvolusi dengan 0memberikan indeks logis (mask) yang digunakan untuk memilih angka dari input.

Luis Mendo
sumber
2

J , 16 byte

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

Cobalah online!

Penjelasan

#~+:<: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
mil
sumber
2

Japt , 17 16 15 byte

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

Cobalah


Penjelasan

Input array secara implisit U.

kÈ>

Hapus ( k) elemen yang mengembalikan true ketika melewati fungsi, dengan Ymenjadi indeks saat ini, yang memeriksa apakah elemen saat ini lebih besar dari ...

[Y°ÉY]

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

x!gU

Dikurangi oleh penambahan ( x) setelah mengindeks setiap elemen ke U...

½*

Dikalikan dengan .5.


Alternatif, 15 byte

fÈ+X§UgYÉ +UgYÄ

Cobalah

Shaggy
sumber
2

R , 51 56 byte

Terima kasih kepada pengguna2390246 untuk mengoreksi algoritma saya

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

Cobalah online!

indeks l mana c(l[-1],l[1])+c(l[s],l[-s]), jumlah tetangga l, tidak kurang dari dua kali l.

Giuseppe
sumber
2

Mathematica, 40 byte

Pick[#,+##>=3#2&@@@Partition[#,3,1,-2]]&
JungHwan Min
sumber
Saya pikir Anda perlu, <=bukan <.
Martin Ender
Sebenarnya tidak, Anda perlu >=.
Martin Ender
@ MartinEnder Ah, Anda benar. Saya harus Picknomor non-narsis.
JungHwan Min
1

Jelly , 17 byte

Ḣ+ṪH<ḢṆ
.ịj⁸Ç3ƤTị

Cobalah online!

Erik the Outgolfer
sumber
1

Python 2 , 64 60 byte

  • Disimpan empat byte berkat xnor ; golf l[-~j%len(l)](dan ruang) untuk (l+l)[-~j].
lambda l:[k for j,k in enumerate(l)if(l+l)[-~j]+l[~-j]>=k+k]

Cobalah online!

Jonathan Frech
sumber
1

Java 8, 141 137 127 byte

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 byte berkat @Nevay .

Penjelasan:

Coba di sini.

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

JavaScript ES5, 59 byte

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

PowerShell , 75 byte

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