查找最大列中的每个数字


14

这对您来说是一个相对简单的挑战:

给定一个正整数列表:

  • 将它们排列成网格,然后对每一列求和。例如,如果输入为[123, 7, 49, 681],则网格将如下所示:

     1  2  3
     7 
     4  9 
     6  8  1 
    

    每列的总和为[18, 19, 4]

     1  2  3
     7 
     4  9 
     6  8  1 
     --------
     18 19 4
    
  • 查找这些总和的最大值,在这种情况下为19,然后

  • 输出与此最大列在同一索引处的每个数字。在这种情况下,

    2
    9
    8
    

    您不必以任何特定顺序输出这些数字。请注意,即使我们有4个输入,也只有3个输出。如果是平局,请选择最早的索引。例如,如果输入为[25, 223, 302],则您的网格为:

    2  5
    2  2  3
    3  0  2
    -------
    7  7  5
    

    你应该输出

    2
    2
    3
    

您可以按照自己喜欢的任何格式打印这些数字。列表格式,换行符分隔,空格分隔等。您不能将输入作为2D数字数组,例如

[[1, 2, 3],
[7],
[4, 9],
[6, 8, 1]

但是除此之外,您可以将输入作为字符串列表,数字列表或任何其他合理的格式。

您还可以假设所有输入都是有效的,并且至少包含两个数字。

像往常一样,最短的答案(以字节为单位)获胜!

测试IO:

#Input                      #Output
[1, 11, 111, 1111]      --> [1, 1, 1, 1]
[1, 12, 123]            --> [2, 2]
[987654321, 111]        --> [9, 1]
[111, 123456789]        --> [9]
[4, 8, 15, 16, 23, 42]  --> [4, 8, 1, 1, 2, 4]
[4, 8, 12, 26, 27, 38]  --> [2, 6, 7, 8]
[24, 53]                --> [2, 5]
[12, 304, 506]          --> [4, 6]
[30, 285, 121]          --> [0, 8, 2]

标题很难理解。问题似乎在于表达式“最大列”。可能类似于“查找总数最大的列”或“列加法:找到最大的和”。
DavidC

问题陈述说“给出了一个正整数列表”,但是其中一个示例有一个0。英文通常不认为零。
Ton Hospel'9

@tonhospel哪一个?一个302?拆分列后,该值只有零。
詹姆斯

是的,我输入的格式错误。修复我的提交..
吨Hospel

Answers:


6

Haskell,63个字节

import Data.Lists
argmax sum.transpose.map(map(read.pure).show)

用法示例:argmax sum.transpose.map(map(read.pure).show) $ [12,304,506]-> [4,6]

怎么运行的:

                     map                       -- for each number
                         map(read.pure).show   -- turn into list of digits
           transpose                           -- transpose the list of list
argmax sum                                     -- find the element with the
                                               -- largest sum

5

果冻,6 个字节

DZṚSÞṪ

在线尝试!。这是问题的相对简单的实现。

D              Convert each number in the input to a list of digits, e.g.
               [353, 2247] -> [[3, 5, 3], [2, 2, 4, 7]]
 Z             Zip the lists together, e.g. [[3, 2], [5, 2], [3, 4], [7]]
  Ṛ            Reverse the list of lists so that first occurrences are now
               at the end, e.g. [[7], [3, 4], [5, 2], [3, 2]]
   SÞ          Sort by sum - this uses Python's sorted function, which is stable
               so equal elements end up in order of appearance, e.g.
               [[3, 2], [7], [3, 4], [5, 2]]
     Ṫ         Tail - get the last element, e.g. [5, 2]

不要减损您的解决方案,但实际上它不是11个字节,因为它包含一些UTF-8多字节字符。
约书亚

3
@Joshua有点奇怪,但是Jelly使用了自己的自定义代码页该页将它可以理解的256个字符中的每个字符编码为一个字节。它通常不会在UTF-8中评分,与APL不会一样。
Sp3000

嗯好 感谢您的解释。
约书亚

2

Ruby,100 97字节

a=$<.map &:chomp
puts a.map(&:size).max.times.map{|i|a.map{|e|e[i]}.compact}.max_by{|e|eval e*?+}

eval e*?+是很棒的!你也可以做$<.map; 无需将其展开为数组。
约旦

@Jordan谢谢您的建议!
cia_rana '16

1

Mathematica 82字节

这将在每个数字的数字右边填充x,对矩阵进行转置,删除虚拟x,按数字的总和排序并取最大数。

SortBy[#~Select~NumberQ&/@Transpose[PadRight[#,30,x]&/@IntegerDigits@#],Tr][[-1]]&

应该有某种使用上标-T形式的方法Transpose来节省一些字节。


1

Perl,49岁个48字节

包括+1的 -p

使用STDIN上的输入运行,在STDOUT上打印以下列为前缀的列号 +

lcolumn.pl
123
7 
49 
681

lcolumn.pl

#!/usr/bin/perl -p
s/./@;[@-].="+$&"/eg}{($_)=sort{eval"$b<=>$a"}@

1

使用Javascript(ES6),108个 103 100字节

这有点冗长,可能可以使用其他方法打更多的高尔夫球。我希望我能摆脱这个.filter(n=>n)

Neil节省了5个
字节edc65节省了3个字节

l=>l.map(n=>[...n].map((d,x)=>(m=(s[x]=(s[x]|0)-d)<m?s[c=x]:m,d)),s=[m=0]).map(n=>n[c]).filter(n=>n)

演示版

let f =
l=>l.map(n=>[...n].map((d,x)=>(m=(s[x]=(s[x]|0)-d)<m?s[c=x]:m,d)),s=[m=0]).map(n=>n[c]).filter(n=>n)

console.log(f(["1", "11", "111", "1111"]).join`,`);          // --> [1, 1, 1, 1]
console.log(f(["1", "12", "123"]).join`,`);                  // --> [2, 2]
console.log(f(["987654321", "111"]).join`,`);                // --> [9, 1]
console.log(f(["111", "123456789"]).join`,`);                // --> [9]
console.log(f(["4", "8", "15", "16", "23", "42"]).join`,`);  // --> [4, 8, 1, 1, 2, 4]
console.log(f(["4", "8", "12", "26", "27", "38"]).join`,`);  // --> [2, 6, 7, 8]
console.log(f(["24", "53"]).join`,`);                        // --> [2, 5]
console.log(f(["12", "304", "506"]).join`,`);                // --> [4, 6]
console.log(f(["30", "285", "121"]).join`,`);                // --> [0, 8, 2]


如果使用(d,x)=>(...,,d)则内部map函数将返回的副本k,从而节省了您必须分配的工作k,从而节省了4个字节。
尼尔

我认为否定m即为(s[x]=(s[x]|0)-d)<m您节省了一个字节。
尼尔

@Neil-像往常一样好看;)
Arnauld

1
我尝试了一种无过滤器的方法。原来是... 103个字节!a=>a.map(n=>[...n+''].map((d,i)=>(t=s[i]=s[i]||[0],t.push(d),(t[0]-=d)<m?r=t:0)),s=[],m=0)&&r.slice(1)
尼尔

您可以将输入作为字符串列表而不是数字列表。这样,您可以在+''
edc65'9

1

Pyth,5 8字节

esDsMM.T

将输入作为字符串列表,将输出作为不分隔数字的列表。

在线尝试!

说明:

      .T  Transpose input to zip together corresponding columns
   sMM    Cast to digit lists
 sD       sort(D) by (s)um
e         take last element, implicitly print

嗯,这似乎不适用于所有测试用例吗?我尝试了最后一个,它给出的输出与OP的问题不同。
凯文·克鲁伊森

@KevinCruijssen是的,我搞砸了。它是按整数值排序,而不是因为字符串使Pyth的重载弄乱了。
史蒂文H.

0

Pyth,11个字节

h.MsZ.TmjdT

一个程序,它在STDIN上输入整数列表并打印一个列表。

在线尝试

怎么运行的

h.MsZ.TmjdT  Program. Input: Q
        j T   Yield the base-10 representation, giving a list of digits
       m d   Map that over Q (implicit input fill)
     .T      Justified transpose, giving each column as a list
 .MsZ        Filter the above by maximum sum
h            First element of above
             Implicitly print

0

JavaScript(ES6),90

(l,x)=>[...l+0].map((t,i)=>l.map(n=>(n=n[i])&&(v-=n,t.push(n)),v=t=[])|v>=x||(x=v,r=t))&&r

f=(l,x)=>[...l+0].map((t,i)=>l.map(n=>(n=n[i])&&(v-=n,t.push(n)),v=t=[])|v>=x||(x=v,r=t))&&r

;[
 [[123, 7, 49, 681]       , [2,9,8]]
,[[25, 223, 302]          , [2, 2, 3]]
,[[1, 11, 111, 1111]      , [1, 1, 1, 1]]
,[[1, 12, 123]            , [2, 2]]
,[[987654321, 111]        , [9, 1]]
,[[111, 123456789]        , [9]]
,[[4, 8, 15, 16, 23, 42]  , [4, 8, 1, 1, 2, 4]]
,[[4, 8, 12, 26, 27, 38]  , [2, 6, 7, 8]]
,[[24, 53]                , [2, 5]]
,[[12, 304, 506]          , [4, 6]]
,[[30, 285, 121]          , [0, 8, 2]]]
.forEach(t=>{
  var i=t[0], o=t[1], r, ok
  i=i.map(x=>x+'') // convert i to a string list
  r=f(i) 
  ok = (r+'')==(o+'') // compare r and o as comma separated strings
  console.log(ok?'OK':'KO', i+' -> '+ r)
  
})


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.