El desafío es realmente simple: dado un número, se dividen sus dígitos en una matriz de números más pequeños de modo que los números resultantes no disminuyan. El problema es que debe dividirlo de modo que la longitud de la matriz sea máxima.
¿Confuso?
- Se le da un número entero positivo a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función en cualquier formato de entrada conveniente y sin ambigüedades.
- Debe dividir los dígitos decimales del número en grupos contiguos y disjuntos.
- La matriz de números representados por estos grupos de dígitos debe ordenarse (en el orden habitual, no decreciente) sin reorganizar los grupos .
- En los casos en que exista más de una de estas particiones, debe dividir la entrada en tantos números como sea posible. En caso de empate, devuelva uno de esos resultados.
- Puede enviar la matriz a STDOUT (o la alternativa más cercana) o como un valor de retorno de función. En el caso de STDOUT (o la alternativa más cercana), la matriz debe imprimirse en cualquier formato de lista conveniente y sin ambigüedades.
- Los números divididos no deben tener ceros a la izquierda. Entonces, por ejemplo
1002003
, no se puede imprimir como o[1, 002, 003]
o[1, 2, 3]
y la única respuesta válida es[100, 2003]
.
Casos de prueba:
123456 -> [1, 2, 3, 4, 5, 6]
345823 -> [3, 4, 5, 8, 23]
12345678901234567890 -> [1, 2, 3, 4, 5, 6, 7, 8, 90, 123, 456, 7890]
102 -> [102]
302 -> [302]
324142 -> [3, 24, 142] OR [32, 41, 42]
324142434445 -> [32, 41, 42, 43, 44, 45]
1356531 -> [1, 3, 5, 6, 531]
11121111111 -> [1, 1, 1, 2, 11, 11, 111]
100202003 -> [100, 202003]
Puntuación
Este es el código de golf, por lo que el código más corto en bytes gana.
fuente
aY
lugar de~Y]
a
. No se porque.int("01")
era un error en Pyth (esto no sucede en Python).n
es la longitud de la entrada.Mathematica,
134127 bytesEsto es bastante ineficiente ya que genera muchas más particiones que las válidas. El
324142434445
caso de prueba se ejecuta en unos pocos segundos, pero no lo intentaría12345678901234567890
.Esto define una función sin nombre que toma un entero y devuelve una lista de enteros.
Explicación
El orden de lectura de este código está un poco por todas partes, por lo que me desglosaré en el orden en que está destinado a ser leído (y evaluado en su mayor parte):
d=IntegerDigits@#
obtenga los dígitos decimales de la entrada y asigne esta lista ad
.SetPartitions
(que requiereNeeds@"Combinatorica`";
) me da todas las particiones de esto. Sin embargo, devuelve mucho más de lo que realmente quiero, ya que trata la entrada como un conjunto . Esto es lo que lo hace ineficiente, pero lo estoy usando porque la forma más corta que conozco para obtener todas las particiones de la lista es mucho más larga. Como ejemplo, si la lista fuera{1, 2, 3}
la función devolvería:Tenga en cuenta que a) las particiones consecutivas están todas en el orden correcto yb) las particiones se ordenan de la más gruesa a la más fina.
Select[...,...&]
luego filtra esta lista por la función anónima pasada como segundo argumento.Join @@ # == d
comprueba que realmente tenemos una partición de lista en lugar de una partición de conjunto general.#~FreeQ~{0, __}
comprueba que ninguna partición comience con un cero a la izquierda.0 <= ## & @@ f /@ #
Es un poco más oscuro. Primero asignamosFromDigits
a cada lista en la partición para recuperar los números representados por los dígitos. Luego aplicamos0 <= ##
a esos números, donde se##
refiere a todos los números. Si la partición es{1, 23, 45}
entonces esto se expande a0 <= 1 <= 23 <= 45
, por lo que verifica que la matriz esté ordenada.Last@
luego me da la última partición que queda después del filtrado; esto funciona porqueSetPartitions
ya ordenó las particiones, de modo que las más finas están al final.f/@
recupera los números de las listas de dígitos.fuente
Python 3, 134 bytes
Es un poco desordenado, pero bueno. El programa solo genera todas las particiones válidas de forma recursiva. La parte interesante es que para no permitir los ceros iniciales, todo lo que se necesitaba era una
or "1">s[i:]>""
condición adicional .Toma entrada como
f("12345678901234567890")
y devuelve una lista de entradas.fuente
Pyth
62 626160 60Explicación
El algoritmo funciona generando todos los números binarios entre
0
(inclusivo) y2^(n-1)
(exclusivo), donden
es la longitud de la entrada.Los dígitos binarios de cada uno se asignan a un separador (
N
) para 1 y nada para 0.Estos caracteres luego se insertan entre cada carácter de entrada, y el resultado se divide por
N
, dando una lista.Los valores en las listas se analizan en enteros y las listas se ordenan por longitud. Entonces todo lo que queda es filtrar los que no están ordenados y los que se han dividido en ceros a la izquierda, después de lo cual se selecciona la lista más larga.
fuente
(SIN COMPETENCIA) Pyth, 25 bytes
Pruébalo en línea!
Cómo funciona:
fuente
J, 109 bytes
Muy largo, pero al menos ocupa O (n * (2n)!) Memoria y O (n * log (n) * (2n)!) Tiempo donde n es la longitud de la entrada. (Por lo tanto, no intente ejecutarlo con más de 5 dígitos).
La función toma la entrada como una cadena.
Ejemplos:
Método:
fuente
Haskell, 161 bytes
Prueba de funcionamiento:
Cómo funciona: la función auxiliar
f
divide la lista de entrada en cada lista posible de sublistas.g
primero descarta aquellos con una sublista que comienza con0
y luego aquellos sin el orden adecuado. Empareje cada lista restante con su longitud, tome el máximo y descarte la parte de longitud nuevamente.fuente