Carrera máxima entre elementos idénticos

24

Esta es una revisión de esta pregunta ahora eliminada por ar kang . Si el OP de esa pregunta quisiera reclamar esta pregunta o tiene un problema conmigo publicando esto, me complacería complacerlo

Dada una lista de enteros como entrada, encuentre la suma máxima posible de una sublista continua que comienza y termina con el mismo valor. Las sublistas deben tener una longitud de al menos 2. Por ejemplo, para la lista

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

Hay 2 sublistas continuas diferentes que comienzan y terminan con el mismo valor

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

La suma mayor es 9, por lo que produce 9.

Puede suponer que cada entrada contiene al menos 1 duplicado.

Este es el por lo que las respuestas se puntuarán en bytes, con menos bytes mejor.

Casos de prueba

[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
Asistente de trigo
fuente
¿Debería [2,8,2,3,2]ser 12 o 17? Presumo 17.
NikoNyrh
@NikoNyrh Debería ser 17.
Wheat Wizard
¡Hurra por CC BY / SA! Tiene derecho a publicar una pregunta derivada de otra, incluso si los miembros de la comunidad la marcan como engañada más tarde. Parece que deberías agregar un enlace a la página del OP como lo obtengo de esta publicación de blog. "3. Mostrar los nombres de los autores para cada pregunta y respuesta [...] 4. Vincular cada nombre de autor directamente a su página de perfil de usuario en el sitio fuente" - No tengo privilegios para ver las preguntas eliminadas, así que no No sé quién hizo el original.
Mindwin
@Mindwin Gracias, agregué un enlace a la página del OP. Lo dejé fuera originalmente porque pensé que si el OP borraba su publicación, querrían evitar estar vinculados a la pregunta.
Wheat Wizard el
El motivo de eliminación es irrelevante y no transparente para el usuario común (yo). Pero la atribución es del tipo de exclusión voluntaria. Al enviar y aceptar la licencia, nos otorgaron esos derechos en esas condiciones. Cualquier cosa fuera es una excepción. GJ
Mindwin

Respuestas:

9

Haskell , 62 bytes

f toma una lista de enteros y devuelve un entero.

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

Pruébalo en línea!

Cómo funciona

  • tes la función estándar "obtener todos los sufijos de una lista sin importar Data.List.tails".
  • En f l, la comprensión de la lista recorre en iteración todos los sufijos no vacíos de la lista de argumentos l, con el primer elemento xy el resto m.
  • Para cada uno, hace lo mismo para todos los sufijos no vacíos de m, seleccionando el primer elemento yy el resto n.
  • Si xy yson iguales, la comprensión de la lista incluye la suma de los elementos entre ellos. Esta sublista es la misma que x:mcon su sufijo neliminado, por lo que la suma se puede calcular como x+sum m-sum n.
Ørjan Johansen
fuente
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 prueba

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
fuente
Estaba un poco confundido por el pedido y - a[i]y (x += y) < m, en mi humilde opinión, el código sería un poco más claro con el intercambio, ya que parece un simple campo de golf (x += y) < m || y != a[i].
Neil
@Neil, entiendo tu punto, pero también (x+=y)<m|y-a[i]podría malinterpretarse (x+=y)<(m|y-a[i]). No estoy seguro de que realmente elimine la ambigüedad. (Editado de todos modos porque tiendo a preferir esta versión).
Arnauld
Bueno, eso supone que no interpretarían mal y-a[i]|(x+=y)<mcomo (y-a[i]|(x+=y))<m...
Neil
5

Jalea , 12 bytes

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

Pruébalo en línea!

Cómo 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
fuente
5

Casco , 10 bytes

▲mΣfΓ~€;ṫQ

Pruébalo en línea!

Explicación

▲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
fuente
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))))

Pruébalo en línea!

combn¡golpea de nuevo! Genera al menos todas las sublistas de longitud 2, establece la suma de la sublista en -Infsi el primero y el último no son iguales, y toma el máximo de todas las sumas.

Esto "if"generará un montón de advertencias, pero son ignorables con seguridad: ese es probablemente el mejor truco de golf aquí, rev(p)-pes cero en el primer elemento iff p[1]==tail(p,1)y "if"usa el primer elemento de su condición con una advertencia.

Giuseppe
fuente
2

Jalea , 13 , 12 bytes

=ṚṖḢ
ẆÇÐfS€Ṁ

Pruébalo en línea!

Un byte guardado por el Sr. Xcoder, que actualmente está compitiendo conmigo. :RE

Explicación:

        # 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
fuente
1

Pyth, 15 bytes

eSsMf&qhTeTtT.:

Pruébalo en línea

Explicación

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.

fuente
1

05AB1E , 9 bytes

ŒʒćsθQ}OZ

Pruébalo en línea!

Explicación

Œ          # 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
fuente
1

Limpio , 94 90 86 bytes

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

Pruébalo en línea!

Οurous
fuente
Me temo que esto falla para el [1, 1, 80]caso de prueba.
Ørjan Johansen
@ ØrjanJohansen lo arregló
Οurous
1

Python 2 , 86 bytes

Afligido 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])

Pruébalo en línea!

Genera todas las sublistas más grandes que la longitud 2, donde el primer elemento es igual al último, luego asigna cada una a su suma y selecciona el valor más grande.

FlipTack
fuente
88 bytes usando una función lambda
Halvard Hummel
@HalvardHummel 86 bytes usando enumerate.
Jonathan Frech
Afligido por Dennis - Honestamente, ¿qué esperabas?
Sr. Xcoder
@ Mr.Xcoder hubiera obtenido su solución, pero me fui a dormir :(
FlipTack
1

Jalea , 11 bytes

Utiliza algunas características que son posteriores al desafío.

Ẇµ.ịEȧḊµƇ§Ṁ

Pruébalo en línea!

¿Cómo funciona?

Ẇµ.ịEȧḊµƇ§Ṁ || Programa completo Toma entrada de CLA, salidas a STDOUT.
Ẇ || Sublistas.
 µ µƇ || Filtrar-Guardar esos
    ȧḊ || ... que tienen una longitud de al menos 2 y ...
 .ị || ... Los elementos en el piso (0.5) y el techo (0.5) (modular, 1 indexado) ...
    E || ... Son iguales.
         § || Suma cada uno.
          Ṁ || Máximo.

-1 con ayuda de caird .

Sr. Xcoder
fuente
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%

Toma datos como parámetros de línea de comandos.

Neil
fuente
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;}

Pruébalo en línea!

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;}

Pruébalo en línea!

Steadybox
fuente
99 bytes , si te gusta el comportamiento 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
fuente
0

Java 8, 129 byes

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 entero Xen la lista, la función encuentra la suma de la sublista más grande con inicio y fin X. Luego, encuentra la suma máxima que especifica el OP.

Mario Ishac
fuente
No lo he probado, pero me parece que podría fallar en el [2,8,2,-3,2]caso de prueba, y posiblemente [1,1,80]también.
Ørjan Johansen
0

Perl, 61 59 bytes

Incluye +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
fuente