启动Wolfram挑战站点

Wolfram的挑战

一个人的计算思维做得越多,他的计算能力就越强。今天我们要启动Wolfram的挑战网站给每个人一个来源的咬大小计算思维的挑战基于Wolfram语言.用它们来学习。用它们来保持敏锐。用它们来证明你有多伟大。

这些挑战的典型形式是:“编写一个函数来执行X”。但是因为我们使用的是Wolfram语言——以及它所有的内置计算智能——所以很容易使X变得非常复杂。

该网站有一系列级别的挑战。有些适合初学者,而有些则需要有经验的程序员和计算思考者的认真努力。通常,每个挑战至少有一些已知的解决方案,最多只有几行Wolfram语言代码。但是这些代码行是什么呢?

对于一个特定的挑战,可能会有许多不同的方法,从而导致不同类型的代码。有时代码会更小,有时会运行得更快,等等。对于每一个挑战,网站都保持排行榜这显示了到目前为止谁得到了最小的,最快的,等等解决方案。

如何才能应对网站上的挑战?如果你读过我的Wolfram语言的基本介绍例如,您应该充分准备 - 可能有一些额外的帮助来自主要的Wolfram语言文档。但即使你是一个初学者,你仍然应该能够做出更简单的挑战,也许在你需要的时候看着我的书的部分。(如果你是一个经验丰富的程序员,那么跳跃的好方法就是看看程序员快速入门.)

它是如何工作的

网站上有很多不同的挑战。每个挑战都与主题区域标记。在首页上,您可以使用许多“曲目”,您可以用作相关挑战序列的指南。以下是当前的挑战真实的数据追踪:

现实世界的数据挑战

单击您想要尝试的一个 - 您将获得一个网页解释挑战:

海拔挑战以上或低于海平面挑战

现在你可以选择将Challenge笔记本下载到桌面,或者直接在浏览器中打开Wolfram云.(使用Wolfram Cloud是免费的,不过你必须登录——否则系统将无法为你解决的挑战打分。)

这是这个特定笔记本的云版本:

挑战云笔记本

您可以在Scratch Area构建您的解决方案,并在那里进行尝试。当你准备好了,把你的代码放在写着" Enter your code here "的地方。然后按提交。

提交所做的是将您的解决方案发送到Wolfram cloud,在那里它将被测试,看看它是否正确。如果它不正确,你会得到这样的结果:

错误代码

但如果它是正确的,你就会得到这个,你就可以进入排行榜,看看你的解决方案与其他人的相比如何。你可以多次提交相同的挑战。(顺便说一下,你可以在个人资料选项卡中选择你的名字和图标。)

挑战排行榜

挑战的范围

在难度水平和主题方面,该网站上的挑战范围广泛。(并且,顺便说一下,我们计划逐步发展该网站,尤其是来自外部贡献者的材料。)

以下是一个简单的挑战例子,我个人可以在几秒钟内解决:

蝴蝶字符串的挑战

下面是一个更复杂的挑战,我花了15分钟才解决好:

巴巴比方块挑战

有些挑战在某种意义上是“纯粹的算法挑战”,不依赖于任何外部数据:

最大连续的总和挑战

有些挑战是“真实世界的”,并利用Wolfram知识库

全国连锁的挑战

一些挑战是“数学的”,并利用Wolfram语言的数学能力:

的阶乘零挑战

数方格数目挑战

预发动经验

我们多年来一直计划推出一个像Wolfram Challenges这样的网站,但直到现在,在Wolfram Cloud的当前状态下,我们才能够像今天这样设置它——这样任何人都可以打开网页浏览器,开始解决挑战。

尽管如此,我们已经有了大约三年的未公布的初步版本,并且挑战的数量稳步增长。事实上,总共有270人已经发现了初步版本,并且总共产生了不少于11400个解。有些人已经多次解决了同样的挑战,想出了越来越短或越来越快的解决方案。其他人则转向了不同的挑战。

