Чи володіють 26 найбагатших мільярдерів стільки ж багатства, скільки найбідніших 3,8 мільярда людей?


37

Вступ:

Кілька днів тому я прочитав цей пост з такою ж назвою, коли натрапив на нього в HNQ. У цьому питанні обговорюється, якщо претензія кандидата в президенти Берні Сандерса, який заявив про наступне:

Сьогодні 26 найбагатших у світі 26 мільярдерів, 26, тепер володіють стільки ж багатств, скільки найбідніших 3,8 мільярда людей на планеті, що становить половину населення планети.
Посилання на відео

правда чи ні. Будь ласка, перейдіть до самого питання, щоб отримати відповіді та обговорення там.

Що стосується фактичного виклику на основі цієї претензії:

Виклик:

Два входи: низхідний відсортований список номерів L та число n (де n дорівнює ). Вихід: найдовший можливий суфікс суб-список , для яких загальна сума суми перших значень в списку .1n<length of L
LnL

Приклад:

Вхідні дані: = і . Вихід:L[500,200,150,150,125,100,75,75,55,50,40,30,30,20,10,10,8,5,5,5,3,2,2,1,0,-2,-3]n=2
[125,100,75,75,55,50,40,30,30,20,10,10,8,5,5,5,3,2,2,1,0,-2,-3]

Чому?

Перше значення списку ( ) дорівнює . Якщо взяти всі суфікси залишків чисел, а також їхні суми:n=2L[500,200]700

Suffix:                                                                  Sum:

[-3]                                                                     -3
[-2,-3]                                                                  -5
[0,-2,-3]                                                                -5
[1,0,-2,-3]                                                              -4
[2,1,0,-2,-3]                                                            -2
[2,2,1,0,-2,-3]                                                          0
[3,2,2,1,0,-2,-3]                                                        3
[5,3,2,2,1,0,-2,-3]                                                      8
[5,5,3,2,2,1,0,-2,-3]                                                    13
[5,5,5,3,2,2,1,0,-2,-3]                                                  18
[5,5,5,5,3,2,2,1,0,-2,-3]                                                23
[10,5,5,5,5,3,2,2,1,0,-2,-3]                                             33
[10,10,5,5,5,5,3,2,2,1,0,-2,-3]                                          43
[20,10,10,5,5,5,5,3,2,2,1,0,-2,-3]                                       63
[30,20,10,10,5,5,5,5,3,2,2,1,0,-2,-3]                                    93
[30,30,20,10,10,5,5,5,5,3,2,2,1,0,-2,-3]                                 123
[40,30,30,20,10,10,5,5,5,5,3,2,2,1,0,-2,-3]                              163
[50,40,30,30,20,10,10,5,5,5,5,3,2,2,1,0,-2,-3]                           213
[55,50,40,30,30,20,10,10,5,5,5,5,3,2,2,1,0,-2,-3]                        268
[75,55,50,40,30,30,20,10,10,5,5,5,5,3,2,2,1,0,-2,-3]                     343
[75,75,55,50,40,30,30,20,10,10,5,5,5,5,3,2,2,1,0,-2,-3]                  418
[100,75,75,55,50,40,30,30,20,10,10,5,5,5,5,3,2,2,1,0,-2,-3]              518
[125,100,75,75,55,50,40,30,30,20,10,10,5,5,5,5,3,2,2,1,0,-2,-3]          643
[150,125,100,75,75,55,50,40,30,30,20,10,10,5,5,5,5,3,2,2,1,0,-2,-3]      793
[150,150,125,100,75,75,55,50,40,30,30,20,10,10,5,5,5,5,3,2,2,1,0,-2,-3]  943

Найдовший суфікс, який має суму, меншу або рівну, 700- [125,100,75,75,55,50,40,30,30,20,10,10,8,5,5,5,3,2,2,1,0,-2,-3]це сума 643, так що це наш результат.

