那些年,程序员用过的行酒令

python基础

浏览数:124

2019-5-15

AD:资源代下载服务

  

  在外界的印象中,程序员应该是背着双肩包,穿着格子衬衫,而且有和大熊猫一样的黑眼圈。但程序员也曾经热血、慷慨激昂、就着酒吐槽这个世界,本文记录一些适合程序员的行酒令,权当抛砖引玉,欢迎大家补充。

翻扑克牌
  简单粗暴,上一轮喝酒的玩家(成为last one吧,下同)翻一张牌,然后从自己开始数点数,数到谁就谁喝。毫无技术可言,完全靠运气,只不过人数不同,每个人的概率可能不一样罢了。

成语接龙
  这个也很简单的,大家都会,谁接不上来或者在一局中重复了之前说过的成语,那么就得喝酒一杯了。这个似乎靠的是语文的积累,似乎跟程序员没有什么关系,好吧,没有问题那就制造问题。比如说,不能重复在一局中说过的成语,怎么检查吗,是判断单链表是否有环吗?好像也不是,毕竟一个成语可以有多个后继的成语(出度)。

三七二十一
  这个看起来简单,实践起来还是有点麻烦。就是last one随便说一个比较小的整数,这个数不能是3或者7的倍数。之后按顺序,每个人说出大于且最接近上一个整数的数字,同时也不能是3或者7的倍数。如果说出的数字不是符合条件,那么就罚酒了,如果既是3的倍数也是7的倍数,那么就double! 写一个公式是不是表达得清楚一点

  An+1 = min(Number for Number > An and (Number % 3 !=0 and Number % 7 !=0))

  不过呢,这个需要高度的注意力(监督其他玩家)和运算能力,对已经处于微醺的玩家来说太不友好

夹逼定理
  这个玩法跟数学中的夹逼定理没有关系,玩法是这样的,last one出一个数字,在0到100之间(0<N<100),然后接下来每一个人猜一个数字,该数字必须在上一个玩家收缩后的区间之内,如果猜中初始值,那么直接罚酒。否则,庄家判断该数据与初始值的大小关系,进一步收缩。如果收缩后的范围刚好“夹住“初始值,那么庄家罚酒。所以这个逼 是 “SB”得意思。

  用python代码描述这个过程,大致是这样的;

 1 def main():
 2     lower, upper = 0, 100 # range is (lower, upper), exclusive
 3     INIT = random.randint(lower+1, upper-1)
 4     print "INIT value is", INIT
 5     while(True):
 6         print "current_range: (%s, %s)" % (lower, upper)
 7         if lower + 1 == INIT and upper - 1 == INIT:
 8             print ("master lose")
 9             break
10         num = int(raw_input("current guess: "))
11         if (num == INIT) or not(lower < num < upper):
12             print ("current lose")
13             break
14         if num > INIT:
15             upper = num
16         else:
17             lower = num
18 
19 if __name__ == '__main__':
20     main()

  在《数学之美番外篇:快排为什么那样快》一文中,作者用更朴素的思想解释了为什么用二分法能够最快的收敛。那么为了夹住“庄家”,大家也会尽量用二分,但有趣的是,庄家可能直接出个50(N的二分之一)!那么猥琐流可能害怕中了庄家的圈套,就猜一个1或者99。这个玩法还是很有趣的,第一,对微醺者比较公平;第二,节奏不会很快;第三,谋略与运气共存。

卡牌

  最后一个,是笔者看《程序员喝酒解释专业术语》这篇文章想到了,感觉很有意思,于是在原文的描述上做了适当修改,使得可玩性 可操作性更强.
  目前想到的卡牌包括:p2p tcp 服务器 事务  互斥锁。首先,每一个玩家对应一个点数,保证玩家的概率是一样的。每一轮开始,掷骰子,对应的玩家摸卡,不同的卡,后续的操作可能不一样。如果需要概率,则一律扔骰子判断。下面列出卡牌对应的后续操作:

  • udp,再扔一次骰子,选出另外一名玩家碰杯
  • tcp,再扔一次骰子,选出另外一名玩家,前者一杯,后者一杯,前者再来一杯(三次握手)
  • 服务器,再扔一次骰子,选出防火墙,其余所有玩家(都叫客户端)按50%的概率决定是否连接。防火墙按50%的概率判断是否帮服务器抵挡,如果抵挡,防火墙与客户端碰杯,否则,服务器与客户端碰杯
  • 事务,再扔一次骰子,从1,2,3这三个数字中中随机选出一个(NUM)。然后选出NUM个玩家,每个玩家都有50%的概率失败,如果失败,则立即rollback。如果NUM个玩家都成功,则commit,NUM+1(包括最开始摸到事务卡的玩家)碰杯
  • 互斥锁,再扔一次骰子,选出另外一名玩家。两名玩家各扔一次骰子,点数大的取胜抢到资源(一杯酒)

  

  谨以此文怀念曾经一起大块吃肉、大口喝酒的朋友与时光。

 

作者:xybaby