Mathematica 中的模式匹配

Standard

本文目录:

 

想了很久,还是决定写下这篇教程。因为模式匹配在Mathematica太重要了,但这东西的确比较难描述清楚,下面我将尽我所能力图清晰地展现Mathematica中的模式匹配机制,部分内容参考自《An Introduction to programming with Mathematica》第六章,喜欢直接阅读英文材料的可以直接看这一节。

当然,以下均假定读者有基本的Mathematica基础。如果你以前从未接触过这个语言,建议你至少先看一下这篇文章(Mathematica中的四种括号,这篇至少是图文并茂,比本文全是代码要好一点)。


《Tiny Dice Dungeon》游戏机制分析

Tiny_Dice_Dungeon_Banner
Standard

《Tiny Dice Dungeon》是Flash游戏的聚集地——Kongregate推出的一款像素风格的骰子RPG手机游戏。游戏的独特之处在于以骰子的点数和来作为伤害,并且还可以通过 roll 骰子来捕获宠物。是RPG元素与随机元素的结合。

笔者大约试玩了一个小时,初步了解了该游戏的核心机制,觉得有些地方还是很值得分析的,特此拿出来分析一下。注意这不是攻略,只是对游戏玩法机制的分析。

Continue reading

《Extra Credits》汇总

Extra_Credits_Banner2
Standard

Do you want more from your games?
Do you want to know how games are designed, built and produced?
Do you want your games to leave you with something more when you walked off your screen?


We are Extra Credits and we believe that games matter.
We talk about how we can build better games, how games can be used not only as entainment, but for education, politics, even medicine.
We talk about game community, about game schools, game companines and the business of making games.


If it that sounds good to you, then join us each week for Extra Credits.
Because games matter.


《Extra Credits》系列是国外很有名的一个关于游戏分析的节目。一般每周都会以轻松幽默的讲座方式来分析关于游戏的一些问题。

该系列的一部分有汉化,可是也不太完全,英文原版语速比较快,觉得听力可以的童鞋可以试一下。

链接整理如下,定期更新。


Continue reading

【欧拉计划 #49】记一次神奇的解题经过

Standard

了解我的人应该都知道欧拉计划吧,就不多介绍了,这次是第49题,如下:

The arithmetic sequence, 1487, 4817, 8147, in which each of the terms increases by 3330, is unusual in two ways: each of the three terms are prime, and, (ii) each of the 4-digit numbers are permutations of one another.

There are no arithmetic sequences made up of three 1-, 2-, or 3-digit primes, exhibiting this property, but there is one other 4-digit increasing sequence.

What 12-digit number do you form by concatenating the three terms in this sequence?

 

翻译概括如下:

寻找一个3位的序列,满足:

  1. 每个数都是4位数的质数
  2. 构成等差数列
  3. 每个数的4个数字是另两个数的置换(例如1487, 4817, 8147)

已知这样的序列一共只有两组,一组是(1487,4817,8147),问另一组是什么?

 

这道题我想了半天,没有在数学上把它化简出来,就准备用枚举法做了。

因为要求的是一个3个数的有序序列,其总的可能数不超过9000^3/3!≈1.215e+11,直接枚举每个数会死人的。

由条件2,它是等差序列,这样知道两个数就能算第三个数,枚举的压力小了一点,上限是9000^2/2!/2≈2.0e+7,大概是两千万这个量级,依旧无法接受。

再由条件1,或许可以先生成1000~9999间的质数列表,再从中进行枚举,经计算这一区间内共有1061个质数,于是枚举量上限为1061^2/2!≈562860,五十万次。。唔。。还行吧。

但还有最后一个条件,每个数的数字构成必须相同,这个条件的验证还是有点麻烦的,目前还没想到特别高效的验证方法。但是其生成确是比较高效的。

 

想着想着,我就在想能否归纳出这类带约束的枚举类问题的通性,最终我画出了如下的表:

类型 验证 生成
质数 简单 简单
等差数列 相当容易 困难,情况数十分多
数位同构 比较麻烦,不够效率 中等,共C104 = 210组,每组至多24个元素

 

枚举固然有很多种方式,但说到底还是在于你对每一个维度选择了生成策略还是验证策略,而且其可能难度很不相同,这颇有点NP问题的感觉。

Continue reading

如何在网页中给单词加上注释

Standard

最近要看大段大段的英文,总是会遇到一些莫名其妙的词,想搞懂它的意思就得单独去查,甚是麻烦。又不想在电脑上装各种插件,但又希望能有一个一键切换翻译的选项。

几经波折,我看到在Chrome上有一款有道划词的插件,开启之后效果是这样的:

YoudaoTranslation

它不仅可以在单词后面加上中文注释,而且还可以选择适当的难度,很适合我这种只需要知道单词意思又不需要全文翻译的人。这样阅读起来效率会很高。

可是令人遗憾的是,这插件只有Chrome有,Firefox下就没有。为了能在 FF 下也能使用它,我开始了探索。

其实这插件的原理很简单,当页面载入的时候,会加载一段js,这段js如下:

javascript: void((function() {var element = document.createElement('script');element.id = 'outfox_seed_js';element.charset = 'utf-8',element.setAttribute('src', 'http://fanyi.youdao.com/web2/seed.js?' + Date.parse(new Date()));document.body.appendChild(element);})())

可以直接在控制台下运行这段代码(从void开始复制),看看页面上的单词是不是都加上注释啦!

 

其实,把这段代码复制到浏览器的地址栏中,也是可以达到同样效果的。也就是说,如果把这段代码作为地址存到书签里,只要点一下就相当于运行这段代码了。效果与安装插件一模一样。

接下来的事在Firefox中就很容易了:在书签管理器中新建一个书签(如果不能新建,就随便存一个然后修改),把名称改为“有道划词翻译”,地址部分填上面的代码(前面的javascript头不能少),然后保存即可。

接下来把这个书签放到你喜欢的位置,任何时候只要你想翻译,轻轻点一下,单词的翻译就自动跳出来啦,是不是很方便呢~\ (≧▽≦) /~

 

Mathematica语法拾遗

Standard

这里是用来总结Mathematica中的一些语法、句式、函数等,不一定很有条理,只是作为记录而已。

以及,本页的代码是有语法高亮的,如果看不到,可能是js没有加载完全,稍等片刻即可。 ╯_╰

 

2014-07-07 Update 4 新增Inner/Outer及范例,新增一些关于列表操作的 One-liners 实例。
2014-06-23 Update 3 新增Sow/Reap以及Gather等价类操作,更新分配部分。
2014-06-22 Update 2 新增规则匹配部分。
2014-06-21 Update 1 新增列表操纵、分配操作、简写符号、四种表达式形式,以及新增In/Out显示。
2014-06-17 初稿 新增基本函数调用、简单函数式用法。

Continue reading

Euler Project(欧拉计划)刷题记(Problem 1~50)

Standard

EulerProject官网地址)是一系列问题的集合,涉及数学与计算机方面。有的问题看起来是一个计算机问题,但却可以用数学推导去化简,有的问题化简到最后,也需要用编程技巧写代码来求解它。

EulerProject不限制你所用的语言,你可以使用Mathematica这样的数学工具,也可以使用PythonC++,甚至可能连编程语言都不需要,如果是自己推导算出答案的话。在解决完一道题后,会开放该题的讨论区,在那里你就能看到其他人是怎么解决这道题的。

EulerProject强调的是解决问题的想法,而不是你用什么编程语言。并且上面的题都是围绕一个很有趣的“一分钟法则”来设计的。这个法则是说,有可能你写了一个算法花了很长时间才算出结果,但总存在一个高效的算法能够在一分钟内得出结果,即使在一台性能比较差的计算机上。

然后,我就是开始了在EP上艰难的旅程,我用的是Mathematica语言。

 