Правила виклику:

  • Значення у першому префіксі не зараховуються до вихідного суфікса. Тобто введення = і n = 2 призведе до , а не .nL[10,5,5,3]n=2[5,3][5,5,3]
  • Введення / виведення гнучко. Ви можете вводити L як список / потік / масив цілих чисел / десяткових знаків / рядків, окремий розділений рядок, по одному через STDIN тощо. Ви можете також виводити як список / потік / масив цілих чисел / десяткових знаків / рядків, надрукувати / повернути обмежений рядок, надрукувати номер на кожному новому рядку тощо. Ваш дзвінок.
  • Вихід є гарантією того, що він не пустує. Тож вам не доведеться мати справу з тестовими випадками, такими як L = [-5,-10,-13]і n=2 результаті чого [].
  • Обидва (або будь-який) вхід та / або вихід можуть також бути у порядку зростання, а не у порядку зменшення, якщо ви захочете.

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам коду-гольфу відштовхувати вас від публікації відповідей з мов, що не кодують гольф. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Для вашої відповіді застосовуються стандартні правила з правилами вводу / виводу за замовчуванням , тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу повернення. Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду (тобто TIO ).
  • Також настійно рекомендується додавати пояснення до своєї відповіді.

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

Inputs: L=[500,200,150,150,125,100,75,75,55,50,40,30,30,20,10,10,8,5,5,5,3,2,2,1,0,-2,-3], n=2
Output: [125,100,75,75,55,50,40,30,30,20,10,10,8,5,5,5,3,2,2,1,0,-2,-3]

Inputs: L=[10,5,5,3], n=2
Output: [5,3]

Inputs: L=[7,2,1,-2,-4,-5,-10,-12], n=7
Output: [-12]

Inputs: L=[30,20,10,0,-10,-20,-30], n=1
Output: [20,10,0,-10,-20,-30]

Inputs: L=[100,35,25,15,5,5,5,5,5,5,5,5,5,5,5,5,5], n=1
Output: [15,5,5,5,5,5,5,5,5,5,5,5,5,5]

Inputs: L=[0,-5,-10,-15], n=2
Output: [-10,-15]

Inputs: L=[1000,999,998,900,800,766,525,525,400,340,120,110,80,77,33,12,0,-15,-45,-250], n=2
Output: [525,525,400,340,120,110,80,77,33,12,0,-15,-45,-250]

Inputs: L=[10,5,5], n=1
Output: [5,5]

Чи можу я написати відповідь, яка працює лише з позитивними (або, можливо, негативними; я ще не написала її) цілими числами через відсутність цілого числа в мові?
Ніл

3
@Neil Я припускаю, що ви тут говорите про Retina? Але впевнено, ви можете припустити, що всі значення в цьому випадку є негативними. Хоча, вам найкраще також мати другу версію, яка працює для негативних значень, тому що я маю відчуття, що насправді може бути досяжним (з величезним збільшенням кількості байтів та деякими заощадженнями); що більше загальне почуття, ніж фактичний факт, не впевнений, чи дійсно можливо обійти частину негативних значень).
Кевін Кройсейсен

6
Справжній тестовий вигляд виглядав би так [131000000000, 96500000000, 82500000000, 76000000000, (7.7 billion more entries)]:: p
Арнольд

2
Як щодо сценарію, коли жодне з значень не відповідає критеріям: [1,2,3] n = 1? Що ви хочете для виведення?
ouflak

@ouflak Див правило третій виклик: « Вихід гарантії бути непустою Таким чином , ви не будете мати справу з тестовими подібних випадках. L = [-5,-10,-13]і в n=2результаті []. » Крім того , для введення списку гарантовано відсортоване по спадаючій (або зростаючим, якщо ви захочете), тому [1,2,3]це не є дійсним списком вхідних даних для початку (якщо ви не вибрали висхідний вхід, в такому випадку [1,2]результат буде).
Кевін Круїссен

Відповіді:


17

C # (Visual C # Interactive Compiler) , 88 81 69 68 63 байт

-4 байти завдяки LiefdeWen

a=>b=>a.Skip(b).Where((x,i)=>a.Skip(i+b).Sum()<a.Take(b).Sum())

Спробуйте в Інтернеті!


Я думаю, що ти міг би поголити ще двох, усунувши +bв Skipдзвінку; перевірити перший nсписок зайве, але я вважаю, що це все-таки правильно.
TheRubberDuck

3
@TheRubberDuck nope, довелося додати його у випадку, коли префікс і суфікс перекриваються. Тобто [10,5,5,3], n = 2
Термін дії даних минув


@LiefdeWen приємно! насправді це теж менше, якщо ми використовуємо функцію curried
Expired Data

@ExpiredData О так, я забув, що я її видалив.
LiefdeWen

12

EXAPUNKS (2 EXA, 30 інструкцій, файл рішення з 594 байтами)

