Нарцисові елементи масиву

Mr. Xcoder 10/03/2017. 19 answers, 2.703 views
code-golf number array-manipulation

Визначення

Нарцисові цілі числа 1 масиву вважають, що вони кращі, ніж сусіди, тому що вони суттєво вищі за середнє арифметичне.

Сусіди визначаються таким чином:

  • Якщо ціле число знаходиться в індексі 0 (перший), то його сусіди - це останній та другий елементи списку.

  • Якщо ціле число не перше, а останнє, то його сусіди - це два безпосередньо сусідні елементи.

  • Якщо ціле число знаходиться в індексі -1 (останній), то його сусіди є другим останнім і першими елементами списку.


Завдання

З огляду на масив цілих чисел, ваше завдання - відкинути нарцисичні.

  • Цілі числа можуть бути позитивними, негативними або нульовими.

  • Ви можете припустити, що масив містить принаймні три елементи.

  • Усі стандартні правила застосовуються. Це , тому найкоротший код у байтах виграє.

Приклади

Розглянемо масив [6, 9, 4, 10, 16, 18, 13] . Тоді ми можемо побудувати таку таблицю:

  Елемент |  Сусіди |  Сусіди "середні" |  Це нарцисичний?  -------- + ------------ + ------------------ + --------- --------  6 |  13, 9 |  11 |  Помилковий.  9 |  6, 4 |  5 |  Правда  4 |  9, 10 |  9.5 |  Помилковий.  10 |  4, 16 |  10 |  Помилковий.  16 |  10, 18 |  14 |  Правда  18 |  16, 13 |  14.5 |  Правда  13 |  18, 6 |  12 |  Правда 

Фільтруючи нарцисичні, ми залишаємося [6, 4, 10] . І це все!

Тестові випадки

  Вхід -> вихід   [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 не означає математично нарцисичну .

5 Comments
Leaky Nun 10/03/2017
Це суворо чи ні?
Mr. Xcoder 10/03/2017
@ LeakyNun, оскільки вони (strictly) вище, ніж середнє їх арифметичне
2 Leaky Nun 10/03/2017
Так чи то суворо чи ні?
8 Mr. Xcoder 10/03/2017
@LeakyNun Так, це строго. Я не знаю, що незрозуміло.
2 Nova 10/04/2017
Проблемою є круглі дужки. Спробуйте записати "(суворо!) Вище" або просто видалити круглі дужки.

19 Answers


Neil 10/04/2017.

JavaScript (ES6), 57 56 байт

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

Редагування: збережено 1 байт завдяки @ g00glen00b.

5 comments
4 Luke 10/03/2017
Мені подобається коротка частина, яка є симетричною: =>e+e<= .
Luke 10/03/2017
Також не (i+l-1)%l таке ж (i-1)%l ?
LarsW 10/03/2017
@ Люк не для i=0 , я думаю
Neil 10/03/2017
@ Люк Дійсно, % JavaScript є залишком, а не модулем, на жаль.
g00glen00b 10/04/2017
Ви повинні мати можливість замінити (i+l-1)%l (i||l)-1 , вважаючи, що якщо i==0 ви хочете length - 1 а іншим способом ви хочете i-1 . (і оскільки 0 є false ....). Це врятує вам інший байт.

Misha Lavrov 10/03/2017.

Mathematica, 44 байти

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

Як це працює

Даний вхід, такий як NO , обчислює

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

і вибирає елементи вихідного вводу в місцях, де цей результат не перевищує 0.


Rod 10/03/2017.

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] 

Спробуйте онлайн!


Leaky Nun 10/03/2017.

Желе , 10 байт

ṙ2+ṙ-<ḤCx@ 

Спробуйте онлайн!

Пояснення:

ṙ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) 
4 comments
Mr. Xcoder 10/03/2017
@EriktheOutgolfer Тому що це буде недійсним ...?
Mr. Xcoder 10/03/2017
@EriktheOutgolfer Решту частини коду треба впоратися з цим (я думаю)
miles 10/04/2017
@EriktheOutgolfer Він використовує правила синтаксичного аналізу для монадичних ланцюгів. Прочитайте його як (поверніть на 2) плюс оригінал, а потім поверніть на -1
Erik the Outgolfer 10/04/2017
@miles Трохи складніше, ніж це, але все одно було вирішено.

Magic Octopus Urn 10/03/2017.

05AB1E , 22 17 15 14 байт

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

