読者です 読者をやめる 読者になる 読者になる

No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

Re:アルファベットの繰り上がり

どう書く Groovy

お題: Server error
投稿: Server error

こんな感じになりました

println alphaList('A'..'Z', 100)*.join()*.trim().join(', ')

/** アルファベットのリストを返却 */
def alphaList(values, num) {
    // 必要な桁を求める
    int digit = {
        int d = 1; int size = values.size()
        while (size < num) { size *= (values.size() + 1); d++ };
        return d
    }()
    // 桁毎の値のリスト
    def digitList = (digit == 1 ? [] : [([' '] + values)] * (digit - 1)) + [values]
    // 組み合わせのリストの先頭からnum個分
    return digitList.reverse().combinations()*.reverse()
        .findAll{ it.join().trim().count(' ') == 0 }[0..<num]
}

動作確認はGroovy Version: 1.5.7 JVM: 1.6.0_10にて。

考察

先にリストを作りこんでから出力する方法で実装してみましたが、コードがスパゲッティで読みにくい。
やっぱりこういう処理はindexで各桁の文字を割り出すべきかな。