방화벽 규칙

코드 출현 2016 20일차



1 부


  • 아이디어가 있습니다. 작동하지 않을 수 있습니다.
  • 제 아이디어가 효과가 있나요? 우리는 결코 알지 못할 수도 있습니다.
  • 더 나은 아이디어가 작동합니까? 도대체!

  • 나는 아이디어가. 작동하지 않을 수 있습니다.



    내 생각은 부분적으로:

    입력에서 목록으로 시작:

    5-8
    0-2
    4-7
    


    하한을 기준으로 정수 범위 목록을 오름차순으로 정렬합니다.

    0-2
    4-7
    5-8
    


    고유한 값 세트를 초기화합니다.

    { }
    


    첫 번째 범위의 모든 정수를 더합니다.

    {0,1,2}
    


    다음 범위의 하한에 대한 확인을 수행합니다.

    Is it two greater than the highest integer in the set?
      If so, the integer one higher than the highest integer is the answer
    Else, it's either less than, equal to, or one higher than the highest in the set
      Add all integers to the set
    


    일치하는 항목이 발견될 때까지 이 작업을 수행합니다. 집합에서 가능한 가장 높은 정수보다 작은 가장 낮은 정수를 가정합니다.

    이것이 효과가 있을지 궁금합니다.

    나는 그것을 쓰게되어 기쁩니다!

    내 아이디어가 작동합니까? 우리는 결코 알지 못할 수도 있습니다.



    더 나은 것을 생각했기 때문입니다!

    내가 자리를 비운 동안 나는 그 일에 대해 어느 정도 명료성을 얻었다.

    그리고 나는 숫자 집합을 전혀 포함하지 않는 훨씬 더 빠른 알고리즘을 생각해 냈습니다!

    내 더 나은 아이디어는 다음과 같습니다.

    입력에서 목록으로 시작:

    5-8
    0-2
    4-7
    


    하한을 기준으로 정수 범위 목록을 오름차순으로 정렬합니다.

    0-2
    4-7
    5-8
    

    max0로 설정합니다.

    max = 0
    


    첫 번째 범위를 기준으로 업데이트max:

    max = Math.max(max, 2)
    


    다음 범위의 하한이 max + 1 미만인 한 계속합니다.

    루프가 종료될 때까지:

    return max + 1
    


    더 빠른 이유:
  • 수백만/10억/조의 숫자 모음 없음
  • 반복할 때마다 3개의 숫자만 읽습니다. 1) 현재 최대값; 2) 상한; 3) 하한

  • 문제는 실제로 작동할까요?

    내 더 나은 아이디어가 작동합니까? 도대체!


  • 예제 목록에서 작동했습니다
  • .
  • 내 퍼즐 입력을 사용하여 작동했습니다!

  • 더 좋은 점은 종료하기 전에 1005개가 넘는 범위 중 18개만 확인하면 되었다는 것입니다!

    2 부


  • 하나에서... 모두에게. 그것이 오는 것을 보았다.
  • 파트 1 알고리즘 업데이트 중

  • 하나부터... 모두까지. 그것이 오는 것을 보았다.



    나는 이것이 내 알고리즘에 약간의 조정 만 필요하다고 확신합니다.
  • 지금은 do...while 루프를 사용하여 차단되지 않은 IP
  • 를 찾으면 바로 중지합니다.
  • 모두 찾으려면 대신 각 범위를 반복하고 차단되지 않은 모든 IP를 수집해야 합니다
  • .

    내 파트 1 알고리즘 업데이트



    라운드 1




    Set max as 0
    Set ips as an empty set
    
    For each range of ips
      If the lower bound of the range is greater than the integer one higher than max
        For each integer from max + 1 up to but not including the lower bound
          Add the integer to ips
      Update max to the higher integer between max and the upper bound in the range
    
    Return the count of integers in ips
    


    정답을 생성합니다!

    그러나 정답은 차단되지 않은 IP의 수일 뿐이므로 각 IP를 저장할 필요는 없습니다.

    나는 집계를 증가시킬 수 있어야합니다!

    2라운드




    Set max as 0
    Set ips as 0
    
    For each range of ips
      If the lower bound of the range is greater than the integer one higher than max
        Increment ips by the difference of the lower bound and max + 1
      Update max to the higher integer between max and the upper bound in the range
    
    Return the count of integers in ips
    


    정답도 생성합니다!

    이봐, 잠깐만.

    약간의 성능 희생으로 파트 1과 파트 2의 알고리즘을 결합할 수 있었습니다!
    reduce() 다시 구조하러!

    3라운드




    For each range of ips, accumulate a 2-element array
      Element 1 is ips, an array
      Element 2 is max, starting as 0
      If the lower bound of the range is greater than the integer one higher than max
        For each integer from max + 1 up to but not including the lower bound
          Add the integer to ips
      Update max to the higher integer between max and the upper bound in the range
    
    Return the first integer in the array, and the length of the array
    


    자바스크립트에서:

    let [ips,] = ranges.reduce((acc, range) => {
        if (range[0] > acc[1] + 1) {
          for (let i = acc[1] + 1; i < range[0]; i++) {
            acc[0].push(i)
          }
        }
        acc[1] = Math.max(acc[1], range[1])
        return acc
    }, [[], 0])
    return [ips[0], ips.length]
    


    GIF로:


    해냈어!!


  • 두 부분 모두 해결했습니다!
  • 범위를 정렬한 다음 범위 경계
  • 를 확인하면 이 퍼즐을 풀 수 있다는 것을 알았습니다.
  • 네 개의 알고리즘을 작성했습니다!
  • 마지막은 두 문장으로 두 부분을 모두 풀었습니다!
  • 모든 알고리즘이 처음에 예상했던 것보다 빠르게 실행됩니다!

  • 이 퍼즐은 내가 초보자에서 전문 컴퓨터 프로그래머가 된 것처럼 느끼게 해주었습니다.
  • 처음에는 수조 개의 정수가 포함된 컬렉션을 평가하고 저장해야 한다고 생각했습니다!
  • 결국 퍼즐 입력에서 2000개의 정수 중 일부만 평가하는 결합된 알고리즘을 작성했습니다!
  • 좋은 웹페이지 즐겨찾기