有趣的派派节

今天是3月14日,圆周率日,昵称派派节。你能背出圆周率的前几位?

我只能背出“山巅一寺一壶酒”。刚好够用,因为圆周率节一般在3月14日1:59开始庆祝,这样至少我不会错过开场的红酒。小时候背到这里就到此为止了,属于童子功。如果像《少年派的奇幻漂流》里的少年派那样,一口气背了满满一黑板,那么现在就可以在儿子面前炫耀了。

德国同事像发现新大陆一样,兴高采烈地说:“你知道吗?披萨(pizza)这个词其实告诉了我们怎么计算披萨的体积。如果披萨的半径是z,厚度是a,那么体积就是 pi * z *z *a!哦耶!”

呃……好吧。

enter image description here

去年,我们经历了百年一遇的圆周率时:3月14日15年9时26分53秒。这时辰够猛,不知有多少孩子在这个时辰出生。不过,这还不是最猛的,最猛的是1592年3月14日上午6时53分58秒,记作3/14/1592 6:53:58,被称为“终极圆周率日”,绝无仅有,空前绝后。照理说,当时的人们应该热烈庆祝吧?呵呵, 错了,当时的人类还没有把圆周率算到这么多位。当时,欧洲刚刚把圆周率推算到3.1415926到3.1415927之间。而在遥远的东方,中国人完成这项工作时,比欧洲早了1000年。

圆周率是非常神奇的数字。不管你怎么画圆,它的周长和直径总是这样一个比值,一点也不多,一点也不少,充满了神秘的宿命感,冥冥之中似乎蕴藏着一个天大的道理。荒唐的是,它偏偏被称为“无理数”。人类对圆周率的认识,从某种程度上显示了对这个宇宙认识的水平。古代中国的水平世界领先,可是雏凤清于老凤声,欧洲比我们晚,但却给我们带来了现代科学,这是更值得我们反思的。

我的博客有一次发福利的时候,需要从留言中随机挑选几位幸运者。如何做到真正的随机?我就借鉴了土木坛子的算法用到了圆周率,略作改动。方法是这样的:

  1. 取最后一名留言者留言时的两位分钟数;
  2. 找到这个数在圆周率中第一次出现的位置,抽出其后面的十个数字(假设留言者总数不超过99位,如果是超过99位不到1000位则需要取15个数字,以此类推),依次两两分成五组,得到五个两位数;
  3. 剔除我自己和重复发留言的网友后,将所有的留言者按先后顺序排队,每人有一个编号(最早的为01号,以此类推),并得到总人数;
  4. 将上述五个数字百分化,即除以99(假如是多于99位则需要千分化,以此类推),再乘上总人数,四舍五入取整数,这五组整数就是对应的幸运编号。

这个方法的R代码,我列在后面。只要把urlink更改成本博客任何一篇帖子的网址,就可以看任何一篇帖子幸运留言者的名单了。

祝大家派派节快乐!

lucky <- function(urlink){
  clear <- function(x) { # 处理字符串
    y <- gsub('^[^<]*', '', x)
    y <- gsub('says:.*', '', y)
    y <- gsub('<[^>]+>', '', y)
    y <- gsub(' ', '', y)
    return(y)
  }
  mypi <- '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989' #http://pi.911cha.com/
  commentformat <- 'class="fn"'
  webpage <- readLines(urlink, encoding='UTF-8')
  id.ps <- grep(commentformat, webpage) 
  id <- clear(webpage[id.ps])
  time <- strptime(paste(substr(webpage[id.ps + 2], 5, 14), substr(webpage[id.ps + 2], 19, 23)), '%Y-%m-%d %H:%M', tz = 'GMT')
  time <- time[-regexpr('大鹏', id) > 0]
  id <- id[-regexpr('大鹏', id) > 0] # remove my own
  id <- unique(id)
  lastcomment <- format(time[time == max(time)], '%M')
  pc <- regexpr(lastcomment, mypi)[1]
  ndigits <- nchar(length(id))
  lucky <- unique(id[ceiling(as.numeric(substring(mypi,  pc + seq(ndigits, length.out =3, by = ndigits),  pc + seq(ndigits * 2 - 1, length.out =3, by = ndigits))) / 10^ndigits * length(id))])
  return(lucky)
}

urlink <- 'http://dapengde.com/archives/17520'
lucky(urlink)
urlink <- 'http://dapengde.com/archives/18732'
lucky(urlink)

有趣的派派节》上有6条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax