코드 출현 2015 - 6일차

8929 단어 adventofcodepython
이것은 인기 있는 라이브러리인 NumPy에 대해 더 많이 배웠으면 하는 또 다른 퍼즐입니다. Python은 기본적으로 다차원 배열을 수행하지 않으므로 이 경우와 같이 1000 x 1000 그리드를 채워야 하는 경우 몇 가지 옵션이 있습니다.
  • NumPy 배우기
  • 중첩 목록 사용
  • 이 퍼즐
  • 로 끝낸 것처럼 다른 해결 방법을 사용하십시오.

    파트 1:



    우리는 아마 모든 백만(!) 조명을 추적할 필요가 없기 때문에, 내가 켜는 각 조명의 좌표에 키가 지정된 사전을 튜플로 사용하기로 결정했습니다.

    나는 'turn ''turn on' 에서 'turn off' 를 제거할 수 있다고 결정했기 때문에 'on', 'off', 'toggle'의 세 가지 명령만 남았습니다. 지침을 구문 분석한 방법은 다음과 같습니다.

    #Parse an instruction from the input file
    def parse_instruction(s):
        words = s.replace('turn ', '').replace(',', ' ').split()
        instruction, x1, y1, _, x2, y2 = words
        return instruction, int(x1), int(x2), int(y1), int(y2)
    


    저는 밑줄에 the를 할당하여 사용하지 않는 변수를 버리는 Python의 기능과 목록을 개별 변수로 바로 압축 해제하는 기능을 좋아합니다.

    코드 본문은 다음과 같습니다. 꺼진 조명은 아직lights{}에 없거나 '0'으로 설정되어 있고, 물론 켜져 있는 조명은 '1'입니다. 데이터가 끝날 때까지 사전에 있는 항목의 값을 간단히 합산하여 얼마나 많은 조명이 켜져 있는지 확인할 수 있습니다.

    lights = {}
    for line in data:
        instruction, x1, x2, y1, y2 = parse_instruction(line)
        for x in range(x1, x2 + 1):
            for y in range(y1, y2+1):
                key = (x, y)
                if instruction == 'off':
                    lights[key] = 0
                elif instruction == 'on':
                    lights[key] = 1
                else: #toggle
                    if key in lights:
                        if lights[key] == 0:
                            lights[key] = 1
                        else:
                            lights[key] = 0
                    else:
                        lights[key] = 1
    print(sum(lights.values()))
    


    내가 본 것 중 가장 빠른 코드는 아닙니다. 하지만 작동하며 megathread의 여러 사람이 완료 시간을 초 단위로 보고했습니다.

    파트 2는 여느 때와 마찬가지로 시나리오를 약간 조정합니다.



    여기서 변경하는 모든 것은 offtoggle 에서 일어나는 일입니다. off에서 가장 중요한 것은 음수에 빠지지 않도록 하는 것입니다. 그리고 toggle는 단순히 두 배의 강도 on입니다!

    if instruction == 'off':
        if key in lights:
            if lights[key] > 0:
                lights[key] -= 1
    else:
        if instruction == 'on':
            incr = 1
        else: #toggle
            incr = 2
        if key in lights:
            lights[key] += incr
        else:
            lights[key] = incr
    


    나는 오늘 골프를 치는 것을 보지 못했고(어쨌든 파이썬에서는 아님) 내 코드는 가장 길지 않았습니다. 좋지는 않지만 7일차에 접어들면 Numpy를 배워야 할 Python 주제 목록에 추가할 것입니다. 그러나 다른 언어에는 매우 짧은 솔루션이 있습니다. this one's in K 언어인지도 몰랐던 !

    e:{"SJJJJ"$'@[;0 2 4 8 10]$["turn"~*x;2;0]_x}'![-4]'0:`:/Users/geocar/e.txt
    a:1000 1000#0;{p:x[1 2]+!:'1 1+x[3 4]-x[1 2];.[`a;p;o@*x]}'e;+//a
    o:`off`on`toggle!(0 0;1 1;1 0)
    


    그리고 아니, 나는 그것이 무엇을 의미하는지 전혀 모른다!

    좋은 웹페이지 즐겨찾기