확장 중합

코드 2021의 출현 14일차



입력한 시뮬레이터를 사용해 보십시오.





X에 대해 풀기


X = the difference between the most and least common letters after N pair insertion steps
  • N = 10
  • N = 40

  • 우리의 의견은 무엇입니까?


  • 여러 줄 문자열

  • 두 가지를 나타냅니다.


  • 시작 템플릿
  • 쌍 삽입 규칙

  • 내 순진한 말 그대로 무차별 대입 알고리즘




    Step 1 - Parse the input into the two separate parts
      1. A string representation of the starting template
      2. An object where keys are adjacent letters and values are the letter to be inserted
    
    Step 2 - Perform in-place pair insertion into a growing string of letters, just as the instructional diagram depicts
      Do N times
        Split the template into a list of ordered letters
        For each letter in the list at its initial length, starting from the letter at the end of the list:
          Look-up the rule matching the concatenation of the letter to the left and the current letter
          If a pairing rule exists:
            Update the array by inserting the correct letter between the current letter and the one to its left
        Reassign to the variable storing the starting template the result of joining each letter in the updated array
    
    Step 3 - Tally each letter
      Store an object to be filled with keys of each letter and values that increment with each occurrence of that letter
      For each letter in the most updated template string
        If the object has a key of the letter, increment its value by 1
        Else, create the key and set its value to 1
    
    Lastly, return the difference of the letter with the largest tally and the letter with the smallest tally
    


    이 애니메이션은 내 알고리즘의 2단계가 어떻게 작동하는지 보여줍니다.

    내 알고리즘이 그렇게 끔찍하게 작동하는 이유


  • N이 13이 될 때까지 템플릿 문자열에는 25,000개의 문자가 있으며 각 반복마다 최소 두 배가 됩니다.
  • 25k 분할, 규칙 검사 및 스플라이스입니다.
  • 알고리즘이 15에서 크롤링 속도가 느려지고 40에 도달하지 않을 가능성이 높습니다.

  • 나는 이 도전을 다른 방법으로 해결하는 방법을 몰라 헤맸습니다.

    웅변적인 솔루션에 대한 짧은 검색



    find a solution은 간결하고 집중된 연구로 이해할 수 있으며 결국 재현할 수 있는 것처럼 보이는 데 오랜 시간이 걸리지 않았습니다.

  • JavaScript solver NullDev의 솔루션은 완벽한 후보였다

  • NullDev 알고리즘 연구



    6가지 핵심 단계가 있는 것 같습니다.
  • 입력을 구문 분석하여 템플릿을 추출하고 - 개별적이지만 결합된 - 템플릿의 규칙 및 북엔드(예: 시작 템플릿의 첫 번째 및 마지막 문자)
  • 이 퍼즐을 푸는 데 중심이 되는 알고리즘을 정의하십시오.
  • 시작템플릿에 먼저 적용
  • 누적 쌍의 후속 처리마다 적용
  • 초기 북엔드 문자를 포함하여 결과 쌍의 각 문자에 적용합니다.
  • 일부 수학을 수행하고 최대 및 최소 카운트의 차이를 반환합니다.

  • 핵심 알고리즘



    (o, k, v = 1) => (o[k] = (k in o) ? o[k] + v : v);
    

    의사 코드로 번역:

    Define a function that expects three parameters:
      1. An object
      2. A key to lookup in that object
      3. A value - 1 - to assign to new keys, or to add to values of existing keys...
    
    Body of the function:
      Assign to the object's key the following, depending on whether that key exists on the object:
        If it exists, assign to it the sum of the current value stored in that key and the passed in value
        Else - if it doesn't exist:
          Assign to it the value passed in, or 1    
    


    이 애니메이션은 3단계를 설명합니다.





    이 애니메이션은 4단계를 설명합니다.





    이 애니메이션은 5단계를 설명합니다.





    다음은 NullDev의 웅변 알고리즘에서 위의 세 단계에 대한 전체 그림입니다.





    이 알고리즘의 성능과 역학에 감탄


  • 기본적으로 프로그램은 소수의 키와 그에 저장된 증가하는 숫자만 추적합니다.
  • 중합 동안 생성된 쌍의 합에 대한 새로운 집계를 수집하기 위해 새 개체를 반복적으로 빌드한 다음 가장 최근에 생성된 키와 값으로 전역 개체를 업데이트합니다.
  • 동일한 단일 작업 기능을 훌륭하게 사용하여 유사한 구조의 개체에 대해 약간 다른 작업을 수행합니다.

  • 내 입력을 해결할 시뮬레이터 구축


  • 이전 연습과 마찬가지로 내 입력을 붙여넣고 일부 버튼을 클릭하고 내 또는 모든 입력에 대한 답변을 생성할 수 있는 웹 앱을 구축하는 것이 좋습니다.
  • 자체 레이블을 사용하여 NullDev의 코드를 재현했습니다.
  • 코드를 즉시가 아닌 버튼을 눌러 호출할 수 있는 기능으로 재구성했습니다.
  • 어쩔 수 없이 디버깅을 해봤습니다
  • 아아, 나는 모든 입력에 대한 중합 프로세스의 모든 단계에서 문자와 답변을 표시하는 작업 시뮬레이터를 가지고 있었습니다.


  • 그런 보람찬 느낌


  • 시뮬레이터 로드 중
  • 내 입력에 붙여넣기
  • 시작 누르기
  • 몇 라운드 동안 작동하는 것을보고
  • 그리고 10라운드 동안
  • 그리고 40명을 위한
  • Advent of Code 제출 상자에 답을 복사하여 붙여넣기
  • 정답을 맞혀서 두 번째 금상을 수상한

  • 이 퍼즐에 시간을 잘 보냈습니다.

    다음으로!

    좋은 웹페이지 즐겨찾기