以下内容转自水木社区(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())
各位兄弟还有没有别的更好的建议呀?
阅读(1475) | 评论(0) | 转发(1) |