最大の列からすべての数字を見つける


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]

しかし、それ以外は、文字列のリスト、数字のリスト、またはその他の妥当な形式として入力を受け取ることができます。

また、すべての入力が有効で、少なくとも2つの数字が含まれていると想定することもできます。

いつものように、バイト単位の最短回答が勝ちです!

テスト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

問題文には「正の整数のリストが与えられた」とありますが、例の1つにはがあり0ます。通常、ゼロは英語では正とは見なされません。
トンホスペル16

@tonhospelどっち?302のあるもの?列を分割した後のみゼロなります。
DJMcMayhem

そうです、入力フォーマットを間違えました。私の提出を修正..
トンホスペル

回答:


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]

ソリューションを損なうものではありませんが、UTF-8マルチバイト文字が含まれている場合、これは実際には11バイトではありません。
ジョシュア

3
@Joshua少し奇妙ですが、Jellyは、1バイトで理解できる256文字のそれぞれをエンコードする独自のカスタムコードページを使用します。通常、UTF-8でスコア付けされることはありません。APLで得られるのとほとんど同じです。
Sp3000

ああ、わかった。説明してくれてありがとう。
ジョシュア

2

ルビー、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

1

Mathematica 82バイト

これにより、各数値の桁に右側にxが埋め込まれ、行列が転置され、ダミーのxが削除され、桁の合計で順序付けられ、最大値が取得されます。

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

Transpose数バイトを節約するために上付きT形式を使用する何らかの方法があるはずです。


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

ジャバスクリプト(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)、inner mapはのコピーを返すため、k割り当てが不要になりk、4バイト節約できます。
ニール

否定m、つまり(s[x]=(s[x]|0)-d)<m1バイト節約できると思います。
ニール

@Neil -グッド目、いつものように;)
アルノー

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

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

うーん、これはすべてのテストケースで機能するとは思われませんか?最後の1つを試しましたが、OPの質問とは異なる出力が得られます。
ケビンCruijssen 16

@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)
  
})


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.