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) 꽤 읽기 쉬운 동안 꽤 짧습니다.
Reference
이 문제에 관하여(AoC 2015 - 8일차 - Eval() 사용 안 함), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jules_lewis/advent-of-code-2015-day-8-3jd9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)