AoC 2015 - 10일차 - RegEx에 동의합니다.

6177 단어
오늘날 퍼즐 형태의 Look-and-Say Number Sequence의 멋진 예입니다. 퍼즐에서 더 긴 예제가 제공되었지만 기본 아이디어는 다음과 같은 일련의 숫자가 있다는 것입니다. 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의 이야기를 보는 것이었습니다. 즐기세요!

좋은 웹페이지 즐겨찾기