看到针对单个挑战的解决方案是多么多样化是一件有趣的事情。以下是三个不同挑战的解决方案中使用的功能词云:

在Wolfram挑战中使用的函数

当涉及到解决方案的长度(这里指的是代码字符)时,针对特定的挑战可能会有不同的变化:

Wolfram挑战中的解决方案长度

以下是所有挑战期间提交的所有解决方案的解决方案长度的分布:

提交的解决方案的解决长度

目前还不清楚这是哪种分布(尽管看起来接近对数正态)。但真正美妙的是,它是多么集中于解,而解不超过一行。(其中81%的人甚至可以写进一条280个字符的推文!)

事实上,我们所看到的可以被看作是对Wolfram语言的一个伟大的敬意。在任何其他编程语言中,大多数挑战——如果你能做到的话——都需要几页代码。但在Wolfram语言中,即使是复杂的挑战,通常也可以通过tweet长度的代码来解决。

这是为什么呢?好吧,基本上是因为Wolfram语言是一种不同的语言:它是一种基于知识的语言,许多关于计算和其他事情的知识都内置在语言中(感谢我们30多年的辛勤工作)。

但这些挑战仍然是“真实的”吗?当然!只是Wolfram语言让我们可以在更高的层次上操作。人们不必担心编写复杂操作如何实现的低级机制——人们可以专注于如何完成挑战的纯高级计算思维。

在引擎盖下

好的,那么建立Wolfram挑战网站的一些挑战是什么?可能是最重要的是如何检查特定解决方案是否正确。毕竟,我们不只是要求计算一些我们可以轻易比较的单一结果(例如,42)。我们要求创建一个可以采取的函数,可能是无限可能的参数,并且在每种情况下都提供正确的结果。

那么我们如何知道这个函数是否正确呢?在一些简单的情况下,我们实际上可以看到函数的代码是否可以以一种保留意义的方式转换为我们已经知道是正确的代码。但是在大多数情况下——比如在大多数实际的软件质量保证中——最好的方法就是尝试测试用例。有些将被确定地选择——例如基于检查简单的或角落的情况。其他的则是概率生成的。

但最终,如果我们发现该功能不正确,我们希望向用户提供一个简单的案例,演示了这一点。经常在实践中,我们可能首先在某种相当复杂的情况下看到失败 - 但是系统试图尽可能简化故障。

好的,另一个问题是:如何判断一个函数的特定值是否正确?如果值只是一个整数(比如,343)或字符串(比如," hi "),那么就很简单了。但如果它是一个近似的数字(比如,3.141592……)呢?那我们就得开始考虑数值精度了。如果它是一个数学表达式(比如,1 + 1/x) ?我们应该允许对表达式进行什么转换?

还有许多其他的情况。如果它是一个网络,我们可能会说它是正确的,如果它与我们所期望的同构(即相同直到重新标记节点)。如果它是一个图形,我们可能会说它是正确的,如果它在视觉上看起来和我们期望的一样,或者至少是足够接近。如果我们处理的是真实世界的数据,那么我们必须确保重新计算我们的预期结果,考虑到我们知识库中的数据,这些数据因为现实世界的变化而改变。

好了,假设我们已经得出结论某个函数是正确的。现在,为了填写排行榜,我们需要在上面做一些测量。首先,代码有多长?

我们可以把代码格式化InputForm,然后数字符。这给了我们一个衡量标准。你也可以申请ByteCount只要在函数的定义中计数字节。或者我们可以申请LeafCount,计算表达式树中定义的叶子的数量。排行榜分别追踪所有这些“代码大小”度量值。

好的,那么代码的速度如何?好吧,这有点棘手。首先,因为速度不是抽象的东西,就像“图灵机上的总操作数” - 它运行计算机的实际速度。因此,它已被标准化为计算机硬件的速度。然后,它必须以某种方式丢弃特质(与缓存相关联),特别是测试运行,如此重复封闭.哦,甚至更基本上,它必须决定测试该功能的哪个实例,以及如何平均平均。(它必须确保它不会浪费太多时间追逐一个令人难以置信的缓慢的解决方案。)

