Llegó el 2019 y probablemente todos hayan notado la peculiaridad de este número: de hecho, está compuesto por dos subnúmeros (20 y 19) que representan una secuencia de números descendentes consecutivos.
Desafío
Dado un número x
, devuelve la longitud de la secuencia máxima de números consecutivos y descendentes que se pueden formar tomando subnúmeros de x
.
Notas:
- sub-números no pueden contener ceros a la izquierda (por ejemplo,
1009
no se puede dividir en10
,09
) - consecutiva y descendente significa que un número en la secuencia debe ser igual al número anterior -1, o (por ejemplo , no se puede dividir en y porque no son consecutivos )
52
5,2
5
2
2 ≠ 5 - 1
- la secuencia debe ser obtenido utilizando el número completo, por ejemplo, en
7321
que no se puede descartar7
y obtener la secuencia3
,2
,1
- sólo una secuencia puede obtenerse a partir del número, por ejemplo,
3211098
no se puede dividir en dos secuencias3
,2
,1
y10
,9
,8
Entrada
- Un número entero (
>= 0
): puede ser un número, una cadena o una lista de dígitos
Salida
- Un número entero dado el número máximo de sub-números decrecientes (tenga en cuenta que el límite inferior de este número es
1
, es decir, un número está compuesto por sí mismo en una secuencia descendente de longitud uno)
Ejemplos:
2019 --> 20,19 --> output : 2
201200199198 --> 201,200,199,198 --> output : 4
3246 --> 3246 --> output : 1
87654 --> 8,7,6,5,4 --> output : 5
123456 --> 123456 --> output : 1
1009998 --> 100,99,98 --> output : 3
100908 --> 100908 --> output : 1
1110987 --> 11,10,9,8,7 --> output : 5
210 --> 2,1,0 --> output : 3
1 --> 1 --> output : 1
0 --> 0 --> output : 1
312 --> 312 --> output : 1
191 --> 191 --> output : 1
Reglas generales:
- Este es el código de golf , por lo que la respuesta más corta en bytes gana.
No permita que los lenguajes de código de golf lo desalienten de publicar respuestas con idiomas que no sean de código. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación. - Las reglas estándar se aplican a su respuesta con las reglas de E / S predeterminadas , por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno. Tu llamada.
- Las lagunas predeterminadas están prohibidas.
- Si es posible, agregue un enlace con una prueba para su código (es decir, TIO ).
- Además, se recomienda agregar una explicación para su respuesta.
210 -> 2,1,0
mal el caso de prueba (lo mismo con0 -> 0
)? La tarea dice "los subnúmeros no pueden contener ceros a la izquierda ", ¿es cero un caso especial?212019
. Parece que no leí todas las reglas.Respuestas:
Jalea ,
159 bytesBugfix gracias a Dennis
Pruébalo en línea! (inclusoO ( N2) )
321
toma medio minuto ya que el código es al menos¿Cómo?
fuente
JavaScript (ES6), 56 bytes
Un puerto de respuesta Python de ArBo es significativamente más corto. Sin embargo, falla en algunos casos de prueba debido a demasiada recursividad.
Pruébalo en línea!
JavaScript (ES6), 66 bytes
Toma la entrada como una cadena.
Pruébalo en línea!
Comentado
fuente
Perl 6 ,
43 4140 bytes-1 byte gracias a nwellnhof
Pruébalo en línea!
Solución basada en expresiones regulares. Estoy tratando de encontrar una mejor manera de hacer coincidir una lista descendente, pero Perl 6 no hace bien las particiones
Explicación:
fuente
Python 3 ,
232228187181180150149 bytes-1 gracias a @ Jonathan Frech
Pruébalo en línea!
Código inicial sin golf:
fuente
s+1 for
puede sers+1for
,(t(n[:j])-t(n[j:j+i])==1)*t(n[0])
posiblemente puede sert(n[:j])-t(n[j:j+i])==1>=t(n[0])
.if
.Python 2 ,
787473 bytesPruébalo en línea!
-1 byte gracias a Arnauld
Toma la entrada como una cadena. El programa se ejecuta rápidamente en el límite de profundidad de recursión de Python, pero puede finalizar la mayoría de los casos de prueba.
Cómo funciona
fuente
a+c+1
se puede acortar aa-~c
.05AB1E , 10 bytes
Extremadamente lento, por lo que el siguiente TIO solo funciona para casos de prueba por debajo de 750 ..
Pruébalo en línea .
Explicación:
fuente
n!
an lg n
simplemente no vale la pena.Pyth, 16 bytes
Pruébelo en línea aquí , o verifique todos los casos de prueba a la vez aquí .
fuente
Jalea , 11 bytes
Pruébalo en línea!
Cómo funciona
fuente
Carbón , 26 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Bucle
i
de 0 a la longitud de la entrada.Bucle
k
de 0 a la longitud de la entrada.Calcule los primeros
k
números en la secuencia descendente comenzando por el número dado por los primerosi
dígitos de la entrada, concatenelos y acumule cada cadena resultante en la lista vacía predefinida.Encuentre la posición de la primera copia coincidente de la entrada y reduzca el módulo 1 más que la longitud de la entrada.
Ejemplo: para una entrada de
2019
las siguientes cadenas se generan:2019
luego se encuentra en el índice 12, que se reduce el módulo 5 para dar 2, la respuesta deseada.fuente
Haskell, 87 bytes
La entrada es una lista de dígitos.
Pruébalo en línea!
La función
#
crea una lista de todas las divisiones posibles al observar ambasa
a todas las divisiones devueltas por una llamada recursiva con el resto de la entrada (x<-b#c
), pero solo si el siguiente número no es cero (b>0
) (o es el último número en la entrada (c==[]
)) ya
es uno mayor que el primero número de la división anterior respectivax
(a==x!!0+1
).y
b
de la lista de entrada al número actuala
y continuar con el resto de la entrada ((10*a+b)#c
)El caso base es cuando la lista de entrada está vacía (es decir, no coincide con el patrón
(b:c)
). La recursión comienza con el número actuala
siendo0
((0#)
), que nunca llega a la primera rama (a
antes de todas las divisiones anteriores), porque nunca será mayor que cualquier número de divisiones.Toma la longitud de cada división y encuentra el máximo (
maximum.map length
).Una variante con también 87 bytes:
que básicamente funciona de la misma manera, pero en lugar de mantener toda la división en una lista, solo mantiene un par
(r,x)
de la longitud de la divisiónr
y el primer número en la divisiónx
.fuente
Python 3 ,
302282271 bytes-10 bytes gracias al consejo de @ElPedro.
Toma la entrada como una cadena. Básicamente, se necesitan segmentos cada vez mayores del número desde la izquierda, y ve si para ese segmento del número se puede formar una secuencia utilizando todos los números.
Pruébalo en línea!
fuente
range
3 veces, puede definirR=range
fuera de ambas funciones y luego usar enR(whatever)
lugar derange(whatever)
guardar 4 bytes.Japt , 27 bytes
Pruébalo en línea! o marque la mayoría de los casos de prueba
Esto no tiene un buen puntaje, pero utiliza un método único y puede haber espacio para jugarlo mucho más. También funciona lo suficientemente bien como para que todos los casos de prueba que
201200199198
no sean eviten el tiempo de espera.Explicación:
fuente
21201
porque no imponen que el final de la secuencia se alinee correctamente (de mi versión original la línea "termina con una coma"). Esta o esta alternativa funciona.210
porque no hay un delimitador después de 0. Aquí hay un byte fijo de 28 bytes que funciona.Haskell, 65 bytes
La entrada es una cadena.
Pruébalo en línea!
Completamente diferente a mi otra respuesta . Una fuerza bruta simple que prueba todas las listas de números descendentes consecutivos hasta encontrar una que sea igual a la lista de entrada.
Si limitamos el número de entrada de enteros de 64 bits, podemos ahorrar 6 bytes haciendo un bucle
y
a través[1..19]
, ya que el mayor entero de 64 bits tiene 19 dígitos y no hay necesidad de listas de prueba con más elementos.Haskell, 59 bytes
Pruébalo en línea!
fuente
Python 2 , 95 bytes
Otra solución lenta de fuerza bruta.
Pruébalo en línea!
fuente
Dyalog APL, 138 bytes
Un poco bocado, pero también funciona rápido para grandes números. Si lo prueba en línea , ponga el prefijo dfn en
⎕←
y proporcione la entrada a la derecha como una lista de dígitos.Explicación
Primero, el dfn interno a la derecha que construye recursivamente una lista de posibles formas de particionar (con
⊂
) la lista de dígitos. Por ejemplo,1 0 1 0 ⊂ 2 0 1 9
devuelve el vector anidado(2 0)(1 9)
.Usamos
1,
para agregar una columna de 1s al comienzo y terminar con una matriz de particiones válidas para ⍵.Ahora la función se entrena a la izquierda en parens. Debido al
⍨
argumento izquierdo para el tren es la fila de la matriz de particiones y el argumento derecho es la entrada del usuario. El tren es un montón de horquillas con una cima como el diente izquierdo.Si la partición crea una secuencia de números descendentes, el tren devuelve la longitud de la secuencia. De lo contrario cero.
⍤1⊢
aplica el tren de funciones entre la entrada del usuario y cada fila de la matriz de particiones, devolviendo un valor para cada fila de la matriz.⊢
es necesario desambiguar entre operando⍤
y argumento a la función derivada de⍤
.⌈/
encuentra el máximo.Podría encontrar un algoritmo más corto, pero quería probar de esta manera, que es lo más directo y declarativo que se me ocurre.
fuente
TSQL, 169 bytes
Nota: esto solo se puede ejecutar cuando la entrada se puede convertir a un entero.
SQL recursivo utilizado para bucle.
Golfizado:
Sin golf:
Pruébalo
fuente
R , 101 bytes
Pruébalo en línea!
Han pasado más de 2 semanas sin ninguna respuesta R, así que decidí publicar la mía :)
El código es bastante rápido ya que utiliza un enfoque de fuerza bruta "limitado"
Código desenrollado y explicación:
fuente