Generate a list of lists (or print, I don't mind) a Pascal's Triangle of size N with the least lines of code possible!
Here goes my attempt (118 characters in python 2.6 using a trick):
c,z,k=locals,[0],'_[1]'
p=lambda n:[len(c()[k])and map(sum,zip(z+c()[k][-1],c()[k][-1]+z))or[1]for _ in range(n)]
Explanation:
- the first element of the list comprehension (when the length is 0) is
[1]
- the next elements are obtained the following way:
- take the previous list and make two lists, one padded with a 0 at the beginning and the other at the end.
- e.g. for the 2nd step, we take
[1]
and make[0,1]
and[1,0]
- e.g. for the 2nd step, we take
- sum the two new lists element by element
- e.g. we make a new list
[(0,1),(1,0)]
and map with sum.
- e.g. we make a new list
- repeat n times and that's all.
usage (with pretty printing, actually out of the code-golf xD):
result = p(10)
lines = [" ".join(map(str, x)) for x in result]
for i in lines:
print i.center(max(map(len, lines)))
output:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
The following is just a Scala function returning a
List[List[Int]]
. No pretty printing or anything. Any suggested improvements? (I know it's inefficient, but that's not the main challenge now, is it?). 145 C.Or perhaps:
(I'm a Scala noob, so please be nice to me :D )
a Perl version (139 chars w/o shebang)
output starts from 1 2 1
PHP, 115 chars
If you don't care whether print_r() displays the output array in the correct order, you can shave it to 113 chars like
My attempt in C++ (378c). Not anywhere near as good as the rest of the posts.. but I'm proud of myself for coming up with a solution on my own =)
VBA, 122 chars:
K (Wikipedia), 15 characters:
Example output:
It's also easily explained:
p
is a function taking an implicit parameterx
.p
unfolds (C) an anonymous function (B)x
times (A) starting at1
(D).The anonymous function simply takes a list
x
, appends0
and returns a result by adding (+
) each adjacent pair (':
) of values: so e.g. starting with(1 2 1)
, it'll produce(1 2 1 0)
, add pairs(1 1+2 2+1 1+0)
, giving(1 3 3 1)
.Update: Adapted to K4, which shaves off another two characters. For reference, here's the original K3 version: