26位最富有的亿万富翁拥有的资产与最贫穷的38亿人口一样多吗?


37

介绍:

几天前,当我在HNQ遇到这篇文章时,我读了同样的标题。在这个问题上,正在讨论总统候选人伯尼·桑德斯的主张,该主张的主张如下:

如今,世界上最富有的26位亿万富翁(26岁)拥有的财富相当于地球上最贫穷的38亿人口(全球人口的一半)。
链接到视频

是否正确。请转到问题本身以获取答案和讨论。

至于基于此主张的实际挑战:

挑战:

两个输入:一个降序排序的数字列表和一个数字(其中是)。输出:的最长可能后缀子列表,其总和为列表前值的和。Lnn1n<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,所以这是我们的结果。

挑战规则:

  • 前前缀中的值不计入输出后缀。即输入 = 和将导致,而不是。nLn = 2[10,5,5,3]n=2[5,3][5,5,3]
  • I / O是灵活的。您可以将输入为整数/小数/字符串的列表/流/数组,单个定界字符串,通过STDIN逐一输入等,也可以输出为整数/小数/字符串的列表/流/数组,打印/返回定界字符串,在每个换行符上打印数字,等等。您的呼叫。L
  • 输出保证为非空。因此,您不必处理 = 和导致的测试用例。 Ln = 2[-5,-10,-13]n=2[]
  • 输入和/或输出两者(或其中之一)也可以按升序排列,而不是按降序排列(如果您选择这样做)。

一般规则:

  • 这是,因此最短答案以字节为单位。
    不要让代码高尔夫球语言阻止您发布使用非代码高尔夫球语言的答案。尝试针对“任何”编程语言提出尽可能简短的答案。
  • 标准规则适用于具有默认I / O规则的答案,因此允许您使用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我以为你在这里谈论视网膜吗?但是可以肯定的是,在这种情况下,您可以假设所有值都是非负的。虽然,您最好也有一个第二个版本可用于负值,因为我觉得这实际上是可以实现的(字节数增加了很多,并且有一些解决方法);这比实际情况更笼统,不确定不确定是否确实可以解决负值部分)。
凯文·克鲁伊森

6
真正的测试用例如下所示[131000000000, 96500000000, 82500000000, 76000000000, (7.7 billion more entries)]::p
Arnauld

2
如果没有一个值满足条件[1,2,3] n = 1,那该怎么办?您想要什么输出?
ouflak

@ouflak请参阅第三个挑战规则:“ 输出保证是非空的。因此,您不必处理诸如此类的测试用例,L = [-5,-10,-13]n=2得出结果[] ”此外,输入列表也应保证按降序排序(或如果您选择[1,2,3]升序输入,[1,2]那么它就不是有效的输入列表(除非您选择升序输入,否则将是结果)。
凯文·克鲁伊森

Answers:


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

在线尝试!


我想你可以更通过消除假两件刮胡子+bSkip通话; 检查第一个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将L中的最后n个值相加,然后将其发送到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

05AB1E14 12字节

多亏了Grimy,节省了2个字节

.$Δ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>‹}θ。:)
Kevin Cruijssen

2
@KevinCruijssen 这是12
Grimmy

1
仅ASCII的12(使用不同的输入方法)。
Grimmy

1
@肮脏:嗯。我从来不知道|改写的last-input,有趣的。
Emigna

2
@Grimy:看这个 vs 这个。通常,当所有输入都被消耗时,最后一个输入将隐式用于下一个输入的所有实例。使用|此处使结果|成为最后一个输入,而不是实际的最后一个输入。
Emigna

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的规定,将输入作为递减,将输出递增。

  • YL使用1:n移除的rev0:-n
  • Y累积总和小于等于的总和中返回L[X]

@Giuseppe一如既往的感谢。试图删除X使用-(1:n)但当然大小相同,所以就把它
留了下来

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好像我误读了要求。现在应该修复。
Arnauld


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

Pyth16 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

编辑:由于MrXcoder节省了1个字节


@ 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

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节省了一个字节!

Ln

说明

ṫ            | 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¥Ḣ
Jonathan Allan

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

MATL13 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

PowerShell99 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


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]。在第一个列表中包含一个额外元素的原因是,在循环中,发生的第一件事是丢弃。如果没有附加额外的元素,则输出应该是列表的其余部分的情况将失败。


2

Wolfram语言(Mathematica),40个字节

Drop@##//.{a_,b__}/;a+b>Tr@Take@##:>{b}&

在线尝试!

Drop@##                     (*don't include the first n values*)
 //.{a_,b__}/;a+b>Tr@Take@##(*while the remaining values sum to greater than the sum of the first n*)
     :>{b}&                 (*drop the first element*)

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上尝试一下!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.