Function by Others Except Itself游戏,活跃下贴吧气氛
mathematica吧
全部回复
仅看楼主
吧务
level 11
situxuming 楼主
工作了之后就好久没来MMA吧活跃了。最近在学Haskell,看到有篇文章提到说,熟悉一门语言的有效方法是尽可能使用该语言的所有特性来实现其某内置函数的功能,但是除了使用该函数本身。想到MMA,就觉得应该也可以采用该方法来熟悉MMA的特性以及相关函数的使用了。
基于此,我就想到到贴吧里来发起这个游戏,游戏规则很简单:每个人都可以指定一个内置函数,然后尽可能多的采用其他方法(但是除了使用该函数本身)来实现该内置函数的功能,要求实现的功能要完全一致,例如函数A针对所有数据类型进行操作,那么其他实现方式也是要针对所有数据类型都具有一样的功能,这一点非常重要。
当然,其他人也可以对其进行补充,这样于己于人都是一次不错的学习过程。
好了,介绍就到此为止,下面我抛出个引子,例如MMA中选取列表最后一个元素的函数Last,可以采用以下方式来实现:
*******************************************************************************************************************************************
test = {1, "abc", s, "a", Sin[3], 1.34, 6/5};
Fold[#2 &, test]
First[Reverse[test]]
test[[-1]]
test[[-1]]
Nest[Rest, test, Length@test - 1] // First
test //. {x_, y__} :> {y} // First
Take[test, -1] // First
Drop[test, Length@test - 1] // First
TakeDrop[test, -1][[1, 1]]
Pick[test, SparseArray[{Length@test -> 1}], 1] // First
Extract[test, -1]
************************************************************************************************************************************
欢迎大家继续补充,后面的朋友继续 ^_^
2017年12月22日 07点12分 1
level 3
In[5]:= mylast[x_] := If[Rest[x] === {}, First[x], mylast[Rest[x]]]
In[9]:= mylast[Range[99]]
Out[9]= 99
2017年12月23日 09点12分 2
level 9
很好奇内置函数Flatten要怎么写[滑稽]
2017年12月26日 03点12分 3
Flatten的默认用法是好写的,但是指定层次的用法以及Flatten的第四种用法就呵呵了
2017年12月26日 06点12分
吧务
level 11
situxuming 楼主
@茶之花314 就Flatten第1-3种用法,可以采用Replace进行逐层的函数头替换,针对是否显示指定特定函数头进行展开,分别定义两种函数模式:
myFlatten[xs_, n_: Infinity] := Switch[n,
Infinity,
FixedPoint[(Replace[#, Head[xs] -> Sequence, {1},
Heads -> True] & /@ #) &, xs],
_, Nest[(Replace[#, Head[xs] -> Sequence, {1},
Heads -> True] & /@ #) &, xs, n]]
myFlatten[xs_, n_, h_] :=
Switch[n,
Infinity,
FixedPoint[(Replace[#, h -> Sequence, {1}, Heads -> True] & /@ #) &,
xs],
_, Nest[(Replace[#, h -> Sequence, {1}, Heads -> True] & /@ #) &,
xs, n]]
上述定义,在Flatten的帮助文档给出的例子中,除了第4种用法,以及稀疏数组,所有范例均可行。
当然,对于稀疏数组,可以采用一个投机取巧的办法,就是Normal之后再myFlatten,这与Flatten本身的功能就有差别了。
至于第四种用法,还没怎么研究,有空再来定义看看。
上述供参考,有不正确之处欢迎指正,也可以提供其他实现方法。
2017年12月28日 03点12分 4
[真棒]
2017年12月31日 15点12分
对于SparseArray,只要加上 Unprotect[SparseArray]; SparseArray /: myFlatten[SparseArray[x___], y___] := myFlatten[Normal@SparseArray[x], y]; Protect[SparseArray]; 就可以,不过这个会报一个警告信息
2017年12月31日 15点12分
很奇怪啊,为什么f[x___] := SparseArray[x]没有报警信息,然而 Unprotect[SparseArray]; SparseArray /: myFlatten[SparseArray[x___], y___] := myFlatten[Normal@SparseArray[x], y]; Protect[SparseArray]; 就有呢
2017年12月31日 15点12分
level 3
我用scheme写了flatten的第二种用法,其实前三种写起来都不难,第二种应用最普遍,所以写下来以后用的上
2017年12月30日 02点12分 5
吧务
level 15
关于Flatten的第4种语法,我怀疑用Table反而最好写,这里有个相关的例子:https://mathematica.stackexchange.com/a/140092/1871
当然了,这个跟“一般化”的实现还有距离。
2018年01月06日 11点01分 6
吧务
level 15
然后……老实说我觉得这个主题开得……有点“问题”,该说是范围太大了呢,还是目标不够明确呢……顶楼说这是个游戏,可这个游戏的目标是啥?怎么通关?怎么算排名?
2018年01月06日 11点01分 7
吧务
level 15
还有,我觉得真要说难,一些非常基本的函数反而难写。(主要是顶楼要求了功能要完全相同。)比如说,List怎么写?
此外,Mathematica里其实有极少数函数,由于其功能的特殊性与基础性,是不可能用顶楼的方法复制的(…these behaviors simply cannot be altered, nor can they be duplicated.)。这帖专门讨论了这个问题:https://mathematica.stackexchange.com/q/121981/1871
2018年01月06日 11点01分 8
1