Execução máxima entre elementos idênticos

24

Esta é uma revisão geral desta pergunta excluída por ar kang . Se o OP dessa pergunta desejar recuperar essa pergunta ou tiver algum problema ao postar isso, ficarei feliz em acomodar

Dada uma lista de números inteiros como entrada, encontre a soma máxima possível de uma sub-lista contínua que comece e termine com o mesmo valor. As sublistas devem ter pelo menos 2. Por exemplo, para a lista

[1, 2, -2, 4, 1, 4]

Existem 2 sublistas contínuas diferentes, iniciando e terminando com o mesmo valor

[1,2,-2,4,1] -> 6
[4,1,4]      -> 9

A soma maior é 9, então você gera 9.

Você pode assumir que cada entrada contém pelo menos 1 duplicado.

Isso é então as respostas serão pontuadas em bytes, com menos bytes sendo melhores.

Casos de teste

[1,2,-2,4,1,4]  -> 9
[1,2,1,2]       -> 5
[-1,-2,-1,-2]   -> -4
[1,1,1,8,-1,8]  -> 15
[1,1,1,-1,6,-1] -> 4
[2,8,2,-3,2]    -> 12
[1,1,80]        -> 2
[2,8,2,3,2]     -> 17
Assistente de Trigo
fonte
Deve [2,8,2,3,2]ser 12 ou 17? Eu presumo 17.
NikoNyrh
@NikoNyrh Deveria ter 17. #
Wheat Wizard
Viva a CC BY / SA. Você tem o direito de postar uma pergunta derivada de outra, mesmo que posteriormente seja denunciada por membros da comunidade. Parece que você deve adicionar um link para a página do OP conforme recebo desta postagem do blog. "3. Mostre os nomes dos autores para todas as perguntas e respostas [...] 4. Hiperlink o nome de cada autor diretamente de volta à sua página de perfil de usuário no site de origem" - Não tenho privilégios para ver as perguntas excluídas. sabe quem fez o original.
Mindwin
@Mindwin Obrigado, adicionei um link para a página do OP. Eu o deixei de fora originalmente porque achei que, se o OP excluísse a postagem, eles poderiam evitar o vínculo com a pergunta.
Assistente de trigo
O motivo da exclusão é irrelevante e não transparente para o usuário comum (eu). Mas a atribuição é do tipo opt-out. Ao enviar e concordar com a licença, eles nos concederam esses direitos sob essas condições. Qualquer coisa fora disso é uma exceção. GJ.
Mindwin

Respostas:

9

Haskell , 62 bytes

f pega uma lista de números inteiros e retorna um número inteiro.

f l=maximum[x+sum m-sum n|x:m<-t l,y:n<-t m,x==y]
t=scanr(:)[]

Experimente online!

Como funciona

  • té a função padrão "obter todos os sufixos de uma lista sem importar Data.List.tails".
  • Em f l, a compreensão da lista interage com todos os sufixos não vazios da lista de argumentos l, com o primeiro elemento xe o restante m.
  • Para cada um, faz o mesmo para todos os sufixos não vazios de m, selecionando o primeiro elemento ye o restante n.
  • Se xe yfor igual, a compreensão da lista inclui a soma dos elementos entre eles. Esta sub-lista é igual x:mà do seu sufixo nretirado, portanto, a soma pode ser calculada como x+sum m-sum n.
Ørjan Johansen
fonte
8

JavaScript (ES6), 68 62 bytes

a=>a.map(m=(x,i)=>a.map((y,j)=>m=j<=i||(x+=y)<m|y-a[i]?m:x))|m

Casos de teste

Comentado

a =>                    // a = input array
  a.map(m =             // initialize m to a function (gives NaN in arithmetic operations)
    (x, i) =>           // for each entry x at position i in a:
    a.map((y, j) =>     //   for each entry y at position j in a:
      m =               //     update m:
        j <= i ||       //       if j is not after i
        (x += y) < m |  //       or the sum x, once updated, is less than m
        y - a[i] ?      //       or the current entry is not equal to the reference entry:
          m             //         let m unchanged
        :               //       else:
          x             //         update m to the current sum
    )                   //   end of inner map()
  ) | m                 // end of outer map(); return m
