Uno sube, el otro baja

20

Introducción

En este desafío, su tarea es decidir si una secuencia de números dada se puede separar en dos subsecuencias, una de las cuales está aumentando y la otra disminuyendo. Como ejemplo, considere la secuencia 8 3 5 5 4 12 3. Se puede dividir en dos subsecuencias de la siguiente manera:

  3 5 5   12
8       4    3

La subsecuencia en la primera fila está aumentando, y la de la segunda fila está disminuyendo. Además, debe realizar esta tarea de manera eficiente.

Entrada

Su entrada es una lista no entera Lde enteros en el rango de 0 a 99999 inclusive. Se proporciona en el formato nativo de su idioma, o simplemente delimitado por espacios.

Salida

Su salida es un valor verdadero si Lpuede dividirse en una subsecuencia creciente y decreciente, y un valor falso de lo contrario. Las subsecuencias no necesitan ser estrictamente crecientes o decrecientes, y cualquiera de ellas puede estar vacía.

Reglas y bonificaciones

Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten. Además, el forzamiento bruto está prohibido en este desafío: su programa debe ejecutarse en tiempo polinómico en la longitud de la entrada .

No es necesario que devuelva las dos subsecuencias, pero hay una bonificación de -20% por hacerlo. Para hacer que la bonificación sea más fácil de reclamar en idiomas escritos estáticamente, es aceptable devolver un par de listas vacías para las instancias falsas.

Casos de prueba

Dado en el formato input -> Nonepara entradas falsas y input -> inc decpara entradas verdaderas. Aquí solo se da un posible par de subsecuencias; Puede haber más.

[4,9,2,8,3,7,4,6,5] -> None
[0,99999,23423,5252,27658,8671,43245,53900,22339] -> None
[10,20,30,20,32,40,31,40,50] -> None
[49,844,177,974,654,203,65,493,844,767,304,353,415,425,857,207,871,823,768,110,400,710,35,37,88,587,254,680,454,240,316,47,964,953,345,644,582,704,373,36,114,224,45,354,172,671,977,85,127,341,268,506,455,6,677,438,690,309,270,567,11,16,725,38,700,611,194,246,34,677,50,660,135,233,462,777,48,709,799,929,600,297,98,39,750,606,859,46,839,51,601,499,176,610,388,358,790,948,583,39] -> None
[0,1,2,3,4] -> [0,1,2,3,4] []
[4,3,2,1,0] -> [] [4,3,2,1,0]
[1,9,2,8,3,7,4,6,5] -> [1,2,3,4,6] [9,8,7,5]
[71414,19876,23423,54252,27658,48671,43245,53900,22339] -> [19876,23423,27658,48671,53900] [71414,54252,43245,22339]
[10,20,30,20,30,40,30,40,50] -> [10,20,20,30,40,40,50] [30,30]
[0,3,7,13,65,87,112,43,22,1] -> [0,3,7,13,65,87,112] [43,22,1]
[7,4,4,7,4,7,7,4,7,4,4,4,7,7] -> [7,7,7,7,7,7,7] [4,4,4,4,4,4,4]
[7,997,991,957,956,952,7,8,21,924,21,923,22,38,42,44,920,49,58,67,71,83,84,85,917,89,907,896,878,878,90,861,115,860,125,128,140,148,858,155,160,836,164,182,826,191,824,805,195,792,205,782,206,210,769,213,756,748,214,745,724,701,234,241,693,268,685,293,679,297,334,671,336,669,341,652,356,648,362,364,370,375,386,630,622,388,389,618,398,408,468,615,470,533,611,539,544,609,586,582,572,565,547,602,536,619,624,528,512,631,640,649,669,671,677,505,678,723,743,489,489,473,454,757,446,445,758,759,764,445,431,770,429,426,418,409,790,383,379,366,363,791,358,795,809,827,835,356,353,841,844,333,867,323,317,879,311,881,309,896,282,281,897,263,904,237,236,226,202,195,914,186,177,917,920,157,926,936,154,138,943,131,945,100,98,947,957,964,95,973,989,57,43,32,21,16,13,11,8,0] -> [7,7,8,21,21,22,38,42,44,49,58,67,71,83,84,85,89,90,115,125,128,140,148,155,160,164,182,191,195,205,206,210,213,214,234,241,268,293,297,334,336,341,356,362,364,370,375,386,388,389,398,408,468,470,533,539,544,586,602,619,624,631,640,649,669,671,677,678,723,743,757,758,759,764,770,790,791,795,809,827,835,841,844,867,879,881,896,897,904,914,917,920,926,936,943,945,947,957,964,973,989] [997,991,957,956,952,924,923,920,917,907,896,878,878,861,860,858,836,826,824,805,792,782,769,756,748,745,724,701,693,685,679,671,669,652,648,630,622,618,615,611,609,582,572,565,547,536,528,512,505,489,489,473,454,446,445,445,431,429,426,418,409,383,379,366,363,358,356,353,333,323,317,311,309,282,281,263,237,236,226,202,195,186,177,157,154,138,131,100,98,95,57,43,32,21,16,13,11,8,0] 
Zgarb
fuente

Respuestas:

3

Pyth, 34 bytes

.N|!N|&ghNT:tNhNY&gYhN:tNThN:QZ^T5

Banco de pruebas

Utiliza la recursión memorable para mantener el tiempo de ejecución bajo. Define una función de 3 entradas :, que toma el sufijo de la lista de entradas, el final de la secuencia creciente y el final de la secuencia decreciente.

isaacg
fuente
2

Brachylog , 16 bytes - 20% = 12.8 (pero es casi seguro que no es polinomial)

⊇≥₁X&⊇≤₁Y;X.cp?∧

Pruébalo en línea!

Falla si no hay un par de subsecuencias compatibles y las genera a través de su variable de salida si hay una (pero solo imprimirá true.si se ejecuta como un programa). Digo que es casi seguro que no es polinomial porque la belleza de Brachylog es que, dado que es un lenguaje declarativo, no se hace tanto en la implementación de un algoritmo como simplemente se describen relaciones entre variables y se le pide a la computadora que produzca resultados . Entonces, es probable que se trate de una fuerza bruta extrema, pero pasé una copia lo suficientemente larga pegando los casos de prueba (dos de los cuales simplemente se agota) que siento que debería enviar esto de todos modos, si no es por otra razón que arrastrar este desafío desde el final de la lista más recientes "más reciente".

   X                X is a
 ≥₁                 non-increasing
⊇                   sublist of the input
    &               and
        Y           Y is a
      ≤₁            non-decreasing
     ⊇              sublist of the input
         ;X         which paired with X
           .        is the output variable
            c       which when its elements are concatenated
             p      is a permutation of
              ?     the input
               ∧    which is not unified with the output.
Cadena no relacionada
fuente
2

Haskell , 65 bytes

(>[]).foldl(%)[(0,9^6)]
p%x=do(u,d)<-p;[(x,d)|x>=u]++[(u,x)|x<=d]

Pruébalo en línea!

Itera a través de la lista, rastreando los posibles pares (u,d)del máximo de la secuencia creciente y el mínimo de la secuencia decreciente. Cada nuevo elemento xreemplaza cualquiera uo d, lo que corresponde a que se agregue a esa subsecuencia. Podría ser que ambas o ninguna de las opciones sean válidas. Al final, verificamos que la lista de posibilidades no esté vacía.

Los límites iniciales (0,9^6)usan que el problema especifica los números que deben estar en el rango de 0 a 99999. Una solución más general podría ser (1/0,-1/0)para hacer (-inf,inf).

xnor
fuente