acokikoy's notes

{"勉強中":"Python","注目":"Shopify","LOVE♡":["ABARTH595","TA-GG9","Ukulele","Movable Type","ガーナ ミルクチョコレート"]} なWebディレクター

毎朝Codewars@2019.04.23(月): String incrementer

毎朝ちびちびCodewars。

String incrementer [5級] www.codewars.com

今日のお題:

""" increment_string(strng)
Args:  
    strng (str):  
Returns:  
    加工後のstrng (str):  
    - 文字列の末尾が数字なら、数字部分を 数値に1を足した文字列に変換する。
      ただし、数字部分の桁数は維持する。
    - 末尾が数字以外なら末尾に「1」を追加する
"""

コード

me

自分のコード

def increment_string(strng):
    if not strng:
        # 空かNone
        return '1'
    elif strng.isdecimal():
        # 全部数字
        return str(int(strng)+1).zfill(len(strng))

    for i, s in enumerate(reversed(strng)):
        # 右から一文字ずつ拾って数字以外に当たるまで繰り返す
        if s.isdecimal(): #  数字だったら次の一文字へ。
            continue
        elif i == 0: # 全部数字以外の文字
            return strng + '1'
        else: # sは数字以外の文字
            str_f = strng[0:(len(strng)-1-i)]
            str_e = str(int(strng[len(strng)-i:])+1).zfill(i)
            return str_f + s + str_e

awesome

他ユーザーのエレガントな解法。  

def increment_string(strng):
    head = strng.rstrip('0123456789')
    tail = strng[len(head):]
    if tail == "": return strng+"1"
    return head + str(int(tail) + 1).zfill(len(tail))

コードも変数の命名もスマートで、軽く嫉妬した。^^;

文法、メソッドnote

変数名の英語
  • head - tail: 先頭 - 末尾文字列

利用メソッド

標準ライブラリ > 組み込み型 > 文字列メソッド
https://docs.python.org/ja/3/library/stdtypes.html#string-methods

str.rstrip(chars)
  • strの末尾から、charsに含まれる文字を除去した文字列を返す。
  • chrs無指定(or None)なら空白文字を除去する。
str.zfill(width)
  • width桁でゼロパディング(ゼロ埋め)した文字列を返す。対象(str)は
  • 数値でなく文字列。先頭が符号接頭辞 ('+'/'-') なら、 '0' は符号の後ろ に挿入される。width が len(s) 以下なら元の文字列を返す。