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 個あるようです。


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