【发布时间】:2019-01-17 02:46:39
【问题描述】:
作为我学习 j 之旅的一部分,我实现了一种计算我在Futility Closet 中遇到的多边形面积的技术。我想出了一个解决方案,但它很不优雅,所以我对更好的方法很感兴趣:
polyarea =: -:@((+/@((1&{&|:)*(0{&|:1&|.)))-(+/@((0&{&|:)*(1{&|:1&|.))))
y =: 2 7 9 5 6,.5 7 1 0 4
polyarea y
20
此技术旋转一列并获取列的点积,然后在旋转另一列后执行相同操作。面积是这两个结果之差的一半。
对建议感兴趣!
【问题讨论】:
-
这比其他任何东西都更像是代码高尔夫。我会把
polyarea写成-:@|@(-&:((+/ .* 1&|.)/) |.)@|:。核心是rotate and dot:(+/ .* 1&|.),您使用一次作为输入y,一次用于反向|.y,使用火车(f |.)。然后使用组合- &: g减去结果。 -
谢谢,我很喜欢。对于 j,我发现一些代码高尔夫对加深您的理解很有帮助!
标签: j