Introdução:
Inspirado por essas duas perguntas do SO (sem dúvida da mesma classe): imprima os elementos na sub -matriz de soma máxima sem elementos adjacentes java e Soma máxima de elementos não adjacentes de uma matriz, a serem impressos .
Desafio:
Dada uma lista de números inteiros, imprima uma subsequência que consiste em elementos não adjacentes que possuem a soma mais alta. Aqui estão alguns exemplos:
[1,2,3,-1,-3,2,5]
resultaria em[1,3,5]
(com uma soma de9
) nos índices baseados em 0[0,2,6]
.[4,5,4,3]
resultaria em[4,4]
(com uma soma de8
) nos índices baseados em 0[0,2]
ou[5,3]
(também com uma soma de8
) nos índices baseados em 0[1,3]
.[5,5,10,100,10,5]
resultaria em[5,100,5]
(com uma soma de110
) nos índices baseados em 0[0,3,5]
ou[1,3,5]
.
O que é mais importante sobre esses exemplos acima, os índices que contêm os elementos estão pelo menos 2 separados um do outro. Se examinarmos o exemplo [5,5,10,100,10,5]
mais detalhadamente: temos a seguinte subsequência potencial contendo itens não adjacentes; com seus índices abaixo dele; com suas somas abaixo disso:
[[5],[10],[100],[10],[5],[5],[100,5],[10,5],[10,10],[5,5],[5,10],[5,100],[5,5],[5,10],[5,100],[5,10],[5,100,5],[5,100,5],[5,10,5],[5,10,10]] // non-adjacent subsequences
[[5],[ 4],[ 3],[ 2],[1],[0],[ 3,5],[ 2,5],[ 2, 4],[1,5],[1, 4],[1, 3],[0,5],[0, 4],[0, 3],[0, 2],[1, 3,5],[0, 3,5],[0, 2,5],[0, 2, 4]] // at these 0-based indices
[ 5, 10, 100, 10, 5, 5, 105, 15, 20, 10, 15, 105, 10, 15, 105, 15, 110, 110, 20, 25] // with these sums
^ ^ // and these two maximums
Como as somas máximas são 110
, produzimos [5,100,5]
como resultado.
Regras do desafio:
- Você tem permissão para gerar pares de valores-chave do índice + valor. Portanto, em vez de
[5,100,5]
você pode produzir[[0,5],[3,100],[5,5]]
ou[[1,5],[3,100],[5,5]]
como resultado (ou[[1,5],[4,100],[6,5]]
/[[2,5],[4,100],[6,5]]
quando a indexação baseada em 1 é usada em vez de baseada em 0).- Se você usar pares de valores-chave, eles também poderão estar em ordem reversa ou aleatória, pois fica claro quais valores são devidos ao índice pareado.
- Não é permitido emitir apenas os índices sem valores. Deverá emitir os valores ou os valores / índices como pares de valores-chave (ou duas listas separadas para 'chaves' e 'valores' do mesmo tamanho se pares de valores-chave não forem possíveis no idioma de sua escolha).
- Você tem permissão para gerar todas as subsequências possíveis com a soma máxima em vez de apenas uma.
- Como você pode ver nos exemplos, a lista de entrada também pode conter valores negativos e duplicados. Você pode assumir que os números inteiros de entrada estão dentro do intervalo .
- A lista de saída não pode estar vazia e sempre deve conter pelo menos um elemento (se uma lista contiver apenas valores negativos, uma lista contendo o menor valor negativo mais baixo será exibida como resultado - consulte os dois últimos casos de teste).
- Se houver uma saída possível, mas para vários índices diferentes, é permitido gerar os dois, mesmo que pareçam duplicados. (ou seja, o exemplo acima, pode gerar
[[5,100,5],[5,100,5]]
ambas as combinações possíveis de índices).
Casos de teste:
Input: Possible outputs: At 0-based indices: With sum:
[1,2,3,-1,-3,2,5] [1,3,5] [0,2,6] 9
[4,5,4,3] [4,4]/[5,3] [0,2]/[1,3] 8
[5,5,10,100,10,5] [5,100,5] [0,3,5]/[1,3,5] 110
[10] [10] [0] 10
[1,1,1] [1,1] [0,2] 2
[-3,7,4,-2,4] [7,4] [1,4] 11
[1,7,4,-2] [7] [1] 7
[1,2,-3,-4,5,6,-7] [2,6] [1,5] 8
[800,-31,0,0,421,726] [800,726]/[800,0,726] [0,5]/[0,3,5]/[0,2,5] 1526
[-1,7,8,-5,40,40] [8,40] [2,4]/[2,5] 48
[-5,-18,-3,-1,-10] [-1] [3] -1
[0,-3,-41,0,-99,-2,0] [0]/[0,0]/[0,0,0] [0]/[3]/[6]/[0,3]/
[0,6],[3,6]/[0,3,6] 0
fonte
[5,100,5]
duas vezes para o seu terceiro exemplo.powerset
é um conjunto de subconjuntos, não é? mas parece que você está retornando um conjunto de subsequências? [4,5,4,3] resultaria em [4,4] onde [4,4] claramente não é um conjunto.Respostas:
Casca , 11 bytes
Experimente online!
Explicação
fonte
Haskell , 60 bytes
Experimente online!
A função auxiliar
%
ramifica-se recursivamente na escolha de incluir o primeiro elemento e soltar o segundo ou de ignorar o primeiro elemento. Leva o máximo de todos os resultados, que são tuplas cujo primeiro elemento é a soma e cujo segundo elemento é a lista correspondente que é extraída para a saída.Para lidar com a regra de que a lista vazia não é permitida, mesmo que tenha o menor truque, fazemos um truque simples de escrever em
sum r<$r
vez desum r
. Isso cria uma lista cujos elementos são todossum r
e cujo comprimento é o der
. Dessa forma, quando escolhemos o máximo, priorizamos qualquer lista em vez de uma vaziar
, mas as comparações dependem do primeiro elemento que ésum r
.fonte
R ,
136125 bytesExperimente online!
-6 bytes graças ao digEmAll , que aliás também me superou .
Retorna a subsequência mais curta como a
list
, quebrando os laços lexicograficamente primeiro pelos índices.A força bruta gera todas as subsequências do índice e, em seguida,
Filter
s para as que não são adjacentes, ou seja, ondeall(diff(x)>1)
. Então subconjuntos[
paral
utilizar estes índices, seleccionando[[
o primeiro onde a soma é o máximo (which.max
).Tenho certeza de que esta é a primeira resposta R que eu já escrevi que usatriste,Filter
!Filter
é sem graça, não é de admirar que eu nunca tenha usado ...fonte
05AB1E , 14 bytes
Guardado 1 byte graças a Kevin Cruijssen
Experimente online! ou como um conjunto de testes
Explicação
fonte
¤ª
paraĆ
.Braquilog (v2), 14 bytes
Experimente online!
Envio de função; entrada da esquerda, saída da direita, como de costume. Muito devagar; uma lista de cinco elementos é provavelmente o máximo para teste no TIO.
Os resultados obtidos dos prefixos não estão incorretos, mas também não são interessantes; todos os resultados possíveis são gerados usando um sufixo (que é possivelmente a própria lista, mas não pode estar vazia), mas "sufixo" é mais detalhado no Brachylog do que "prefixo ou sufixo", por isso fui com a versão que é mais tersa (e menos eficiente, mas ainda correto). A idéia básica é que, para cada elemento que desejamos na lista de saída, a partição em sublistas contíguas precisa colocar esse elemento e o elemento antes na mesma sublist (porque o elemento é o segundoda sub-lista), portanto, dois elementos consecutivos não podem aparecer no resultado. Por outro lado, é bastante claro que qualquer lista sem dois elementos consecutivos pode aparecer no resultado. Assim, quando tivermos todas as listas de candidatos possíveis, podemos apenas pegar as somas de todas elas e ver qual é a maior.
fonte
Geléia ,
1614 bytesExperimente online!
Obrigado a @EriktheOutgolfer por salvar 2 bytes!
fonte
JavaScript (ES6),
138 132 130 129126 bytesEmite pares de valores-chave.
Experimente online!
Passo 1
Passo 2
fonte
Haskell,
8180 bytesExperimente online!
f
cria todas as subsequências válidas pulando o próximo elemento (f(b:c)
) ou usando-o e pulando o próximo (map(a:)(f c)
) e trabalhando recursivamente no resto. Para o resultado, construa todas as subsequências (f
), descarte a subsequência vazia (que ocorre primeiro na listatail
:), faça pares(<sum>,<subsequence>)
(map((,)=<<sum)
), encontre o máximo (os pares são comparados em ordem lexicográfica) ->maximum
) e solte a soma (snd
).Edit: -1 byte graças a @Lynn.
fonte
map(:[])a
é um byte menor que(pure<$>a)
^^J , 47 bytes
Experimente online!
-7 bytes graças ao FrownyFrog
original
J , 54 bytes
Experimente online!
fonte
T-SQL,
122119118 bytesEntrada é uma variável de tabela.
Essa consulta seleciona todos os elementos da variável da tabela, combinando-os com todos os elementos não adjacentes com valores de posição mais altos e mostra o texto gerado para a soma mais alta desses valores.
Experimente on-line sem limites
fonte
Língua Wolfram (Mathematica) , 144 bytes
Experimente online!
fonte
Pitão, 19 bytes
Experimente online aqui ou verifique todos os casos de teste de uma vez aqui .
fonte
Gaia , 24 bytes
Experimente online!
Ugh,
E‡
faz algumas coisas estranhas ... de acordo com a documentação, ele deve fazer algo como "determinadoi
conjunto de listas deX
comprimento ej
conjunto de índices de comprimentoY
, returnX[i][Y[j]]
", mas retorna[X[i][Y[j]] X[i][Y[-j]]
onde a indexação negativa representa o complemento, então temos que fazerev2%
para extrair apenas os que queremos.fonte
]]
vez de uma?[[1] [2]]
são impressas, o[[1]] [2]]]]
que dificulta a leitura / depuração da lista.re.sub(" ?$","]",result)
no intérprete que deveria ser,re.sub(" +$","]",result)
mas meu python é super ruim.R ,
108107 bytesExperimente online!
-1 graças a @Giuseppe
fonte
Wolfram Language (Mathematica) ,
7063 bytesExperimente online!
Pesquisa de alto nível
,1
é necessário para não retornar inadvertidamente conjuntos inválidos (caso contrário, por exemplo, uma entrada de{1,1,1}
resultaria em uma saída de{{1,1},{1,1},{1,1}}
)fonte
Haskell ,
300168 bytesExperimente online!
-132 bytes, graças a todos os comentários de @nimi :)
Original
Ungolfed (original)
fonte
f
:f x=zip[0..length x]x
, entãof
torna-sef=zip[0..]
.g
é justog=map unzip
. A função com a qual filtrarj
éh.fst
(<- pares invertidos!).j=filter(h.fst)
. Ofoldl1+
fromk
ésum
e com um par sem pontosk=map((,)=<<sum.snd)
.sortBy(...)
pode ser substituído porsortOn fst
:l=snd.last.sortOn fst
. Finalmente, como você está usando todas as funções apenas uma vez, é possível incorporá-las em uma única expressão sem pontos:z=snd.last.sortOn fst.map((,)=<<sum.snd).filter(h.fst).map unzip.subsequences.zip[0..]
Data.Function
.h
: procuramos elementos não adjacentes, ou seja, a diferença de índices adjacentes deve ser>1
.zipWith(-)=<<tail
cria uma lista dessas diferenças, mas falha na lista vazia, por isso precisamos de mais umatail
para nossubsequences
livrarmos dela. Inline novamente. Experimente online!Carvão , 46 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
A variável
u
é predefinida com uma lista vazia. Isso é colocado em uma lista à qual está atribuídoh
. Essas variáveis atuam como acumuladores.u
contém as sublistas que incluem o elemento mais recente da entrada,q
enquantoh
contém as sublistas que não (e, portanto, são adequadas para anexar o próximo elemento da entrada).Faça um loop sobre os elementos da entrada.
Salve a lista de sublistas que contêm o elemento anterior.
Pegue todas as sublistas que não contêm o elemento anterior, acrescente o elemento atual e salve o resultado como a lista de sublistas que contêm o elemento atual. (Eu não uso
Push
aqui, pois preciso clonar a lista.)Concatene as duas sublistas anteriores na nova lista de sublistas que não contêm o elemento atual.
Concatene as sublistas uma última vez e remova a lista vazia original (que o carvão vegetal não pode somar de qualquer maneira).
Calcule as somas de todas as sublistas.
Encontre um índice da maior soma e produza a sub-lista correspondente.
fonte
Japonês
-h
, 22 bytesTente
fonte
Japt
-h
, 21 bytesJá teve um daqueles desafios em que você esquece completamente como jogar golfe ?!
Tente
fonte
Python 2 ,
637065 bytesExperimente online!
5 bytes thx para ArBo
fonte
[1, 7, 4, -2] [1, 4] 5 7
está recebendo a resposta errada.