嗯,实际上做所有这些东西,一个人必须制定一系列特定决策。最后,我们所做的就是将所有人包装成我们在排行榜中报告的单一“速度分数”。

排行榜中的最终指标是“记忆效率”。像“速度分数”一样,这是以函数的实际测试运行的一种复杂的方式导出。但重点是,在狭窄的边缘内,结果应该是相同的解决方案之间的可重复性。(以及,是的,当它们在新版本的Wolfram语言中运行时,速度和内存排行榜可能会更改,具有不同的优化。)

基本信息

我们首先开始测试现在的Wolfram Challenges网站Wolfram暑期学校在2016年,我们很快发现很多人都觉得我们开发的挑战非常吸引人。一开始,我们不确定挑战需要多久——也许有点异想天开。我们尝试在每个挑战中设置完整的“故事”(游戏邦注:如一些数学竞赛等)Project Euler做)。但很快我们决定将挑战限制在较短的状态中,尽管有时会给它们起一些古怪的名字。

我们在2017年沃尔佛夏季学校再次测试了挑战,以及沃尔夫勒姆高中夏令营我们发现这些挑战非常容易上瘾,以至于有些人会系统地去尝试解决所有的挑战。

我们最初并不确定应该允许何种形式的挑战。但过了一段时间后,我们决定(至少在最初)专注于“编写一个函数来执行X”,而不是仅仅“计算X”。我们的基本理由是,我们希望这些挑战的解决方案更加开放。

如果挑战是“计算X”,那么通常只有一个最终答案,一旦你得到了它,你就得到了它。但是对于“编写一个函数来做X”,总是有不同的函数要编写——可能更快、更小,或者只是不同而已。在实践层面上,有了“计算机X”,答案更容易被发布在网上,从而“破坏乐趣”。对于“编写函数”,是的,可能会有某个函数的一个版本的代码发布在某个地方,但总有其他版本需要编写——如果你总是提交以前见过的版本,很快就会很清楚,你必须从某个地方复制它们。

事实证明,我们实际上具有相当多的经验,“计算x”格式。因为在我的书中Wolfram语言的基本介绍所有的655个练习基本上都是“编写代码来计算X”的形式。在这本书的在线版本中,所有的练习都是自动评分的。

自动评分

现在,如果我们只是做“便宜”的自动分级,我们只需看看代码在运行时会产生正确的结果。但这实际上并没有检查代码。毕竟,如果答案应该是42,有人可以给出42(或者41 + 1)作为“代码”。

我们实际的自动评分系统要复杂得多。它当然会查看代码运行时的结果(注意不要盲目求值)退出在一段代码中——考虑诸如随机数、图形或数字精度等因素)。但是系统的真正内容是对代码本身的分析,以及运行时发生的事情。

因为Wolfram语言是符号的,“代码”和“数据”是一样的东西。而自动评分系统广泛地使用了这一点——不仅仅是应用符号代码转换序列来确定输入的特定代码段是否等同于已知的代表适当解决方案的代码段。(系统也有办法处理“完全新颖”的代码结构。)

代码等价是一个困难的(其实一般,不可判定的)问题。一个稍微简单一点的问题(尽管在一般情况下仍然无法判定)是数学表达式的等价。我们广泛使用这种等价的地方是在Wolfram问题发电机

当然,我们想要的等价可能取决于我们生成的问题的类型。通常是1 +xx+ 1被认为是等价的。但是(1 +x) /x可能想要,也可能不想被认为等同于1 + 1/x.要把这些事情做好并不容易(许多在线评分系统在这方面做得很糟糕)。但是通过在Wolfram语言中使用一些复杂的数学和符号转换功能,我们已经成功地使它在Wolfram Problem Generator中工作得很好。

贡献新的挑战!

Wolfram Challenges网站现在的存在只是一个开始。我们打算让它成长。让它成长的最好方式,就像我们的长时间运行Wolfram示范项目-是让人们贡献出伟大的新挑战。