Спробуйте онлайн!

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. 
1 comments
1 Emigna 10/03/2017
Збережіть 1 байт за допомогою ʒ¹®1,¾ + èO;> <¼

Luis Mendo 10/04/2017.

Octave / MATLAB, 48 байт

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

Try it online!

Пояснення

Вхідний масив спочатку розширено з останніми ( x(end) ) і першими ( x(1) ) записами на відповідних сторін.

Тест на нарцисизм здійснюється шляхом констатування розширеного масиву з [1, -2, 1] і зберігаючи лише 'valid' частину.

Порівнюючи кожну записку в результаті згортку з 0 дається логічний індекс (маска), який використовується для вибору номерів із вводу.


miles 10/04/2017.

J 16 байт

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

Спробуйте онлайн!

Пояснення

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

Shaggy 10/04/2017.

Japt , 17 16 15 байт

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

Спробуй це


Пояснення

Неявний введення масиву U

kÈ> 

Вилучіть ( k ) елементи, які повертають істину при проходженні через функцію, причому Y є поточним індексом, який перевіряє, чи поточний елемент більше, ніж ...

[Y°ÉY] 

Масив [Y-1, Y+1] ...

x!gU 

Зменшений додаванням ( x ) після індексування кожного елемента в U ...

½* 

Помножена на .5 .


Альтернатива, 15 байт

fÈ+X§UgYÉ +UgYÄ 

Спробуй це


Laikoni 10/04/2017.

Haskell , 51 байт

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

Спробуйте онлайн! Приклад використання: f [1,2,3] дає [1,2] .

Для s = [1,2,3] , last s:s - це список [3,1,2,3] і tail$s++s списку [2,3,1,2,3] . zip3 генерує список трійок (a,b,c) із трьох зазначених списків, обріжуючи довші до довжини самого короткого списку. Ми отримуємо [(3,1,2),(1,2,3),(2,3,1)] , причому b є первинним елементом списку, а і його сусідами. Поняття списку потім вибирає все b де b*2<=a+c , тобто b не є нарцисичним.


Giuseppe 10/04/2017.

R 51 56 байт

Завдяки користувачеві 2390246 для корекції мого алгоритму

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

Спробуйте онлайн!

індекси l де c(l[-1],l[1])+c(l[s],l[-s]) , сусідні суми l , не менше ніж двічі l .

2 comments
user2390246 10/04/2017
Це розглядає два наступні елементи вектора, а не сусідні. Вам знадобиться щось на зразок c(l[sum(l|1)],l[2:sum(l|1)-1]) . Збіг обставин, що ваша версія працює на наведеному прикладі, але вона не працює на всіх тестових випадках.
Giuseppe 10/04/2017
@ user2390246 ти абсолютно правий. Мені навіть вдалося відправитися в гольф на кілька байтів!

JungHwan Min 10/04/2017.

Mathematica, 40 байт

