2011年11月30日星期三

新手提车小记

用chli的话说,就这样一下回到了解放前。用工作以来的全部积蓄,买了辆小汽车。号快到期了,再加上反正也不懂,就随便买了一个。
虽然交款第二天这款车型就上了央视的每周质量报告一通批判,可我还是很开心。心想有了车以后,去看父母再也不用在公交车上浪费宝贵的时间了。
销售小李帮我把车从4S店的洗车房里开出来,放在了青年路的路边换我上去,嘱咐我说,别忘了松手刹。
离开驾校5年零9个月以来,第一次自己开车。之前1个月摸过两次朋友的车,不过都没开出去多远,一次在院子里转了转,一次在试驾路线上兜了半圈,而且都有司机在边上指挥着。
这次,说实话,很紧张。
我坐上驾驶座,等老婆坐上副驾驶座,都扣好安全带,就松手刹、给油、窜了出去。
这时销售敲车门,大声问,松手刹了吗?我踩住刹车回答,松了,然后又给油窜了出去。
刚窜出去又一脚刹车,让左边一辆残疾三轮过去。
等他过去之后,缓缓给油,慢慢开起来了。在青年路的试驾路线上开了一圈,试驾路线上几乎一辆车都没有,觉得太假了,于是回到了姚家园路,准备回家。
本来在手机上安装调试好了付费版的凯立德导航软件,下载了离线版北京地图,可是完全无心打开,只觉得周围都是车,特紧张。根本不敢分心去掏手机。
心想,嗨,我车没牌我怕谁。就顶着一张临时牌照一路。。。蜗行回家了。
按照常识最外侧车道用于右转弯或者出主路,那我就在最里侧走吧。没想到这条车道是左转弯掉头的。
汗死。
由东向西到了东三环,要右转,狠心往右并线要出主路,右侧车队死活不给空档,还挤进来一辆9XX公交挡住了我的半个屏幕。左右摇摆之际,后面喇叭声此起彼伏。
到了出口的位置,妈的老子还在直行道上打着蹦灯没拐出去呢,急了,一把转盘一脚油门挤了出去,然后一脚刹车踩死定在了9XX屁股后面。
原以为老婆在旁边吓得惊惶失措了,没想她还挺高兴的,说道:"老公,你真棒!"
汗死。
到了桥下,发现其实刚才沿着主路直行到桥下也能右转,没必要拼了命地提早挤到辅路上来。
三环上走不起来。40%时间点着刹车往前蹭,30%时间滑行,5%的时间给点油,其他时间拉上手刹开风景。
当然,看风景的心思是没有的,只有在车里瑟瑟发抖的份:紧张+不知道空调热风怎么开。
安华桥掉头,两次右转270度=负180度那种,出主路又出不来了。打着蹦灯看着漫长的辅路车队,颇有沉舟侧畔千帆过的感觉。然而不是卧在船上看,而是要扭着脖子看。因为车身已经转过了30度,这次右侧后视镜视野完全不对,看不到辅路车辆,只能回头通过后排右侧车窗观察。差不多等了一个红灯的功夫,终于没车了,转上了安华桥。
终于到家了。可是。。。噩梦才刚刚开始!
最恐怖的路段,是进小区门之后。这是一个老小区,路只有三道宽,一道是规划停车位,停满了大大小小的车,另一侧地上画着禁止停车的标志,也停满了大大小小的车。
进门保安撕条递给我,我给油冲隔离墩,没控制好,留给他一个屁股。放了3个车窗才把自己的车窗放下来,伸出头去说,我停这儿去办车证,行吗。他说,这不能停,往前去,停前头那儿。
我再想往前开,发现已经不能开了,已经快顶到前面停那儿那车上了。想那就往后倒一点吧,后面进来一辆金杯,滴滴冲我按喇叭。
我勒个去。
我就在那里踩着刹车原地打轮,不敢碰油门。
金杯按耐不住,自己往后倒了一点,噌地窜了进去。
我一着急,刹车踩成了油门,往后跳出去老远。好在后面没人,赶快一脚刹车站住了。
看来倒车的时候不仅容易分不清左右,而且也容易分不清前后啊。
稳定一下情绪,踩着脚刹靠怠速驶入小区,边爬边寻觅车位。
这时对面从饭馆开出来一辆运货的小面包,迎面驶来。怎么办,只有一条可用车道啊。千军万马过独木桥么。狭路相逢勇者胜么。桥到船头自然直么。车到山前可路在哪儿呢。
缓缓地,他往左蹭蹭,我往右蹭蹭,好在相遇点两侧都是小车。我看到我的左侧后视镜距离面包车的左侧后视镜只有12厘米到15厘米,右侧后视镜距离停那儿那辆桑塔纳的右侧后视镜只有4厘米到9厘米。
过去之后我才纳过闷来,那叫后怕。天哪,我这是怎么过来的。。
继续在小区里逡巡。
逡巡许久,终于找到了一个理想的车位。停进去。右侧有矮墙,副驾门开不开。
老婆说,那我从你那边爬出去吧。
我说,别,我往回倒点。
老婆下车后,我又把车往边上靠了靠,停稳,轮回正,拉手刹,放P档,拔了钥匙,走人。

