找回密码
 注册
Simdroid-非首页
查看: 143|回复: 6

[基础概念] 一行代码优化题:纯洁无瑕

[复制链接]
发表于 2009-8-5 06:35:45 | 显示全部楼层 |阅读模式 来自 江苏无锡
悬赏1仿真币已解决

  1. triples=Subsets[Range[10],{3}];

  2. triples=Select[triples,(Abs[#[[1]]-#[[2]]]<=1)||(Abs[#[[2]]-#[[3]]]<=1)||(Abs[#[[3]]-#[[1]]]<=1)&]
复制代码


一个纯函数  (Abs[#[[1]]-#[[2]]]<=1)||(Abs[#[[2]]-#[[3]]]<=1)||(Abs[#[[3]]-#[[1]]]<=1)&

如何把这个行代码简化,并完成同样的功能?
发表于 2009-8-5 07:02:49 | 显示全部楼层 来自 美国
Simdroid开发平台
  1. triples = Subsets[Range[10, 1, -1], {3}];
  2. triples =
  3. Select[triples, (Abs[#[[2]] - #[[1]]] <=
  4.       1) || (Abs[#[[3]] - #[[2]]] <= 1) &]
复制代码
回复

使用道具 举报

发表于 2009-8-5 07:09:44 | 显示全部楼层 来自 美国
  1. triples = Subsets[Range[20], {3}];
  2. triples =
  3. Select[triples, (xx =
  4.      Sort[#]; (xx[[2]] - xx[[1]] <= 1) || (xx[[3]] - xx[[2]] <= 1)) &]
复制代码
回复

使用道具 举报

 楼主| 发表于 2009-8-5 07:10:47 | 显示全部楼层 来自 江苏无锡
有进步,第一行不要改动它。
但是我不知道这样保不保险?
能不能数学证明是有效的?
回复

使用道具 举报

发表于 2009-8-5 07:18:07 | 显示全部楼层 来自 美国
本帖最后由 smarten 于 2009-8-4 17:24 编辑

如果第一个不改动,你得到数据就是从小到大的。帮助上说:
If the elements of list are in the order returned by Sort, then the complete result from Subsets
    will also be in this order.
    1. triples = Subsets[Range[10], {3}];
    2. triples =
    3. Select[triples, (#[[2]] - #[[1]] <= 1) || (#[[3]] - #[[2]] <= 1) &]
    复制代码

回复

使用道具 举报

发表于 2009-9-9 23:02:37 | 显示全部楼层 来自 江苏无锡
你这个:(Abs[#[[1]]-#[[2]]]<=1)||(Abs[#[[2]]-#[[3]]]<=1)||(Abs[#[[3]]-#[[1]]]<=1)
其实就等价于:
Min[Flatten@(Differences /@ Subsets[#, {2}])] <= 1


所以,你上面的可以这样来做:(我发现为什么大家总是在用完之后不清空定义呢????)
triples = Subsets[Range[10], {3}];
sele[list_] :=
Select[list, Min[Flatten@(Differences /@ Subsets[#, {2}])] <= 1 &]
sele@triples

Clear[sele]
Clear[triples]

评分

1

查看全部评分

回复

使用道具 举报

发表于 2009-9-10 00:17:59 | 显示全部楼层 来自 江苏无锡
顺便说一下,要非常小心的使用SortBy 用Sort, 配合着有 Split, SplitBy

看我下面的例子,我用SortBy 做了增强:(我把出现如 First@cond 这样的地方改成了 : First[cond] , 因为这个PHP论坛会把First@cond改成 [email=First@cond]First@cond[/email], 真是晕S了,那帮人不知道我们的mathematica语言的特殊性 )


list = {{0, 9, 2}, {3, 3, 2}, {1, 4, 0}, {9, 9, 1}, {0, 4, 7}, {0, 2,
    8}, {0, 8, 5}, {5, 2, 4}, {3, 7, 2}, {6, 2, 3}, {8, 4, 9}, {2, 8,
    2}};

(* 增强型的SortBy,可以按多个条件依次排序 *)
sortByEn[list_, cond_] :=
  Flatten @@ {SortBy[#, Last[cond]] & /@ SplitBy[list, First[cond]],
    1};
EnhancedSortBy[list_, condlist_] :=
  Fold[sortByEn, SortBy[list, First[condlist]],
   Partition[condlist, 2, 1]];

EnhancedSortBy[list, {Last, Total, Part[#, 2] &}]
EnhancedSortBy[list, {Last, Total}]

Clear[EnhancedSortBy, sortByEn]

Clear
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-28 06:40 , Processed in 0.037693 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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