Я хотів на деякий час спробувати випробування з кодовим гольфом у EXAPUNKS, і ти виглядав як найкраще, що я міг знайти, отже, вітаю!

Введіть через файли 200 і 201, для L і n відповідно. Виведіть через новий файл. L і вихід у порядку зростання.

В основному, XA підсумовує останні n значень у L, після чого надсилає їх до XB. Потім він прагне до початку L і посилає кожне значення по одному на XB. XB спочатку отримує загальну суму від XA і зберігає її в регістрі X. Потім вона отримує значення по одному від XA, віднімаючи нове значення від X, і записуючи ці значення у вихідний файл до X <0.

XA

GRAB 201
SUBI T F T
DROP
GRAB 200
SEEK 9999
SEEK T
MARK FIRST_SUM
ADDI F X X
ADDI T 1 T
SEEK -1
VOID F
TJMP FIRST_SUM
COPY X M
SEEK -9999
MARK SECOND_SUM
COPY F M
TEST EOF
FJMP SECOND_SUM
KILL

XB

MAKE
COPY M X
MARK LOOP
COPY M T
COPY T F
SUBI X T X
TEST X > 0
TJMP LOOP
SEEK -1
VOID F
KILL

JavaScript для рівня тут


IIRC не має засобів для збереження рішень? Якщо так, то вам слід скористатися кількістю байтів, а не ігровими інструкціями.
Пшеничний майстер

1
@ SriotchilismO'Zaic, так, я не вважав, що файли повинні бути легкодоступними, але я їх просто знайшов. Я додам розмір на диску. Купа метаданих, які я не писав, зберігається поряд, але я думаю, що це найкращий спосіб насправді отримати єдиний "байт" з цієї гри.
ymbirtt

Я хотів би витратити час, щоб переглянути ці файли і подивитися, чи є спосіб впорядкувати метадані. Мені також цікаво, чи деякі інструкції займають більше пам’яті, ніж інші.
Пшеничний майстер

@ SriotchilismO'Zaic, вони насправді так і роблять. Усі інструкції зберігаються як простий текст, тому для початку ми можемо перетворити всі позначки на однобуквені ідентифікатори. Назва вашого рішення є там, тому ми можемо видалити кілька байт, викликавши рішення "a". Деякі його частини також здаються пов'язаними з віртуальною мережею, яку ви створили для EXA. Чесно кажучи, я думаю, що "найсправедливіший" спосіб оцінити рішення EXAPUNKS - це або використовувати кількість байтів фактичного коду, або кількість інструкцій. Це може бути варте мета-повідомлення ...
ymbirtt

2
@ymbirtt Я вважаю, що тоді питання зводиться до того, чи можете ви написати інтерпретатора, який перегляне інструкції та перетворить їх на збережені дані? Ну тривіально так, просто напишіть програму, яка вводить для вас джерело .. Хоча це вважатиметься іншою мовою.
Термін дії якого минув

11

Python 2 , 60 байт

l,n=input()
s=sum(l[:n])
while sum(l[n:])>s:n+=1
print l[n:]

Спробуйте в Інтернеті!


Пояснення:

Спочатку береться сума перших nпредметів.

Тоді сума кожного підспілу порівнюється з цією сумою. Як тільки одного не більше, ми зупиняємось.

Потім виводиться отриманий (найдовший) підпис.


2
насправді найбільш читаний +1
Kryštof Řeháček

10

05AB1E , 14 12 байт

Збережено 2 байти завдяки Grimy

.$ΔDOI¹£O›.$

Спробуйте в Інтернеті!

Пояснення

.$               # drop the first n entries of the list
  Δ              # repeat the following code until the result doesn't change
   DO            # duplicate and sum the copy
     I¹£O        # calculate the sum of the first n items of the input
         ›.$     # if the current sum is greater than the sum of the first n items
                 # remove the first item of the current list

2
"Точно" те саме, що я підготував як рішення. І під "точно" я маю на увазі мою .$.sʒO²¹£O>‹}θ. :)
Кевін Круїссен

2
@KevinCruijssen ось 12
Grimmy

1
ASCII лише 12 (використовуючи інший метод введення).
Гриммі

1
@Grimy: Так. Я ніколи не знав, що це |перетворило last-input, цікаво.
Емінья