Arnauld
fonte
Fiquei um pouco confuso com a ordem de y - a[i]e (x += y) < m- IMHO o código seria um pouco mais claro com eles trocados, desde então, parece um simples golfe de (x += y) < m || y != a[i].
Neil
@ Neil Entendo o seu ponto, mas (x+=y)<m|y-a[i]poderia ser mal interpretado (x+=y)<(m|y-a[i])também. Não tenho certeza se isso realmente afastaria a ambiguidade. (Editado qualquer maneira porque eu tendem a preferir esta versão.)
Arnauld
Bem, isso pressupõe que eles não interpretar mal y-a[i]|(x+=y)<mcomo (y-a[i]|(x+=y))<m...
Neil
5

Gelatina , 12 bytes

ĠŒc€Ẏr/€ịḅ1Ṁ

Experimente online!

Como funciona

ĠŒc€Ẏr/€ịḅ1Ṁ  Main link. Argument: A (array)

Ġ             Group the indices of A by their corresponding values.
 Œc€          Take all 2-combinations of grouped indices.
    Ẏ         Dumps all pairs into a single array.
     r/€      Reduce each pair by range, mapping [i, j] to [i, ..., j].
        ị     Index into A.
         ḅ1   Convert each resulting vector from base 1 to integer, effectively
              summing its coordinates.
           Ṁ  Take the maximum.
Dennis
fonte
5

Casca , 10 bytes

▲mΣfΓ~€;ṫQ

Experimente online!

Explicação

▲mΣfΓ~€;ṫQ  Input is a list, say x=[1,2,-2,4,1,4]
         Q  Slices: [[1],[2],[1,2],..,[1,2,-2,4,1,4]]
   f        Keep those that satisfy this:
    Γ        Deconstruct into head and tail, for example h=2 and t=[-2,4,1]
        ;    Wrap h: [2]
      ~€     Is it an element of
         ṫ   Tails of t: [[-2,4,1],[4,1],[1]]
            Result: [[1,2,-2,4,1],[4,1,4]]
 mΣ         Map sum: [6,9]
▲           Maximum: 9
Zgarb
fonte
3

R , 108 103 90 88 83 bytes

function(l)max(combn(seq(l),2,function(x)"if"(rev(p<-l[x[1]:x[2]])-p,-Inf,sum(p))))

Experimente online!

combnataca novamente! Gera pelo menos todas as sublistas de comprimento 2, define a soma da sub-lista como -Infse o primeiro e o último não forem iguais e obtém o máximo de todas as somas.

O "if"recurso gera vários avisos, mas eles são ignorados com segurança - esse é provavelmente o melhor truque de golfe aqui, rev(p)-pé zero no primeiro elemento se p[1]==tail(p,1)e "if"usa o primeiro elemento de sua condição com um aviso.

Giuseppe
fonte
2

Gelatina , 13 , 12 bytes

=ṚṖḢ
ẆÇÐfS€Ṁ

Experimente online!

Um byte salvo pelo Sr. Xcoder, que atualmente está competindo comigo. : D

Explicação:

        # Helper link:
=Ṛ      # Compare each element of the list to the element on the opposite side (comparing the first and last)
  Ṗ     # Pop the last element of the resulting list (so that single elements return falsy)
   Ḣ    # Return the first element of this list (1 if the first and last are equal, 0 otherwise)

        # Main link:
Ẇ       # Return every sublist
 Ç      # Where the helper link
  Ðf    # Returns true (1)
    S€  # Sum each resulting list
      Ṁ # Return the max
DJMcMayhem
fonte
1

Pitão, 15 bytes

eSsMf&qhTeTtT.:

Experimente online

Explicação

eSsMf&qhTeTtT.:
             .:Q  Take all sublists of the (implicit) input.
    f qhTeT       Take the ones that start and end with the same number...
     &     tT     ... and have length at least 2.
  sM              Take the sum of each.
eS                Get the largest.

fonte
1

05AB1E , 9 bytes

ŒʒćsθQ}OZ

Experimente online!

Explicação

Œ          # push sublists of input
 ʒ    }    # filter, keep values where
  ć        # the head of the list, extracted
     Q     # is equal to
   sθ      # the last element of the rest of the list
       O   # sum the resulting sublists
        Z  # get the max
Emigna
fonte
1

