テストケース:単細胞生命体の頂点

環状リストがあると便利ですが、Python の組み込み型 list には、その機能がありません。幸いにも、当面の問題を解決するには、環状リストを2巡するだけで十分です。そこで、組み込み型 list を利用します。


s = "abcdef"
for p in range(6):
    print "%d:"%p, circulate(s, p, q=4)

一方の生命体(右赤: abcdef)に着目します。他方の生命体(左青: ABCDEF)と接合した後で、残される頂点を獲得します。頂点 a からのオフセット位置 p(0〜5)を指定したときに、残される4つの頂点(q=4)が得られます。このテストケースを実行すると、

0: bcde
1: cdef
2: defa
3: efab
4: fabc
5: abcd

頂点 a(オフセット位置 p=0)で接合すると、4つの頂点(bcde)が残されるのが分かります。

def circulate(s, p, q):
    size = len(s)
    start = p+1; stop = p+q+1
    if size < stop:
        s = s[start:] + s[:stop-size]
    else:
        s = s[start:stop]
    return s