2
@Grimy: Дивіться це проти цього . Зазвичай, коли споживаються всі входи, останній вхід неявно використовується для всіх примірників наступного вводу. Використання |тут робить результат |стати останнім входом замість того, що був насправді останнім входом.
Емінья

7

J , 18 байт

}.#~+/@{.>:+/\.@}.

Спробуйте в Інтернеті!

Пояснення:

Діадичне дієслово, беручи nза лівий аргумент і L- як правильний аргумент.

                }.  drop the first n items from L 
               @    and
             \.     for each suffix (starting from the longest)
           +/       find its sum
         >.         is this sum smaller or equal than (results in a boolean vector)
    +/              the sum 
      @             of
       {.           the first n items of L
  #~                use the 1s in the boolean vector to copy the respective
}.                  elements of L (without the first n)

7

Ruby , 47 43 байт

Приймає висхідний список як вхідний. Видаляєн елементів з кінця масиву, щоб отримати початкову суму, а потім продовжуйте видаляти елементи, поки сума решти елементів не перевищить початкову суму.

-4 байти, прочитавши специфікацію уважніше.

->a,n{s=a.pop(n).sum;a.pop while a.sum>s;a}

Спробуйте в Інтернеті!


7

R , 53 55 байт

@Giuseppe врятував мені 2 байти, змінивши спосіб виконання видалення

function(n,L,Y=rev(L[0:-n]))Y[cumsum(Y)<=sum(L[1:n])]

Спробуйте в Інтернеті! Приймає вхід як спадний, а вихідний у зростаючому порядку, як це дозволено правилом 4.

  • Y- оберт Lз 1: n, видалений за допомогою0:-n
  • повернення, Yзвідки сукупна сума менше, ніж дорівнюєL[X]

@Giuseppe як завжди дякую. Спробував видалити Xвикористання, -(1:n)але, звичайно, того самого розміру, тому залишив його
MickyT

6

JavaScript (ES6), 66 bytes

Вводиться як (a)(n)зі списком у порядку зростання.

a=>n=>(g=s=>n?g(s+a.pop(n--)):eval(a.join`+`)>s?g(s,a.pop()):a)(0)

Спробуйте в Інтернеті!

Прокоментував

a => n =>               // a[] = list, n = number of richest guys
  ( g = s =>            // g is a recursive function taking a sum s
    n ?                 // if n is not equal to 0:
      g(s + a.pop(n--)) //   recursive call: add the last entry to s and decrement n
    :                   // else:
      eval(a.join`+`)   //   if the sum of the remaining entries
      > s ?             //   is greater than s:
        g(s, a.pop())   //     recursive call with the last entry removed
      :                 //   else:
        a               //     stop recursion and return a[]
  )(0)                  // initial call to g with s = 0

1
@KevinCruijssen Seems like I misread the requirement. Should be fixed now.
Arnauld

And unlike some other answers that had fixed the same issue, without an increase in byte-count. :) (And partially my bad, should have included a test case for to begin with..)
Kevin Cruijssen

5

Python 2, 59 bytes

Also compatible with Python 3

f=lambda l,n:l[n:]*(sum(l)/2>=l.pop(n)+sum(l[n:]))or f(l,n)

Try it online!


Explanation

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


4

Pyth , 16 15 байт

efgs>vzQsT._<vz

Спробуйте в Інтернеті!

Очікується, що список вхідних даних буде відсортований у порядку зростання, а не за зменшенням, як використовується у прикладах.

Часом так, коли мені дуже хочеться, щоб Pyth мав один оператор маркера, щоб отримати доступ до другого входу не один раз ( Eоцінює наступний рядок введення, але повторні дзвінки відкидають попереднє прочитане значення).

efgs>vzQsT._<vzQ   Implicit: Q=eval(input()), z=input() - that is, Q is list, z is string n
                   Trailing Q inferred
             vz    Evaluate z as integer
            <  Q   Remove the above number of elements from the end of Q
          ._       Generate a list of all prefixes of the above
 f                 Filter keep elements of the above, as T, where:
    >vzQ             Take the last z elements of Q
   s                 Sum
  g                  Is the above greater than or equal to...
        sT           ... the sum of T?
e                  Take the last remaining element, implicit print

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


@ Mr.Xcoder Добре горе, що очевидне заощадження! Дякую 👍
Sok

4

JavaScript, 64 байти

f=(a,n,s=0,[h,...t]=a)=>n<1?f(a)>s?f(t,0,s):a:1/h?f(t,n-1,s+h):s

