Secuencias de cruce


11

Secuencias de cruce

Dada una lista de enteros positivos A, llámela secuencia creciente si cada elemento es mayor o igual que el anterior; y llamarlo una secuencia decreciente si cada elemento es menor o igual que el anterior.

Algunas secuencias crecientes:

[1,2,4,7]
[3,4,4,5]
[2,2,2]
[]

Algunas secuencias decrecientes:

[7,4,2,1]
[5,4,4,3]
[2,2,2]
[]

Una secuencia cruzada es una lista que puede descomponerse en dos subsecuencias disjuntas, una secuencia creciente y la otra secuencia decreciente.

Por ejemplo, la lista:

[3,5,2,4,1]

es una secuencia cruzada, ya que se puede descomponer en:

[3,    4  ]
[  5,2,  1]

donde [3,4]está la subsecuencia creciente y [5,2,1]es la subsecuencia decreciente. Llamaremos a este par de subsecuencias (crecientes, decrecientes) una descomposición de la secuencia de cruce.

La lista:

[4,5,2,1,3]

no es una secuencia cruzada; no hay forma de descomponerlo en una subsecuencia creciente y decreciente.

Su tarea es escribir un programa / función tomando como entrada una lista de enteros positivos; y si es una secuencia cruzada, devuelva las dos listas en una de sus descomposiciones; o algún valor consistente de "falsey" si la lista no es una secuencia cruzada.

Este es el ; El programa / función más corto en cada idioma es el ganador.

Reglas:

  • La entrada es flexible.
  • Las lagunas habituales están prohibidas.
  • Si hay varias formas válidas de descomponer la entrada, puede generar una o todas ellas.
  • El formato de salida para la descomposición es flexible; pero debe ser inequívoco con respecto a la distinción entre las dos subsecuencias.
  • Puede usar cualquier valor de salida consistente para indicar que la entrada no es una secuencia cruzada; siempre que no sea ambiguo en comparación con la salida para cualquier secuencia de cruce. Debe especificar el valor de falsey en su respuesta.

Casos de prueba:

Utilizando Falsepara indicar secuencias no cruzadas:

[3, 5, 2, 4, 1] => [3, 4], [5, 2, 1]
[3, 5, 2, 4, 4, 1, 1] => [3, 4, 4], [5, 2, 1, 1]

[7, 9, 8, 8, 6, 11] => [7, 8, 8, 11], [9, 6]
[7, 9, 8, 8, 6, 11] => [7, 9, 11], [8, 8, 6] # also valid
[7, 9, 8, 8, 6, 11] => [7, 8, 11], [9, 8, 6] # also valid

[7, 8, 9, 10, 20, 30] => [7, 8, 9, 20, 30], [10]
[7, 8, 9, 10, 20, 30] => [8, 9, 10, 20, 30], [7] # this is also valid

[5, 5, 5] => [5, 5, 5], []

[4, 5, 2, 1, 3] => False
[3, 4, 3, 4, 5, 2, 4] => False

2
Posible duplicado . Solo veo dos diferencias: el otro desafío debe ejecutarse en tiempo polinómico en la longitud de la entrada, y permite un valor verdadero en lugar de las dos subsecuencias (si se devuelven las subsecuencias, recibirán una bonificación del 20%). Todavía me suena como un tonto, pero no lo golpearé.
— Kevin Cruijssen

La restricción de tiempo de @KevinCruijssen es probablemente suficiente por sí sola para no hacer que esto sea un engaño.
— Nick Kennedy el

1
@NickKennedy Posiblemente sí, por eso me abstuve de golpearlo. :)
— Kevin Cruijssen

2
Caso de prueba sugerida: [3, 5, 2, 4, 4, 1, 1]. Los casos de prueba actuales le permiten salirse con >=/ <, cuando realmente debería ser >=/ <=.
— Grimmy

1
@Arnauld: Sí, puede ser cualquier valor ("falsey" es solo decir: es falso que la entrada sea una secuencia cruzada).
— Chas Brown

Respuestas:


1

05AB1E , 15 14 13 bytes

2.Œ.ΔćRšεü@}W

Pruébelo en línea o valide todos los casos de prueba .

Explicación:

2.Œ                    # all partitions of the input in 2 subsequences
   .Δ                  # find the first partition such that the following gives 1
     ćRš               # reverse the first subsequence
        ε  }           # map each subsequence to
         ü@            # pairwise greater-than
            W          # minimum (1 if all 1s, 0 otherwise)


1

JavaScript (ES6),  110 105  104 bytes

[[decreasing], [increasing]]1

f=(a,n,b=[[],[]])=>a.some((v,i)=>[...x=b[i=n>>i&1]].pop()*(x.push(v),i-=!i)>v*i)?n>>a.length||f(a,-~n):b

Pruébalo en línea!

¿Cómo?

norte0 02LL

si[0 0]si[1]yonorte

1yo=1-1yo=0 0

[...x = b[i = n >> i & 1]].pop() * (x.push(v), i -= !i) > v * i

sisome()


1

Haskell, 84 bytes

(([],[])#)
(d,i)#(a:b)=(#b)=<<[(d++[a],i)|all(a<=)d]++[(d,i++[a])|all(a>=)i]
p#_=[p]

Devuelve una lista de todos los (decreasing,increasing)pares válidos o la lista vacía si no existe dicho par.

Pruébalo en línea!


1

Python 3 , 109107 bytes

def f(l,i=[],d=[]):
 if l:s,*r=l;i and s<i[-1]or f(r,i+[s],d);d and s>d[-1]or f(r,i,d+[s])
 else:print(i,d)

Pruébalo en línea!

La función imprime todas las descomposiciones posibles en la salida estándar. Si no hay posibles descomposiciones, no se imprime nada.

Gracias a @Sriotchilism O'Zaic por sugerencias de mejora.


Bienvenido al sitio. Sugiero hacer en s<i[-1]lugar de i[-1]>s y similar con d[-1]<s ambos, guardar un byte.
— Ad Hoc Garf Hunter

Gracias por la sugerencia. He actualizado la respuesta. ¿Hay alguna plantilla que se pueda copiar y pegar aquí para publicar respuestas?
— Joel

¿No estoy seguro de lo que quieres decir? TIO tiene una plantilla que parece que ya estás usando.
— Ad Hoc Garf Hunter

Solo generé un enlace en TIO y agregué el enlace a mi publicación. No utilicé ninguna plantilla allí. ¿Dónde está?
— Joel

1
@Joel: en la parte superior de la página de TIO hay un ícono que se parece a algunos enlaces de cadena. Haga clic en eso, y luego obtendrá una página de opciones. Uno de ellos es 'Envío de código de golf'. ¡Eso pondrá en su búfer de copia las cosas formateadas que desee! ¡Bienvenido también y buena solución!
— Chas Brown el


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.