小毛的胡思乱想

凡走过,必留痕迹.

使用jekyll和markdown遇到的问题

| Comments

不能正常生成页面

我是使用windows来弄的,在git shell里边操作。发现有时候页面根本不生成, 即使我把_site下面的文件全部生成,还是没动静。后来发现,需要设置一下环境的字符编码,例如export LC_ALL=zh_CN.UTF-8 可以在启动脚本里边修改,例如修改RUBY_HOME/bin/jekyll.bat,增加

SET LANG=zh_CN.UTF-8
SET LC_ALL=zh_CN.UTF-8

最近发现一个新的方法

chcp 65001

tags不能正常发布

tags如果列举多个的话,除了用逗号分割之外,必须在逗号之后加上空格,否则不能在github上正常发布。 但奇怪的是,在本地却是没有问题的。

列表不能正常显示

这个也比较奇怪,无论是有序列表还是无序列表,只能有部分能正常显示。 我试了很久,发现如果列表项里边没有数字或英文字符就不能显示。 这个问题已经解决了,原来在每个列表前面需要空行

高亮代码有问题

高亮代码不容易呀,需要python支持,还有安装easy_install Pygments。 但对于某些python版本来说,这样还不行,出现Liquid error: Bad file descriptor。 需要修改gems\albino-1.3.3\lib\albino.rb

另外,有时候高亮不是很合适,可以选择引用,只要每行前面至少加4个空格或1个tab就可以了。我习惯在每个引用块前后加一个空行。

在段落中硬换行

我原来以为不能硬换行,原来markdown也支持,只需要在需要换行的地方后面加至少两个空格就可以了。

页面生成太慢

当你的文章越来越多的时候,页面生成的时间会变得非常夸张,jekyll没有提供参数来控制。 为了解决这个问题,有个办法就是过滤某些没有变化的文件,因为大多数情况下,我们只是对特定的文件进行修改而已。 摸索了很久,最后我直接拿jekyll源码开刀,见让include和exclude支持正则add glob support to include,exclude option

围棋中气的判断

| Comments

围棋玩法

围棋本身的规则是非常简单的。判断一个子能不能落在某个点是最基本的问题。
如果不能吃掉对方但这个子周围还有气(空点)的话,是可以落子的。
如果能吃掉对方但不是打劫这种特殊情况的话,也是可以落子的。
我们先不考虑打劫这种情况,问题就归结为如何判断某个子是否有气,而杀子就是判断四周的子是否有气。

用递归来判断

假设有个方法try2kill(r,c),它可以用来判断r行c列的子是否有气,如果没气返回true,否则返回false。

递归过程如下:

  1. 判断四周是否存在一个气,就是有个空格(0),如果有返回false。
  2. 否则,给当前点记录为预杀状态(x)(表示自己周围没有明显的气)
  3. 再依次判断四周的点,对每个点例如左边(left):
  4. 如果左边未出边界且和当前点是同一颜色(但并非预杀状态),则调用try2kill进行判断
  5. 如果其中一个点有气(try2kill返回false),则直接返回false
  6. 如果四周都判断完,没有发现明显的气,则返回true(这样所有预杀状态的都是没气的,都会被杀掉)

打劫处理

打劫有个特殊的地方就是不能立即回提,本质上是不能在对弈过程中出现同形。
一个比较简单有效的办法就是,记录落子次序和每次的吃子数(通过上面的判断逻辑)。 这两个记录都是很容易记录的。判断是否打劫违规就是当前手和上一手的吃子数是否都为1。 且当前落子点对应上手的死子点,当前死子点对应上手的落子点。
这些条件符合的话,这就是一次违规。

后续

有了这些判断逻辑,要实现整个走法已经不是问题了,有兴趣的可以试试。
当然,围棋最复杂的地方还是人工智能领域,现阶段的电脑围棋还是比较弱的。

连连看中如何判断连通

| Comments

连连看基本玩法

连连看的玩法非常简单,判断两个块是否可以消除的规则是:必须是同一类型的块,可以通过至多 三条直线相连,并且直线没有被其他的块所阻拦。

数据结构表示

可以用一个二维数组来表示整个界面,不同类型的点用不同的值k来表示,那么一个点可以用k和(x, y)来表示。 空白处的值设置为0。另外为了方便处理只在边边上可以连通的情况,可以加上边界(二维数组加上两行两列,并设置为0)。 判断点a和b是否可以连通,如果是不同类型的点很好判断,判断a.k==b.k即可。 那么,问题就变成判断两个点a(a.x, a.y)和b(b.x, b.y)是否可连通。