Спробуйте в Інтернеті!

f=(
  a,               // remaining array
  n,               // if n >= 0: we try to find suffix <= s + a[0..n]
                   // if n is NaN (or undefined): we calculate sum(a) + s
  s = 0,           // previous sum
  [h, ...t] = a    // split array (a) into head (h) and tail (t)
) => (n < 1 ?      // if n == 0
  f(a) > s ?       //   if sum(a) > s
    f(t,0,s) :     //     drop head and test tail again
    a :            //   otherwise, a is the answer
  1 / h ?          // if a is not empty
    f(t,n-1,s+h) : //   add head to sum and recurse
    s              //   we only reach here if n is NaN, return the sum
)

4

Стакс , 12 байт

îo╧╫Σ↑>'qµΣº

Запустіть і налагоджуйте його на staxlang.xyz!

Приємніший варіант

Розпаковано (14 байт) та пояснення:

:/|]{|+n|+>!}j
:/                Split array at index.
  |]              Suffixes. The bit after the split (the poor) is on top for this.
    {       }j    First item in array that yields truthy under the block:
     |+             Sum array (collective wealth of the many).
       n            Copy second item to top of stack.
        |+          Sum again. Wasted computation, but this location saves a byte.
          >!        Second item on stack less than or equal to first?

За консенсусом я можу залишити цей результат на стеці. Stax спробує неявну друк, яка може вийти з ладу, але додавшиm до розпакованої програми дозволяє добре бачити вихід.

Схоже, { ... }jце те саме, що { ... fh. Ага. Правка: Це не зовсім так; єдиний колишній зупиниться, коли отримає неприємний результат, можливо, уникнувши побічних ефектів або фатальної помилки згодом.



3

Japt , 16 байт

£sV+YÃæ_x §U¯V x

Спробуй це

£sV+YÃæ_x §U¯V x     :Implicit input of U=L and V=n
£                    :Map U, with Y being the 0-based indices
 sV+Y                :  Slice U from index V+Y
     Ã               :End map
      æ              :First element that returns true
       _             :When passed through the following function
        x            :  Reduce by addition
          §          :  Less than or equal to
           U¯V       :    Slice U to index V
               x     :    Reduce by addition

3

Желе , 13 12 байт

ṫḊÐƤS>¥ÞḣS¥Ḣ

Спробуйте в Інтернеті!

Дякуємо @JonathanAllan за збереження байта!

Дьядичне посилання, що приймає список значень L як лівий аргумент і число н як правильно.

Пояснення

ṫ            | Tail: take all values of L from the nth onwards (which is actually one too many; dealt with below)
 ḊÐƤ         | Take all suffixes, removing the first value from each. This will yield a list of all possible suffixes of L that exclude the first n values
       Þ     | Sort by:
    S>¥ ḣS¥  | - The sum is greater than the sum of the first n values of L
           Ḣ | Take the first resulting list and return from link (implicitly output when called as a full program)

Ви можете зберегти байт, сортуючи замість фільтрування:ṫḊÐƤS>¥ÞḣS¥Ḣ
Джонатан Аллан

3

Гая , 12 байт

eSe¤Σ¤┅⟪Σ⊃⟫∇

Спробуйте в Інтернеті!

Я думаю, що є байт, в який я можу пограти, якщо я отримаю стек правильно.

e	| eval first input as Gaia code
S	| Split into a list of ["first n elements" "rest of elements"]
e	| dump onto stack
¤Σ	| swap and take the sum (sum of first n elements)
¤┅	| swap and take suffixes
⟪  ⟫∇	| return the first element of suffixes where:
 Σ⊃	| the sum(first n elements) ≥ sum(suffix)

3

Haskell , 46 байт

Незадоволений тим, як це виглядає; сподіваюся, що я просто пропускаю явних гольфів.

n#l=until(((sum$take n l)>=).sum)tail$drop n l

Спробуйте в Інтернеті!

Я спробував отримати префікс і суфікс, використовуючи splitAtта відповідність шаблону в захисті, але це виявилося на 3 байти більше. Плануйте спробувати перетворити на рекурсивну функцію з охоронцями, щоб побачити, чи знижує це кількість байтів.

Пояснення

n # l = until (((sum $ take n l) >= ) . sum) tail $ drop n l
n # l =                                                        -- define infix operator
n                                                              --  the number of elements
    l                                                          --  the list
        until                                                  -- until
                                        sum                    --  the sum of the suffix
               ((sum $ take n l) >=)                           --  is <= the sum of the prefix
                                             tail              --  remove the first element
                                                    drop n l   -- the suffix

Те, що я називаю "префіксом", - це перші nелементи, а "суфікс" - решта списку.


3

APL (Dyalog Unicode) , 23 21 байт SBCS

Анонімний префікс лямбда, взяття н як лівий аргумент і L як правильний аргумент.

{⍵↓⍨⍺⌈⊥⍨(+/⍺↑⍵)<+\⌽⍵}

Спробуйте в Інтернеті!

{} "Dfn";нє (ліва грецька літера) іLє (найправіша грецька літера):

⌽⍵ реверс L

+\ префіксні суми того

()< Булева маска, де менше:

  ⍺↑⍵ приймати перше н елементи L

  +/ суму цих

⊥⍨порахуйте сліди правди

⍺⌈ максимум н і це

⍵↓⍨ відкиньте багато елементів з передньої частини L


1
@KevinCruijssen Чудово помічений. Виправлено.
Адам

3

MATL , 13 12 байт

1 байт збережено завдяки @Giuseppe на основі відповіді @MickyT .

:&)PtYsbs>~)

