問題1.5

世界で闘うプログラミング力を鍛える150問

ちょっと汚いかも。まぁ。。。

問題

文字の連続する数を使って基本的な文字列処理圧縮を行うメソッドを実装してください。たとえば、「aabcccccaaa」は「a2b1c5a3」のようにしてください。もし、圧縮変換された文字列が元の文字列よりも短くならなかった場合は、元の文字列を返してください。

#encoding: utf-8


def compress_string(string):
    '''
    引数で渡された文字列を圧縮する関数
    >>> compress_string('aabcccccaaa')
    'a2b1c5a3'
    >>> compress_string('abcd')
    'abcd'
    '''
    # 圧縮した文字列
    compressed_string = ''

    # 引数で渡された文字列をリストに変換
    char_list = list(string)

    # 圧縮不可であれば、引数で渡された文字列をそのまま返す
    if _is_compressable(char_list) is False:
        return string

    # 圧縮処理
    counter = 0
    char_counter = 0
    char_list_size = len(char_list)
    current_last_char = char_list[0]
    while counter < char_list_size:
        if char_list[counter] == current_last_char:
            char_counter = char_counter + 1
        else:
            compressed_string   \
                = compressed_string + current_last_char + str(char_counter)
            char_counter = 1
            current_last_char = char_list[counter]
        counter = counter + 1

    # 文字リスト中の最後の連続する文字を付け加えてリターン
    return compressed_string + current_last_char + str(char_counter)


def _is_compressable(char_list):
    '''
    引数で渡された文字リストが圧縮可能かどうかのチェック
    >>> _is_compressable('aaa')
    True
    >>> _is_compressable('abc')
    False
    '''
    counter = 0
    char_list_size = len(char_list)
    while counter < (char_list_size - 1):
        if char_list[counter] == char_list[counter + 1]:
            return True
        counter = counter + 1

    return False


def _test():
    import doctest
    doctest.testmod()


if __name__ == '__main__':
    _test()

ほいじゃ、走ってくる。