Python
python3

Pythonでアルファベット文字列中の大文字を小文字に変換する

コーディング&ビルド環境:Paiza.io

大学のゼミで出た問題で、「文字列の標準メソッドやstringモジュールを使わない」という制約のもと書いてみました

大文字を線形探索法で探し出して変換していく方法

lower.py
def lower(inputdata) :
    arr = list(inputdata)
    data = ""
    for i in range(len(arr)) :
        data = data + (arr[i] if ord(arr[i]) + 0x20 > 0x7A else chr(ord(arr[i]) + 0x20))
    return data

大文字を二分探索法で探し出して変換していく方法

lower.py
class Letter:
    def __init__(self, count, data) :
        self.index = count
        self.num = ord(data)
    def largestr(self) : 
        return 0x41 <= self.num and self.num <= 0x5A
    def smallstr(self) : 
        return 0x61 <= self.num and self.num <= 0x7A
    def getstring(self) :
        return chr(self.num)
    def changeSmall(self) :
        if self.largestr() : self.num += 0x20

def sort(keystr, arr) :
    import operator
    p = arr
    p.sort(key=operator.attrgetter(keystr))
    return p

def getEndPoint(arr) :
    t = int(len(arr) / 2)
    if arr[t].largestr() :
        while(t < len(arr)) :
            if arr[t].smallstr() : break
            t += 1
    else :
        while(t > 0) :
            if arr[t].largestr() : break 
            t -= 1
    return t

def createLetterList(arr) :
    data = []
    for i in range(len(arr)) : 
        data.append(Letter(i, arr[i]))
    return data

def lower(inputstr) : 
    import datetime
    data = sort('num', createLetterList(list(inputstr)))
    if data[0].smallstr() : return inputstr
    t = getEndPoint(data)
    for i in range(t) : data[i].changeSmall()
    data = sort('index', data)
    retdata = ""
    for i in range(len(data)) : retdata = retdata + data[i].getstring()
    return retdata

if __name__=='__main__' :
    import sys
    print(lower(sys.stdin.readline()))

時間測定をpaiza.ioでそれぞれやってみたんですけど、後者のほうが4倍くらい早いことが分かりました。
まだコード色々問題あると思うので少しずつ直していきます

時間測定まで書いてあるコードは
線形探索法
二分探索法