2011年11月20日星期日

马尔代夫满月岛攻略

11月15日
早上9点从T2航站楼出发,这个周二早高峰时间路面上的机场巴士不靠谱,于是7点半在北三环上打了个车,去三元桥换机场快轨。8点5分到机场柜台,被告知再有五分钟通道就关闭了,真悬!下午2点多到马累机场,出飞机差点被热死。老子还穿着秋裤,在赤道上忍了2个多小时才到房间。坐船到满月岛,前台交400$押金。喝了一种非常好喝的饮料,填了张表格。
先住沙滩屋,洗澡的地方是上半露天的,洗的慢了会晒伤。还有个阳台,阳台外有个水龙头可冲脚,因为从沙滩回来通常脚上都是沙子。傍晚到海滩走了走,订了第二天的海豚巡游。
16日
5点多起来看了个日出的尾巴,趁太阳不太猛,到处走走拍拍。金色的朝阳暖暖地打在沙滩上。
吃完早餐就回房睡觉。下午下海游了会儿泳,又睡了。
傍晚出海去看海豚巡游。没有见到海豚。日落很美,浪很大。
17日
搬家到水屋,有车接。水屋特别好,洗澡的地方有270°的视野看海景。从阳台可以直接下水。中饭后,我们就下海试了装备。
累了就回房睡觉,或者在阳台的躺椅上吹海风,吃苹果。
18日
又看了个日出的尾巴。上午在浅滩看到了小鲨鱼,还有上千条小鱼。
中午继续在阳台晒太阳,忽然想到一句词"海空凭栏阔",不知出处。后来才知道是杜撰出来的,没有这样的说法。如果把"凭"和"栏"断开,把前者解释为"是因为",那么这句词就有了含义:觉得海面空旷,是因为阳台宽敞。
下午在近海浮潜,拍水下小鱼。拍到了一些。
晚饭去吃了烛光晚餐。
19日
什么也没做,上午睡了个懒觉,中午交了房就坐船回机场了。

心得:
自始至终没觉得是出国,到处是中国人。还以为是到了三亚。
满月岛貌似由喜来登托管,国际化做的不错,几乎所有服务都有中文。那些不懂英语的富二代到了岛上也不会饿死。
自助餐貌似不用给小费。烛光晚餐和出海看海豚巡游直接记账就好,不用给现金。账单上已经包括了消费。
早餐相当丰盛,一坐下就有人来给你倒咖啡、橙汁。豆奶很好喝。各种面包点心粥。各种鸡蛋的做法:煎蛋、水煮蛋、蛋卷。各种果酱和水果。
浮潜装备因人而异,本人因为视力不好,带上面罩水下什么也看不见,只好换带度数的泳镜。气管的塑料味和海水的咸味让我恶心,在嘴里咬了一会儿就扔一边了。穿着救生衣,很难潜到水下太深的地方。大陆架很长,水也不深。脚蹼很好用,没有它基本上游的速度是0。光脚下水很危险,水下珊瑚轧脚。
水屋柱子上有一种奇怪的螺,不小心靠近柱子的时候碰到,手被剌出一个口子,直流血。
岛上只有一个地方可以免费上wifi,在Lobby旁边的网吧。
我们搭乘的是海航的飞机,往返各含两餐,一顿正餐有热米饭,一顿落地餐是三明治。回到北京是凌晨2点半,公共交通工具不要想了,直接打的回家。
自己带了一箱子吃的,因为酒店管4顿早餐,2顿晚餐,所以另外还有6顿饭要自己解决。
不用带水,房间里有瓶装水,还可以烧开水。
防晒霜不能省,我们每次下海前都抹,仍然会晒黑,不过不会晒伤。
不要为整天介睡觉而懊丧,心情好精神好是最重要的。这就是马尔代夫度假的意义。
如果平时苦日子过惯了,开始一两天会无法进入状态,适应不了这么慵懒并且奢靡的生活。带着一点批判去享受它,慢慢就好了。回到北京之后,你会忽然发现,哇塞自己的执行力好强。

