코드 2020의 출현: 2일차 Python 솔루션

AdventOfCode2020.에서 2차 챌린지를 완료했고 그에 대한 관심이 조금 높아졌습니다. 이 도전은 이미 완료되었습니다. 나는 내 방법으로 시도했습니다.

이 도전에는 두 부분이 있습니다.

1 부



귀하의 항공편은 해안 공항에서 며칠 후에 출발합니다. 여기에서 해안으로 내려가는 가장 쉬운 방법은 터보건을 이용하는 것입니다.

북극 터보건 렌탈샵의 가게 주인은 힘든 하루를 보내고 있습니다. "컴퓨터에 문제가 있어 로그인할 수 없습니다!"봐주실 수 있냐고 물어보십니다.

그들의 비밀번호 데이터베이스가 약간 손상된 것 같습니다. 일부 비밀번호는 선택 당시 유효한 공식 Toboggan 기업 정책에 의해 허용되지 않았을 것입니다.

문제를 디버깅하기 위해 그들은 (손상된 데이터베이스에 따라) 암호 목록(귀하의 퍼즐 입력)과 해당 암호가 설정되었을 때 회사 정책을 만들었습니다.

예를 들어 다음 목록이 있다고 가정합니다.

1-3 a: abcde
1-3 b: cdefg
2-9 c: ccccccccc
각 행은 암호 정책을 제공한 다음 암호를 제공합니다. 암호 정책은 암호가 유효하기 위해 주어진 문자가 나타나야 하는 최소 및 최대 횟수를 나타냅니다. 예를 들어, 1-3 a는 비밀번호에 최소 1회, 최대 3회가 포함되어야 함을 의미합니다.

위의 예에서는 2개의 비밀번호가 유효합니다. 중간 암호인 cdefg는 그렇지 않습니다. 그것은 b의 인스턴스를 포함하지 않지만 최소한 1이 필요합니다. 첫 번째와 세 번째 비밀번호는 유효합니다. 하나의 a 또는 9개의 c가 모두 해당 정책의 한도 내에서 포함됩니다.

정책에 따라 유효한 비밀번호는 몇 개입니까?

이 부분에 대한 내 솔루션은 아래에 나와 있습니다. 나는 작은 코드 블록을 작성하는 것으로 시작했습니다. 그리고 주어진 예제 데이터로 내 코드를 테스트하고 제대로 작동하면 내 입력으로 테스트합니다.

data_dir = "Data/"
day2 = open(data_dir+"day2.txt").readlines()
day2 = [line.strip() for line in day2]


valid_password = []

for line in day2:
    key, value = line.split(": ")
    #print(line)
    #print(key, value)
    v1, v2 = key.split(" ")[0].split("-")
    v = key.split(" ")[1]

    if int(v1) <= value.count(v) <= int(v2):
        valid_password.append(value)


#     print(key, value, v1, v2, v)
len(valid_password)



2 부



암호를 올바르게 검증한 것으로 보이지만 공식 Toboggan 기업 인증 시스템에서 기대하는 것과 같지 않습니다.

가게 주인은 길 아래에 있는 썰매 대여소에서 예전 직장에서 비밀번호 정책 규칙을 우연히 설명했다는 사실을 갑자기 깨달았습니다! 공식 터보건 기업 정책은 실제로 약간 다르게 작동합니다.

각 정책은 실제로 암호의 두 위치를 설명합니다. 여기서 1은 첫 번째 문자를 의미하고 2는 두 번째 문자를 의미하는 식입니다. (조심하십시오. Toboggan 기업 정책에는 "인덱스 0"이라는 개념이 없습니다!) 이러한 직책 중 정확히 하나에 지정된 문자가 포함되어야 합니다. 편지의 다른 항목은 정책 시행의 목적과 관련이 없습니다.

위의 동일한 예제 목록이 제공됩니다.

1-3 a: abcde가 유효합니다. 위치 1에는 a가 포함되고 위치 3에는 포함되지 않습니다.
1-3 b: cdefg가 유효하지 않음: 위치 1과 위치 3 모두 b를 포함하지 않습니다.
2-9 c: ccccccccc가 유효하지 않습니다: 위치 2와 위치 9 모두에 c가 포함되어 있습니다.
정책의 새로운 해석에 따르면 몇 개의 암호가 유효합니까?

당신의 퍼즐 답은 616이었습니다.

이 퍼즐의 두 부분이 모두 완료되었습니다! 그들은 두 개의 금 별을 제공합니다: **

이 시점에서 Advent 달력으로 돌아가서 다른 퍼즐을 시도해야 합니다.

그래도 보고 싶다면 퍼즐 입력을 받을 수 있습니다.

이 챌린지에서 내 코드는 다음과 같습니다.

data_dir = "Data/"
day2 = open(data_dir+"day2.txt").readlines()
day2 = [line.strip() for line in day2]

valid_password = []
for line in day2:
    key, value = line.split(': ')

    vint = lambda x: [int(i) for i in x]

    v1,v2 = key.split(' ')[0].split('-')
    v1, v2 = vint([v1, v2]) 
    v = key.split(' ')[1]
#     print(v1, v2, v, value)

    count = 0    
    if value[v1-1] == v:
        count+=1

    if value[v2-1] == v:
        count+=1

    if count == 1:
        valid_password.append(value)

len(valid_password)



시도한 각 솔루션 후에 내 GitHub Repository를 업데이트하고 있습니다.

좋은 웹페이지 즐겨찾기