Chinaunix首页 | 论坛 | 博客
  • 博客访问: 75109
  • 博文数量: 17
  • 博客积分: 1426
  • 博客等级: 上尉
  • 技术积分: 370
  • 用 户 组: 普通用户
  • 注册时间: 2005-10-03 11:13
文章分类

全部博文(17)

文章存档

2010年(1)

2007年(4)

2005年(12)

我的朋友

分类:

2005-10-10 19:24:55

以下内容转自水木社区(newsmth.org,前水木清华)Programming版:

水木上一兄弟的签名如下:
{
如果将英文字母A到Z分别编上1—26的分数,(A=1,B=2,...Z=26)那么:
知识(knowledge)得到96分(11+14+15+23+12+5+4+7+5=96),
努力(hardwork)也只得98分(8+1+18+4+23+15+18+11=98),
态度(attitude)才是左右生命的全部(1+20+20+9+20+21+4+5=100)。
}

根据上面的计算单词的办法,
现在编一个程序,输入任意一个单词,来自动输出该单词的分数。

有几点要思考的:
1.如果输入26个字母以外的字符,那么自动报错。
2.如果输入小写字母的a-z是不是该自动转换为A-Z
3.......

好了,开始喽,看谁写的程序简单,又能正确输入结果,最好把可能碰到的意外情况全部考
虑上?

  我的初始版本如下:

#!/usr/bin/python

def char(i):
    return i - ord('A') + 1

def trans(word):
    import re

    template = re.compile(r"[^a-zA-Z]")

    if (template.search(word)):
        print "Input ERROR!"
        result = 0
    else:
        word = word.upper()
        result = sum(map(char, map(ord, word)))

    return result

if __name__ == "__main__":
    word = raw_input("Input a word:")
    print trans(word)

  后来有人跟贴说perl只要一行($_=uc<>;chop;/[^A-Z]/&¨$s-=64-ord for split//;print$s),于是我也对程序进行修改,但是最后还是用了两行(一行用来import re):
import re
print (lambda word: re.compile(r"[^a-zA-Z]").search(word) and "Input ERROR!" or sum(map(lambda i: i-ord('A')+1, map(ord,  word.upper()))))(raw_input("Input a word: "))

  后来,要求又提高了,要求只要一条语句(就是语句必须分行,不能用;挤成一行)。有位兄弟说可以不用re实现,于是,最后我就在他的版本上改了一下,得到最终版本:
(lambda s: sum(map(lambda c: ord('A') <= ord(c) <= ord('Z') and 1 or 0, s)) != len(s) and  "Input ERROR!" or sum(map(lambda c: ord(c) - ord('A') + 1, s)))(raw_input("Input a word: ").upper())

  各位兄弟还有没有别的更好的建议呀?

阅读(1456) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~