找回密码
 欢迎注册
楼主: chyanog

[擂台] 差三角

[复制链接]
 楼主| 发表于 2013-4-11 18:42:37 | 显示全部楼层
9# hujunhua
1-21和1-28的穷举后发现似乎不存在
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-4-11 19:21:31 | 显示全部楼层
这个稍快

  1. n = 5;
  2. Join @@ NestList[Abs@Differences@# &, {a, b, c, d, e}, n - 1]
  3. table = Table[%, {a, #}, {b, #}, {c, #}, {d, #}, {e, #}] &[ n (n + 1)/2]~Flatten~(n - 1);
  4. fmt = MatrixForm@Internal`PartitionRagged[Reverse@#, Range[n]] &;
  5. Do[If[Unequal @@ i, If[(And @@ Positive /@ i), Print@fmt@i]], {i,  table}] // Timing
  6. Clear["`*"]
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-4-11 21:25:11 | 显示全部楼层
今天白天本想跟帖说:这是一个非常适合编程擂台的题目,
现在打开居然已经有代码了。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-4-11 21:42:57 | 显示全部楼层
12#的代码中第3行人工生成的table大小为15^5, 用排列函数,代码和结果都可略有优化。
  1. n = 5; m = n (n + 1)/2;
  2. f = Abs@Differences@# &;
  3. Flatten@NestList[f, #, n - 1] &
  4. table =% /@ Permutations[Range[m], {n}];
  5. fmt = MatrixForm@Internal`PartitionRagged[Reverse@#, Range[n]] &;
  6. Do[If[Unequal @@ i, Print@fmt@i], {i, table}] // Timing
复制代码
试了一下,第3行用Flatten比Join约快1倍。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-4-11 21:49:14 | 显示全部楼层
14# hujunhua
不过这个总运行时间反而长了,应该还能够优化
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-4-11 22:11:01 | 显示全部楼层
在我的电脑上,
12#的时间最快的为2.230814
14#的时间最快的为0.998406
--------------------------------------------------------
是的,上述时间都不是总时间,总时间14#慢些。14#生成排列表很快,但随后又对排列表进行操作生成table耗费了大量时间。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-4-11 22:46:13 | 显示全部楼层
这个版本速度有了较大提升,不过牺牲一些可读性

  1. t1 = AbsoluteTime[];
  2. n = 5;
  3. k = n (n + 1)/2;
  4. cf = Compile[{{ls, _Integer, 1}},
  5.      #[ls],
  6.      RuntimeAttributes -> {Listable}
  7.      ] &[Evaluate[
  8.       Flatten@NestList[Abs@Differences@# &, Array[Slot, n],
  9.         n - 1]] & /. Slot[x_] :> #[[x]]];
  10. table = cf@Permutations[Range[k], {n}];
  11. fmt = MatrixForm@Internal`PartitionRagged[Reverse@#, Range[n]] &;
  12. Do[If[Unequal @@ i, Print@fmt@i], {i, table}]
  13. AbsoluteTime[] - t1
  14. Clear["`*"]
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-4-12 15:54:38 | 显示全部楼层
13# gxqcn
我写的C代码太难看了,中间比较长的部分还是mathematica生成的,
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-4-13 22:49:43 | 显示全部楼层
18# chyanog
mathematica生成?

有才,我还没这么玩过呢
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-4-14 15:58:01 | 显示全部楼层
本帖最后由 chyanog 于 2013-4-14 15:59 编辑

19# wayne
其实没什么技术含量的。1-21和1-28的差三角似乎不存在,更大的就不清楚了

  1. xx = Table[Symbol["x" <> ToString[i]], {i, 15}]
  2. StringReplace[
  3. xx == (ToLowerCase@ToString@CForm@# & /@
  4.       Join @@ NestList[Abs@Differences@# &, {a, b, c, d, e}, 4]) //
  5.    Thread // ToString, {"," -> ";", "{" | "}" -> "", "==" -> "="}]

  6. LogicalExpand[Unequal @@ xx]
  7. And @@ Thread[xx > 0]
  8. "" <> Table["%d ", {15}]
复制代码

评分

参与人数 1威望 +12 鲜花 +12 收起 理由
wayne + 12 + 12

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-4 15:31 , Processed in 0.045695 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表