珠玉のプログラミングのお題を python で書いてみた : 3

#!/bin/env python

"""
2.3 the loop/combination of basic procedure(P16-18)
Problem B turning over : rotdist=3, "abcdefgh" -> "defghabc"
Solution 1
"""
# global
DATA = ['a','b','c','d','e','f','g','h']
ROTDIST = 3
LENGTH = len(DATA)

def main():
    
    print "input  : ", DATA
    convert_data, cnt = otedama(DATA, gcd(ROTDIST, LENGTH), LENGTH)
    if cnt != LENGTH:
        for x in xrange(1, ROTDIST):
            convert_data, cnt = otedama(DATA, x, LENGTH)
        
    print "output : ", convert_data

def otedama(d, p, l):
    i = p
    t = d[i]
    j = i
    c = 1
    while 1:
        k = j + ROTDIST
        if k >= l:
            k -= l
        if k == i:
            break
        d[j] = d[k]
        j = k
        c += 1
    d[j] = t
    return d, c

def gcd(i, j):
    while i != j:
        if i > j:
            i -= j
        else:
            j -= i
    return i

if __name__ == '__main__':
    main()
#!/bin/env python

"""
2.3 the loop/combination of basic procedure(P16-18)
Problem B turning over : rotdist=3, "abcdefgh" -> "defghabc"
Solution 2
"""
# global
DATA = ['a','b','c','d','e','f','g','h']
ROTDIST = 3

def main():
    
    print "input  : ", DATA
    
    length = len(DATA)
    reverse(0, ROTDIST)
    reverse(ROTDIST, length)
    reverse(0, length)
    
    print "output : ", DATA

def reverse(s, e):
    for i in DATA[s:e][::-1]:
        DATA[s] = i
        s += 1

if __name__ == '__main__':
    main()

実行結果。

input  :  ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
output :  ['d', 'e', 'f', 'g', 'h', 'a', 'b', 'c']