Владеют ли 26 самых богатых миллиардеров таким же богатством, как самые бедные 3,8 миллиарда человек?


37

Введение:

Несколько дней назад я прочитал этот пост с тем же названием, когда наткнулся на него в HNQ. В этом вопросе обсуждается ли иск кандидата в президенты Берни Сандерса, который утверждал следующее:

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

это правда или нет. Пожалуйста, перейдите к самому вопросу для ответов и обсуждения там.

Что касается фактической проблемы, основанной на этом требовании:

Вызов:

Два входа: отсортированный по убыванию список номеров L и номер n (где n равно ). Выход: самый длинный возможный суффикс суб-список , для которых общая сумма суммы первых значений в списке .1n<length of Ln 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, так что это наш результат.

Правила соревнований:

  • Значения в первом префиксе не учитываются в суффиксе вывода. Т.е. входы = и приведут , а нет .nL[10,5,5,3]n=2[5,3][5,5,3]
  • Ввод / вывод является гибким. Вы можете ввести в виде списка / потока / массива целых чисел / десятичных дробей / строк, одной строки с разделителями, один за другим через STDIN и т. Д. Вы также можете вывести в виде списка / потока / массива целых чисел / десятичных дробей / строк, распечатать / вернуть строку с разделителями, напечатать число на каждой новой строке и т. д. Ваш звонок.L
  • Выход гарантированно будет непустым. Таким образом, вам не придется иметь дело с тестовыми примерами, такими как = и n = 2, в результате чего . 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
@ Нейл Я предполагаю, что ты говоришь о 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 #) , 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 Нет, пришлось добавить его для случая, когда префикс и суффикс перекрываются. Т.е. [10,5,5,3], n = 2
данные


@LiefdeWen приятно! это на самом деле меньше, если мы используем функцию карри
Expired Data

@ExpiredData Ах да, забыл, я удалил его.
LiefdeWen

12

EXAPUNKS (2 EXAs, 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 не имеет exapunks способ сохранить решения? Если это так, вы должны использовать количество байтов, а не в игровых инструкциях.
Пшеничный волшебник

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-only 12 (с использованием другого метода ввода).
Grimmy

1
@ Грими: Да. Я никогда не знал, |переписал last-input, интересно.
Эминья

2
@ Грими: Смотрите это против этого . Обычно, когда используются все входы, последний вход неявно используется для всех экземпляров следующего ввода. При использовании |здесь результат |становится последним входом, а не последним.
Эминья

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

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]

@ Джузеппе как всегда спасибо. Попытался удалить Xиспользование, -(1:n)но, конечно, это был тот же самый размер, поэтому оставил это
MickyT

6

JavaScript (ES6), 66 байт

Принимает ввод как (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 Похоже, я неправильно прочитал требование. Должно быть исправлено сейчас.
Арно


5

Python 2 , 59 байт

Также совместим с Python 3

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

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


объяснение

Сумма суффикса сравнивается с половиной суммы всего списка. Если сумма суффикса меньше или равна, суффикс возвращается. Если нет, функция вызывается рекурсивно, и первый элемент суффикса появляется.


4

Pyth , 16 15 байт

efgs>vzQsT._<vz

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

Предполагается, что входной список будет отсортирован по возрастанию, а не по убыванию, как это используется в примерах.

В такие моменты я действительно хочу, чтобы у Пайта был один токен-оператор для доступа ко второму входу более одного раза (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 Боже, какое очевидное спасение! Спасибо 👍
Сок

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

Stax , 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 в качестве левого аргумента и числа N как правильно.

объяснение

ṫ            | 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

Gaia , 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

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

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

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

{} "Дфн";Nэто (самая левая греческая буква) иLявляется (самая правая греческая буква):

⌽⍵ обратный L

+\ префикс суммы этого

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

  ⍺↑⍵ взять первый N элементы L

  +/ суммировать те

⊥⍨считать истины

⍺⌈ максимум N и это

⍵↓⍨ отбросьте столько элементов с фронта 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 байт длиннее и содержит отрицательные числа. И нп, что это не работает, когда первыйNцифры суммируются с отрицательным значением. Пока это работает с положительными целыми числами, это все еще хорошо. Отлично сработано.
Кевин Круйссен

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.