코드 출현 2015 - 4일 차

4062 단어 adventofcodepython
4일차에는 Python에서 이전에 사용하지 않았던 표준 라이브러리가 있어 매우 기뻤습니다. 퍼즐의 첫 번째 부분은 다음과 같습니다.



빠른 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으로 작성하는 것처럼 퍼즐을 계속 풀 것입니다.
  • zip()
  • 세트
  • 멀티스레딩
  • 반복자
  • 좋은 웹페이지 즐겨찾기