在Wolfram挑战的底部主页您可以下载创作笔记本的挑战:

挑战创作笔记本

填好这张表,按“提交挑战”,然后这张表就会发给我们审阅。

超越挑战

Wolfram Challenges似乎吸引了那些喜欢解决数学难题、填字游戏、脑筋难题、数独等问题的人,对此我并不感到惊讶。我也不惊讶于它们能够吸引那些喜欢游戏和编程比赛的人。但就个人而言,无论好坏,我都不属于这些类别。事实上,当我们第一次考虑创建Wolfram Challenges时,我说:“是的,很多人会喜欢它,但我不会成为其中之一。”

我得说我对自己的看法是错的。因为我很喜欢做这些挑战,我发现我必须避免开始他们因为我会继续做他们(是的,我是一个射手,所以有风险我可以继续,直到我做了,这将是一个非常严重的投资的时间)。

那么这些挑战有什么不同呢?我认为对我来说,答案是它们感觉更真实。是的,它们被设计成挑战。但解决这些问题所需要的思考基本上与我在“真实环境”中所做的思考是一样的。所以当我致力于这些挑战时,我并不觉得自己“只是在做一些消遣”;我觉得我在磨练自己的技能,做真实的事情。

现在我意识到并不是每个人的动机结构都是一样的——许多人喜欢把这些挑战当成真正的娱乐。但我认为“挑战”也可以帮助培养真正的技能,这很好。当然,如果有人做了很多这样的挑战,这表明他们有一些真正的技能。(是的,我们开始把挑战作为一种评估申请者的方式,比如说,我们的暑期计划.)

值得一提的是,Wolfram语言还有其他一些“潜在的娱乐”用途。

一个例子就是竞争性的实时编码。Wolfram语言基本上是独一无二的,它是一种可以以足够快的速度编写有趣程序的语言。多年来,我做了大量的(非竞争性的)实时编码——两者都做在人转播画面.但在过去的几年里,我们一直在发展竞争性实时编码的概念,将其作为一种新的运动。

Wolfram技术会议

我们已经完成了一些试验Wolfram技术会议我们正在努力建立健全的规则和程序。在我们目前所做的工作中,典型的挑战是“计算机X”的形式——人们需要几秒钟到十分钟来完成它们。我们用了现在属于我们的东西Wolfram聊天功能来分发挑战并让参赛者提交解决方案。我们使用自动化的测试方法和人工“裁判”来评判比赛。

Wolfram语言的另一种娱乐应用是我们的Tweet-a-Program服务,2014年发布.这里的想法是编写足够短的Wolfram语言程序,以容纳一条tweet(当我们启动tweet -a- program时,意味着只有128个字符),并使它们产生尽可能有趣的输出:

Tweet-a-Program输出

我们在我们的Wolfram技术会议上有一段时间的现场模拟:我们的年度一行程序竞争.我不得不说,即使我(大概)知道Wolfram语言很好,我总是惊讶于人们实际上设法用一行Wolfram语言代码做什么。

在我们最近的Wolfram技术会议上,在了解我们在机器学习的进步方面,我们决定做一个“机器学习艺术竞争“ - 使最有趣的可能重新剪裁“Wolfie”:

沃尔夫提交

在未来,我们计划将机器学习挑战作为Wolfram挑战的一部分。事实上,我们希望添加几类挑战。我们已经有了使用Wolfram知识库的挑战,以及它包含的内置数据。但我们也计划添加挑战,使用外部数据来自Wolfram数据存储库.我们还想添加一些挑战,包括创建神经网络之类的东西。

这里出现了一个新问题 - 这实际上与大量可能的挑战有关。因为大多数原因都像神经网络这样的东西,所以不要再期望产生一定的函数,明确地“得到正确的答案”。相反,一个只是想要一个在特定任务上做出最好的工作的函数。

