코드 출현 2015 - 4일 차
4062 단어 adventofcodepython
빠른 Google을 통해 Python이 적절하게
hashlib
라고 하는 standard library for hashing을 제공한다는 것을 알았습니다. SHA1, SHA224, SHA256, SHA384, SHA512 및 물론 MD5와 같은 많은 표준 해시 알고리즘을 래핑합니다.문자열을 모듈로 가져오고 16진수 값을 가져오는 것은 원하는 만큼 간단하지 않지만 문서는 매우 명확합니다. 먼저 문자열을
s.encode()
로 전달하기 전에 바이트 객체( md5()
)로 변환해야 합니다. 그런 다음 hexdigest()
함수를 사용하여 반환 값을 16진수로 변환해야 합니다.나는
solve()
를 함수로 사용했는데, 그 이유는 선행 0의 수에 상관없이 해결하는 데 사용할 수 있기 때문입니다. 항상 파트 2를 미리 생각하십시오!import hashlib
def solve(key, zeroes):
n = 1
prefix = zeroes * '0'
while True:
s = key + str(n)
h = hashlib.md5(s.encode()).hexdigest()[:zeroes]
if h == prefix:
return n
n += 1
print(solve('yzbqklnj', 5))
나는
while True
에 대해 지나치게 흥분하지는 않았지만 임의로 높은 상한을 설정하는 것 외에 다른 대안을 볼 수 없었습니다. for i in range(1, 1000000)
와 megathread 에서 for i in itertools.count()
와 같은 코드를 보았는데 그다지 좋아 보이지는 않았습니다. 퍼즐 해결의 좋은 점은 해결책이 있다는 것을 아는 것이므로 어느 시점에서 루프를 종료할 것이라는 것을 알고 있습니다.코드는 약 0.8초 안에 5개의 선행 0에 대해 해결되었으며, 이는 본질적으로 무차별 대입인 내가 하고 있는 것보다
hashlib
의 구현에 더 가깝습니다.파트 2는 지금까지 가장 짧은 확장이었고 내가 본 것 중 가장 짧은 것 중 하나였습니다.
Now find one that starts with six zeroes.
일반
solve()
함수가 있다는 것은 파트 2를 작성하는 것이 한 문자를 변경하는 것만큼 간단하다는 것을 의미했습니다.print(solve('yzbqklnj', 6))
이것은 상당히 느리게 실행되었지만 나는 이것을 예상하고 있었고 30초 이내에 해결되어 상당히 기뻤습니다.
그리고 실제 Python 프로그래머는?
대부분의 Pythonista는 저와 같은 방식으로 문제를 해결했지만 멀티스레딩을 사용하여 여러 CPU에 무차별 대입을 퍼뜨리는 몇 가지 솔루션이 있습니다. 나는 이전에 멀티 스레딩을 해본 적이 없으므로 이것은 아마도 내가 봐야 할 것입니다.
단 4일 만에 표준 Python의 여러 영역을 이해하는 데 시간을 할애해야 한다는 것을 깨달았습니다. 그렇지 않으면 여전히 Basic으로 작성하는 것처럼 퍼즐을 계속 풀 것입니다.
Reference
이 문제에 관하여(코드 출현 2015 - 4일 차), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jules_lewis/advent-of-code-2015-day-4-392o텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)