| Bytes | Lang | Time | Link |
|---|---|---|---|
| 001 | Nekomata | 230721T091432Z | alephalp |
| 003 | Thunno 2 | 230721T055604Z | The Thon |
| 080 | PostScript | 220523T173226Z | bartysla |
| 031 | Zsh | 190825T034809Z | GammaFun |
| 102 | PHP | 200314T200559Z | Zombo |
| 063 | Python 2 | 210605T064746Z | Wasif |
| 001 | Japt R | 180202T141547Z | Shaggy |
| 067 | Python | 121125T143551Z | primo |
| 001 | Pyth | 191030T232504Z | EdgyNerd |
| 058 | Python 2 | 191003T194500Z | Chas Bro |
| 006 | Jelly | 161220T182050Z | Erik the |
| 002 | 05AB1E | 190306T092204Z | Kevin Cr |
| 078 | PHP | 190306T081628Z | Titus |
| 004 | Brachylog | 190306T041452Z | Unrelate |
| 074 | Python 2 | 130323T133559Z | chyanog |
| 090 | Coconut | 190105T151624Z | Solomon |
| 117 | Common Lisp | 190105T135642Z | Renzo |
| 005 | Japt R | 190103T185411Z | Oliver |
| 078 | Haskell | 180423T065633Z | Angs |
| 022 | Perl 6 | 180423T072241Z | elcaro |
| 013 | APL Dyalog Classic | 180202T170043Z | ngn |
| 068 | JavaScript ES6 | 180202T140743Z | Arnauld |
| 094 | brainfuck | 161220T131734Z | Mitch Sc |
| 082 | awk | 161220T180611Z | karakfa |
| 064 | Python 2 | 150613T101545Z | Uri Gran |
| 046 | Matlab | 150613T104651Z | Abr001am |
| 051 | Mathematica | 150612T121321Z | LogicBre |
| 014 | K | 150612T141523Z | JohnE |
| 164 | C# | 131220T230719Z | Ben Reic |
| 076 | JavaScript ES6 | 150612T135201Z | edc65 |
| 081 | Scala | 131221T000620Z | Dan G |
| 063 | R | 131221T114719Z | Sven Hoh |
| 018 | GolfScript | 121121T155032Z | Howard |
| 026 | APL | 131221T075743Z | marinus |
| 016 | Mathematica | 121121T120118Z | DavidC |
| 089 | Haskell | 130323T140148Z | kyticka |
| 053 | Mathematica | 130323T133051Z | chyanog |
| 039 | Ruby | 130323T121150Z | Lowjacke |
| 019 | J | 130322T040329Z | randomra |
| nan | Ruby Array method combination from 1.9 [50 chars] | 121229T134958Z | beginner |
| 096 | Haskell | 121208T031528Z | Lambda F |
| 070 | Python | 121125T173655Z | AMK |
| 087 | Python | 121123T094930Z | ugoren |
| 098 | JavaScript | 121123T075326Z | Paul Wal |
| 115 | C | 121122T010344Z | baby-rab |
| 043 | GolfScript | 121121T225520Z | Peter Ta |
| 048 | Golfscript | 121121T094136Z | Cristian |
Nekomata, 1 byte
S
S finds a subset of a list.
By default, Nekomata prints all possible results separated by newlines.
Thunno 2, 3 bytes
ʠ¶j
Explanation
ʠ¶j # Implicit input
ʠ # Take the powerset
¶j # Join on newlines
# Implicit output
PostScript, 80 bytes
00000000: 921a 2f6c 923e 9233 3088 0132 206c 2065 ../l.>.30..2 l e
00000010: 7870 2031 92a9 7b2f 6e92 3e92 335b 3088 xp 1..{/n.>.3[0.
00000020: 016c 2031 92a9 7b6e 2032 926a 3192 3d7b .l 1..{n 2.j1.={
00000030: 921b 9201 9258 7d7b 9275 7d92 552f 6e20 .....X}{.u}.U/n
00000040: 6e88 ff92 0f92 337d 9248 5d3d 3d7d 9248 n.....3}.H]==}.H
Usage: gsnd -c 1 2 3 -- powerset.ps gives output
[]
[3]
[2]
[3 2]
[1]
[3 1]
[2 1]
[3 2 1]
Un-tokenized version:
count /l exch def
0 1 2 l exp 1 sub{
/n exch def
[
0 1 l 1 sub{
n 2 mod 1 eq{
counttomark add index
}{
pop
}ifelse
/n n -1 bitshift def
}for
] ==
}for
Zsh, 31 bytes
Accidentally cut my previous byte-count in half answering another prompt...
for i;a=({$i,}\ $^a)
<<<${(F)a}
Delimiter is one or more spaces, we abuse trailing delimiters extensively here.
PHP, 102 bytes
<?php
function p($a){
$b=[[]];foreach($a as $c)foreach($b as $d)$b[]=array_merge([$c],$d);return $b;
}
Go, 118 bytes
package m
func p(a ...int)[][]int{b:=[][]int{{}}
for _,c:=range a{for _,d:=range b{b=append(b,append(d,c))}}
return b}
Japt -R, 5 1 byte
Sadly, Japt's built-in for getting the powerset of an array doesn't include the empty array or this would be 1 byte. It does now!
à
Try it (the empty line at the end is the empty set or you can run it with the -Q flag instead to visualise the sub-arrays)
Python 70 67 bytes
def p(a,*v):
i=0;print v
for n in a:i+=1;p(a[i:],n,*v)
p(input())
Input is taken in the same manner as for ugoren's solution. Sample I/O:
$ echo [1,2,3] | powerset.py
()
(1,)
(2, 1)
(3, 2, 1)
(3, 1)
(2,)
(3, 2)
(3,)
Pyth, 1 byte
y
Since Pyth has implicit Q (input variable) at the end of programs, this is basically just power set of the input. I don't think this violates any rules (although 'No libraries besides io' is a bit vague)
05AB1E, 2 bytes
æ»
Output is space-delimited (i.e. 1 2 3). If you want it as actual lists (i.e. [1, 2, 3]), add €¸ before the »:
怸»
Explanation:
æ # Take the powerset of the (implicit) input-list
» # Join the lists by newlines (and each inner list by spaces)
# (and output the result implicitly)
€¸ # Wrap each inner list into a list
# (i.e. [[1],[1,2]] → [[[1]],[[1,2]]])
PHP, 78 bytes
for(;$i<1<<$argc;$i+=2)for(print$c=_;$argc>$c+=1;)$i&1<<$c&&print"$argv[$c],";
prints a comma after each element and an underscore before each subset. Run with -nr or try it online.
Python 2, 74 bytes
def f(x):
for i in reduce(lambda s,e:s+[i+[e] for i in s],x,[[]]):print i
Coconut, 90 bytes
def p(l)=(fmap((+)$(l[:1]),p(l[1:])))+p(l[1:])if l else[[]]
fmap(print,p(input().split()))
I think I had something one byte shorter but I lost it after experimenting more.
Common Lisp, 117 bytes
(labels((p(l &aux(x(car l)))(if x`(,@#1=(p(cdr l)),@(mapcar(lambda(m)(cons x m))#1#))'(()))))(mapcar'print(p(read))))
Input is a list of element, in output the sets are printed as lists (empty list is equal to NIL)
If the answer can be a function that returns the result, then:
Common Lisp, 90 bytes
(defun p(l &aux(x(car l)))(if x`(,@#1=(p(cdr l)),@(mapcar(lambda(m)(cons x m))#1#))'(())))
Haskell, 80 78 bytes
import System.Environment
main=getArgs>>=mapM(print.concat).mapM(\a->[[a],[]])
Perl 6, 22 bytes
say words.combinations
The built in combinations method will give all N-combinations of a list, ie. the powerset. Arguments provided via STDIN
% echo 1 2 3 | ./powerset.p6
(() (1) (2) (3) (1 2) (1 3) (2 3) (1 2 3))
APL (Dyalog Classic), 13 bytes
⍪,⊃∘.,/⎕,¨⊂⊂⍬
Output:
1 2 3
1 2
1 3
1
2 3
2
3
There's a blank line at the end to represent the empty set.
Explanation:
⎕ evaluated input
⎕,¨⊂⊂⍬ append an empty numeric list after each element
∘., Cartesian product
/ reduction (foldr)
⊃ disclose (necessary after reduction in APL)
At this point the result is an n-dimensional 2-by-...-by-2 array, where n is the length of the input.
, flatten into a vector
⍪ turn the vector into an upright 2n-by-1 matrix, so each subset is on a separate line
JavaScript (ES6), 68 bytes
a=>alert(a.reduce((a,x)=>[...a,...a.map(y=>[...y,x])],[[]]).join`
`)
Demo
let f =
a=>alert(a.reduce((a,x)=>[...a,...a.map(y=>[...y,x])],[[]]).join`
`)
f([1,2,3])
brainfuck, 94 bytes
+[[<+>>+<-]++[>-<------]>-[>]<<[>>+>]>,]++++++++++[[[<]<]+[-[>[.>]]<[<]>+[>]>]<<
.[<<[<]>-]++>]
Formatted:
+
[
[<+> >+<-]
++[>-<------]>-[>]
<<[>>+>]
>,
]
++++++++++
[
[[<]<]
+
print
[
-[>[.>]]
<[<]
>+[>]
>
]
<<.
increment
[
<<[<]
>-
]
++>
]
Expects input of the form 9,10,11 without a trailing newline, and outputs subsets in the same format, sometimes with a trailing comma. The first line printed will always be empty, signifying the empty set.
The basic idea is to place a bit next to each element, then repeatedly increment the binary number while printing the corresponding subset before each increment. (A bit indicates whether an element is in the subset.) A sentinel bit to the left of the array is used to terminate the program. This version actually creates an exponential number of sentinels to save some bytes; a more efficient 99-byte solution that only uses one sentinel can be found in the revision history.
Each bit is encoded as one plus its value; i.e., it can be either 1 or 2. The tape is laid out with the bit before each element and a single zero cell between adjacent elements. The comma is included on the tape for non-final elements, so we can conveniently just print elements without doing any extra work to handle delimiters.
awk (82)
{for(;i<2^NF;i++){for(j=0;j<NF;j++)if(and(i,(2^j)))printf "%s ",$(j+1);print ""}}
assume saved in file powerset.awk, usage
$ echo 1 2 3 | awk -f powerset.awk
1
2
1 2
3
1 3
2 3
1 2 3
ps if your awk doesn't have and() function, replace it with int(i/(2^j))%2 but adds two to the count.
Python 2, 64 bytes
Using comma-separated input:
P=[[]]
for i in input():P+=[s+[i]for s in P]
for s in P:print s
Pyth, 4 bytes (using builtin) or 14 bytes (without)
As noted by @Jakube in the comments, Pyth is too recent for this question. Still here's a solution using Pyth's builtin powerset operator:
jbyQ
And here's one without it:
jbu+Gm+d]HGQ]Y
You can try both solutions here and here. Here's an explanation of the second solution:
jb # "\n".join(
u # reduce(
+G # lambda G,H: G+
m # map(
+d]H # lambda d: d+[H],
G # G),
Q # input()
]Y # [[]]))
Matlab (46)
v=input(''),for i=1:numel(v),nchoosek(v,i),end
- the input must be of the form [% % % ..] where % is a number
Mathematica, 51
More cheating:
Column@ReplaceList[Plus@@HoldForm/@#,x___+___->{x}]&
Use with @{1,2,3}.
K, 14 bytes
{x@&:'!(#x)#2}
Generate all 0/1 vectors as long as the input, gather the indices of 1s and use those to select elements from the input vector. In practice:
{x@&:'!(#x)#2} 1 2 3
(!0
,3
,2
2 3
,1
1 3
1 2
1 2 3)
This is a bit liberal with the output requirements, but I think it's legal. The most questionable part is that the empty set will be represented in a type dependent form; !0 is how K denotes an empty numeric vector:
0#1 2 3 / integers
!0
0#`a `b `c / symbols
0#`
0#"foobar" / characters
""
Explanation
The (#x)#2 builds a vector of 2 as long as the input:
{(#x)#2}1 2 3
2 2 2
{(#x)#2}`k `d `b `"+"
2 2 2 2
When monadic ! is applied to a vector, it is "odometer":
!2 2 2
(0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1)
Then we use "where" (&) on each (') vector to gather its indices. The colon is necessary to disambiguate between the monadic and dyadic form of &:
&0 0 1 0 1 1
2 4 5
{&:'!(#x)#2} 1 2 3
(!0
,2
,1
1 2
,0
0 2
0 1
0 1 2)
If we just wanted combination vectors, we'd be done, but we need to use these as indices into the original set. Fortunately, K's indexing operator @ can accept a complex structure of indices and will produce a result with the same shape:
{x@&:'!(#x)#2} `a `c `e
(0#`
,`e
,`c
`c `e
,`a
`a `e
`a `c
`a `c `e)
Elegant, no?
C# 164
Man this is hard in C#!
void P<T>(T[]c){foreach(var d in c.Aggregate<T,IEnumerable<IEnumerable<T>>>(new[]{new T[0]},(a,b)=>a.Concat(a.Select(x=>x.Concat(new[]{b})))))Console.WriteLine(d);}
JavaScript (ES6) 76
Partially copied from this one: https://codegolf.stackexchange.com/a/51502/21348
Using a bitmap, so it's limited to no more than 32 elements.
Run the snippet in Firefox to test.
f=l=>{
for(i=0;i<1<<l.length;i++)
console.log(l.filter(v=>[i&m,m+=m][0],m=1))
}
// TEST
// Redefine console to have output inside the page
console = { log: (...p) => O.innerHTML += p.join(' ') + '\n' }
test=()=>{
var set = I.value.match(/[^ ,]+/g)
O.innerHTML='';
f(set);
}
test()
#I,#O { border: 1px solid #aaa; width: 400px; padding:2px}
Insert values, space or comma separated:<br>
<input id=I value='1 2 3'> <button onclick="test()">-></button>
<pre id=O></pre>
Scala, 81
def p[A](x:Seq[A]){x.foldLeft(Seq(Seq[A]()))((a,b)=>a++a.map(b+:_)).map(println)}
R, 63
y=lapply(seq(v),function(x)cat(paste(combn(v,x,s=F)),sep="\n"))
Here, v represents a vector.
Usage:
v <- c(1, 2, 3)
y=lapply(seq(v),function(x)cat(paste(combn(v,x,s=F)),sep="\n"))
1
2
3
c(1, 2)
c(1, 3)
c(2, 3)
c(1, 2, 3)
GolfScript, 22 18 characters
~[[]]{{+}+1$%+}@/`
Another attempt in GolfScript with a completely different algorithm. Input format is the same as with w0lf's answer. (online test)
APL (26)
Reads input from keyboard because there's no argv equivalent.
↑⍕¨(/∘T)¨↓⍉(M/2)⊤⍳2*M←⍴T←⎕
Usage:
↑⍕¨(/∘T)¨↓⍉(M/2)⊤⍳2*M←⍴T←⎕
⎕:
1 2 3
3
2
2 3
1
1 3
1 2
1 2 3
Explanation:
T←⎕: read input, store inTM←⍴T: store length ofTinM(M/2)⊤⍳2*M: generate the bit patterns for1upto2^MusingMbits.↓⍉: split the matrix so that each bit pattern is separate(/∘T)¨: for each bit pattern, select those sub-items fromT.↑⍕¨: for output, get the string representation of each element (so that it will fill using blanks and not zeroes), and format as a matrix (so that each element is on its own line).
Mathematica 16
Code
Subsets is native to Mathematica.
Column@Subsets@s
The code (without column) can be verified on WolframAlpha. (I had to use brackets instead of @; they mean the same thing.
Usage
s={1,2,3}
Column@Subsets@s

This method (55 chars) uses the approach suggested by @w0lf.
s #&/@Tuples[{0,1},Length@s]/.{0:>Sequence[]}//Column
Breakdown
Generate the tuples, composed of 0 and 1's of length Length[s]
Tuples[{0, 1}, Length@s]
{{0, 0, 0}, {0, 0, 1}, {0, 1, 0}, {0, 1, 1}, {1, 0, 0}, {1, 0, 1}, {1, 1, 0}, {1, 1, 1}}
Multiply the original list (vector) by each tuple:
s # & /@ Tuples[{0, 1}, Length@s]
{{0, 0, 0}, {0, 0, 3}, {0, 2, 0}, {0, 2, 3}, {1, 0, 0}, {1, 0, 3}, {1, 2, 0}, {1, 2, 3}}
Delete the 0's. % is shorthand for "the preceding output".
%/. {0 :> Sequence[]}
{{}, {3}, {2}, {2, 3}, {1}, {1, 3}, {1, 2}, {1, 2, 3}}
Display in column:

Haskell 89 chars
import System.Environment
main=getArgs>>=mapM print.p
p[]=[[]]
p(x:y)=(map(x:)$p y)++p y
Getting parameters is long :/
Mathematica 53
Column@Fold[#~Join~Table[x~Join~{#2},{x,#}]&,{{}},#]&

Ruby, 39
$*.map{p *$*.combination($.)
$.+=1}
p$*
J, 19 chars
(<@#~#:@i.@(2&^)@#)
(<@#~#:@i.@(2&^)@#) 1 2 3
┌┬─┬─┬───┬─┬───┬───┬─────┐
││3│2│2 3│1│1 3│1 2│1 2 3│
└┴─┴─┴───┴─┴───┴───┴─────┘
The ascii boxing in the output is called boxing and provides heterogen collection (for different length of arrays here).
Ruby Array method combination (from 1.9 ) [50 chars]
0.upto(ARGV.size){|a|ARGV.combination(a){|v| p v}}
Haskell (96)
import Control.Monad import System.Environment main=getArgs>>=mapM print.filterM(\_->[False ..])
If importing Control.Monad isn't allowed, this becomes 100 characters:
import System.Environment
main=getArgs>>=mapM print.p
p z=case z of{[]->[[]];x:y->p y++map(x:)(p y)}
Python (74 70 chars)
def p(a,v):
if a:i,*a=a;p(a,v);p(a,v+[i])
else:print v
p(input(),[])
for input as 1,2,3 or [1,2,3], output is:
[]
[3]
[2]
[2, 3]
[1]
[1, 3]
[1, 2]
[1, 2, 3]
Python, 93 87 chars
Python makes formatting simple, because the required input/output matches its native format.
Only supports items which are Python literals (e.g. 1,2,'hello', not 1,2,hello).
Reads standard input, not parameters.
f=lambda x:x and f(x[1:])+[x[:1]+a for a in f(x[1:])]or[()]
for l in f(input()):print l
JavaScript, 98
Sadly, a good chunk is spent on output formatting.
for(n in a=eval(prompt(i=p=[[]])))
for(j=i+1;j;)
p[++i]=p[--j].concat(a[n]);
alert('[]'+p.join('\n'))
Input
Takes a JavaScript array. (e.g. [1,2,3])
Output
[]
1
1,2
2
2,3
1,2,3
1,3
3
C, 118 115
Whilst can save approx 20 chars with simpler formatting, still not going to win in code golf terms either way.
x,i,f;
main(int a,char**s){
for(;x<1<<a;x+=2,puts("[]"+f))
for(i=f=0;++i<a;)x&1<<i?f=!!printf("%c%s","[,"[f],s[i]):0;
}
Testing:
/a.out 1 2 3
[]
[1]
[2]
[1,2]
[3]
[1,3]
[2,3]
[1,2,3]
GolfScript (43 chars)
This may seem quite long, but it's the first solution to follow the spec: input is from command-line arguments, and output is newline-delimited.
"#{ARGV.join('
')}"n/[[]]\1/{`{1$+.p}+%}%p;
E.g.
$ golfscript.rb powset.gs 1 2 3
["1"]
["2"]
["2" "1"]
["3"]
["3" "2"]
["3" "1"]
["3" "2" "1"]
[]
Golfscript 48
~:x,:§2\?,{[2base.,§\-[0]*\+x\]zip{~{}{;}if}%p}%
This program uses the binary representations of numbers from 0 to length(input) to generate powerset items.
Input
The input format is the Golfscript array format (example: [1 2 3])
Output
The output is a collection of arrays separated by newlines, representing the power set. Example:
[]
[3]
[2]
[2 3]
[1]
[1 3]
[1 2]
[1 2 3]
Online Test
The program can be tested online here.