El desafío es escribir la implementación más corta para encontrar la subsecuencia de mayor crecimiento .
Ejemplo : Sea S la secuencia 1 5 7 1 8 4 3 5 [longitud de S = 8]
- Tenemos 1 subsecuencia de longitud 0 [lo consideraremos creciente]
- 6 subsecuencias de longitud 1 {1,5,7,8,4,3} [todas se consideran en aumento]
- (7 * 8) / 2 subsecuencias de longitud 2 [pero eliminaremos los duplicados], las subsecuentes crecientes están en negro intenso.
{ 15,17 , 11, 18,14,13,57 , 51, 58 , 54,53,55,71, 78 , 74,73,75,84,83,85,43, 45,35 }
[tenga en cuenta que solo nos interesan las subsecuencias estrictamente crecientes]
[no puede cambiar el orden de los elementos dentro de la secuencia, por lo que no hay una subsecuencia [37] en la secuencia de ejemplo]
- Tenemos subsecuencias crecientes de longitud 4, que es 1578, pero no hay una subsecuencia de longitud 5, por lo que consideramos la longitud de la subsecuencia creciente más larga = 4.
Entrada :
a 1 a 2 ... a N (La secuencia)
todos los números son enteros positivos menores que 10 3
N <= 1000
Salida :
Un número entero que indica la longitud de la subsecuencia creciente más larga de la secuencia de entrada.
sample input(1)
1 2 4 2 5
sample output(1)
4
sample input(2)
1 5 7 1 8 4 3 5
sample output(2)
4
Su código debe ejecutarse de manera oportuna, pruebe su código en este caso antes de enviarlo aquí (también el enlace contiene mi solución c ++ 11 de 290 bytes)
Puede tomar la entrada de un archivo / stdin o como un parámetro de función y puede imprimir la salida en un archivo / stdout o simplemente devolver el valor si escribe una función
Tablero de puntuación
- Dennis CJam - 22
- Isaac Pyth - 26
- Howard GolfScript - 35
- orgulloso Haskeller Haskell - 56
- Ray Python 3 - 66
- histocrat Ruby - 67
- DLeh C # - 92
- YosemiteMark Clojure - 94
- faubiguy Python 3 - 113
function f(){...}
) o la función interna (solo...
)? Si contamos las funciones externas, ¿se permiten funciones anónimas?Respuestas:
CJam, 22 bytes
Pruébalo en línea.
Ejemplo
El programa imprime
57
para este caso de prueba después de 0.25 segundos.Cómo funciona
Tomé la idea general de la respuesta de @ Ray .
fuente
Pitón 3, 66
Tenga en cuenta que todos los números están en el rango [1, 999], podemos usar una matriz
b
para mantener la longitud de subsecuencia más larga que termina con cada número.b[x] = d
significa que la subsecuencia más larga que termina enx
tiene longitudd
. Para cada número de la entrada, actualizamos la matriz usandob[x] = max(b[:x]) + 1
y luego terminamos el trabajo tomandomax(b)
finalmente.La complejidad del tiempo es
En)O (mn) , dondem
siempre es 1000 yn
es el número de elementos de entrada.Wow, parece que ya no tiene golf :) Puedes probarlo usando stdin / stdout agregando una línea:
fuente
for x in a: max(b)
se ve más o menos O (n ^ 2).O(1000 n)
and 1000 es una constante. También puedes pensarlo comoO(m n)
.O(1)
;-)print
es más corto quereturn
.Python - 113
fuente
a+=[i]*(a==[]or i>a[-1]);z=0
y la impresiónlen(a)
(sin corchetes) puede guardar 4 caracteres.Pyth , 26
293339Puerto de la solución de @ ray. Pasa las pruebas oficiales. Ahora usa la entrada STDIN separada por espacios, no la función de llamada.
Ejecute de la siguiente manera:
Explicación:
Tiempo ilimitado:
Pyth , 18
Nota técnica: Noté un error en mi compilador Pyth mientras escribía este golf.
L
No estaba funcionando. Es por eso que hay un compromiso reciente con el repositorio git anterior.fuente
Clojure, 94 caracteres
Usando el enfoque de @ Ray de actualizar los resultados en un vector de 1000 elementos:
Por solicitud, con una declaración impresa (imprimirá la respuesta y devolverá cero). La entrada debe ser un vector (g [1 2 3]) o una lista (g '(1 2 3)):
fuente
Haskell,
585756 caracteresEsto usa un algoritmo que vi una vez en Internet, pero no puedo encontrarlo. Lleva una cantidad de tiempo imperceptible en el caso de prueba dado en mi computadora con GHCi (probablemente sería aún más rápido si se compilara).
fuente
GolfScript, 35 caracteres
Una implementación que funciona como un programa completo con entrada en STDIN (sin el número de longitud proporcionado). La implementación es razonablemente rápida, incluso para entradas más largas (intente aquí ).
Ejemplos:
fuente
$
es O (n log n), el algoritmo es O (n ^ 2 log n).Ruby, 67
Esto se ejecuta en 30 segundos en la entrada grande, ¿eso cuenta de manera oportuna? :pag
Es una recursión bruta, pero con cierta memorización.
fuente
C #,
17292 caracteresNada especial, pero lo hice, así que pensé que podría enviarlo.
¡Gracias Armin y Bob por sus mejoras!
fuente
=>
son innecesarios. También puede mover lai=0
declaración fuera delfor
ciclo, aint c=2,m=2,i=0;for(;
. También puede soltar las llaves alrededor delfor
cuerpo, ya que solo tiene una sola declaración allí.c++;if(c>m)m=c;
puede serm=c++>m?m:c;
, y nuevamente puedes soltar los frenos alrededor de eso.if(i>0)
cheque haciendo que elfor
ciclo comience en 1. Puede acortar aún más loint c=2,m=2,i=0;for(;i<j.Length;i++)if(i>0)
sugerido anteriormenteint c=2,m=2,i=0;for(;i++<j.Length;)
. Toda esa sección podría convertirseint c=2,m=2,i=0;for(;i++<j.Length;){c=j[i]>j[i-1]?c+1:2;m=c>m?m:c;}
(usando otro ternario para reemplazar el último remanenteif
; la regla general es que los ternarios son más cortos si suif
cuerpo es simplemente una tarea.m=c>m?m:c
debería serm=c>m?c:m
. Y si agrega la sugerencia de @ Armin, obtendrá 92 bytes, ¡casi la mitad del tamaño!int a(int[] j){int c=2,m=2,i=0;for(;i++<j.Length;){c=j[i]>j[i-1]?c+1:2;m=c>m?c:m;}return m;}
J , 19 bytes
Pruébalo en línea!
Se ejecuta en O (n log n) , utilizando un orden de paciencia modificado ya que solo se necesita la longitud, no la subsecuencia real.
Explicación
fuente
Bash + coreutils, 131 bytes
Esta solución falla horriblemente en el requisito de manera oportuna , y ni siquiera es particularmente corta, pero me gustó que este tipo de cosas sea al menos teóricamente posible en el script de shell, por lo que estoy publicando de todos modos. Esto funciona con una complejidad de tiempo que induce la eternidad de O (2 ^ n).
La entrada es una lista separada por comas que se pasa como un único argumento de línea de comandos:
La expansión de llaves se usa para construir la lista de todas las subsecuencias posibles.
,:},{
, que produce una cadena como1,:},{5,:},{7,:},{1,:},{8,:},{4,:},{3,:},{5
{1,:},{5,:},{7,:},{1,:},{8,:},{4,:},{3,:},{5,:}
. Esta es una expansión válida de llaves, que cuando seeval
edita con unecho
produce esta lista separada por espacios1,5,7,1,8,4,3,5 1,5,7,1,8,4,3,: 1,5,7,1,8,4,:,5 1,5,7,1,8,4,:,: ...
sort -C
para probar el orden creciente, y si es así, utilizamoswc -w
para imprimir la longitud de la listafuente
Stax , 21 bytes
Ejecutar y depurarlo
Esto tiene dos casos de prueba, uno de los cuales es el caso de 1000 elementos. Se ejecuta ese en 24 segundos en mi máquina. Utiliza el enfoque clásico de programación dinámica para este tipo de problema.
fuente
J 34
Tenga en cuenta que también leo la entrada estándar.
Sin leer la entrada estándar, la carne tiene 26 caracteres.
Acabo de notar que el mío corre lento para una gran entrada, oh bueno.
fuente
C ++ (gcc) , 129 bytes
Pruébalo en línea!
fuente
C # (.NET Core) , 155 bytes
Usó una matriz para calcular la subsecuencia creciente más larga que termina en cada posición en la matriz de entrada (programación dinámica), luego devolvió el valor más grande. Por ejemplo, la matriz calculada para la entrada
[1,5,7,1,8,4,3,5]
sería[1,2,3,1,4,2,2,3]
, y4
se devuelve el valor más grande .Pruébalo en línea!
fuente
Wolfram Language (Mathematica) , 38 bytes
Pruébalo en línea!
Por supuesto, hay un Mathematica incorporado para encontrar secuencias ordenadas más largas. Su nombre es muy largo: constituye más de la mitad de la solución, y no me sorprendería si alguien supera esta solución.
fuente