Descripción del desafío
Una subsecuencia monotónica es una secuencia de números [a1, a2, ..., an]
tal que
a1 <= a2 <= ... <= an
o a1 >= a2 >= ... >= an
. [1, 3, 3, 7, 9, 13, 13, 100]
es una subsecuencia monotónica (no decreciente), así como [9, 4, 4, 3, 0, -10, -12]
(esta no aumenta), pero [1, 3, 6, 9, 8]
no lo es. Dada una lista de enteros (en cualquier formato razonable), genera el número más pequeño de N
modo que la secuencia de estos enteros se pueda dividir en N
secuencias monotónicas.
Ejemplos
[1, 3, 7, 5, 4, 2] -> [[1, 3, 7], [5, 4, 2]] -> 2
[1, 2, 3, 4, 5, 6] -> [1, 2, 3, 4, 5, 6] -> 1
[3, 1, 5, 5, 6] -> [[3, 1], [5, 5, 6]] -> 2
[4, 6, 8, 9, 1, 6] -> [[4, 6, 8, 9], [1, 6]] -> 2
[3, 3, 3, 3] -> [[3, 3, 3, 3]] -> 1
[7] -> [[7]] -> 1
[] -> [] -> anything (you don't actually have to handle an empty list case)
[1, 3, 2, -1, 6, 9, 10, 2, 1, -12] -> [[1, 3], [2, -1], [6, 9, 10], [2, 1, -12]] -> 4
[4,4,8,8,1,4,5] -> 2
0 / undefined
que parece que debería ser 0 o la representaciónundefined
en nuestro idioma, pero a partir de tu comentario sobre la respuesta de Jonathan Allan Jelly, parece queundefined
significaanything
... ¿Cuál es? ? En el segundo caso, sugeriría escribir enanything
lugar deundefined
Respuestas:
Brachylog , 12 bytes
Pruébalo en línea!
Esto devuelve
false.
para la lista vacía[]
.Explicación
Esto devolverá el más pequeño porque
~c
generará puntos de elección desde el número más pequeño de sublistas hasta el más grande.fuente
Z
porqueZ
es un nombre de variable; entonces estamos diciendo "llame a este programa con la Salida como variable". Puede cambiarZ
a cualquier otra letra mayúscula ; Es solo un nombre variable. La razón por la que existe este argumento es para permitir la posibilidad de establecer realmente la salida en algo, en lugar de una variable.4
en ese ejemplo, le dirá si eso es correcto o no )3
porque no encontrará ninguna lista de sublistas donde todas sean monótonas y de longitud3
. Solo lleva mucho tiempo porque probará todas las listas posibles de sublistas, incluso aquellas que en realidad tienen más de 3 elementos porque la longitud se verifica después de encontrar la lista. Porque5
dicetrue
porque de hecho hay al menos una lista de longitud5
con sublistas monótonas que funciona. Entonces, este programa devuelve la longitud más pequeña cuando la salida es una variable y si hay alguna lista de esa longitud que funcione si la salida es un entero.Perl, 65 bytes
62 bytes de código + 3 bytes para la
-n
bandera.monot_seq.pl:
Dé la entrada sin nueva línea final, con los números separados por espacios:
-5 bytes gracias a @Gabriel Benamy.
fuente
($&<=>$1)*($1<=>$2)||$1==$2
en($&<=>$1)*($1<=>$2)>=0
Mathematica, 111 bytes
Función con nombre que
f
toma una lista no vacía de números (enteros o incluso reales). Funciona de adelante hacia atrás, descarta el primer elemento repetidamente y realiza un seguimiento de cuántas subsecuencias se necesitan. Más detallado:fuente
d=#2-#&@@#&;
Además, definir cualquieraf
og
como operador unario±
probablemente ahorrará algunos bytes.Jalea , 19 bytes
TryItOnline! o ejecutar todas las pruebas (la lista vacía da como resultado
1
)¿Cómo?
(No estoy convencido de que este sea el método más adecuado para minimizar el recuento de bytes)
fuente
1
(lo que en realidad creo que tiene más sentido que0
).undefined
significa: el resultado es irrelevante.Perl,
98979679 bytesLa entrada se proporciona como una lista de números, separados por espacios, proporcionados en tiempo de ejecución, p. Ej.
(el 4 es la salida)
Legible:
El 'operador de nave espacial'
<=>
devuelve -1 si LHS <RHS, 0 si LHS = RHS y +1 si LHS> RHS. Al comparar los tres elementos secuenciales$a,$b,$c
para determinar si son monótona, sólo es necesario determinar que no es exactamente el caso de que uno de$a<=>$b
,$b<=>$c
es 1 y el otro es -1 - que sólo sucede cuando su producto es -1. Si bien$a==$b
o$b==$c
, entonces la secuencia es monotónica, y el producto es 0. Si$a < $b < $c
, entonces ambos resultan en -1, y -1 * -1 = 1. Si$a > $b > $c
, entonces ambos resultan en 1, y 1 * 1 = 1. En cualquier caso, la secuencia es monotónica y deseamos continuar.Si el producto es menor que 0, sabemos que la secuencia no es monotónica, y descartamos los valores
$a,$b
que actualmente tenemos, e incrementamos nuestro contador de subsecuencia. De lo contrario, avanzamos un número.No devuelve nada si la entrada está vacía; de lo contrario, devuelve el menor número de subsecuencias monotónicas contiguas.
fuente
1
yif
(o tal vez lo hace en perlas antiguas, pero en las recientes no las necesita ). También puede (probablemente) reemplazarshift
porpop
. Sin embargo, hay algunos casos de prueba en los que su código no funciona:6 3 6 3
(imprime 3 en lugar de 2),4 3 2 1
(imprime 2 en lugar de 1). Usando enpop
lugar deshift
resolverlos, pero creando otros nuevos (1 2 3 4
imprime 3 en lugar de 1) ...C # 6,
297209 bytesSin golfing con explicaciones
fuente
JavaScript (ES6), 69 bytes
Toma la entrada como múltiples parámetros. Funciona comparando recursivamente los primeros tres elementos para ver si son monótonos, de ser así, elimina el elemento del medio ya que es inútil, si no, elimina los dos primeros elementos y comienza una nueva secuencia.
fuente
Clojure, 97 bytes
reduce
realiza un seguimiento de la subsecuencia actual y calcula cuántas veces<=
y>=
condiciones fallan. El último1
toma el segundo elemento del resultado (siendo el contadori
).fuente