有很多可以想象到的挑战的例子,涉及寻找“最低成本的解决方案”或“最合适的”。这与典型的机器学习任务类似:找到一个函数(比如基于神经网络)在对某个测试集进行分类时表现最好,等等。

是的,Wolfram Challenges的基本结构非常适合处理这种情况。它只是告诉你你的解决方案在排行榜上的排名,而不是明确地告诉你你为某个挑战找到了正确的解决方案。

Wolfram Challenges网站中的挑战总是有非常明确的最终目标。但是关于Wolfram语言的一个伟大的事情是它是多么容易使用它来探索和以一种开放式的方式创建。但作为一种类似于《Challenges》的游戏,我们总是可以为它提供一些种子。一个例子是探索Wolfram编程实验室.其他例子是我们为像我们这样的东西制作的各种项目建议暑期计划

开放式探索的正确输出是什么?我认为在很多情况下一个好的答案是计算论文,写在Wolfram笔记本,并“讲述一个故事”与普通文本和Wolfram语言代码的混合物。当然,与《挑战》(Challenges)不同的是,在《挑战》中,人们所做的事情是要被机器检查和分析的,计算性论文从根本上讲是关于与人类交流的——没有正确或错误的“答案”。

前进的道路

在创建Wolfram语言时,我的总体目标之一是为尽可能多的人带来计算知识和计算思维。威尔法共兰挑战网站的推出是漫长旅程的最新一步。

这是与编程和计算思维进行融合的好方法。它设置为始终让您知道您是如何进入。你解决了这一挑战吗?你是如何相对于其他也解决挑战的人?

我很期待看到那些小而高效的人能如何解决这些挑战。(是的,大量等价的解决方案为在程序转换和优化方面进行机器学习提供了很好的原材料。)

谁将成为Wolfram挑战排行榜的领导者?我想会有各种各样的人——有不同的背景和教育背景。有些人会很年轻;有些人会变老。有些人将来自世界上技术最发达的地区;我希望,有些人将来自技术落后的地区。有些人已经是Wolfram语言社区的积极贡献者;我希望,其他人将通过挑战来到Wolfram语言——甚至可能通过这种方式被“发现”为有才华的程序员和计算思想家。

但最重要的是,我希望很多人能从Wolfram challenges中得到很多乐趣和满足,并有机会体验到找到一个特别聪明和强大的解决方案后所带来的兴奋,然后可以在自己的电脑上运行。

7评论

  1. 提交我的解决方案后如何看到最好的解决方案?

  2. 这是一个很好的想法。在Project Euler做了一些问题。这里可以了解更多,人们提交他们的代码,可以了解其他人如何做到。

    解决了一些挑战,我来到Tomorsecode并有几个建议。应该有一种不同意测试的方法。如果它应该是娱乐编码,则验证应该“快乐案例”。如果您想雇用某人,那么输入验证是一件好事。在这种情况下,用字符串“它们”来测试代码,这应该产生包括撇号的莫尔斯编码。在文本周围有空间不是“快乐案例”编码的一部分。人们可以争辩说它应该是结果的一部分,而是必须修剪或不修剪输入不是大脑戏弄的一部分。

    尝试在Mathematica中提交结果常常会导致401 http错误代码,即使是使用正确的凭据。

    “评估框”不允许我复制结果,例如做一个差值。

    匿名
    • 我们很高兴您享受Wolfram挑战!

      tomorcode测试的问题已经解决。

      我们正在努力修复在Mathematica内提交结果时导致错误代码的问题。

      目前在Wolfram Cloud notebook中不支持CopyToClipboard,这就是为什么你可能会面临复制结果的问题。

      谢谢你的反馈!

      管理
  3. 感谢您描述在“引擎盖下”部分中的检查。
    用户是否可以使用这种检查机制(例如,创建他们自己的挑战)

    内存
    • 嗨,Ram !用于检查解决方案的代码(与Stephen在您所引用的部分中描述的代码不同)对公众是不可用的。谢谢你的兴趣!

      管理
  4. 我就是喜欢学习

    杰克史瓦兹
Baidu