Pythonの記述力

ネットサーフィンをしていたら、TopCoderなるサイトがあることを知りました。
なんでも、毎回、お題を出されて制限時間内に解くというものらしいです。

お題自体はなんの役に立つのかわからんのですが、やればそこそこの技術はつくんじゃないかと思います。

このサイトではJavaとかCとかC++とか、Pythonほどお手軽じゃない言語で問題を解かないといけないので、いささか面倒なのですが、問題自体がPythonのお手軽さを表現するのにちょうどよいので、サンプル問題としていただいてまいりました。

問題1.

カードをn人に配るアルゴリズムを記載してください。
カードは、文字列で表します。
たとえば、Dealer.deal(’123123123′, 3)としたら、’111′, ’222′, ’333′ となります。
Dealer.deal(’123123123′, 4)ならば、’12′, ’23′, ’31′, ’12′ となります。
’123′, ’23′, ’31′, ’12′としてはいけません。

Javaの解答例
(動かしてないけど、多分こんな感じ。面倒なのでStringBuilderは使いません。)
class Dealer {
    public static String[] deal(String cards, int n) {
        String[] result = new String[n];
        for ( int i = 0; i < n; ++i )
            result[i] = '';
        int ndeal = ((cards.length() / n) * n;

        for ( int i = 0; i < ndeal; ++i )
            result[i % n] = result[i % n] + cards[i];
        return result;
    }
}

Pythonの解答例
deal = lambda n, cards: \
  [ ''.join(( cards[j]
               for j in range(i, (len(cards) / n) * n, n) ))
    for i in range(n) ]

問題2.

文字列をアルファベットの出現位置をずらすことで暗号化する機能を実装してください。
MyEncoder.encode(‘IBM’, -1) -> ‘HAL’
MyEncoder.encode(‘TOPCODER’, 2) -> ‘VQREQFGT’
これらは符号を変えれば元に戻ります。
MyEncoder.encode(‘HAL’, 1) -> ‘IBM’
MyEncoder.encode(‘VQREQFGT’, -2) -> ‘TOPCODER’

Java解答例: (略・・・面倒くさい)

Python解答例:
myencode = lambda src, shift, \
                  charset="ABCDEFGHIJKLMNOPQRSTUVWXYZ": \
             ''.join(( charset[(charset.index(ch) - shift) \
                               % len(charset)]
                       for ch in src ))

好き嫌いはあると思います。
ちなみにPython知らない人のためにフォローするとPythonだってふつうに書こうと思えば書けます。
僕はこっちのほうが直感的に理解しやすいので好きですけど。


Leave a Reply

 

2009年7月
« 3月   8月 »
 1234
567891011
12131415161718
19202122232425
262728293031  

最近のコメント

最近の投稿

メタ情報

カテゴリー