简单的算法

我用的是一种比较直观的算法,当然还有其他很多算法(在网上资料搜一下就有很多了)。

首先为了方便理解,先不考虑两个点在同一线上的情况。那么两个点能够连上的情况只有就是横竖横或竖横竖两个情况 先考虑两个点是否可以横竖横连接的情况,参考下面的算法步骤:

  1. 给整个边界加上一圈空点(0)(方便后面计算)。
  2. 计算x轴上a,b两点左右两边的空点,这样可以算出两者公共的空点(x坐标相同),只有通过这些空点才可能联通达到横竖横的情况。
  3. 对每个公共的点,假设x坐标为c,那么就是点(c,a.y)和(c,b.y),再判断这两个点能否联通。
  4. 假设a.y小于b.y,那么就是看从(c,a.y+1)到(c,b.y-1)这些点是否都为空。
  5. 如果是空(0)的,表示最初的两个点是可以联通的。

到这里,一切已经ok了。另外一种情况跟这个是一样的, 而在一条直线上的情况只是这种判断的特殊情况而已。

蚂蚁走木棍

| Comments

蚂蚁走木棍

百度面试题

有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。 木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。 当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。 编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。

简化问题

看上去很复杂,但可以这样看问题:假设可以过两只蚂蚁,那么蚂蚁相撞两蚂蚁调头相当于不调头继续前进。 这样问题就可以迎刃而解了。最大的时间就是每只蚂蚁往远端前进(算出来是离一端最远的那只),最小的时间就是每只蚂蚁往近端前进(算出来是最后爬出来的那只)。 这样,最大时间就是3厘米的那只,耗时24秒。最小时间是11厘米那只,它最快要11秒才能出来。

小学竞赛题

这个题目让我想起一个竞赛题,大概是说,有两个人相距x米迎面走来(速度已知),其中有只狗在他们之间来回跑(狗的速度较快), 求两人相逢的时候,狗跑了多长距离。如果着眼点在狗每次跑动的距离,那一样非常复杂。如果着眼于时间, 则问题也就迎刃而解了。话说回来,类似的这些题目,更像是智力题而非编程题。

Blog in Github,新的开始

| Comments

老掉牙的故事

我写博客也不算新鲜事了,不过已经有2年没写过博客了。很早之前就有blogspotbonyfish.cn, blogspot是我最初的博客地址,因为我比较喜欢blogspot那种简洁的风格,只是后来在天朝无法访问,所以把数据迁移出来。 后来自己弄了个域名,用wordpress重新搭建了一个,又这样持续了一两天。 前后加起来写过超过1000篇大大小小的博客,只是因为各种原因,后来没有坚持下来,回想起来,还是有些可惜的。 不过,我手头上还是有一份完整的数据库备份,算是留个纪念。

why blog, why github

这两年的工作比较忙,这也是没坚持下来的原因之一,但同样也是这次想重新捡起来的主要动力。 在这家公司里边,忙已经成为一种常态,常常没有时间停下来思考,把好的东西沉淀下来。 这是一家感觉很特别的公司,有很多人很认真,却忙得一塌糊涂,没时间学习。 不得不说,这真是很无奈的一件事。但我不想这样,我需要时常回顾一下做过的事情,希望能从中获取到一些东西。 或许哪天我离开这家公司,我希望带走更多东西,而不只是一些钱和一个漂亮的工作简历。

为什么选择github作为博客?我非常喜欢github,它给我的体验非常好,我在公司弄的code diff工具也借鉴了github的review功能。 github的博客功能其实是一个只支持静态页面的page功能,相对于正式的博客来说,只能用简陋来形容,但它符合KISS原则,能够让我关注不至于过于分散。 借助jekyll和markdown标记语言来生成静态页面也很简单,稍微试了一下,符合我的要求:足够简单。

关于jekyll的更多内容,可以参考原作者的博文:像黑客一样写博客(中文版)

关于markdown的更多内容,可以参考这个教程:Markdown 语法说明,你只要花半个小时到一个小时就差不多了。

我还整理了一个使用jekyll和markdown中遇到的问题

plan…and so on

我是使用Jekyll Bootstrap弄的,因为我对twitter bootstrap这套简洁的css框架还算了解。同时,我相信你也是喜欢上这个风格的。

我会争取一个星期至少更新一篇,这个频率虽然有点慢,但目标不要定太高,万事开头难嘛 :) 另外,我会抽时间整理一下以前老的博客,把还有点用的东西重新分享一番,但愿这些年没有白过了。

拭目以待吧!