레오나르도의 모노레일

코드 출현 2016 12일차



1 부


  • 맙소사: 11일차에 의존하지 않음
  • 조합 코드: 원형...?
  • 작업 알고리즘 작성

  • 맙소사: 11일차에 의존하지 않음


  • 11일차의 어떤 부분도 풀지 못했습니다
  • .
  • 12일 차에 들어와서 걱정이 되었어요

  • 다행히도 12일차는 또...

    조합 코드: 라운드...?


  • 내가 잘못 기억하고 있는 것 같지만, 2021년을 제외하고 매년 어셈블리 코드 테마 퍼즐
  • 이 하나 이상 등장한 것 같습니다.

    이것은 더 쉬운 것 같습니다.
  • 레지스터에 번호 저장 및 업데이트
  • 조건부 점프
  • 포인터가 범위를 벗어나면 종료됨
  • 특정 레지스터에 저장된 값 반환

  • 나는 세 번째나 네 번째처럼 느껴지는 것에 대해 동일한 알고리즘을 작성하려고 합니다...

    내 작업 알고리즘 작성



    각 줄의 opcode 및 피연산자 추출:

    Split the input at each newline character into an array of strings
    
    For each string
      Split the string at each space character into an array of two or three strings, saved as op, x and y
      If y contains a value (meaning there were three strings)
        Construct a three-element array containing the opcode string, and either a string or number for x and y
      Else, if y is empty (meaning there were two strings)
        Construct a two-element array containing the opcode string, and either a string or number for x
    


    이것은 내가 작성한 JavaScript입니다.

    input.split('\n').map(line => {
      let [op, x, y] = line.split(' ')
      if (y) {
        return [op, isNaN(x) ? x : +x, isNaN(y) ? y : +y]
      } else {
        return [op, isNaN(x) ? x : +x]
      }
    })
    


    추가 설정:

    Set pointer to 0 so it starts reading at the first instruction
    Set registers as an object with four keys, a-d, each with 0 as a value
    


    opcode 함수의 사전:

    cpy(x,y) {
      registers[y] = (typeof x == 'string') ? registers[x] : x;
      pointer++
    },
    inc(x) {
      registers[x]++
      pointer++
    },
    dec(x) {
      registers[x]--
      pointer++
    },
    jnz(x,y) {
      registers[x] !== 0 ? pointer += y : pointer++
    }
    


    메인 루프:

    Do as long as pointer contains a number that could refer to an index within the bounds of the list of instructions
      Invoke the appropriate function in the dictionary of opcodes, passing as arguments the second value in the instruction and the third...even if there is no third value
    



    while (pointer >= 0 && pointer < rules.length) {
      opcodes[rules[pointer][0]](
        rules[pointer][1], rules[pointer][2]
      )
    }
    


    위의 코드를 작성하면서 두 가지 실수를 저질렀습니다.
  • 3개의 비pointer 함수
  • 에서 jnz를 증가시키는 것을 잊었습니다.
  • 나는 rules[pointer[1]] 대신에 rules[pointer][1]를 썼는데, 프로그램이 1에 저장된 번호에 어떤 속성pointer이 존재할 것으로 예상하도록 혼동했습니다.

  • 이러한 오류를 수정한 후 프로그램이 실행되어 예상대로 정답을 생성했습니다!

    2 부


  • 추측해 보겠습니다... 성능 테스트?
  • 고맙게도 몇 초 안에 완료됩니다

  • 추측해 볼까요... 성능 테스트?


  • 간단한 작업인 것 같습니다. c1로 변경한 다음
  • 를 다시 실행하십시오.
  • 이전 퍼즐에서는 레지스터의 시작 값을 변경하면 프로그램이 기하급수적으로 더 오래 실행되었습니다...영원한 것처럼 보였습니다!
  • 여기도 그럴까요?

  • 고맙게도 몇 초 안에 끝납니다.


  • 정확히 말하면 7초 - 좋지 않음
  • 레지스터a에는 900만 개가 넘는 숫자가 포함되어 있습니다. 1부에서는 300,000개가 조금 넘는 숫자
  • 를 포함하는 것으로 끝났습니다.
  • 긴 실행 시간의 원인을 조사할 만큼 관심이 없습니다. 이전 퍼즐에서 시도해 보았지만 퍼즐을 푸는 데 도움이 되지 않았습니다
  • .
  • 1분도 안 되어 완료되어 정답이 생성되어 기쁩니다!

  • 해냈어!!


  • 두 부분 모두 해결했습니다!
  • 슬프게도 이전 시도에서 저지른 것과 동일한 실수인 배열 조회 및 포인터 증가를 우연히 발견했습니다!
  • 23일 차의 파트 1을 시도할 준비가 된 것 같습니다!

  • 오늘의 퍼즐을 풀고 메인 맵으로 돌아온 후 이 애니메이션이 재생되는 것을 보고 기뻤습니다.

    좋은 웹페이지 즐겨찾기