wayne 发表于 2013-3-18 16:28:38

22# 无心人
haskell 神级的语言,天书呀。

呵呵,被我删掉了那个回复,因此你这个指向已经不存在了,by 无心人

chyanog 发表于 2013-3-18 16:44:28

23# wayne
其实别人看Mathematica代码,见到@ # &/@这些符号和层层嵌套也可能会这么想

无心人 发表于 2013-3-18 16:50:55

23# wayne


其实平面时候的代码还是很容易理解的
到了立体时候,要满足的条件太多了
关键还不知道自己写的条件对不对

考虑写独立程序会清晰些

无心人 发表于 2013-3-19 08:57:16

点集定义
let p n = [(x, y, z)|z<-, y<-, x<-]
正交测试
let orth (x0, y0, z0) (x1, y1, z1) (x2, y2, z2) = (x1-x0)*(x2-x0)+(y1-y0)*(y2-y0)+(z1-z0)*(z2-z0)==0

wayne 发表于 2013-3-19 09:17:36

24# chyanog
我看到无心人写的haskell代码好像每一句都是定义,而非实作。

无心人 发表于 2013-3-19 10:04:26

未考虑是否越界的暴力搜索
let all3 n = if n < 1 then [] else [(p0, p1, p2, p3)|let ps = p n,let l = length ps, i<-, j<-, k<-, m<-, let p0=ps!!i, let p1=ps!!j, let p2=ps!!k, let p3=ps!!m, orth p0 p1 p2, orth p0 p1 p3, orth p0 p2 p3]
Prelude Data.Array Data.List> all3 2
[((0,0,0),(0,0,1),(0,1,0),(1,0,0)),((0,0,0),(0,0,1),(0,1,0),(2,0,0)),((0,0,0),(0,0,1),(0,2,0),(1,0,0)),((0,0,0),(0,0,1),(0,2,0),(2,0,0)),((0,0,0),(0,0,2),(0,1,0),(1,0,0)),((0,0,0),(0,0,2),(0,1,0),(2,0,0)),((0,0,0),(0,0,2),(0,2,0),(1,0,0)),((0,0,0),(0,0,2),(0,2,0),(2,0,0)),((0,0,1),(0,0,2),(0,1,1),(1,0,1)),((0,0,1),(0,0,2),(0,1,1),(2,0,1)),((0,0,1),(0,0,2),(0,2,1),(1,0,1)),((0,0,1),(0,0,2),(0,2,1),(2,0,1)),((0,0,1),(0,1,0),(0,1,2),(1,0,1)),((0,0,1),(0,1,0),(0,1,2),(2,0,1)),((0,0,1),(0,1,1),(1,0,0),(1,0,2)),((0,0,1),(0,2,1),(1,0,0),(1,0,2)),((0,1,0),(0,1,1),(0,2,0),(1,1,0)),((0,1,0),(0,1,1),(0,2,0),(2,1,0)),((0,1,0),(0,1,1),(1,0,0),(1,2,0)),((0,1,0),(0,1,2),(0,2,0),(1,1,0)),((0,1,0),(0,1,2),(0,2,0),(2,1,0)),((0,1,0),(0,1,2),(1,0,0),(1,2,0)),((0,1,1),(0,1,2),(0,2,1),(1,1,1)),((0,1,1),(0,1,2),(0,2,1),(2,1,1)),((0,1,1),(0,1,2),(1,0,1),(1,2,1)),((0,1,1),(0,2,0),(0,2,2),(1,1,1)),((0,1,1),(0,2,0),(0,2,2),(2,1,1)),((0,1,1),(0,2,0),(1,0,0),(2,2,2)),((0,1,1),(0,2,0),(1,2,2),(2,0,0)),((0,1,1),(0,2,1),(1,1,0),(1,1,2)),((0,1,1),(0,2,2),(1,0,2),(2,2,0)),((0,1,1),(0,2,2),(1,2,0),(2,0,2)),((1,0,0),(1,0,1),(1,1,0),(2,0,0)),((1,0,0),(1,0,1),(1,2,0),(2,0,0)),((1,0,0),(1,0,2),(1,1,0),(2,0,0)),((1,0,0),(1,0,2),(1,2,0),(2,0,0)),((1,0,1),(1,0,2),(1,1,1),(2,0,1)),((1,0,1),(1,0,2),(1,2,1),(2,0,1)),((1,0,1),(1,1,0),(1,1,2),(2,0,1)),((1,0,1),(1,1,1),(2,0,0),(2,0,2)),((1,0,1),(1,2,1),(2,0,0),(2,0,2)),((1,1,0),(1,1,1),(1,2,0),(2,1,0)),((1,1,0),(1,1,1),(2,0,0),(2,2,0)),((1,1,0),(1,1,2),(1,2,0),(2,1,0)),((1,1,0),(1,1,2),(2,0,0),(2,2,0)),((1,1,1),(1,1,2),(1,2,1),(2,1,1)),((1,1,1),(1,1,2),(2,0,1),(2,2,1)),((1,1,1),(1,2,0),(1,2,2),(2,1,1)),((1,1,1),(1,2,1),(2,1,0),(2,1,2))]
Prelude Data.Array Data.List> length (all3 2)
49

