[プログラマー]おすすめ新ID Python


質問する


https://programmers.co.kr/learn/courses/30/lessons/72410
KACAに加入した新規開発者NEOは「KACAアカウント開発グループ」に割り当てられ、KACAサービスに加入したユーザのID生成を担当する.「ニオ」の最初のタスクは,新たに加入したユーザがKakao IDルールに合わないIDを入力する際に,入力したIDのようにルールに合ったIDを推薦できるようにするプログラムを開発することである.
次はKakao IDのルール
  • IDの長さは、3文字または15文字を超えてはいけません.
  • IDは、小文字、数字、マイナス記号(-)、下線()および句点(.)を含む.文字のみ使用できます.
  • 段落、ピリオド(.)先頭と末尾では使用できませんし、連続して使用することもできません.
  • 「ニオ」は、次の7つのステップの連続処理により、新規ユーザが入力したIDがKACO IDルールに適合しているかどうかを確認し、ルールに適合していない場合は、ルールに適合している新規IDを推奨する.
    新しいプレイヤーが入力したIDがnew idであれば、

    たとえば、new idの値が「...!@Bat#*.y.abcdefghijklm」の場合、上記の手順7を実行すると、new idは次のように変更されます.
    第1段階の大文字「B」および「T」は、小文字「b」および「t」に変更された.
    "...!@BaT#..y.abcdefghijklm"→ "...!@bat#..y.abcdefghijklm"
    第2段階「!」、「@」、「#」、「」文字が削除されました.
    "...!@bat#..y.abcdefghijklm"→ "...bat..y.abcdefghijklm"
    第3段階「…」わあ「…」“.”に変更されました.
    "...bat..y.abcdefghijklm"→ ".bat.y.abcdefghijklm"
    第4段階IDの先頭の‘削除に成功しました.
    ".bat.y.abcdefghijklm"→ "bat.y.abcdefghijklm"
    ステップ5のアイデンティティは空の文字列ではないので、変更はありません.
    "bat.y.abcdefghijklm"→ "bat.y.abcdefghijklm"
    ステップ6のアイデンティティ長が16文字を超えるため、上位15文字以外の文字は削除された.
    "bat.y.abcdefghijklm"→ "bat.y.abcdefghi"
    ステップ7のアイデンティティの長さは2文字を超えないため、変更はありません.
    "bat.y.abcdefghi"→ "bat.y.abcdefghi"
    したがって、新ユーザが入力したnew idが「...!@Bat#*.y.abcdefghijklm」である場合、neoのプログラムが推奨する新IDは「bat.y.abcdefghi」である.
    新規プレイヤーが入力したnew idにパラメータが付与された場合、solution関数を完了し、「ニオ」が設計した7段階の処理手順後の推奨IDを返してください.

    せいげんじょうけん

  • new idは、長さが1または1000未満の文字列です.
  • new idは、大文字、小文字、数字、特殊文字から構成されています.
  • newidに現れる可能性のある特殊文字は-.~!@#$%^&*()=+[{]}:?,<>/のみ.
  • I/O例



    アイデア

  • 小文字に変更しました.
  • 文字がリストにない場合は、文字が追加されます.(ある場合は削除)
  • '.'これらを繰り返すと1つになります.
  • 、1番目の位置にあります」.クリア
  • の長さが0の場合、「a」が追加されます.
  • 16文字以上ならカットします.
  • 2文字以下で最後の
  • を繰り返す

    ソリューション関数python

    def solution(new_id):
        id = list(new_id.lower())
    
        new_list = []
        for i in range(len(id)):
            if id[i] not in ['~', '@', '#', '&', '!', '$', '%', '^', '*', '(', ')', '=', '+', '[', ']', '{', '}', ':', '?',
                             ',', '<', '>', '/']:
                new_list.append(id[i])
        print(new_list)
        # new_list = re.sub('[^a-z\d\-\_\.]', '', new_id.lower())
        list4 = [0]
        for i in range(len(new_list)):
            if list4[-1] == new_list[i] == '.':
                continue
            else:
                list4.append(new_list[i])
        del list4[0]
    
        if len(list4) > 0 and list4[0] == '.':
            del list4[0]
        if len(list4) > 0 and list4[-1] == '.':
            del list4[-1]
        if len(list4) == 0:
            list4.append('a')
        if len(list4) >= 16:
            list4 = list4[:15]
            if list4[-1] == '.':
                del list4[-1]
        if len(list4) <= 2:
            for i in range(2):
                if len(list4) == 3:
                    break
                list4.append(list4[-1])
    
        return ''.join(list4)

    他者コード


    ::pythonのreを使用して簡単な解を求めました。

    import re
    
    def solution(new_id):
        st = new_id
        st = st.lower()
        st = re.sub('[^a-z0-9\-_.]', '', st)
        st = re.sub('\.+', '.', st)
        st = re.sub('^[.]|[.]$', '', st)
        st = 'a' if len(st) == 0 else st[:15]
        st = re.sub('^[.]|[.]$', '', st)
        st = st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))])
        return st
    ソース:プログラマの回答