星期三, 二月 28, 2007

Code Kata:Anagram

CodeKata上有一些很值得一做的题目(并不一定需要你操一门语言写代码。有些只是design,乃至estimate)。有一个题目(Kata 6)是Anagram,就是找出一个单词表里的所有形变词,比如:

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个单词。为此还专门写了一个脚本,检查我得到的结果是否都是形变词而且没有重复,好像也没什么问题。不知道是谁弄错了。

17 条评论:

逆円助 说...

さあ、今夏も新たな出会いを経験してみませんか?当サイトは円助交際の逆、つまり女性が男性を円助する『逆円助交際』を提供します。逆円交際を未経験の方でも気軽に遊べる大人のマッチングシステムです。年齢上限・容姿・経験一切問いません。男性の方は無料で登録して頂けます。貴方も新たな出会いを経験してみませんか

精神年齢 说...

みんなの精神年齢を測定できる、メンタル年齢チェッカーで秘められた年齢がズバリわかっちゃう!かわいいあの子も実は精神年齢オバサンということも…合コンや話のネタに一度チャレンジしてみよう

メル友募集 说...

最近仕事ばかりで毎日退屈してます。そろそろ恋人欲しいです☆もう夏だし海とか行きたいな♪ k.c.0720@docomo.ne.jp 連絡待ってるよ☆

家出 说...

最近TVや雑誌で紹介されている家出掲示板では、全国各地のネットカフェ等を泊り歩いている家出娘のメッセージが多数書き込みされています。彼女たちはお金がないので掲示板で知り合った男性の家にでもすぐに泊まりに行くようです。あなたも書き込みに返事を返してみませんか

動物占い 说...

あなたの性格を、動物に例えて占っちゃいます。もしかしたらこんな動物かも!?動物占いをうまく使って、楽しい人間関係を築いてください

家出 说...

家出中の女性や泊まる所が無い女性達がネットカフェなどで、飲み放題のドリンクで空腹を満たす生活を送っています。当サイトはそんな女性達をサポートしたいという人たちと困っている女性たちの為のサイトです

セレブラブ 说...

セレブ女性との割り切りお付き合いで大金を稼いでみませんか?女性に癒しと快楽、男性に謝礼とお互い満たしあえる当サイト、セレブラブはあなたの登録をお待ちしております。

夏フェス!! 说...

夏フェス一緒に行ってくれる人募集!!夏の思い出一緒につくろぉ☆ megumi-0830@docomo.ne.jp 連絡してね♪

無料ゲーム 说...

あなたのゲーマー度を無料ゲーム感覚で測定します。15個の質問に答えるだけの簡単測定で一度遊んでみませんか?ゲームが得意な人もそうでない人もぜひどうぞ。

素人 说...

Hな女性たちは素人ホストを自宅やホテルに呼び、ひとときの癒しを求めていらっしゃいます。当サイトでは男性ホスト様の人員が不足しており、一日3~4人の女性の相手をするホストもおられます。興味を持たれた方は当サイトにぜひお越しください

出会い系 说...

実は出会い系には…関係者用入り口があるのを知っていますか?広告主やスポンサー用に用意されたIDではサクラや業者が立ち入ることが出来ないようになっているのです。当サイトでは極秘に入手した関係者用URLが公開されています

逆援助 说...

男性はお金、女性は快楽を得る逆援助に興味はありませんか?お金を払っても性的欲求を満たしたいセレブ達との割り切り1日のお付き合いで当サイトでは大金を得ることができます。無料登録なのでアルバイト感覚でOK、詳しくはTOPページでどうぞ。

友達募集 说...

ホムペ完成記念!私の事みんなに知ってもらいたくて頑張りましたぁ。色々とご感想をお待ちしているので思った事を意見してください。メアドはほむぺにのせてありますぅ!★ fan.jna@docomo.ne.jp

家出 说...

夏休みで気軽に家出する女子○生が急増しています。しかし家出したはいいものの泊る所やお金が無い彼女たちは、掲示板などで泊めてくれる男性を探す子も多いようです。当掲示板にも夏休みに入ってから通常の3倍以上のメッセージが寄せられています

人妻 说...

今最もアツイバイトは人妻とのセフレ契約です。当サイトではお金を払ってでもセフレがほしい人妻が集まり、男性会員様との逆援生活を待っています。当サイトで欲求不満の女性との出会いをしてみませんか

素人 说...

素人ホストでは、男性のテクニック次第で女性会員様から高額な謝礼がもらえます。欲求不満な人妻や、男性と出会いが無い女性達が当サイトで男性を求めていらっしゃいます。興味のある方はTOPページからどうぞ

友達募集中 说...

少し魅惑な自分をネットだから公開してみました。普段言えない事など、思い切って告白しているプロフなので興味ある方はぜひ除いてみてください連絡待ってまぁす。 hinyaaaaa@docomo.ne.jp