Вихід складається у порядку зростання.

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

Розглянемо вхідні дані 2та [500,200,150,150,125,100,75,75,55,50,40,30,30,20,10,10,8,5,5,5,3,2,2,1,0,-2,-3].

:      % Implicit input: n. Push [1 2 ... n]
       % STACK: [1 2]
&)     % Implicit input: array. Two-output indexing: pushes the subarray
       % indexed by [1 2 ... n] and the remaining subarray
       % STACK: [500 200], [150 150 125 ... -2 -3]
P      % Flip
       % STACK: [500 200], [-3 -2 ... 125 150 150]
t      % Duplicate top of the stack
       % STACK: [500 200], [-3 -2 ... 125 150 150], [-3 -2 ... 125 150 150]
Ys     % Cumulative sum
       % STACK: [500 200], [-3 -2 ... 125 150 150], [-3 -5 ...646 796 946]
b      % Bubble up in the stack
       % STACK: [-3 -2 ... 125 150 150], [-3 -5 ...646 796 946], [500 200]
s      % Sum
       % STACK: [-3 -2 ... 125 150 150], [-3 -5 ...646 796 946], 7
>~     % Greater than, negate; element-wise
       % STACK: [-3 -2 ... 125 150 150], [1 1 ... 1 0 0]
)      % Index. Implicit display
       % STACK: [-3 -2 ... 125]

3

PowerShell , 99 97 байт

param($n,$l)do{$a+=$l[$i++]}until($a-gt($l[-1..-$n]-join'+'|iex)-or$i-gt$l.count-$n)$l[($i-2)..0]

Спробуйте в Інтернеті!

Складає список у порядку зростання, вихід зменшується (оскільки його було легше порівняти з тестовими випадками: ^))

Проходить список назад вперед, порівнюючи акумулятор з останніми nзаписами, доданими разом (склеюючи їх разом з +s і передаючи отриманий рядок уinvoke-expression ). До циклу "Поки" потрібна була додаткова логіка, щоб вирішити питання про потрапляння в Багаче околиці, тому що воно не зупиниться, якщо ми все ще не багатші за Багатих хлопців, поки не розберемо весь список.

Розгорнуто:

param($n,$list)
do{
  $acc+=$list[$i++]
}until($acc -gt ($list[-1..-$n] -join '+'|invoke-expression) -or ($i -eq $list.count-$n))
$list[($i-2)..0]

3

Сітківка 0,8,2 , 99 байт

\d+
$*
^
;,
+`;,(1+)(,.*)1$
$1;$2
,
;$'¶$`,
;.*(;.*)
$1$1
T`,`_`.*;
1G`(1+);\1;
.*;

(1*),
$.1,
,$

Спробуйте в Інтернеті! Посилання включає лише деякі тестові випадки; Я міг би змусити його працювати в деяких випадках з від'ємними числами вартістю 12 байтів (зокрема, перші nзаписи Lвсе ще повинні бути позитивними; теоретично я міг би вимагати лише суми перших nзаписів, щоб бути позитивною). Пояснення:

\d+
$*

Перетворити в одинарне.

^
;,

Вставте маркер на початку L.

