enlist inlets listen silent
boaster boaters borates
fresher refresh
sinks skins
网站作者给了一个单词表。作者说他的解答只用了25行Ruby代码,在他的1GHZ PPC上运行时间1.5s。看到这个数据我很高兴,因为我写了个27行的Python程序,运行时间0.53s。不排除我的电脑比他的快,更可能是因为Python实现本身就比Ruby实现快。幸亏前辈科学家发明了一种伟大的数据结构:散列表,而一些巨牛无比的programmer写出了质量极高的实现,我们才能用这种简洁得足以自我吹嘘的方式解决这个问题。
在blogger上贴代码,缩进老是会乱掉,我不知道有什么解决办法。为了美观起见(我认为这很重要),我把代码转成HTML放到googlepage上(3.11 Update:不久前终于弄明白了怎么贴代码,所以把代码也一块弄上来了)。我的解答:
Anagram.py
import datetime
def load_word(file_name):
file_handler = open(file_name)
table = {}
for line in file_handler.readlines():
w = line.strip(' \n').lower()
w_sorted = ''.join(sorted(w))
if w_sorted not in table:
table[w_sorted] = []
table[w_sorted].append(w)
file_handler.close()
return table
if __name__ == '__main__':
t1 = datetime.datetime.today()
output = open('result.txt','w')
anagram_sets = ['']
for word_list in load_word("wordlist.txt").values():
if len(word_list) > 1:
anagram_sets.extend(word_list)
anagram_sets.append('\n')
output.write(' '.join(anagram_sets))
t2 = datetime.datetime.today()
print str(t2 - t1)
唯一让我有点担心的是,网站作者说他给的list里面包含了2530组形变词,总共5680个单词。而我得到的结果是2531组,5683个单词。为此还专门写了一个脚本,检查我得到的结果是否都是形变词而且没有重复,好像也没什么问题。不知道是谁弄错了。


