AoC 2015 - 8일차 - Eval() 사용 안 함

4059 단어 adventofcodepython
긴 퍼즐, 짧은 코드, 오늘. 우리는 살펴볼 문자열이 많고 파일에서 차지하는 문자열 수와 메모리에서 차지하는 문자열 수를 비교해야 합니다. 간단한 예를 들자면 "Hello World!"는 파일에 14자(따옴표 포함)이지만 메모리에는 12자입니다.

퍼즐에서 우리는 탈출한 캐릭터도 살펴보라는 요청을 받습니다. 파트 1:



처리해야 하는 세 가지 유형의 이스케이프 시퀀스가 ​​있습니다.

  • 단일 백슬래시
  • 를 나타내는 \\

  • 큰따옴표
  • 를 나타내는 \"
  • \xnn 여기서 'nn'은 두 개의 16진수\이며 이스케이프 처리된 단일 Ascii 문자를 나타냅니다
  • .

    이를 처리하는 가장 쉬운 방법은 각 문자열을 로드하고 AoC가 퍼즐 입력에 장난을 치지 않는다고 가정하고 여기에 적용eval()하는 것입니다. 그러나 알 수 없는 문자열에 대해 실행eval()하는 것은 일반적으로 나쁜 생각입니다. 고맙게도 Python 추상 구문 트리 라이브러리에는 문자열을 실행하지 않고 평가하는 eval() 의 또 다른 버전이 있습니다: literal_eval() . 이렇게 하면 파트 1 코드가 매우 짧아집니다.

    import ast
    
    with open('src/day08.txt') as f:
        lines = [line.rstrip() for line in f]
    
    total_length = 0
    
    for line in lines:
        total_length += len(line)
        total_length -= len(ast.literal_eval(line))
    
    print(total_length)
    


    2부에서는 다른 방향으로 진행합니다.



    간단한 추가 작업을 수행할 수 있다는 사실을 깨닫기 전에 오랫동안 이것을 응시했습니다.

    각 끝에 인용 부호를 추가할 것이므로 모든 문자열은 두 문자 더 길어집니다.

    문자열 자체의 따옴표는 백슬래시뿐만 아니라 추가 문자로 각각 이스케이프해야 합니다. 저는 에서 모음을 세는 것과 같은 방식으로 이 문자를 세기로 결정하여 매우 짧은 코드를 작성했습니다.

    extras = 0
    
    for line in lines:
    
        #Account for adding quotes back onto the line
        extras +=2
        extras += sum(map(line.count, ['"', '\\']))
    
    print(extras)
    


    [이스케이프하려는 백슬래시를 검색하려면 검색 문자열에서 백슬래시를 이스케이프 처리해야 합니다! 😀]

    megathread 에는 여러 개의 하나의 라이너가 있지만 내 코드에 매우 만족했습니다. 여전히 (imho) 꽤 읽기 쉬운 동안 꽤 짧습니다.

    좋은 웹페이지 즐겨찾기