+`;,(1+)(,.*)1$
$1;$2

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

,
;$'¶$`,

Створіть запис для кожного суфікса L.

;.*(;.*)
$1$1

Замініть середину копією суфікса.

T`,`_`.*;

Підсумуйте копію суфікса.

1G`(1+);\1;

Візьміть перший запис, коли сума суфікса не перевищує суми префікса.

.*;

Видаліть суми.

(1*),
$.1,

Перетворити в десятковий.

.,$

Видаліть коду, що вийшла раніше n.


Гарна відповідь. :) Чи не могли б ви додати посилання TIO до версії, що на 12 байтів більше містить мінус-числа. І np, що він не працює, коли першийнчисла підсумовують від’ємне значення. Поки це працює з натуральними числами, це все одно добре. Молодці.
Кевін Кройсейсен

1
@KevinCruijssen Моя версія з негативним номером виявилася надмірно повільною, але мені вдалося виправити це за допомогою rпараметра, тому тепер я пов’язав це з деякими тестовими кейсами.
Ніл

2

Вугілля деревне , 17 байт

IΦθ¬∨‹κη‹Σ…θηΣ✂θκ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

  θ                 Input `L`
 Φ ¬                Filter out elements where
      κ             Current index
     ‹              Is less than
       η            Input `n`
    ∨               Logical Or
           θ        Input `L`
          … η       First `n` terms
         Σ          Summed
        ‹           Is less than
              ✂θκ   Remainder of `L`
             Σ      Summed
I                   Cast to string
                    Implicitly print on separate lines


2

PowerShell , 86 байт

param($n,$l)$l|?{$k++-ge$n}|?{(&{$l|%{$s+=($_,0,-$_)[($n-le$i)+(++$i-ge$k)]};$s})-ge0}

Спробуйте в Інтернеті!

Розгорнуто:

param($n,$list)
$list|?{$k++-ge$n}|?{                               # tail elements after $n only
    $sumLeftSegmentMinusSumRightSgement = &{        # calc in a new scope to reinit variables $s, $i
        $l|%{$s+=($_,0,-$_)[($n-le$i)+(++$i-ge$k)]} # sum(list[0..n-1]) - sum(list[k-1..list.Count-1])
        $s                                          # output sum to the outer scope
    }
    $sumLeftSegmentMinusSumRightSgement -ge 0       # output elements where sum >= 0
}

2

MathGolf , 13 байт

