AoC 2015 - 10일차 - RegEx에 동의합니다.
3111
이것은 '우리가 보는 것을 말하다', 하나 셋, 셋 1에 의해 시리즈의 다음 숫자로 변환됩니다:
1331
하나 하나, 둘 셋, 하나 하나가 되는 것:
112311
등등. 퍼즐의 파트 1에 설명된 방법은 다음과 같습니다.
약간 더 긴 퍼즐 입력을 나누기 위해 정규 표현식을 만드는 것에 대해 간단히 생각했지만 한 자리 숫자 그룹도 포함하는 숫자 그룹을 선택하는 방법을 찾을 수 없었습니다. RegEx를 더 깊이 파고드는 대신 루프를 풀고 코딩했습니다.
groups = []
buffer = ''
for c in puzzle_input:
if buffer == '':
buffer += c
else:
if c == buffer[0]:
buffer += c
else:
groups.append(buffer)
buffer = c
groups.append(buffer)
계속해서 파트 1을 풀었지만 Redditmegathread을 통해 검색했을 때 한 줄로 완료될 수 있다는 것을 알았을 때 위의 내용이 정말 마음에 들지 않았습니다. 거기에 있는 몇 가지 솔루션은 내가 훌륭한 사이트RegExr.com에서 탐색한 표현
((\d)\2*)
을 사용했습니다. 자신의 텍스트에서 정규 표현식을 테스트할 수 있을 뿐만 아니라 표현식이 수행하는 작업에 대한 설명도 제공합니다.이 설명은 위의 정규 표현식에 대한 것이며 어느 정도 이해가 되기 시작했습니다... 어쨌든 1부를 매우 간단하게 만듭니다.
regex = re.compile(r'((\d)\2*)')
def translate(work_string):
groups = [i[0] for i in regex.findall(work_string)]
new_string = ''
for group in groups:
#First we 'say' how many of each digit there is, with len()
#followed by the digit itself
new_string += str(len(group)) + group[0]
return new_string
#Part 1 -- forty rounds
for i in range(40):
work_string = translate(work_string)
print(len(work_string))
translate()
함수는 인라인으로 시작했지만 파트 2 때문에 함수로 들어가야 했습니다.함수에
translate()
가 있는 덕분에 파트 2는 다음과 같이 쉽습니다.#Part 2 -- another ten rounds
for i in range(10):
work_string = translate(work_string)
print(len(work_string))
... 매우 긴 문자열이 구문 분석되기를 기다립니다.
더 재미있는 것은 내가 아래에 포함시킨 'look and say' 시리즈에 대한 John Conway의 이야기를 보는 것이었습니다. 즐기세요!
Reference
이 문제에 관하여(AoC 2015 - 10일차 - RegEx에 동의합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jules_lewis/aoc-2015-day-10-i-give-in-to-regex-28do텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)