Pick[#,+##>=3#2&@@@Partition[#,3,1,-2]]& 
3 comments
Martin Ender♦ 10/04/2017
Я думаю, вам потрібно <= замість < .
Martin Ender♦ 10/04/2017
Насправді ні, вам знадобиться >= .
JungHwan Min 10/04/2017
@Мартін Ендер Ах, ти маєш рацію. Я повинен Pick не нарцисичні цифри.

Erik the Outgolfer 10/03/2017.

Желе , 17 байт

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

Спробуйте онлайн!


Kevin Cruijssen 10/05/2017.

Java 8, 141 137 127 байт

 import java.util.*;a->{List r=new Stack();for(int i=0,l=a.length;i 

-10 байт завдяки @Nevay .

Explanation:

Спробуйте тут.

 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 
2 comments
1 Nevay 10/04/2017
127 байт: a->{List r=new Stack();for(int i=0,l=a.length;i
Kevin Cruijssen 10/05/2017
@Неві Спасибі, потрібно пам'ятати, що для попереднього та наступного цілих чисел з циклом обігу до 0 і після length-1 .

user3809982 10/03/2017.

JavaScript ES5, 59 байт

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


Xcali 10/03/2017.

Perl 5 , 51 + 1 ( -a ) = 52 байти

 $p=$F[-1];say map{$p+$F[++$i%@F]<2*($p=$_)?'':$_}@F 

Спробуйте онлайн!


Jonathan Frech 10/04/2017.

Python 2 , 64 60 bytes

  • Збережено чотири байти завдяки xnor ; гольф l[-~j%len(l)] (і простір) до (l+l)[-~j] .
 lambda l:[k for j,k in enumerate(l)if(l+l)[-~j]+l[~-j]>=k+k] 

Спробуйте онлайн!

3 comments
Mr. Xcoder 10/03/2017
Я просто запропонував 64 байти ;)
xnor 10/04/2017
l[-~j%len(l)] може бути (l*2)[j+1] , і може займати пробіл після if .
Jonathan Frech 10/04/2017
@ xnor спасибі! Це робить enumerate спроба конкурентоспроможною.

lit 10/04/2017.

PowerShell, 75 bytes

for($i=0;$i-lt$a.Length;$i++)NO 

Zacharý 10/05/2017.

APL, 20 байт

{⍵/⍨⍵≤2÷⍨(1⌽⍵)+¯1⌽⍵} 

Спробуйте онлайн!


Abigail 10/03/2017.

Perl, 48 байт

@_[grepNO 

Тело підпрограми.

1 comments
Laikoni 10/04/2017
Матеріали повинні бути повними програмами або функціями, але не фрагментами коду.

HighResolutionMusic.com - Download Hi-Res Songs

1 Martin Garrix

Yottabyte flac

Martin Garrix. 2018. Writer: Martin Garrix.
2 Dyro

Latency flac

Dyro. 2018. Writer: Martin Garrix;Dyro.
3 Martin Garrix

Access flac

Martin Garrix. 2018. Writer: Martin Garrix.
4 Alan Walker

Diamond Heart flac

Alan Walker. 2018. Writer: Alan Walker;Sophia Somajo;Mood Melodies;James Njie;Thomas Troelsen;Kristoffer Haugan;Edvard Normann;Anders Froen;Gunnar Greve;Yann Bargain;Victor Verpillat;Fredrik Borch Olsen.
5 Sia

I'm Still Here flac

Sia. 2018. Writer: Sia.
6 Bradley Cooper

Shallow flac

Bradley Cooper. 2018. Writer: Andrew Wyatt;Anthony Rossomando;Mark Ronson;Lady Gaga.
7 Cardi B

Taki Taki flac

Cardi B. 2018. Writer: Bava;Juan Vasquez;Vicente Saavedra;Jordan Thorpe;DJ Snake;Ozuna;Cardi B;Selena Gomez.
8 Blinders

Breach (Walk Alone) flac

Blinders. 2018. Writer: Dewain Whitmore;Ilsey Juber;Blinders;Martin Garrix.
9 Halsey

Without Me flac

Halsey. 2018. Writer: Halsey;Delacey;Louis Bell;Amy Allen;Justin Timberlake;Timbaland;Scott Storch.
10 Lady Gaga

I'll Never Love Again flac

Lady Gaga. 2018. Writer: Benjamin Rice;Lady Gaga.
11 Mako

Rise flac

Mako. 2018. Writer: Riot Music Team;Mako;Justin Tranter.
12 Kelsea Ballerini

This Feeling flac

Kelsea Ballerini. 2018. Writer: Andrew Taggart;Alex Pall;Emily Warren.
13 Dewain Whitmore

Burn Out flac

Dewain Whitmore. 2018. Writer: Dewain Whitmore;Ilsey Juber;Emilio Behr;Martijn Garritsen.
14 Avril Lavigne

Head Above Water flac

Avril Lavigne. 2018. Writer: Stephan Moccio;Travis Clark;Avril Lavigne.
15 Lady Gaga

Look What I Found flac

Lady Gaga. 2018. Writer: DJ White Shadow;Nick Monson;Mark Nilan Jr;Lady Gaga.
16 Billie Eilish

When The Party's Over flac

Billie Eilish. 2018. Writer: Billie Eilish;FINNEAS.
17 Bradley Cooper

Always Remember Us This Way flac

Bradley Cooper. 2018. Writer: Lady Gaga;Dave Cobb.
18 Rita Ora

Let You Love Me flac

Rita Ora. 2018. Writer: Rita Ora.
19 Diplo

Electricity flac

Diplo. 2018. Writer: Diplo;Mark Ronson;Picard Brothers;Wynter Gordon;Romy Madley Croft;Florence Welch.
20 Charli XCX

1999 flac

Charli XCX. 2018. Writer: Charli XCX;Troye Sivan;Leland;Oscar Holter;Noonie Bao.

Related questions

Hot questions

Language

Popular Tags