网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
10月14日漏签0天
mathematica吧 关注:20,006贴子:74,334
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 11回复贴,共1页
<<返回mathematica吧
>0< 加载中...

Function by Others Except Itself游戏,活跃下贴吧气氛

  • 只看楼主
  • 收藏

  • 回复
  • situxuming
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
工作了之后就好久没来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]
************************************************************************************************************************************
欢迎大家继续补充,后面的朋友继续 ^_^


  • paulwu1983
  • 大写小写
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
In[5]:= mylast[x_] := If[Rest[x] === {}, First[x], mylast[Rest[x]]]
In[9]:= mylast[Range[99]]
Out[9]= 99


2026-10-14 22:35:33
广告
不感兴趣
开通SVIP免广告
  • 茶之花314
  • 列表操作
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
很好奇内置函数Flatten要怎么写


  • situxuming
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
@茶之花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本身的功能就有差别了。
至于第四种用法,还没怎么研究,有空再来定义看看。
上述供参考,有不正确之处欢迎指正,也可以提供其他实现方法。


  • paulwu1983
  • 大写小写
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我用scheme写了flatten的第二种用法,其实前三种写起来都不难,第二种应用最普遍,所以写下来以后用的上


  • xzcyr
  • 吧主
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
关于Flatten的第4种语法,我怀疑用Table反而最好写,这里有个相关的例子:https://mathematica.stackexchange.com/a/140092/1871
当然了,这个跟“一般化”的实现还有距离。


  • xzcyr
  • 吧主
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
然后……老实说我觉得这个主题开得……有点“问题”,该说是范围太大了呢,还是目标不够明确呢……顶楼说这是个游戏,可这个游戏的目标是啥?怎么通关?怎么算排名?


  • xzcyr
  • 吧主
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
还有,我觉得真要说难,一些非常基本的函数反而难写。(主要是顶楼要求了功能要完全相同。)比如说,List怎么写?
此外,Mathematica里其实有极少数函数,由于其功能的特殊性与基础性,是不可能用顶楼的方法复制的(…these behaviors simply cannot be altered, nor can they be duplicated.)。这帖专门讨论了这个问题:https://mathematica.stackexchange.com/q/121981/1871


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 11回复贴,共1页
<<返回mathematica吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示