コーディングテスト練習-新しいアイデンティティを推奨


コーディングテスト練習-新しいアイデンティティを推奨
ユーザがルールに適合しないIDを作成すると,入力されたIDと同様にルールに適合するIDを推奨するサービスが開発される.

#エラーコード


合計:80.0/10.0:3,5,14,20,21失敗
def solution(new_id):
    new_id = new_id.lower() #1단계
    
    dot = 0 # 마침표 개수 count
    for i in new_id: # 2단계
        if i.isdigit() or i.islower() or i =='-' or i == '_' or i == '.':
            continue
        else:
            new_id = new_id.replace(i,'')
    
    for idx, i in enumerate(new_id): # 3단계
        if i == '.':
            dot += 1
            if idx != len(new_id)-1:
                continue     
        if (i == new_id[-1] or i != '.') and dot >= 1:
            if dot > 1:
                new_id = new_id.replace('.'*dot, '.')
            dot = 0        
    
    if new_id[0] == '.': # 4단계
        new_id = new_id[1:]
    
    if not new_id:#5단계
        new_id += 'a'
    
    if new_id[-1] == '.':
        new_id = new_id[:-1]    
    
    if len(new_id) >= 16: #6단계
        new_id = new_id[:15]
        if new_id[-1] == '.':
            new_id = new_id[:14]
    if len(new_id) <= 2: #7단계
        while(len(new_id) < 3):
            new_id += new_id[-1]


    return new_id

#正解コード


正規表現の使用以外は論理的に差はないようですが、正解処理が行われています.特定の文字のみを含むか除外するルールがある場合は、正規表現を使用して必要なデータを効率的に取得できます.
他の記事を読むと確定しませんが、replace()関数を使用して文字列を空の文字列に変換すると、テストケースが失敗する可能性があります.
import re

def solution(new_id):
    answer = new_id.lower()
    
    answer = re.sub("[^-_.a-z0-9]","",answer) # 소문자, 숫자, -, _, .
    answer = re.sub("[.]+", ".",answer) # 2번 이상 연속된 마침표 치환
    answer = re.sub("^[.]|[.]$", "",answer) # 마침표가 맨앞이거나 맨뒤에 있으면 제거
    
    if not answer:
        answer += 'a'
    
    if len(answer) >= 16:
        answer = answer[:15]
        if answer[-1] == '.':
            answer = answer[:14]
    if len(answer) <= 2:
        while(len(answer) < 3):
            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