Dada uma lista não vazia de números inteiros, imprima todas as partições possíveis da lista em que cada partição é uma sublist não vazia.
Portanto, para a lista, [1, 2, 3, 4]
o resultado é:
[[1, 2, 3, 4]]
[[1, 2, 3], [4]]
[[1, 2], [3, 4]]
[[1, 2], [3], [4]]
[[1], [2, 3, 4]]
[[1], [2, 3], [4]]
[[1], [2], [3, 4]]
[[1], [2], [3], [4]]
A ordem das listas na saída não importa; portanto, [[1, 2, 3, 4]]
pode ser o primeiro, o último ou o local. A ordem dos elementos deve ser preservada.
Isso é código-golfe, então a resposta mais curta vence.
Relacionado: Particionar uma lista!
[...]
no formato de saída? (Enquanto as partições são claramente separadas, por exemplo, por linefeeds.):
como separador de lista, mas na saída as próprias partições não são agrupadas em um par adicional de[...]
.[
e o último]
de cada linha?Respostas:
Gelatina , 2 bytes
Experimente online!
fonte
Retina ,
2719 bytesA contagem de bytes assume a codificação ISO 8859-1.
Experimente online!
Explicação
Obviamente, isso calcula todas as partições usando o processamento de strings. A idéia básica é que podemos gerar todas as partições decidindo para cada uma
,
individualmente se queremos ou não dividir a lista lá. Esse tipo de coisa pode ser feito no Retina, combinando cada um,
por vez e usando uma substituição que fornece as duas saídas possíveis.A entrada atua como o caso base: a partição em que todos os elementos ainda estão em uma única lista.
Agora
+
combinamos repetidamente ( ) a primeira (1
) vírgula (,
), em cada linha (%
) (tratando essa linha como uma sequência separada, que é relevante para$'
e `` $ 1 `'na substituição).Essa vírgula é substituída por:
Lembre-se de que tudo à frente da partida e depois da partida permanece na sequência de qualquer maneira, portanto o resultado completo é o
$`;$'¶$`];[$'
que explica por que inserimos o sufixo e o prefixo nessa ordem.Esse loop é interrompido quando todas as vírgulas desaparecem.
Por fim, substitua os pontos e vírgulas por vírgulas novamente para corresponder ao formato de entrada.
fonte
Pure Bash, 28
Aqui, as listas são separadas por dois pontos e contidas entre colchetes. Por exemplo, na pergunta, a lista de entrada seria
1:2:3:4
e a saída é:Experimente online .
${1//:/REPLACEMENT}
substitui os dois pontos$1
por{:,]:[\}
[1{:,]:[}2{:,]:[}3{:,]:[}4]
\
escapes cuidadosas ) faz com que a expansão da braçadeira aconteça por último e forneça o resultado desejado.Se for necessário corresponder exatamente ao
[[ , , ...]]
formato fornecido , podemos fazer isso:Pure Bash, 47
Experimente online .
fonte
Pitão , 2 bytes
Com entrada
[1, 2, 3, 4]
(por exemplo).Explicação :
./
é o operador de partição. Retorna todas as divisões da lista de entrada em sub-listas disjuntas. A entrada é implicitamente fornecida ao programa.Teste online!
fonte
05AB1E , 5 bytes
Experimente online!
fonte
.œ
:: Experimente online.Python 3 ,
827266 bytesExperimente online!
-5 bytes graças a @JonathanAllan
fonte
l
no finalHaskell ,
595549 bytesExperimente online!
Solução recursiva. Exemplo de uso:
p [1,2,3]
retorna[[[1,2,3]],[[1,2],[3]],[[1],[2,3]],[[1],[2],[3]]]
.-6 bytes graças ao xnor !
fonte
do a:b<-p r;[(x:a):b,[x]:a:b]
(isso altera a ordem das listas).<*>
faz exatamente o que você deseja[\(a:b)->(x:a):b,([x]:)]<*>p r
, embora seja mais longo do quedo
porque o primeiro lambda parece precisar de uma correspondência de padrão.J , 42 bytes
Gera todas as partições da sub-lista criando as chaves para sublistas da partição de comprimento 1 e repetindo para o comprimento da lista de entrada. Cada sub-lista de partições é formada selecionando-se as teclas.
Por exemplo, aqui está o processo de criação das chaves para uma lista de tamanho 4.
Experimente online!
fonte
J ,
26bytes 24Experimente online!
fonte
Braquilog , 2 bytes
Experimente online!
Envio de função que produz saída via atuando como gerador. (O link TIO contém código extra para transformá-lo em um programa completo, para fins de teste.)
Aliás, embora não seja tecnicamente um builtin, isso é tão comumente usado no Brachylog que: a) provavelmente merece uma representação de byte eb; b) o
c
builtin pode usar um parâmetro para fazer afirmações sobre sua entrada (enquanto que na maioria dos builtins, um parâmetro fala sobre como produzir a saída ).Explicação
fonte
APL, 26 bytes
Teste:
Explicação:
X←⍴1↓⍵
:X
é o comprimento de⍵
(a lista de entrada) com seu primeiro elemento descartado⍳2*X
: os números [1..2 ^ X](X⍴2)⊤
: representação de base 2 desses números, comX
posições (ou seja,X
ela própria será enrolada em torno de0
).↓⍉
: gire a matriz e divida-a ao longo das linhas (⊤
fornece como resultado uma matriz com os números ao longo das colunas), fornecendo uma matriz de vetores de bits1,¨
: acrescente 1 a cada vetor de bit.⊂∘⍵¨
: para cada vetor de bit, divida⍵
a cada 1.fonte
Haskell , 45 bytes
Experimente online!
Encontrei esta solução há algum tempo, pensando em uma dica de Haskell .
fonte
Python , 90 bytes
superado por ovs (fazendo algo que eu pensei que tinha tentado trabalhar: p)
Uma função recursiva que cria a lista de partições a partir de fatias da entrada com a cauda alcançada quando as fatias têm o comprimento 1.
Experimente online!
Ele
exec
salva 4 bytes em umwhile
ou 3 em umfor
loop (abaixo), pois significa apenas dois\n
s em vez de dois níveis de indentação, permitindo que toda a função esteja em uma linha (enquanto a ordem da fatia não importa).fonte
Python 3 , 67 bytes
Experimente online!
fonte
Haskell, 59 bytes
fonte
Ruby ,
6257 bytesExperimente online!
Como funciona:
fonte
JavaScript (ES6), 87 bytes
Explicação:
b
é a lista de sublistas anteriores,c
é a sub-lista atual (que começa como o primeiro elemento da matriz, pois deve estar na primeira sub-lista), enquantod
é a lista de todas as sublistas. O restante dos elementos da matriz é processado recursivamente. Em cada caso, há duas opções: o próximo elemento é anexado à sub-lista atual ou a sub-lista atual é concluída e o próximo elemento inicia uma nova sub-lista. Os resultados recursivos são então concatenados juntos. Quando a matriz está esgotada, a lista da lista de todas as sublistas é o resultado.fonte
APL (NARS) 38 caracteres, 76 bytes
isso usa a função Nars 11 1kk, mas é muito lenta, inutilizável para arg array de 9 elementos já ...
isto abaixo é a função que não usa o incorporado:
nós vemos o tipo de cada resultado:
Não sei como funciona, é apenas uma tentativa heurística ...
Possível cometer algum erro; ambas as funções constroem as partições da lista independentemente da entrada e não apenas 1 2 ... n.
fonte
Axioma, 251 bytes
Se alguém encontrar algo melhor ... ungof e teste:
Se houver muito espaço, diga isso e eu removo exemplos ...
fonte