珂太練習1


[問題の説明]
KACAに加入した新規開発者NEOは「KACAアカウント開発グループ」に割り当てられ、KACAサービスに加入したユーザのID生成を担当する.「ニオ」の最初のタスクは,新たに加入したユーザがKakao IDルールに合わないIDを入力する際に,入力したIDのようにルールに合ったIDを推薦できるようにするプログラムを開発することである.
次はKakao IDのルール
IDの長さは3文字または15文字を超えてはいけません.
IDは小文字、数字、マイナス(-)、アンダースコア()、ピリオド(.)文字のみ使用できます.
しかし、句号(.)先頭と末尾では使用できませんし、連続して使用することもできません.
「ニオ」は、次の7つのステップの連続処理により、新規ユーザが入力したIDがKACO IDルールに適合しているかどうかを確認し、ルールに適合していない場合は、ルールに適合している新規IDを推奨する.
新しいプレイヤーが入力したIDがnew idであれば、
手順1 newidのすべての大文字を対応する小文字に変換します.
ステップ2 new idでは、小文字、数字、マイナス記号(-)、下線()および句点(.)以外のすべての文字を削除します.
ステップ3 new idのピリオド(.)1つのポイント(.)に置き換えます.
ステップ4 new idのピリオド(.)先頭または末尾にある場合は削除します.
ステップ5 new idが空の文字列の場合、new idに「a」を挿入します.
ステップ6 new idの長さが16文字を超える場合、new idの最初の15文字以外のすべての他の文字を削除します.
削除後のピリオド(.)new idの末尾にある場合、終了記号(.)テキストを削除します.
ステップ7のnew idの長さが2文字未満の場合、new idの長さが3になるまで、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を返してください.
[制限]
newidは、長さが1または1000未満の文字列です.
新idは、アルファベットの大文字、アルファベットの小文字、数字、特殊な文字から構成されています.
new idに現れる可能性のある特殊文字は-.~!@#$%^&*()=+[{]}:?,<>/のみ.
[私の答え]
def solution(new_id):
    answer = ''
    new_id = new_id.lower() # 1단계

    for i in new_id:
        if (i.islower() == True) or (i.isdigit() == True) or (i in ['-','_','.']):
            answer +=i # 2단계 

    for i in range(len(answer),1,-1): #3단계
        dup = '.'*i
        if dup in answer:
            answer = answer.replace(dup,'.')

    if answer[0] == '.': #4단계
        answer = answer[1:]
    if len(answer) != 0:
        if answer[-1] == '.':
            answer = answer[:-1]

    if len(answer)==0: #5단계
        answer = 'a'
    elif len(answer) >=16: #6단계
        answer = answer[:15]
        if answer[-1] == '.':
            answer = answer[:-1]

    if len(answer)<=2:# 7단계
        while len(answer) <3:
            answer = answer + answer[-1]

    return answer
[正規式を解く]
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
[再試行]
  • islower()とisupper()関数を使用して文字列を小文字と大文字に変換
  • isalpha()、isdigit()およびisalnum()関数を使用して、文字列がアルファベットであるか、数値/アルファベットであるか、または数値
  • であるかを決定します.
  • 置換(旧、新、[count])フォーマット
  • old:現在の文字列で変更する文字
  • new:新しい置換文字
  • count:変更回数.回数を入力しない場合はold文字列全体を変更します.デフォルト値はcount=-1全体を表すように指定されます.
  • cote練習は初めてでしたが、解ける2021 KACAブラインド求人1号