Encontre todos os dígitos da coluna maior

14

Aqui está um desafio relativamente simples para você:

Dada uma lista de números inteiros positivos:

  • Alinhe-os em uma grade e some cada coluna. Por exemplo, se a entrada fosse [123, 7, 49, 681], a grade ficaria assim:

     1  2  3
     7 
     4  9 
     6  8  1 
    

    E a soma de cada coluna seria [18, 19, 4]:

     1  2  3
     7 
     4  9 
     6  8  1 
     --------
     18 19 4
    
  • Encontre o máximo dessas somas, que nesse caso seriam 19 e, em seguida,

  • Envie todos os dígitos que estão no mesmo índice que essa coluna máxima. Nesse caso, isso seria

    2
    9
    8
    

    Você não precisa emitir esses números em nenhuma ordem específica. Observe que existem apenas três saídas, mesmo tendo quatro entradas. No caso de empate, escolha o índice mais antigo. Por exemplo, se a entrada foi [25, 223, 302], sua grade é:

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

    Você deve produzir

    2
    2
    3
    

Você pode imprimir esses números em qualquer formato que desejar. Formato de lista, nova linha separada, espaço separado, etc. Você não pode receber a entrada como uma matriz de dígitos 2D, por exemplo

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

Mas, além disso, você pode considerar a entrada como uma lista de cadeias, uma lista de dígitos ou qualquer outro formato razoável.

Você também pode assumir que todas as entradas serão válidas e conterão pelo menos dois números.

Como sempre, a resposta mais curta em bytes vence!

Teste de E / S:

#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]
DJMcMayhem
fonte
O título é difícil de entender. O problema parece estar na expressão "maior coluna". Talvez algo como "Encontre a coluna com o maior total" ou "Adição de coluna: encontre a soma máxima".
DavidC
A declaração do problema diz "dada uma lista de números inteiros positivos", mas um dos exemplos tem a 0. Zero geralmente não é considerado positivo em inglês.
Ton Hospel
@tonhospel Qual deles? Aquele com 302? Isso só tem um zero depois que você divide as colunas.
DJMcMayhem
Certo, eu interpretei mal o formato de entrada. Corrigindo minha submissão ..
Ton Hospel 5/16

Respostas:

6

Haskell, 63 bytes

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

Exemplo de uso: argmax sum.transpose.map(map(read.pure).show) $ [12,304,506]-> [4,6].

Como funciona:

                     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
nimi
fonte
5

Gelatina , 6 bytes

DZṚSÞṪ

Experimente online! . Esta é uma implementação relativamente direta da questão.

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]
Sp3000
fonte
Para não prejudicar sua solução, mas não são 11 bytes, pois contém alguns caracteres de vários bytes UTF-8.
Joshua Joshua
3
@ Joshua É um pouco estranho, mas o Jelly usa sua própria página de códigos personalizada que codifica cada um dos 256 caracteres que entende em um único byte. Geralmente não é classificado em UTF-8, da mesma forma que o APL não seria.
Sp3000 4/16
Ahh, certo. Obrigada pelo esclarecimento.
Joshua
2

Ruby, 100 97 bytes

a=$<.map &:chomp
puts a.map(&:size).max.times.map{|i|a.map{|e|e[i]}.compact}.max_by{|e|eval e*?+}
cia_rana
fonte
eval e*?+é ótimo! Também você pode fazer $<.map; não há necessidade de dividi-lo em uma matriz.
Jordânia
@ Jordan Obrigado por seus conselhos!
cia_rana 03/09
1

Mathematica 82 bytes

Isso preenche os dígitos de cada número com x para a direita, transpõe a matriz, remove os x fictícios, ordena pela soma dos dígitos e leva o maior.

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

Deve haver alguma maneira de usar o formato sobrescrito-T Transposepara salvar alguns bytes.

DavidC
fonte
1

Perl, 49 48 bytes

Inclui +1 para -p

Execute com a entrada STDIN, imprima em STDOUT os números das colunas prefixados por +

lcolumn.pl
123
7 
49 
681

lcolumn.pl:

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

Javascript (ES6), 108 103 100 bytes

É um pouco detalhado e provavelmente poderia ser jogado mais com uma abordagem diferente. Eu gostaria de poder me livrar disso .filter(n=>n).

Economizou 5 bytes graças a Neil
Economizou 3 bytes graças a edc65

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)

Demo

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]

Arnauld
fonte
Se você usar (d,x)=>(... ,d), o interior mapretornará uma cópia de k, economizando assim a necessidade de atribuir k, o que economiza 4 bytes.
Neil
Eu acho que negar m, ou seja (s[x]=(s[x]|0)-d)<m, economiza um byte.
Neil
@Neil - Bom olho, como de costume;)
Arnauld
1
Eu tentei uma abordagem sem filtro. Acabou sendo ... 103 bytes! 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)
Neil
Você pode obter a entrada como uma lista de cadeias e não números. Dessa forma, você pode cortar o+''
edc65 5/16
1

Pitão, 5 8 bytes

esDsMM.T

Recebe entrada como uma lista de seqüências de caracteres e gera como uma lista de dígitos separada por nada.

Experimente online!

Explicação:

      .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
Steven H.
fonte
Hmm, isso parece não funcionar para todos os casos de teste? Eu tentei o último, e ele dá uma saída diferente da pergunta do OP.
Kevin Cruijssen 5/09/16
@KevinCruijssen Sim, eu errei. Ele estava ordenando por valor inteiro, por causa das seqüências que mexiam com a sobrecarga de Pyth.
Steven H.
0

Pitão, 11 bytes

h.MsZ.TmjdT

Um programa que recebe a entrada de uma lista de números inteiros no STDIN e imprime uma lista.

Experimente online

Como funciona

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
TheBikingViking
fonte
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)
  
})

edc65
fonte
0

Pitão - 9 bytes

esD_.TjRT

Conjunto de Teste .

Maltysen
fonte