2011年11月12日星期六

测试MathJax

下面的欧拉公式可以在网页上自动渲染。
$$e^{2\pi i}=1$$
这是因为我在Blog模板的<head>中加入了公式渲染引擎

<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"> </script>

还可以使用inline的公式渲染。例如$\frac{\partial^2 \phi}{\partial x \partial y} = \frac{\partial^2 \phi}{\partial y \partial x}$呵呵。
只需要加一行 <script type="text/x-mathjax-config"> MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$']]}}); </script>

2011年11月11日星期五

2-SAT

总算release了,释放一下,找个简单的问题自娱自乐一把。
n个变量组成m个子句的句子,其中每个子句中恰有两个变量用或连接,每个变量可以替换成他自身的取反,子句之间用且连接。
给一个这样的句子s,求一组真值分配。

算法:
如果存在一个不成立的子句,就反转其中一个变量。
反复为之,直至超过循环的最大次数。

(听到一个声音说:这叫什么狗屁算法,这不就是在瞎蒙么!)

实现:
import random, re

sentence = lambda n, m: " and ".join(["(%sx%d or %sx%d)" % (
                random.choice(["not ", ""]), random.randint(1, n),
                random.choice(["not ", ""]), random.randint(1, n)) for i in xrange(m)])

def detect_self_contradict(sub):
        (i, j) = re.match(".*?(\d+).*?(\d+)", sub).groups()
        ret = i == j and sub.count("not") == 1
        if ret: print i
        return ret

def solve(s, a):
        for _i in xrange(10000):
                print _i, a
                exec(";".join(["x%d=%s" % (i+1, a[i]) for i in xrange(len(a))]))
                if eval(s): return a
                for sub in s.split("and"):
                        if not eval(sub):
                                i = int(random.choice(re.match(".*?(\d+).*?(\d+)", sub).groups())) - 1
                                a[i] = not a[i]
                                break
        return "failed to solve %s" % s

a=[True]*20
s=sentence(len(a), 24)
if any([detect_self_contradict(sub) for sub in s.split("and")]):
        print "no way! %s" % s
        exit()
print s
print solve(s,a)

一次试验:
python 2sat.py 
(x19 or x6) and (not x1 or x20) and (x5 or not x20) and (x14 or not x20) and (x4 or x2) and (not x19 or x2) and (not x15 or not x6) and (x8 or not x15) and (x9 or not x17) and (not x11 or x4) and (not x16 or not x4) and (not x17 or not x11) and (x20 or x20) and (not x12 or not x16) and (x13 or not x10) and (x3 or not x17) and (x17 or x14) and (not x10 or not x6) and (not x13 or x19) and (x3 or x1) and (not x5 or x8) and (x15 or not x3) and (x1 or x1) and (x3 or x4)
0 [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]
1 [True, True, True, True, True, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True]
2 [True, True, True, False, True, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True]
3 [True, True, True, False, True, False, True, True, True, True, False, True, True, True, True, True, True, True, True, True]
4 [True, True, True, False, True, False, True, True, True, True, False, True, True, True, True, False, True, True, True, True]
[True, True, True, False, True, False, True, True, True, True, False, True, True, True, True, False, True, True, True, True]

我试验了很多次,发现凡是有解的时候,都不需要迭代很多次。

再分析:
如果存在一个满足句子s的真值分配A,那么令当前分配X[k]与A相同的变量个数为f(A, X[k])。
每次循环,至少有一半的概率f(A,X[k+1])=f(A, X[k]) + 1

为了证明这一点,假设一个当前未满足的子句X或Y,A以概率p取T,T,以1-p的概率取T,F或F,T。当前取值X[k]显然为F,F,那么f(A,X[k+1])=f(A, X[k]) + 1的概率依全概率公式得
p*1+(1-p)*0.5=0.5+0.5p>=0.5
证毕

f(A,X[k+1])=n时,我们就求得了一个真值分配。


这个试验告诉我们一个道理:如果你相信存在一个真理,并且在实践中发现每次尝试的试错概率不超过一半,并且每次尝试成功都可以向真理靠近一个常数距离,那么,你就大胆地去不断尝试吧!(听到一个声音说:这叫什么狗屁道理。。。)