现在我不确定,这个是否无遗漏,无重复

无心人 发表于 2013-3-19 10:06:12

27# wayne

有的,每个程序正确后,我都会贴一些测试结果的
比如上面的1-30的平面上的非平行结果
我就贴出来了

我跟网上数列对了,完全相等的

一些定义我是当做记录用的,可能会改

无心人 发表于 2013-3-19 10:24:26

2点加法
let addp2 (x0, y0, z0) (x1, y1, z1) (x2, y2, z2) = (x2+x1-x0, y2+y1-y0, z2+z1-z0)
3点加法
let addp3 (x0, y0, z0) (x1, y1, z1) (x2, y2, z2) (x3, y3, z3) = (x3+x2+x1-2*x0, y3+y2+y1-2*y0, z3+z2+z1-2*z0)
是否在边长n的立方体内部的测试
let inside n (x, y, z) = (x <= n) && (y <= n) && (z <= n) && (x>=0) && (y>=0) && (z>=0)
定义点的权重,方便排序
let dp n (x, y, z) = x + (n+1)*y + (n+1)*(n+1)*z

无心人 发表于 2013-3-19 11:45:42

Prelude> let list3A4 n = if n < 1 then [] else [(dp0, dp1, dp2, dp3)|let ps = p n, p0<-ps, p1<-ps, p2<-ps, p3<-ps, let dp0=dp n p0, let dp1=dp n p1, let dp2=dp n p2, let dp3=dp n p3, dp0<dp1, dp1<dp2, orth p0 p1 p2, dp2<dp3, orth p0 p1 p3, orth p0 p2 p3]
Prelude> list3A4 2
[(0,1,3,9),(0,1,3,18),(0,1,6,9),(0,1,6,18),(0,2,3,9),(0,2,3,18),(0,2,6,9),(0,2,6,18),(1,2,4,10),(1,2,4,19),(1,2,7,10),(1,2,7,19),(1,3,5,10),(1,3,5,19),(1,4,9,11),(1,7,9,11),(3,4,6,12),(3,4,6,21),(3,4,9,15),(3,5,6,12),(3,5,6,21),(3,5,9,15),(4,5,7,13),(4,5,7,22),(4,5,10,16),(4,6,8,13),(4,6,8,22),(4,6,9,26),(4,6,17,18),(4,7,12,14),(4,8,11,24),(4,8,15,20),(9,10,12,18),(9,10,15,18),(9,11,12,18),(9,11,15,18),(10,11,13,19),(10,11,16,19),(10,12,14,19),(10,13,18,20),(10,16,18,20),(12,13,15,21),(12,13,18,24),(12,14,15,21),(12,14,18,24),(13,14,16,22),(13,14,19,25),(13,15,17,22),(13,16,21,23)]
Prelude> length $ list3A4 2
49
==============================================================
暴力搜索到的符合两两正交的点集,1个顶点跟3个相邻顶点的编号,编号定义
x+(n+1)*y+(n+1)*(n+1)*z

无心人 发表于 2013-3-19 14:20:23

let list3A9 n = [(dp0, dp1, dp2, dp3)|let ps=p n, let max=(n+1)^3-1, i<-, let p0=ps!!i, let dp0=dp n p0, j<-, let p1=ps!!j, let dp1=dp n p1, k<-,let p2=ps!!k, let dp2=dp n p2, orth p0 p1 p2, m<-, let p3=ps!!m, let dp3=dp n p3, dp2<dp3, orth p0 p1 p3, orth p0 p2 p3, inside n \$ addp2 p0 p1 p2, inside n \$ addp2 p0 p1 p3, inside n \$ addp2 p0 p2 p3, inside n \$ addp3 p0 p1 p2 p3]
页: 1 2 [3] 4
查看完整版本: N×N的方格,里面有多少个长方形?