生成一个列表列表(或打印,我不介意),其大小为 N,且行数最少的帕斯卡的三角形!
这是我的尝试(在 python 2.6 **中使用一个恶作剧的 118 个字符):
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)]
说明:
-
列表理解的第一个元素(长度为 0 时)是
[1]
-
接下来的元素是通过以下方式获得的:
-
取上一个列表,然后创建两个列表,一个列表的开头以 0 填充,另一个列表的末尾填充。
-
e.g. 对于第二步,我们取
[1]
并设为[0,1]
和[1,0]
-
将两个新列表逐个元素相加
-
e.g. 我们创建一个新列表
[(0,1),(1,0)]
并映射总和。 -
重复 n 次,仅此而已。
用法(打印精美,实际上不在 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)))
输出:
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
23 回答
另一个刺(python):
旧线程,但是我写这是为了回应今天在另一个论坛上的挑战:
J,APL 系列的另一种语言,9 个字符:
它使用 J 的内置“组合”动词。
输出:
K(维基百科),15 个字符:
输出示例:
也很容易解释:
p
是采用隐式参数x
的函数。p
展开(C)匿名函数(B)x
次(A)从1
(D)开始。匿名函数仅获取列表
x
,附加0
并通过将相邻的每个值对(':
)相加(+
)来返回结果:e.g. 从(1 2 1)
开始,它将产生(1 2 1 0)
,添加对(1 1+2 2+1 1+0)
,得到(1 3 3 1)
。更新:改编为 K4,可删除另外两个字符。作为参考,这是原始的 K3 版本:
Haskell,58 个字符:
输出:
更具可读性:
C 中的 69C:
像这样使用它:
F#:81 个字符
说明:我太懒了,不能像 Haskell 和 K 程序员一样聪明,所以我采取了直接的方法:Pascal 三角形中的每个元素都可以使用 n 行和 col k 唯一地标识,其中每个元素的值为
n!/(k! (n-k)!
。Python:75 个字符
较短的序言版本(从 112 代替 164):
Haskell,164C,格式为:
不格式化,52C:
更具可读性的形式:
Perl,111C,不居中:
方案-100 个字符的压缩版本
它以更易读的形式显示(269 个字符):
VBA/VB6(392 个字符,带格式)
PHP 100 个字符
Ruby,83c:
测试:
另一个python解决方案,如果内置函数的名称较短,则可能会更短... 106字符。
另一个尝试,在prolog(我正在练习 xD)中,不太短,只有 164c:
说明:
s =总和逐元素列出
l =三角形的第 N 行
p =大小为 N 的整个三角形
VBA,122 个字符:
我几年前写了这个 C 版本:
以下只是一个返回
List[List[Int]]
的 Scala 函数。没有漂亮的印刷或任何东西。有任何建议的改进吗? (我知道它的效率很低,但这不是现在的主要挑战,是吗?)。 145℃。也许:
(我是 Scala 新手,所以请对我好:D)
Perl 版本(139 个字符 w/o shebang)
输出从 1 2 1 开始
PHP,115 个字符
如果您不关心 print_r()是否以正确的顺序显示输出数组,则可以将其剃除为 113 个字符,例如
Perl,63 个字符:
我在 C(378c)中的尝试。虽然没有其他文章那么好。.但是我为自己提出的=)解决方案而感到自豪