Skip to content

Latest commit

 

History

History

day9

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

Day 9: 센서 강화 (Sensor Boost)

https://adventofcode.com/2019/day/9

Part 1

당신은 방금 재부팅된 탐사선에게 작별을 고하고 화성을 떠났을 때, 소행성대로부터 희미한 조난 신호를 받았습니다. 아마도 세레스(주: 소행성대에 있는 가장 큰 왜행성)의 감시 스테이션으로부터 온 것 같습니다.

신호에 주파수를 맞추려면 센서를 강화해야 합니다. 요정들이 최신 버전의 BOOST(Basic Operation Of System Test) 프로그램을 보내주었습니다.

이 BOOST 프로그램(퍼즐의 입력)을 사용하면 센서를 강화할 수 있지만, 사소한 안전 문제로 인해 실행하려는 컴퓨터가 완전한 정수 컴퓨터(Intcode Computer)인지를 확인하기 전에는 실행할 수 없게 되어 있습니다.

당신이 이전에 만들었던 정수 컴퓨터에는 기능이 하나 빠져 있습니다. 바로 **상대 주소 모드(relative mode)**의 파라미터 처리 기능입니다.

상대 주소 모드는 파라미터 모드 2일 때, 동작합니다. **주소 모드(position mode)**와 매우 비슷한데, 파라미터의 값은 주소로 변환되어 값을 읽어 오거나 저장할 주소를 지정합니다.

주소 모드와의 차이점은 상대 주소 모드에서는 주소를 0부터 세지 않는다는 것입니다. 대신, **기준 주소(relative base)**라는 곳부터 세기 시작합니다. 기준 주소0부터 시작합니다.

상대 주소 모드에서 파라미터가 가리키는 주소는 파라미터의 값과 현재 기준 주소더한 것과 같습니다. 즉, 기준 주소가 0인 경우, 상대 주소 모드와 위치 모드의 파라미터는 서로 같은 위치를 참조합니다.

예를 들면, 기준 주소가 50이라고 할 때, 상대 주소 모드 파라미터의 값이 -7이면 50 + -7 = 43번지를 가리키게 됩니다.

기준 주소는 기준 주소 오프셋 명령을 사용하여 수정할 수 있습니다:

  • 연산코드 9는 하나의 파라미터를 받아, 기준 주소를 파라미터의 값만큼 증가시킵니다. (음의 값인 경우 줄입니다.)

예를 들면, 기준 주소가 2000이라고 할 때, 명령어 109,19를 받으면, 처리 후의 기준 주소는 2019가 됩니다. 다음 명령어가 204,-34인 경우, 1985번지의 값을 출력하게 됩니다.

당신의 정수 컴퓨터는 몇 가지 기능을 추가로 지원해야 합니다:

  • 컴퓨터의 가용 메모리는 초기 프로그램의 크기보다 더 커야 합니다. 프로그램이 초기 프로그램의 크기를 벗어나는 메모리의 값을 참조하려는 경우 그 값은 0으로 간주하며, 쓸 때는 다른 메모리처럼 쓸 수 있어야 합니다. (단, 음수 주소를 가질 수는 없습니다.)
  • 컴퓨터는 큰 수의 연산을 지원해야 합니다. BOOST 프로그램의 초반부에는 이 능력을 검증하는 명령어들이 포함되어 있습니다.

이 기능들을 사용하는 몇 가지 예제를 소개합니다:

  • 109,1,204,-1,1001,100,1,100,1008,100,16,101,1006,101,0,99 는 입력을 받지 않고, 프로그램 자기 자신을 차례로 출력합니다 (이를 Quine이라 합니다).
  • 1102,34915192,34915192,7,4,7,99,0 는 16자리 숫자를 출력해야 합니다.
  • 104,1125899906842624,99 는 중간에 있는 큰 숫자를 출력합니다.

BOOST 프로그램은 하나의 입력을 받습니다. 테스트 모드라는 의미로, 1을 입력해 주면 됩니다. 프로그램은 각 명령어들을 순서대로 체크하며, 비정상적으로 동작하는 것으로 의심되는 연산 코드(와 관련된 파라미터 모드)를 출력한 뒤, 최종 BOOST 키를 출력합니다.

당신의 정수 컴퓨터가 완전히 정상적으로 동작한다면, BOOST 프로그램은 테스트 모드에서 비정상적으로 동작하는 연산 코드를 출력해서는 안 됩니다. 대신, 단 하나의 값(BOOST 키)만을 출력해야 합니다.

프로그램이 만들어내는 BOOST 키는 무엇인가요?

Part 2

이제 당신은 완전한 정수 컴퓨터를 갖게 되었습니다.

드디어 당신은 세레스에서 오는 조난 신호를 수신할 수 있게 되었습니다! 이제 BOOST 프로그램을 이용해 센서를 강화하기만 하면 됩니다.

프로그램의 입력 명령어에 값 2를 넣어주면 프로그램은 센서 강화 모드로 동작합니다. 한 번 실행되고 나면 프로그램은 자동적으로 센서를 강화시키지만, 하드웨어가 느린 경우 연산을 완료하는 데에 몇 초 정도 시간이 소요될 수 있습니다. 센서 증폭 모드에서 프로그램은 하나의 값을 출력할 것입니다. 이것은 조난 신호의 좌표를 뜻합니다.

BOOST 프로그램을 센서 증폭 모드로 실행시키세요. 조난 신호는 어디에서 오고 있나요?