O desafio é realmente simples: dado um número, você divide seus dígitos em uma matriz de números menores, de forma que os números resultantes não diminuem. O problema é que você precisa dividi-lo para que o comprimento da matriz seja o máximo.
Confuso?
- Você recebe um número inteiro positivo via STDIN (ou alternativa mais próxima), argumento de linha de comando ou argumento de função em qualquer formato de entrada conveniente e inequívoco.
- Você precisa particionar os dígitos decimais do número em grupos contíguos e independentes.
- A matriz de números representada por esses grupos de dígitos deve ser classificada (na ordem habitual e não decrescente) sem reorganizar os grupos .
- Nos casos em que existe mais de uma partição, é necessário particionar a entrada no maior número possível. No caso de empate, retorne um desses resultados.
- Você pode enviar a matriz para STDOUT (ou alternativa mais próxima) ou como um valor de retorno da função. No caso de STDOUT (ou alternativa mais próxima), a matriz deve ser impressa em qualquer formato de lista conveniente e inequívoco.
- Os números de divisão não devem ter zeros à esquerda. Assim, por exemplo,
1002003
não pode ser impresso como um e[1, 002, 003]
nem[1, 2, 3]
a única resposta válida para isso[100, 2003]
.
Casos de teste:
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]
Pontuação
Este é o código-golfe, pelo que o código mais curto em bytes vence.
code-golf
number
combinatorics
set-partitions
Optimizer
fonte
fonte
aY
vez de~Y]
a
. Não sei porque.int("01")
ser um erro no Pyth (isso não acontece no Python).n
é o comprimento da entrada.Mathematica,
134127 bytesIsso é bastante ineficiente, pois gera muito mais partições do que as válidas. O
324142434445
caso de teste é executado em alguns segundos, mas eu não tentaria12345678901234567890
.Isso define uma função sem nome que pega um número inteiro e retorna uma lista de números inteiros.
Explicação
A ordem de leitura deste código está um pouco em todo o lugar, portanto, detalharei a ordem em que ele deve ser lido (e avaliado na maior parte):
d=IntegerDigits@#
obtenha os dígitos decimais da entrada e atribua esta lista ad
.SetPartitions
(o que requerNeeds@"Combinatorica`";
) me fornece todas as partições disso. No entanto, ele retorna muito mais do que eu realmente quero, pois trata a entrada como um conjunto . É isso que o torna ineficiente, mas estou usando isso porque a maneira mais curta que eu conheço para obter todas as partições de lista é muito mais longa. Como exemplo, se a lista fosse{1, 2, 3}
a função retornaria:Observe que a) as partições consecutivas estão na ordem correta eb) as partições são classificadas da mais grossa para a mais fina.
Select[...,...&]
depois filtra essa lista pela função anônima transmitida como o segundo argumento.Join @@ # == d
verifica se realmente temos uma partição de lista em vez de uma partição geral definida.#~FreeQ~{0, __}
verifica se nenhuma partição começa com um zero inicial.0 <= ## & @@ f /@ #
é um pouco mais obscuro. Primeiro, mapeamosFromDigits
para cada lista na partição para recuperar os números representados pelos dígitos. Então aplicamos0 <= ##
a esses números, onde##
se refere a todos os números. Se a partição for{1, 23, 45}
expandida para0 <= 1 <= 23 <= 45
, verificará se a matriz está classificada.Last@
depois me fornece a última partição que resta após a filtragem - isso funciona porqueSetPartitions
já classificamos as partições, de modo que as melhores estão no final.f/@
recupera os números das listas de dígitos.fonte
Python 3, 134 bytes
Está um pouco bagunçado, mas tudo bem. O programa apenas gera todas as partições válidas recursivamente. A parte interessante é que, para não permitir zeros à esquerda, tudo o que era necessário era uma
or "1">s[i:]>""
condição adicional .Toma entrada como
f("12345678901234567890")
e retorna uma lista de entradas.fonte
Pyth,
626160Explicação
O algoritmo funciona gerando todos os números binários entre
0
(inclusive) e2^(n-1)
(exclusivo), onden
é o comprimento da entrada.Os dígitos binários de cada um são mapeados para um separador (
N
) para 1 e nada para 0.Esses caracteres são inseridos entre cada caractere de entrada e o resultado é dividido por
N
, produzindo uma lista.Os valores nas listas são então analisados para números inteiros e as listas são classificadas por tamanho. Tudo o que resta é filtrar os não classificados e os que foram divididos nos zeros à esquerda, depois dos quais a lista mais longa é selecionada.
fonte
Python (NÃO COMPETENTE), 25 bytes
Experimente online!
Como funciona:
fonte
J, 109 bytes
Muito longo, mas pelo menos ocupa memória O (n * (2n)!) E tempo O (n * log (n) * (2n)!) Em que n é o comprimento da entrada. (Portanto, não tente executá-lo com mais de 5 dígitos.)
A função aceita a entrada como uma sequência.
Exemplos:
Método:
fonte
Haskell, 161 bytes
Execução de teste:
Como funciona: a função auxiliar
f
divide a lista de entradas em todas as listas possíveis de sublistas.g
primeiro descarta aqueles com uma sub-lista começando com0
e depois sem a ordem correta. Emparelhe todas as listas restantes com o seu comprimento, tome o máximo e descarte a parte do comprimento novamente.fonte