Challenge #101 [easy] (Non-repeating years) : dailyprogrammer

問題

[9/27/2012] Challenge #101 [easy] (Non-repeating years) : dailyprogrammer

(年を表す)数字を桁ごとに見たとき、重複のないものだけを選ぶ問題。
たとえば1980から1987までの間で考えると、1がふたつある1981を除く(1980, 1982, 1983, 1984, 1985, 1986, 1987)が条件に当てはまり、7つあることになる。
ボーナス:1000から2013の間で重複している数字が最も長く連続している期間と、非重複数字が最も長く連続している期間を求める。

解答

文字列にset使えないと思い込んでた。ちゃんとドキュメント読まないから…

def func(x):
    numlist = map(int, list(str(x)))
    return len(set(numlist)) == len(numlist)

if __name__ == "__main__":
    test_input = [1980, 1987+1]
    print filter(func, range(*test_input))

答え合わせ後の手直し。無駄を切り詰めれば一行でもそれほど見苦しくない…かな?

print filter(lambda x: len(set(str(x))) == len(str(x)), range(1980, 1987+1))
ボーナス

リンク先sch1zo氏のgroupbyで書く方法がいい。自分は最初なぜだかtakewhileかdropwhileを使うものだと思ってた。