Definição de problema
Imprima o conjunto de potência de um determinado conjunto. Por exemplo:
[1, 2, 3] => [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
Cada elemento deve ser impresso em uma linha separada, portanto, o exemplo acima seria impresso como:
[]
[1]
[2]
...
[1, 2, 3]
Código de exemplo (em D, exemplo de python aqui ):
import std.stdio;
string[][] powerset(string[] set) {
if (set.length == 1) {
return [set, []];
}
string[][] ret;
foreach (item; powerset(set[1 .. $])) {
ret ~= set[0]~item;
ret ~= item;
}
return ret;
}
void main(string[] argv) {
foreach (set; powerset(argv[1 .. $]))
writeln(set);
}
Entrada
Os elementos serão passados como argumentos. Por exemplo, o exemplo fornecido acima seria passado para um programa chamado powerset
como:
powerset 1 2 3
Os argumentos serão alfanuméricos.
Regras
- Nenhuma biblioteca além de io
- A saída não precisa ser solicitada
- O Powerset não precisa ser armazenado, apenas impresso
- Os elementos do conjunto devem ser delimitados (por exemplo
1,2,3
,[1,2,3]
e['1','2','3']
são aceitáveis, mas123
não são- Delimitadores à direita são bons (por exemplo
1,2,3, == 1,2,3
)
- Delimitadores à direita são bons (por exemplo
- O melhor é determinado com base no número de bytes
A melhor solução será decidida pelo menos 10 dias após o primeiro envio.
code-golf
array-manipulation
combinatorics
beatgammit
fonte
fonte
lambda L:reduce(lambda r,x:r+[s+[x]for s in r],L,[[]])
.Respostas:
Mathematica 16
Código
Subsets
é nativo do Mathematica.O código (sem coluna) pode ser verificado no WolframAlpha . (Eu tive que usar colchetes em vez de
@
; eles significam a mesma coisa.Uso
Este método (55 caracteres) usa a abordagem sugerida por @ w0lf.
Demolir
Gere as tuplas, compostas por
0
e1
de comprimentoLength[s]
Multiplique a lista original (vetor) por cada tupla:
Exclua os
0
.%
é uma abreviação de "a saída anterior".% /. {0:> Sequência []}
Exibir na coluna:
fonte
s
a entrada e colocar a entrada no final da linha?Subsets/*Column
cria uma função anônima que pega uma lista e retorna a exibição em colunas.C,
118115Embora possa economizar aproximadamente 20 caracteres com formatação mais simples, ainda assim não será possível ganhar em termos de código de golfe.
Teste:
fonte
main(a,s)char**s;{...}
)f|=x&1<<i&&printf
é menor que?:
.x+=2
(e para onde fois[0]
). Truque muito bom.GolfScript,
2218 caracteresOutra tentativa no GolfScript com um algoritmo completamente diferente. O formato de entrada é o mesmo da resposta de w0lf. ( teste online )
fonte
GolfScript (43 caracteres)
Isso pode parecer bastante longo, mas é a primeira solução a seguir a especificação: a entrada é proveniente de argumentos da linha de comando e a saída é delimitada por nova linha.
Por exemplo
fonte
awk (82)
suponha que seja salvo no arquivo powerset.awk, use
ps se o seu awk não tiver a função e (), substitua-o por,
int(i/(2^j))%2
mas acrescente dois à contagem.fonte
(2^j)
->2^j
economiza 2 bytes; o.awk
arquivo também funciona sem rastro\n
, para que você possa cortar outro byte.JavaScript, 98
Infelizmente, um bom pedaço é gasto na formatação da saída.
Entrada
Toma uma matriz JavaScript. (por exemplo, [1,2,3])
Saída
fonte
Python (
7470 caracteres)para entrada como
1,2,3
ou[1,2,3]
, a saída é:fonte
[a[0]]
=a[:1]
1,2,3
a[:1]
não funciona. tupla + lista não permitida. Existe melhor soluçãoi,*a=a
i,*a=a
Python 3? Não funciona no meu 2.7.1.Python
7067 bytesA entrada é feita da mesma maneira que na solução da ugoren . E / S de amostra:
fonte
def p(a,*v)
e depoisp(a[i:],n,*v)
. A saída se torna um pouco mais feia, mas ainda está OK.J, 19 caracteres
O boxe ascii na saída é chamado
boxing
e fornece coleta de heterogênio (para diferentes comprimentos de matrizes aqui).fonte
Golfscript 48
Este programa usa as representações binárias de números de 0 a comprimento (entrada) para gerar itens do conjunto de energia.
Entrada
O formato de entrada é do formato de matriz Golfscript (exemplo:
[1 2 3]
)Saída
A saída é uma coleção de matrizes separadas por novas linhas, representando o conjunto de energia. Exemplo:
Teste Online
O programa pode ser testado online aqui .
fonte
Haskell (96)
Se a importação
Control.Monad
não for permitida, isso se tornará 100 caracteres:fonte
Mathematica 53
fonte
APL (26)
Lê a entrada do teclado porque não há
argv
equivalente.Uso:
Explicação:
T←⎕
: ler entrada, armazenar emT
M←⍴T
: tamanho da lojaT
emM
(M/2)⊤⍳2*M
: gerar os padrões de bits para usar1
até bits.2^M
M
↓⍉
: divida a matriz para que cada padrão de bit seja separado(/∘T)¨
: para cada padrão de bit, selecione os subitens deT
.↑⍕¨
: para saída, obtenha a representação de seqüência de caracteres de cada elemento (para que seja preenchida usando espaços em branco e não zeros) e formate como uma matriz (para que cada elemento esteja em sua própria linha).fonte
Scala, 81
fonte
JavaScript ( ES6 ) 76
Parcialmente copiado deste: /codegolf//a/51502/21348
Usando um bitmap, ele fica limitado a não mais que 32 elementos.
Execute o trecho no Firefox para testar.
fonte
C # 164
Cara, isso é difícil em c #!
fonte
Python 2, 64 bytes
Usando entrada separada por vírgula:
Pitão, 4 bytes (usando embutido) ou 14 bytes (sem)
Como observado por @Jakube nos comentários, Pyth é muito recente para esta pergunta. Ainda assim, aqui está uma solução usando o operador powerset embutido do Pyth:
E aqui está um sem ele:
Você pode tentar as duas soluções aqui e aqui . Aqui está uma explicação da segunda solução:
fonte
brainfuck, 94 bytes
Formatado:
Espera a entrada do formulário
9,10,11
sem uma nova linha à direita e gera subconjuntos no mesmo formato, às vezes com uma vírgula à direita. A primeira linha impressa estará sempre vazia, significando o conjunto vazio.Experimente online.
A idéia básica é colocar um pouco ao lado de cada elemento e incrementar repetidamente o número binário enquanto imprime o subconjunto correspondente antes de cada incremento. (Um bit indica se um elemento está no subconjunto.) Um bit sentinela à esquerda da matriz é usado para finalizar o programa. Esta versão realmente cria um número exponencial de sentinelas para salvar alguns bytes; uma solução mais eficiente de 99 bytes que usa apenas um sentinela pode ser encontrada no histórico de revisões.
Cada bit é codificado como um mais seu valor; ou seja, pode ser um
1
ou2
. A fita é disposta com o bit antes de cada elemento e uma única célula zero entre os elementos adjacentes. A vírgula está incluída na fita para elementos não finais, para que possamos convenientemente apenas imprimir elementos sem fazer nenhum trabalho extra para manipular delimitadores.fonte
APL (Dyalog Classic) , 13 bytes
Experimente online!
Saída:
Há uma linha em branco no final para representar o conjunto vazio.
Explicação:
⎕
entrada avaliada⎕,¨⊂⊂⍬
anexar uma lista numérica vazia após cada elemento∘.,
produto cartesiano/
redução (foldr)⊃
divulgar (necessário após redução no APL)Nesse ponto, o resultado é uma matriz n-dimensional de 2 por -...- por-2, em que n é o comprimento da entrada.
,
achatar em um vetor⍪
transforme o vetor em uma matriz vertical de 2 n por 1, para que cada subconjunto esteja em uma linha separadafonte
Haskell ,
8078 bytesExperimente online!
fonte
Gelatina , 6 bytes
Experimente online!
ŒṘ€Y
são formatação de string.fonte
Python,
9387 caracteresO Python simplifica a formatação, porque a entrada / saída necessária corresponde ao seu formato nativo.
Suporta apenas itens que são literais em Python (por exemplo
1,2,'hello'
, não1,2,hello
).Lê entrada padrão, não parâmetros.
fonte
print f(input())
mais curtolist
pode realmente ser removido (se também replacinf[[]]
com[()]
.print'\n'.join(f(input()))
salva dois personagensf()
contém tuplas, não seqüências de caracteres.Ruby, 39
fonte
Haskell 89 chars
A obtenção de parâmetros é longa: /
fonte
map(x:)(p y)++p y
e mais dois caracteres acima disso com[(x:),id]<*>p y
. Aparentemente,<*>
está no prelúdio agora. (filterM
não é).R, 63
Aqui,
v
representa um vetor.Uso :
fonte
K, 14 bytes
Gere todos os vetores 0/1 desde a entrada, reúna os índices de 1s e use-os para selecionar elementos do vetor de entrada. Na prática:
Isso é um pouco liberal com os requisitos de saída, mas acho que é legal. A parte mais questionável é que o conjunto vazio será representado em uma forma dependente do tipo;
!0
é como K denota um vetor numérico vazio:Explicação
O
(#x)#2
constrói um vector de2
tão longa como a de entrada:Quando a monádica
!
é aplicada a um vetor, é "odômetro":Em seguida, usamos "where" (
&
) em cada'
vetor ( ) para reunir seus índices. O cólon é necessário para desambiguar entre a forma monádica e diádica de&
:Se apenas quiséssemos vetores de combinação, estaríamos prontos, mas precisamos usá-los como índices no conjunto original. Felizmente, o operador de indexação de K
@
pode aceitar uma estrutura complexa de índices e produzirá um resultado com a mesma forma:Elegante, não?
fonte
{x@&:'+!(#x)#2}
. Não relacionado: um equivalente mais curto de(#x)#2
é2|~x
.Mathematica, 51
Mais trapaça:
Use com
@{1,2,3}
.fonte
JavaScript (ES6), 68 bytes
Demo
Mostrar snippet de código
fonte
alert
?Braquilog , 4 bytes
Experimente online!
fonte
Combinação de método Ruby Array (de 1.9) [50 caracteres]
fonte