Definición del problema
Imprima el conjunto de potencia de un conjunto dado. Por ejemplo:
[1, 2, 3] => [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
Cada elemento debe imprimirse en una línea separada, por lo que el ejemplo anterior se imprimirá como:
[]
[1]
[2]
...
[1, 2, 3]
Código de ejemplo (en D, ejemplo de python aquí ):
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
Los elementos se pasarán como argumentos. Por ejemplo, el ejemplo proporcionado anteriormente se pasaría a un programa llamado powerset
como:
powerset 1 2 3
Los argumentos serán alfanuméricos.
Reglas
- No hay bibliotecas además de io
- La salida no tiene que ser ordenada
- Powerset no tiene que ser almacenado, solo impreso
- Los elementos del conjunto deben estar delimitados (por ejemplo
1,2,3
,[1,2,3]
y['1','2','3']
son aceptables, pero123
no lo son- Los delimitadores finales están bien (p
1,2,3, == 1,2,3
. Ej. )
- Los delimitadores finales están bien (p
- El mejor se determina en función del número de bytes
La mejor solución se decidirá no menos de 10 días después de la primera presentación.
code-golf
array-manipulation
combinatorics
beatgammit
fuente
fuente
lambda L:reduce(lambda r,x:r+[s+[x]for s in r],L,[[]])
.Respuestas:
Mathematica 16
Código
Subsets
Es nativo de Mathematica.El código (sin columna) se puede verificar en WolframAlpha . (Tuve que usar corchetes en lugar de
@
; significan lo mismo.Uso
Este método (55 caracteres) utiliza el enfoque sugerido por @ w0lf.
Descompostura
Genera las tuplas, compuestas de
0
y1
's de longitudLength[s]
Multiplique la lista original (vector) por cada tupla:
Eliminar los
0
's.%
es la abreviatura de "la salida anterior".% /. {0:> Secuencia []}
Mostrar en columna:
fuente
s
y poner la entrada al final de la línea?Subsets/*Column
crea una función anónima que toma una lista y devuelve la visualización en columnas.C,
118115Si bien puede guardar aproximadamente 20 caracteres con un formato más simple, de todos modos no va a ganar en términos de código de golf.
Pruebas:
fuente
main(a,s)char**s;{...}
),f|=x&1<<i&&printf
es más corto que?:
.x+=2
(y dónde fues[0]
). Muy buen truco.GolfScript,
2218 caracteresOtro intento en GolfScript con un algoritmo completamente diferente. El formato de entrada es el mismo que con la respuesta de w0lf. ( prueba en línea )
fuente
GolfScript (43 caracteres)
Esto puede parecer bastante largo, pero es la primera solución para seguir la especificación: la entrada proviene de argumentos de la línea de comandos y la salida está delimitada por una nueva línea.
P.ej
fuente
awk (82)
asumir guardado en el archivo powerset.awk, uso
ps si su awk no tiene la función y (), reemplácela con
int(i/(2^j))%2
pero agrega dos a la cuenta.fuente
(2^j)
->2^j
te ahorra 2 bytes; el.awk
archivo también funciona sin un final\n
, por lo que puede eliminar otro byte.JavaScript, 98
Lamentablemente, se gasta una buena parte en el formato de salida.
Entrada
Toma una matriz de JavaScript. (por ejemplo, [1,2,3])
Salida
fuente
Python (
7470 caracteres)para entrada como
1,2,3
o[1,2,3]
, la salida es:fuente
[a[0]]
=a[:1]
1,2,3
a[:1]
no funciona. tupla + lista no permitida. Existe una mejor solucióni,*a=a
i,*a=a
Python 3? No funciona en mi 2.7.1.Python
7067 bytesLa entrada se toma de la misma manera que para la solución de ugoren . Muestra de E / S:
fuente
def p(a,*v)
y luegop(a[i:],n,*v)
. La salida se vuelve algo más fea, pero aún así está bien.J, 19 caracteres
El boxeo ascii en la salida se llama
boxing
y proporciona una colección heterogénea (para diferentes longitudes de matrices aquí).fuente
Golfscript 48
Este programa utiliza las representaciones binarias de números del 0 al largo (entrada) para generar elementos de conjunto de potencia.
Entrada
El formato de entrada es la Golfscript formato de matriz (ejemplo:
[1 2 3]
)Salida
La salida es una colección de matrices separadas por líneas nuevas, que representan el conjunto de potencia. Ejemplo:
Prueba en línea
El programa se puede probar en línea aquí .
fuente
Haskell (96)
Si
Control.Monad
no se permite importar , esto se convierte en 100 caracteres:fuente
Mathematica 53
fuente
APL (26)
Lee la entrada del teclado porque no hay
argv
equivalente.Uso:
Explicación:
T←⎕
: leer entrada, almacenar enT
M←⍴T
: longitud de la tienda deT
enM
(M/2)⊤⍳2*M
: genera los patrones de bits para usar1
hasta2^M
M
bits.↓⍉
: divide la matriz para que cada patrón de bits esté separado(/∘T)¨
: para cada patrón de bits, seleccione los subelementos deT
.↑⍕¨
: para la salida, obtenga la representación de cadena de cada elemento (para que se llene usando espacios en blanco y no ceros), y formatee como una matriz (para que cada elemento esté en su propia línea).fuente
Scala, 81
fuente
JavaScript ( ES6 ) 76
Parcialmente copiado de este: /codegolf//a/51502/21348
Usando un mapa de bits, por lo que está limitado a no más de 32 elementos.
Ejecute el fragmento en Firefox para probar.
fuente
C # 164
Hombre, esto es difícil en C #!
fuente
Python 2, 64 bytes
Usando una entrada separada por comas:
Pyth, 4 bytes (usando incorporado) o 14 bytes (sin)
Como señaló @Jakube en los comentarios, Pyth es demasiado reciente para esta pregunta. Aún así, aquí hay una solución que utiliza el operador de conjunto de potencia incorporado de Pyth:
Y aquí hay uno sin él:
Puedes probar ambas soluciones aquí y aquí . Aquí hay una explicación de la segunda solución:
fuente
brainfuck, 94 bytes
Formateado:
Espera la entrada del formulario
9,10,11
sin una nueva línea final y genera subconjuntos en el mismo formato, a veces con una coma final. La primera línea impresa siempre estará vacía, lo que significa el conjunto vacío.Pruébalo en línea.
La idea básica es colocar un bit al lado de cada elemento, luego incrementar repetidamente el número binario mientras imprime el subconjunto correspondiente antes de cada incremento. (Un bit indica si un elemento está en el subconjunto). Se utiliza un bit centinela a la izquierda de la matriz para terminar el programa. Esta versión en realidad crea un número exponencial de centinelas para guardar algunos bytes; En el historial de revisiones se puede encontrar una solución más eficiente de 99 bytes que solo usa un centinela.
Cada bit está codificado como uno más su valor; es decir, puede ser
1
o2
. La cinta se presenta con el bit antes de cada elemento y una sola celda cero entre elementos adyacentes. La coma se incluye en la cinta para elementos no finales, por lo que podemos imprimir convenientemente elementos sin hacer ningún trabajo adicional para manejar delimitadores.fuente
APL (Dyalog Classic) , 13 bytes
Pruébalo en línea!
Salida:
Hay una línea en blanco al final para representar el conjunto vacío.
Explicación:
⎕
entrada evaluada⎕,¨⊂⊂⍬
agregar una lista numérica vacía después de cada elemento∘.,
producto cartesiano/
reducción (foldr)⊃
revelar (necesario después de la reducción de APL)En este punto, el resultado es una matriz n-dimensional de 2 por -...- por-2, donde n es la longitud de la entrada.
,
aplanar en un vector⍪
convertir el vector en una matriz vertical 2 n -by-1, de modo que cada subconjunto esté en una línea separadafuente
Haskell ,
8078 bytesPruébalo en línea!
fuente
Jalea , 6 bytes
Pruébalo en línea!
ŒṘ€Y
son formato de cadena.fuente
Python,
9387 caracteresPython simplifica el formateo, porque la entrada / salida requerida coincide con su formato nativo.
Solo admite elementos que son literales de Python (por ejemplo
1,2,'hello'
, no1,2,hello
).Lee entradas estándar, no parámetros.
fuente
print f(input())
más cortolist
tampoco puede ser eliminado (si también replacinf[[]]
con[()]
.print'\n'.join(f(input()))
salva dos personajesf()
contiene tuplas, no cadenas.Ruby, 39
fuente
Haskell 89 caracteres
Obtener parámetros es largo: /
fuente
map(x:)(p y)++p y
y aún dos caracteres más por encima de eso con[(x:),id]<*>p y
. Aparentemente<*>
está en el preludio ahora. (filterM
no es)R, 63
Aquí,
v
representa un vector.Uso :
fuente
K, 14 bytes
Genere todos los vectores 0/1 siempre que la entrada, recopile los índices de 1s y utilícelos para seleccionar elementos del vector de entrada. En la práctica:
Esto es un poco liberal con los requisitos de salida, pero creo que es legal. La parte más cuestionable es que el conjunto vacío se representará en una forma dependiente del tipo;
!0
es cómo K denota un vector numérico vacío:Explicación
El
(#x)#2
construye un vector2
tan largo como la entrada:Cuando
!
se aplica monádico a un vector, es "odómetro":Luego usamos "where" (
&
) en cada ('
) vector para recopilar sus índices. El colon es necesario para desambiguar entre la forma monádica y la diádica de&
:Si solo quisiéramos combinar vectores, estaríamos listos, pero necesitamos usarlos como índices en el conjunto original. Afortunadamente, el operador de indexación de K
@
puede aceptar una estructura compleja de índices y producirá un resultado con la misma forma:Elegante, no?
fuente
{x@&:'+!(#x)#2}
. Sin relación: un equivalente más corto de(#x)#2
is2|~x
.Mathematica, 51
Más trampas:
Usar con
@{1,2,3}
.fuente
JavaScript (ES6), 68 bytes
Manifestación
Mostrar fragmento de código
fuente
alert
?Brachylog , 4 bytes
Pruébalo en línea!
fuente
Combinación de métodos de Ruby Array (desde 1.9) [50 caracteres]
fuente