(‼≥≤Σ\æ╞`Σ≥▼Þ

Спробуйте в Інтернеті!

Пояснення

Вводиться як " n L

(               pops n and decrements (TOS is n-1)
 ‼              apply next two operators to stack simultaneously
  ≥             slice L[n-1:] (gets all elements with index >= n-1)
   ≤            slice L[:n] (gets all elements with index <= n-1)
    Σ           get sum of topmost list (this is the sum of n largest elements)
     \          swap top elements
      æ    ▼    do while false with pop using block of length 4
       ╞        discard from left of string/array
        `       duplicate the top two items on the stack
         Σ      sum the list which is on top
          ≥     is the sum of the partial list >= the desired sum?
            Þ   discard everything but TOS

Причина, чому це працює, полягає в тому, що на першому кроці ми фактично ділимо список на дві частини, що перекриваються. Як приклад, L = [4, 3, 2, 1], n = 2розділимо список як [3, 2, 1]і [4, 3]. Причиною появи зайвого елемента в першому списку є те, що в циклі перше, що трапляється, - це відкинути. Якби додатковий елемент не був попереджений, випадки, коли виведенням повинен бути весь решта списку, не зможуть.



1

Clojure, 66 75 байт

#(loop[v(drop %2 %)](if(>(apply + v)(apply +(take %2 %)))(recur(rest v))v))

На жаль, не здається, що коротша ідіома для загальної суми послідовності.

Редагувати : О, коли ви додаєте приклади до Спробуйте в Інтернеті!посилання Я помітив, що оригінальна відповідь дала неправильні результати, коли було багато негативних цифр.

В doseqвикористовує «ключі» деструктурірующіе тому вона повинна бути кілька ясно торці , які дані в якій символ. #(...)є анонімною функцією, тут я прив'язую її до символу f:

(def f #(loop[v(drop %2 %)](if(>(apply + v)(apply +(take %2 %)))(recur(rest v))v)))


(doseq [{:keys [L n]} [{:L [10,5,5,3] :n 2}
                       {:L [7,2,1,-2,-4,-5,-10,-12] :n 7}
                       {:L [30,20,10,0,-10,-20,-30] :n 1}]]
  (println (f L n)))

Вихід:

(5 3)
(-12)
(20 10 0 -10 -20 -30)

1
Ви не хочете додати TIO з тестовим кодом (я бачу Clojure у списку)? Якщо це якось неможливо (невідповідність версії або використання вбудованих файлів, які не доступні в TIO), чи можете ви включити скріншот із деякими тестовими випадками як перевірку того, що він працює?
Кевін Круїссен

1

APL (NARS), 32 символи, 64 байти

{v/⍨(+/⍺↑⍵)≥+/¨{⍵↓v}¨¯1+⍳≢v←⍺↓⍵}

тест та коментарі:

  q←{v/⍨(+/⍺↑⍵)≥+/¨{⍵↓v}¨¯1+⍳≢v←⍺↓⍵}
  2 q 500,200,150,150,125,100,75,75,55,50,40,30,30,20,10,10,8,5,5,5,3,2,2,1,0,¯2,¯3
125 100 75 75 55 50 40 30 30 20 10 10 8 5 5 5 3 2 2 1 0 ¯2 ¯3 
  2 q 10,5,5,3
5 3 
  ⎕fmt  7 q 7,2,1,¯2,¯4,¯5,¯10,¯12
┌1───┐
│ ¯12│
└~───┘
  2 q 0,¯5,¯10,¯15
¯10 ¯15 
  ⎕fmt 1 q 100,35,25,15,5,5,5,5,5,5,5,5,5,5,5,5,5
┌14───────────────────────────┐
│ 15 5 5 5 5 5 5 5 5 5 5 5 5 5│
└~────────────────────────────┘
  2 q 1000,999,998,900,800,766,525,525,400,340,120,110,80,77,33,12,0,¯15,¯45,¯250
525 525 400 340 120 110 80 77 33 12 0 ¯15 ¯45 ¯250 
  1 q 10,5,5
5 5 
  ⎕fmt  2 q ¯5,¯10,¯13
┌0─┐
│ 0│
└~─┘
  ⎕fmt  1 q 30,20,10,0,¯10,¯20,¯30
┌6───────────────────┐
│ 20 10 0 ¯10 ¯20 ¯30│
└~───────────────────┘


   {v/⍨(+/⍺↑⍵)≥+/¨{⍵↓v}¨¯1+⍳≢v←⍺↓⍵}
                             v←⍺↓⍵   v is ⍵[(⍺+1)..≢⍵] 
                  {⍵↓v}¨¯1+⍳≢v        build the array of array cut v of 0..((≢v)-1) elements
               +/¨                   sum each of these element of array above
      (+/⍺↑⍵)≥                       compare ≥ with the sum of ⍵[1..⍺] obtain one bolean array
                                     has the same lenght of v
   v/⍨                               return the element of v that are 1 of the boolean array above

Я неправильно повідомив про довжину байтів ...


1

MS SQL Server 2017 , 271 байт

create function f(@L nvarchar(max),@ int)returns table return
select v
from(select*,sum(iif(n<=@,v,0))over()r,sum(v)over(order by v)p
from(select row_number()over(order by-v)n,v
from STRING_SPLIT(@L,',')cross apply(select
try_parse(value as int)v)t)t)t
where p<=r and @<n

Я знаю, що використання більш схожої таблиці для зберігання вхідних даних може зробити код більш стислим, але використовуючи тип даних символів для зберігання числового списку та STRING_SPLITфункції, я скорочую Build Schemaчастину :)

Більш читабельна версія:

CREATE FUNCTION f(@L NVARCHAR(MAX), @n INT)
  RETURNS TABLE AS RETURN (
    SELECT
      v
    FROM (
      SELECT
        *,
        SUM(IIF(n<=@n, v, 0)) OVER() AS r,
        SUM(v) OVER(ORDER BY v) AS p
      FROM(
        SELECT ROW_NUMBER() OVER(ORDER BY -v) AS n, v
        FROM STRING_SPLIT(@L, ',')
        CROSS APPLY(
          SELECT TRY_PARSE(value AS INT) AS v
        ) AS t
      ) AS t
    ) AS t
    WHERE p <= r AND @n < n
  );

Спробуйте його на SQL Fiddle !


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.