PythonChallenge第10題


タイトルリンクをクリックするか、画像の乱点+ページのソースコードで見つけたタイトルをクリックします.根拠:a=[1,11,21,1211,111221,len(a[30])=?まずaの中の要素がどんな法則なのかを目視して、手算しても何の法則も見つからない.しかし、数位の増加は本当に速く、そして12構成の数しかなく、どうしたらいいか分からない.ネット上で以下の法則を見ました:法則は:1 11—前の数の“1”が1であることを表します;21—前の数「11」が2つの1からなることを表す.1211—前の数「21」が1個の2、1個の1からなることを表す.111221-すなわち11 12 21は、前の数「1211」が1つ、1つ、2つ、2つの1から順に構成されていることを示す.312211-すなわち31 22 11は、前の数「111221」が3つの1、2つの2、1つの1から順に構成されていることを示す.したがって、次の数は1312221-すなわち13 11 22 21であり、前の数「312211」が1つの3、1つの1、2つの2、2つの1から順に構成されていることを示す.同様に、次の数は「1312221」により1113213121とし、前の数「1312221」が1個1、1個3、2個1、3個2、1個1からなることを示す.
久しぶりにウィキペディアのリンクを考えました.http://zh.wikipedia.org/zh-cn/%E5%A4%96%E8%A7%80%E6%95%B8%E5%88%97上にリンクが見つかりました.http://oeis.org/A005150あ、次は他の人が書いたPythonプログラムがあります.
def A005150(n):
    p="1"
    seq=[1]
    while(n>1):
        q=''
        idx=0
        l=len(p)
        while(idx<l):
            start=idx
            idx=idx+1
            while idx<l and p[idx]==p[start]:
                idx=idx+1
            q=q+str(idx-start)+p[start]
        n,p=n-1,q
        seq.append(int(p))
    return seq

以上、返された結果が1-nの位置のすべてのデータであり、次のプログラムを変更すると、n番目の位置の数、またはn番目の位置の数字の長さだけを返すことができます.
def A005150(n):
    p="1"
    #seq=[1]
    while(n>1):
        q=''
        idx=0
        l=len(p)
        while(idx<l):
            start=idx
            idx=idx+1
            while idx<l and p[idx]==p[start]:
                idx=idx+1
            q=q+str(idx-start)+p[start]
        n,p=n-1,q
        #seq.append(int(p))
    return p

簡単に直した
>>> len(A005150(30))
4462
>>> len(A005150(29))
3410
>>> len(A005150(31))
5808

もう一つの問題はn=31の時に出たのが30の長さで、次のリンクを見つけることができます.リストは0の下付き文字から始まることが分かったが,a=[1,11,21,1211,111221,求めはa[30]の長さであり,31を入力する必要がある.次のリンク:5808.html