Limpo , 94 90 86 bytes

import StdEnv,StdLib
@l=last(sort[sum(l%(i,j))\\e<-l&i<-[0..],j<-elemIndices e l|j>i])

Experimente online!

Furioso
fonte
Receio que isso falhe no [1, 1, 80]caso de teste.
Ørjan Johansen
@ ØrjanJohansen corrigiu
Οurous 4/18
1

Python 2 , 86 bytes

Superado por Dennis

lambda x:max(sum(x[i:j+1])for i,v in enumerate(x)for j in range(i+1,len(x))if v==x[j])

Experimente online!

Gera todas as sublistas maiores que o comprimento 2, onde o primeiro elemento é igual ao último, mapeia cada uma delas à sua soma e seleciona o maior valor.

FlipTack
fonte
88 bytes usando uma função lambda
Halvard Hummel
@HalvardHummel 86 bytes usando enumerate.
Jonathan Frech
Superado por Dennis - Honestamente, o que você esperava?
Sr. Xcoder 5/01
@ Mr.Xcoder eu teria conseguido a sua solução, mas eu fui dormir :(
FlipTack
1

Julia 0.6 , 70 bytes

a->maximum(sum(a[i:k]) for b=[findin(a,x) for x=a] for i=b,k=b if k>i)

Experimente online!

gggg
fonte
1

Gelatina , 11 bytes

Usa alguns recursos que pós-datam o desafio.

Ẇµ.ịEȧḊµƇ§Ṁ

Experimente online!

Como funciona?

Ẇµ.ịEȧḊµƇ§Ṁ || Programa completo. Pega a entrada do CLA, sai para STDOUT.
Ẇ || Sublistas.
 µ µƇ || Manter filtro
    ȧḊ || ... Que têm comprimento de pelo menos 2 e ...
 .ị || ... Os elementos no piso (0,5) e no teto (0,5) (modular, com 1 indexação) ...
    E || ... São iguais.
         § || Soma cada.
          Ṁ || Máximo.

-1 com a ajuda de caird .

Mr. Xcoder
fonte
0

Lote, 179 bytes

@set s=%*
@set/a"m=-1<<30
:l
@set/at=n=%s: =,%
@set s=%s:* =%
@for %%e in (%s%)do @set/at+=%%e&if %%e==%n% set/a"m+=(m-t)*(m-t>>31)
@if not "%s%"=="%s: =%" goto l
@echo %m%

Recebe a entrada como parâmetros da linha de comando.

Neil
fonte
0

C, 104 bytes

i,j,s,l;f(a,n)int*a;{for(i=0,l=1<<31;i<n;++i)for(s=a[j=i];++j<n;l=a[j]-a[i]?l:s>l?s:l)s+=a[j];return l;}

Experimente online!

C (gcc) , 99 bytes

i,j,s,l;f(a,n)int*a;{for(i=0,l=1<<31;i<n;++i)for(s=a[j=i];++j<n;l=a[j]-a[i]?l:s>l?s:l)s+=a[j];l=l;}

Experimente online!

Steadybox
fonte
99 bytes , se você gosta de comportamento indefinido.
Jonathan Frech
0

Clojure, 92 bytes

#(apply max(for[i(range(count %))j(range i):when(=(% i)(% j))](apply +(subvec % j(inc i)))))
NikoNyrh
fonte
0

Java 8, 129 bytes

a->a.stream().map(b->a.subList(a.indexOf(b),a.lastIndexOf(b)+1).stream().mapToLong(Long::intValue).sum()).reduce(Long::max).get()

Para cada número inteiro Xna lista, a função localiza a soma da maior sublist com início e fim X. Em seguida, ele encontra a soma máxima especificada pelo OP.

Mario Ishac
fonte
Não testei, mas parece que pode falhar no [2,8,2,-3,2]caso de teste e possivelmente [1,1,80]também.
Ørjan Johansen
0

Perl, 61 59 bytes

Inclui +3para -p:

max_ident_run.pl:

#!/usr/bin/perl -p
s:\S+:$%=$&;($%+=$_)<($\//$%)||$_-$&or$\=$%for<$' >:eg}{

Correr como:

max_ident_run.pl <<< "1 2 -2 4 1 4 1"
Ton Hospel
fonte