Introducción:
Inspirado por estas dos preguntas SO (sin duda de la misma clase): imprima los elementos en la submatriz de suma máxima sin elementos adyacentes java y la suma máxima de elementos no adyacentes de una matriz, para imprimir .
Reto:
Dada una lista de enteros, genera una subsecuencia que consiste en elementos no adyacentes que tienen la suma más alta. Aquí algunos ejemplos:
[1,2,3,-1,-3,2,5]
daría como resultado[1,3,5]
(con una suma de9
) en los índices basados en 0[0,2,6]
.[4,5,4,3]
daría como resultado[4,4]
(con una suma de8
) en los índices basados en 0[0,2]
o[5,3]
(también con una suma de8
) en los índices basados en 0[1,3]
.[5,5,10,100,10,5]
daría como resultado[5,100,5]
(con una suma de110
) en los índices basados en 0[0,3,5]
o[1,3,5]
.
Lo que es más importante sobre estos ejemplos anteriores, los índices que contienen los elementos están al menos 2 separados entre sí. Si miramos el ejemplo [5,5,10,100,10,5]
más en profundidad: tenemos la siguiente subsecuencia potencial que contiene elementos no adyacentes; con sus índices debajo de él; con sus sumas debajo de eso:
[[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
Dado que las sumas máximas son 110
, generamos [5,100,5]
resultados
Reglas de desafío:
- Se le permite generar pares clave-valor del índice + valor. Entonces, en lugar de
[5,100,5]
usted, puede generar resultados[[0,5],[3,100],[5,5]]
o[[1,5],[3,100],[5,5]]
como resultado (o[[1,5],[4,100],[6,5]]
/[[2,5],[4,100],[6,5]]
cuando se utiliza la indexación basada en 1 en lugar de la basada en 0).- Si usa pares clave-valor, también pueden estar en orden inverso o aleatorio, ya que está claro qué valores se deben al índice emparejado.
- No se permite generar solo los índices sin valores. Debería generar los valores o los valores / índices como pares clave-valor (o dos listas separadas para 'claves' y 'valores' del mismo tamaño si los pares clave-valor no son posibles en el idioma que elija).
- Se le permite generar todas las subsecuencias posibles con la suma máxima en lugar de solo una.
- Como puede ver en los ejemplos, la lista de entrada también puede contener valores negativos y duplicados. Puede suponer que los enteros de entrada están dentro del rango .
- La lista de salida no puede estar vacía y siempre debe contener al menos un elemento (si una lista solo contendría valores negativos, una lista que contenga el único valor negativo más bajo se generaría como resultado; consulte los últimos dos casos de prueba).
- Si hay una salida posible pero para múltiples índices diferentes, se permite la salida de ambos aunque parezcan duplicados. (es decir, el ejemplo anterior, puede generar
[[5,100,5],[5,100,5]]
ambas combinaciones de índices posibles).
Casos de prueba:
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
fuente
[5,100,5]
dos veces para su tercer ejemplo.powerset
es un conjunto de subconjuntos, ¿no? pero parece que estás devolviendo un conjunto de subsecuencias? [4,5,4,3] daría como resultado [4,4] donde [4,4] claramente no es un conjunto.Respuestas:
Casco , 11 bytes
Pruébalo en línea!
Explicación
fuente
Haskell , 60 bytes
Pruébalo en línea!
La función auxiliar se
%
bifurca recursivamente al elegir si incluir el primer elemento y soltar el segundo, o saltear el primer elemento. Toma el máximo de todos los resultados, que son tuplas cuyo primer elemento es la suma y cuyo segundo elemento es la lista correspondiente que se extrae para la salida.Para manejar la regla de que la lista vacía está prohibida, incluso si tuviera el truco más pequeño, hacemos un lindo truco de escritura en
sum r<$r
lugar desum r
. Esto hace una lista cuyos elementos son todossum r
y cuya longitud es la der
. De esa manera, cuando elegimos el máximo, priorizamos cualquier lista sobre un vacíor
, pero de lo contrario las comparaciones dependen del primer elemento que seasum r
.fuente
R ,
136125bytesPruébalo en línea!
-6 bytes gracias a digEmAll , que por cierto también me superó .
Devuelve la subsecuencia más corta como a
list
, rompiendo vínculos en lexicografía primero por índices.La fuerza bruta genera todas las subsecuencias de índice, luego
Filter
s para aquellas que no son adyacentes, es decir, dóndeall(diff(x)>1)
. Luego subconjuntos[
en ell
uso de estos índices, seleccionando[[
el primero donde la suma es el máximo (which.max
).¡Estoy bastante seguro de que esta es la primera respuesta R que he escrito que utilizatriste,Filter
!Filter
es infiel, no es de extrañar que nunca lo haya usado ...fuente
05AB1E , 14 bytes
Guardado 1 byte gracias a Kevin Cruijssen
Pruébalo en línea! o como un conjunto de pruebas
Explicación
fuente
¤ª
aĆ
.Brachylog (v2), 14 bytes
Pruébalo en línea!
Presentación de funciones; entrada desde la izquierda, salida desde la derecha, como de costumbre. Muy lento; Una lista de cinco elementos es probablemente el máximo para probar en TIO.
Los resultados que obtenemos de los prefijos no son incorrectos, pero tampoco son interesantes; todos los resultados posibles se generan tomando un sufijo (que posiblemente sea la lista en sí, pero no puede estar vacío), pero "sufijo" es más detallado en Brachylog que "prefijo o sufijo", así que elegí la versión que es más terser (y menos eficiente pero aún correcto). La idea básica es que para cada elemento que queremos en la lista de salida, la partición en sublistas contiguas necesita colocar ese elemento y el elemento antes en la misma sublista (porque el elemento es el segundoelemento de la sublista), por lo que no pueden aparecer dos elementos consecutivos en el resultado. Por otro lado, está bastante claro que cualquier lista sin dos elementos consecutivos puede aparecer en el resultado. Entonces, una vez que tengamos todas las listas de candidatos posibles, podemos tomar las sumas de todas y ver cuál es la más grande.
fuente
Jalea ,
1614 bytesPruébalo en línea!
¡Gracias a @EriktheOutgolfer por guardar 2 bytes!
fuente
JavaScript (ES6),
138 132 130 129126 bytesSalidas pares clave-valor.
Pruébalo en línea!
Paso 1
Paso 2
fuente
Haskell,
8180 bytesPruébalo en línea!
f
construye todas las subsecuencias válidas omitiendo el siguiente elemento (f(b:c)
) o usándolo y omitiendo el siguiente (map(a:)(f c)
) y trabaja recursivamente en el resto. Para el resultado, construya todas las subsecuencias (f
), suelte la subsecuencia vacía (que aparece primero en la lista:)tail
, haga pares(<sum>,<subsequence>)
(map((,)=<<sum)
), encuentre el máximo (los pares se comparan en orden lexicográfico) ->maximum
) y suelte la suma (snd
).Editar: -1 byte gracias a @Lynn.
fuente
map(:[])a
es un byte más corto que(pure<$>a)
^^J , 47 bytes
Pruébalo en línea!
-7 bytes gracias a FrownyFrog
original
J , 54 bytes
Pruébalo en línea!
fuente
T-SQL,
122119118 bytesLa entrada es una variable de tabla.
Esta consulta selecciona todos los elementos de la variable de tabla, combinándolos con todos los elementos no adyacentes con valores de posición más altos y muestra el texto generado para la suma más alta de estos valores.
Pruébelo en línea sin golf
fuente
Wolfram Language (Mathematica) , 144 bytes
Pruébalo en línea!
fuente
Pyth, 19 bytes
Pruébelo en línea aquí , o verifique todos los casos de prueba a la vez aquí .
fuente
Gaia , 24 bytes
Pruébalo en línea!
Uf,
E‡
hace algunas cosas raras ... de acuerdo a la documentación, se debe hacer algo como "longitud dadai
conjunto de listasX
y longitudj
conjunto de índicesY
, el regresoX[i][Y[j]]
", sino que se devuelve[X[i][Y[j]] X[i][Y[-j]]
en la indexación negativo representa el complemento, por lo que tenemos que hacerev2%
para extraer solo los que queramos.fuente
]]
lugar de uno?[[1] [2]]
se imprime , lo[[1]] [2]]]]
que hace que sea muy difícil leer / depurar la salida de la lista.re.sub(" ?$","]",result)
en el intérprete que en su lugar debería serre.sub(" +$","]",result)
, pero mi pitón es muy mala.R ,
108107 bytesPruébalo en línea!
-1 gracias a @Giuseppe
fuente
Wolfram Language (Mathematica) ,
7063 bytesPruébalo en línea!
Búsqueda de alto nivel
,1
es necesario para no devolver involuntariamente conjuntos no válidos (de lo contrario, por ejemplo, una entrada de{1,1,1}
daría como resultado una salida de{{1,1},{1,1},{1,1}}
)fuente
Haskell ,
300168 bytesPruébalo en línea!
-132 bytes gracias a todos los comentarios de @nimi :)
Original
Sin golf (original)
fuente
f
:,f x=zip[0..length x]x
entonces sef
conviertef=zip[0..]
.g
es justog=map unzip
. La función para filtrarj
esh.fst
(<- ¡pares invertidos!).j=filter(h.fst)
. Elfoldl1+
fromk
essum
y con un par de puntos libresk=map((,)=<<sum.snd)
.sortBy(...)
puede ser sustituido porsortOn fst
:l=snd.last.sortOn fst
. Finalmente, ya que está utilizando todas las funciones solo una vez, puede incorporarlas en una única expresión sin puntos:z=snd.last.sortOn fst.map((,)=<<sum.snd).filter(h.fst).map unzip.subsequences.zip[0..]
Data.Function
.h
: buscamos elementos no adyacentes, es decir, la diferencia de los índices adyacentes debe ser>1
.zipWith(-)=<<tail
construye una lista de tales diferencias, pero falla para la lista vacía, por lo que necesitamos un adicionaltail
en elsubsequences
que deshacerse de él. En línea de nuevo. Pruébalo en línea!Carbón , 46 bytes
Pruébalo en línea!El enlace es a la versión detallada del código. Explicación:
La variable
u
está predefinida con una lista vacía. Esto se pone en una lista que se asigna ah
. Estas variables actúan como acumuladores.u
contiene las sublistas que incluyen el último elemento de la entrada,q
mientras queh
contiene las sublistas que no lo hacen (y, por lo tanto, son adecuadas para agregar el siguiente elemento de la entrada).Recorre los elementos de la entrada.
Guarde la lista de sublistas que contienen el elemento anterior.
Tome todas las sublistas que no contengan el elemento anterior, agregue el elemento actual y guarde el resultado como la lista de sublistas que contienen el elemento actual. (No uso
Push
aquí, ya que necesito clonar la lista).Concatene ambas sublistas anteriores en la nueva lista de sublistas que no contienen el elemento actual.
Concatene las sublistas por última vez y elimine la lista vacía original (que el carbón no puede sumar de todos modos).
Calcule las sumas de todas las sublistas.
Encuentre un índice de la mayor suma y genere la sublista correspondiente.
fuente
Japt
-h
, 22 bytesIntentalo
fuente
Japt
-h
, 21 bytes¿Alguna vez has tenido uno de esos desafíos donde olvidas por completo cómo jugar golf?
Intentalo
fuente
Python 2 ,
637065 bytesPruébalo en línea!
5 bytes thx a ArBo
fuente
[1, 7, 4, -2] [1, 4] 5 7
está obteniendo la respuesta incorrecta.