melpon日記 - HaskellもC++もまともに扱えないへたれのページ

2012-06-14

[]Pythonで遊んだ 10:27 Pythonで遊んだを含むブックマーク

昨日 id:cooldaemon さん含む数人でカフェに行って話していて、

の話になりました。


で、これって初期値を 1974 以外の値にしたらちゃんと収束するんだろうか?

ということで 1234 とか 7192 とか入れてみたのですが、同じ 6174 になりました。

他にもいろいろ値を入れてみたのですが、やはり 6174 になる。

ただ、1111 とかだと 0 になります。これはまあ当然ですね。


じゃあ一体どの値が 6174 にならない値なのか、ということで、0〜9999までの値を全部試してみました。

def f(n, prev = None, count = 0):
    if prev is not None and prev == n:
        return (n, count - 1)
    s = sorted("%04d" % n)
    x = int("".join(s[::-1])) - int("".join(s))
    return f(x, n, count + 1)

xs = [(n, f(n)) for n in xrange(10000)]
print [x for x in xs if x[1][0] != 6174]
m = max([x[1][1] for x in xs])
print 7
print len([x for x in xs if x[1][1] == m])
[(0, (0, 0)), (1111, (0, 1)), (2222, (0, 1)), (3333, (0, 1)), (4444, (0, 1)), (5555, (0, 1)), (6666, (0, 1)), (7777, (0, 1)), (8888, (0, 1)), (9999, (0, 1))]
7
2184

連番以外は全部 6174 になるようです。ふしぎふしぎ。

で、ついでに何回で収束するのかというのも試してみたところ、7回で収束するのが最大で、7回で収束する値は 2184 個あるようです。


とまあ、こんなことをして遊んでいました、と。

トラックバック - http://d.hatena.ne.jp/melpon/20120614/1339637253
リンク元