Soma da matriz não sobreposta
Dadas k matrizes de comprimento n , produza a soma máxima possível usando um elemento de cada matriz, de modo que não haja dois elementos do mesmo índice. É garantido que k <= n.
Entrada
Uma lista não vazia de matrizes não vazias de números inteiros.
Saída
Um número inteiro que representa a soma máxima.
Exemplos
Input -> Output
[[1]] -> 1
[[1, 3], [1, 3]] -> 4
[[1, 4, 2], [5, 6, 1]] -> 9
[[-2, -21],[18, 2]] -> 0
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] -> 15
[[1, 2, 3, 4], [5, 4, 3, 2], [6, 2, 7, 1]] -> 16
[[-2, -1], [-1, -2]] -> -2
code-golf
array-manipulation
Quintec
fonte
fonte
Respostas:
Geléia ,
106 bytesExperimente online!
(4 bytes salvos por @Dennis, que apontou que Jelly tinha uma "soma da diagonal principal" embutida. Eu não esperava que ela tivesse um desses; a solução anterior implementou a operação sem usar o embutido. A operação em questão,
Æṭ
, é definido como "traço", mas o traço é definido apenas para matrizes quadradas; o Jelly também implementa uma generalização para matrizes retangulares.)A melhoria em relação às outras respostas é principalmente de um algoritmo mais simples (portanto, terser para expressar); esse programa foi originalmente escrito no Brachylog v2 (
{\p\iᶠ∋₎ᵐ+}ᶠot
), mas o Jelly possui alguns componentes internos para partes do programa que precisam ser explicadas no Brachylog, então isso ficou mais curto.Explicação
Deve ficar claro que, para qualquer solução para o problema, podemos permutar as colunas da matriz original para colocar essa solução na diagonal principal. Portanto, essa solução simplesmente inverte isso, encontrando todas as principais diagonais principais possíveis de permutações.
Observe que a operação "permutar as colunas" é feita como "transpor, permutar as linhas" sem se preocupar em transpor de volta; o restante do algoritmo é simétrico em relação à diagonal principal; portanto, não precisamos desfazer a transposição e, portanto, podemos salvar um byte.
fonte
ZŒ!ÆṭṀ
salva quatro bytes. Experimente online!ZŒ!ŒD§ṀḢ
antes de lembrar queÆṭ
era uma coisa.J , 28 bytes
Experimente online!
Aqui a chamada recursiva é feita pela
$:
qual representa a maior função anônima que a contém. Temos sorte em J de ter o primitivox u\. y
, que se aplicau
a "outfixes" sucessivosy
obtidos, suprimindo infixes sucessivos de comprimentox
dos itens emy
; aqui, queremos suprimir colunas sucessivas para obter "menores", para que transponha|:
as linhas inferiores (ou cauda}.
) dey
e depois recuamos na transposição de seus outfixes.fonte
Python 3 ,
94 90 89 8480 bytes-4 bytes graças ao xnor (usando conjuntos em vez de listas)!
Experimente online!
fonte
y
um conjunto de encurtar a verificação de associação:f=lambda x,y={-1}:x>[]and max(e+f(x[1:],y|{i})for(i,e)in enumerate(x[0])if{i}-y)
.-1
truque é realmente inteligente :) Muito obrigado!Husk ,
12 119 bytesExperimente online!
Graças ao BMO por sugerir uma porta da resposta do ais523 e um salvamento de 2 bytes, que eu consegui melhorar ainda mais e, por sua vez, o BMO eliminou mais 2 bytes.
Solução anterior (14 bytes)
Experimente online!
Não pude fazer uma suíte de testes porque esta resposta usa o primeiro argumento de linha de comando explicitamente comando. Mas Husk não usa STDIN, por isso incluí todos os casos de teste, para que você possa copiar e colar no campo de argumento para verificar. Observe também que matrizes no Husk podem não conter espaços entre os elementos enquanto são inseridas.
Como funciona?
Repartição do código
Exemplo
É preciso escolher exatamente um índice de cada um, de modo que não haja dois índices correspondentes. Portanto, geramos os intervalos de comprimento das linhas e mantemos apenas aqueles sem duplicatas, produzindo as seguintes combinações (cada combinação é uma coluna em vez de uma linha para economizar espaço):
Em seguida, o programa indexa nas listas de entrada com cada elemento da combinação, retornando:
fonte
JavaScript (ES6),
7471 bytesObrigado a @tsh por identificar 2 bytes inúteis que foram usados para corrigir um erro.
Salva 3 bytes graças a @tsh
Experimente online!
fonte
0
partir da matriz de entrada,-1+(-1)
é-2
e é a resposta correta.f=([a,...r],k,i=1)=>a?Math.max(...a.map(c=>k&(i+=i)?-1/0:c+f(r,k|i))):0
É estranho, masMath.max
salva bytes ...Geléia ,
1312 bytesExperimente online!
Versão alternativa, 11 bytes
Isso usa o novo recurso
œ!
incorporado, que gera todas as permutações de um determinado comprimento.Experimente online!
Como funciona
fonte
XLṗL
vez deJ€Œp
.Haskell , 65 bytes
Experimente online!
Explicação e Não Goleado
A função
take i<>drop(i+1)
recebe uma lista e remove o elemento na posiçãoi
.A função
f
obtém cada elemento possívele
na posiçãoi
, remove os elementos na posiçãoi
dos elementos restantes e adicionae
ao ótimo recursivamente calculado:E o caso base para a lista vazia é apenas
0
:fonte
Braquilog , 18 bytes
Experimente online!
Explicação
fonte
Perl 6 ,
5049 bytesExperimente online!
Decentemente curto, apesar da longa
permutations
ligação. Este é um bloco de código anônimo que pega uma lista de listas e retorna um número.Explicação:
fonte
K (oK) ,
40, 32, 28,19 bytes-13 bytes graças a ngn!
Experimente online!
Solução inicial:
Experimente online!
Nota: Não funciona para o primeiro caso de teste [[1]]
Explicação:
{ }
- função com argumentox
fonte
prm
pode ser aplicado diretamente a uma lista para gerar suas permutações=
, mas o resultado foi mais longo. Existeflatten
em OK?flatten
em que sentido?(1 2 3; 4 5 6; 7 8 9) -> (1 2 3 4 5 6 7 8 9)
,/
ou se você quiser que ele entre em estruturas mais profundas:,//
Haskell , 65 bytes
Experimente online!
71 bytes
Experimente online!
As
[x|x<-a,y<-a,x==y]==a
verificações das quais os elementosa
são distintos. Isso usa um número surpreendente de caracteres, mas não vi uma maneira mais curta.fonte
Pitão,
1512 bytesExperimente online aqui .
Editar: salvou 3 bytes, cortesia de issacg
fonte
.PUlhQl
pode ser substituído por.plh
.V
ignora implicitamente qualquer entrada extra.05AB1E ,
1813 bytesTenho a sensação de que é muito longo, mas não tenho certeza de como fazer a indexação vetorial byte com eficiência em 05AB1E ..E eu estava certo de que era muito longo .. -5 bytes graças a @Emigna .Experimente online ou verifique todos os casos de teste .
Explicação:
Exemplo de execução:
[[1,4,2],[5,6,1]]
нgL
):[1,2,3]
œ
):[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
ε‚
):[[[[1,4,2],[5,6,1]],[1,2,3]],[[[1,4,2],[5,6,1]],[1,3,2]],[[[1,4,2],[5,6,1]],[2,1,3]],[[[1,4,2],[5,6,1]],[2,3,1]],[[[1,4,2],[5,6,1]],[3,1,2]],[[[1,4,2],[5,6,1]],[3,2,1]]]
ø
):[[[[1,4,2],1],[[5,6,1],2]],[[[1,4,2],1],[[5,6,1],3]],[[[1,4,2],2],[[5,6,1],1]],[[[1,4,2],2],[[5,6,1],3]],[[[1,4,2],3],[[5,6,1],1]],[[[1,4,2],3],[[5,6,1],2]]]
ε`è]
):[[4,1],[4,5],[2,6],[2,5],[1,6],[1,1]]
(OBSERVAÇÃO: 05AB1E é indexada em 0 (com envolvimento automático), portanto, a indexação3
em[5,6,1]
resultados é5
.)O
):[5,9,8,7,7,2]
à
):9
fonte
нgLœε‚øε
onças .Haskell, 84 bytes
Experimente online!
fonte
Ruby ,
747269 bytesExperimente online!
fonte
05AB1E , 7 bytes
Porta da resposta Jelly CW de @ ais523 , por isso não deixe de votar também!
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte