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
Chas Brown
fuente
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)
Mugriento
fuente
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()

Arnauld
fuente
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!

nimi
fuente
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.

Joel
fuente
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
0

Brachylog , 17 bytes

;Ṣzpᵐz{ℕˢ}ᵐ≤₁ʰ≥₁ᵗ

Pruébalo en línea!

Probablemente haya mucho espacio para jugar al golf.

Cadena no relacionada
fuente
2
Ya has respondido a este desafío antes aquí , donde lo hiciste en 16 bytes. ;)
Kevin Cruijssen
No pude evitar la sensación de que había algo que había hecho similares, pero por alguna razón mi mente decidió que tenía que haber sido este lugar
Sin relación Cadena
0

Python 2 , 147 bytes

def f(a):
 for i in range(2**len(a)):
	x=[];y=[]
	for c in a:[x,y][i&1]+=[c];i/=2
	if x==sorted(x)and y[::-1]==sorted(y[::-1]):return x,y
 return 0

Pruébalo en línea!

Chas Brown
fuente