如果说把每一道题的解答过程都写出来的话,就会显得很麻烦,而且已经有人做过这种事了。如果不写的话,又没什么好说的,真是太纠结了。干脆就这么水掉吧。

转念一想,很多人可能是第一次听到EulerProject,为了让更多人了解它,我觉得还是有必要举点例子,把一些有代表性的题拿出来说一下的。

 

EP Problem 1

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

 

题目意思是这样的:如果把10以下的3或5的因子列出来的话,有3,5,6,9,它们的和是23. 现在问1000以下3或5的因子之和是多少。

这道题作为整个EulerProject的第一题,一定程度上能传达出整个系列题目的风格,也侧面反映出能刷它的要求。就这道题而言,一般有两种做法,一种做法是写个算法枚举,另一种是通过数学推导直接求和。两种思路都能解决问题,并且实现起来也不难,就看你喜欢哪一种了。

如果是前者,只要有一点基本的代码功底,写一个这样的程序算一下应该没什么问题,实际上,对编码能力的要求并不是很高。因为它不是POJ,它不考验你算法理论、数据结构学的怎么样,只要求你能够用代码的工具去把问题实现即可。(像Python这种轻巧的脚本式语言就是不错的选择)

如果是后者,只要你能反应过来是“3的倍数+5的倍数-15的倍数”就足够了,容斥原理而已。拥有较强数学思维能力的同学可能会觉得后者更加适合。毕竟闭上眼睛想象,画画草稿纸就能蹦出一个答案,还是很了不起的。

 

EP Problem 7

By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.

What is the 10 001st prime number?

 

好逗的题目啊,问你第10001个质数是什么?

100内的质数还能背一下,可第10001个质数恐怕没人能直接报出来吧。

我用Mathematica我自豪,下面的代码可以直接得到答案:

Prime[10001]

用Python的话就要长一点了。

 

好像上面的题都有点水了,就没有有点挑战性的题目么?别急,前面题号才是个位数呢。

Continue reading

Mathematica中的四种括号

Standard

Mathematica中,一共有四种括号,它们有着不同的含义,熟悉它们的用法是看懂Mathematica代码的基础。

类型 示例 说明
圆括号 (term) 表示组合顺序的圆括号
方括号 f[x] 表示函数调用的方括号
花括号 {a,b,c} 表示列表数组的花括号
双括号 v[[i]] 表示下标索引的双括号 (Part[v, i]

 

一、基本用法

(圆括号)

a. 圆括号比较简单,它表示着运算的优先顺序,和数学中的圆括号意义相同:

Mathematica_TB_11a

Continue reading

Mathematica例程1——LookAndSay序列

details-of-lookandsay
Standard

Hello大家好,这里是Mathematica例程大讲堂。

有什么好的入门Mathematica的方法呢?一种办法是看帮助文档,很详细;另外,绝大部分文档下面都会有一个“巧妙范例”,解释一些函数的巧妙用法,我觉得这对学习Mathematica会有很大帮助。

但是Mathematica语法博大精深,有些看起来很废的函数在某些地方便会发挥很神奇的作用,也可以用来辅助理解Mathematica语言设计中的一些架构。

Continue reading

Mathematica连接远程内核那些事

Standard

最近要做一个并行的东东,用的是Mathematica语言,它里面是内置的远程内核的连接功能的。由于自己的电脑跑分实在太渣,所以想着要是能连上机群的服务器那也是不错的呢!然后坑爹的事就从这里开始了。

然后就去找Mathematica的各种资料啊,还好,找到一篇英文的官方文档。里面看起来很详细的说了几种连接的办法。比如,Lightweight Grid Server啦,机群整合啊,还有一个远程登录的连接。前两个都很复杂的样子,就准备试试最后一个。

照教程输入ip地址,看起来很简单的样子。然后运行,等了好久好久。。然后它告诉我没连上。再试,还是连不上。

Continue reading