이 프로그램은 인쇄 할 수없는 문자로 가득 차 있으므로 16 진 덤프가 있습니다.
00000000: 2573 dc01 7e13 dcb6 1f %s..~....
참고 : 음수를 입력 할 수없는 숫자 입력 루틴을 사용하므로이 제출은 음이 아닌 정수로만 제한됩니다.
경찰과 강도 문제에 대한 한 가지 문제 는 코드에 대한 설명을 작성하지 않기 때문입니다. 반면에, 이것은 내가 여기서 문제에 갈 필요가 없다는 것을 의미합니다.
특히 압축 표기법으로는 읽기가 어렵 기 때문에 언어로 7을 선택했으며 8 비트 청크로 작성된 프로그램을 이동하는 데 어려움을 겪어야하는 사람이 왜 나 인지 모르겠습니다 . 3 비트 인코딩 행운을 빕니다!
설명
이제 프로그램이 깨졌습니다 (불행히도 무자비한 힘으로;이 짧은 해결책에서는 항상 위험합니다). 내가 무엇을 얻고 있는지 설명 할 수도 있습니다. 이것은 실제로 프로그램을 읽음으로써 상당히 해결할 수있었습니다. 나는 그것을 훨씬 더 어렵게 만들 수 있었지만, 무차별 대입 균열이있을 때 나쁜 생각처럼 느껴졌습니다.
보다 자연스러운 인코딩으로 프로그램을 표현하는 것으로 시작하겠습니다. ; 평소와 같이, 굵은 숫자는 (프로그램에서 표현할 수있는 모든있는 즉시 실행 명령을 표시 6하고 7있지만 2에 5, unbolded 번호가 탈출 등가물 (대표하지 않습니다) 0에 5원래 프로그램에서 표현할 수있는 모두를, 메모를 그것은 0탈출 한 6것이고 1탈출 한 것입니다 7) :
112 7 1 7 34,002 77 023 67 13303
그것은 기본적으로 원래 스택을 나타냅니다 단지 리터럴 있다고 7 프로그램 소스 평균에서 사용할 수있는 명령 세트는 (아무 것도 그냥 탈출 명령을 수행 할 수 없다 6과 7). 따라서 프로그램이 가장 먼저 할 일은 많은 것들을 스택에 밀어 넣는 것입니다. 다음은 프로그램 실행 후 스택이 어떻게 보이는지 보여줍니다 ( |7과 같이 스택 요소를 분리 함).
772 | 7 | 34662 | 023 | 73363
그런 다음 최종 스택 요소가 복사되어 실행되는 코드가됩니다 (스택에 남아 있음). 그것이 일어날 때, 이것은 코드의 유일한 부분입니다; 다른 모든 것은 단지 데이터입니다. 번역 내용은 다음과 같습니다.
73363
7 빈 요소를 스택에 밀어 넣습니다.
3 상단 스택 요소를 출력하고 아래에있는 요소를 버립니다.
73 조합 된 효과 : 상단 스택 요소를 버립니다.
3 상단 스택 요소를 버리고 아래에 요소를 버립니다.
6 상단 스택 요소를 탈출 한 다음 3 아래 요소에 추가하십시오 . 상단 스택 요소를 출력하고 아래
요소를 삭제하십시오.
다시 말해, 이것은 대부분 많은 I / O 명령어 일뿐입니다. 이것을 자세히 분석해 봅시다 :
7373363스택 위에 있는 것을 버립니다 .
3를 출력 023하고를 삭제합니다 34662. 따라서 34662주석이 다른 버전의 프로그램에 필요한 바이트를 저장하는 데 사용 된 주석 임을 알 수 있습니다 . 023출력시 수행 할 작업 은 I / O 형식 0 (정수)을 선택한 다음 23구현에 정수를 입력하도록 요청하는 지시문입니다 (7에서 입력을 요청하는 특정 코드를 출력하여 입력합니다). 입력은 아래에 스택 요소를 복사하여 수행됩니다. 예를 들어 입력 정수가 10이면 다음 스택 요소 (현재 7)가됩니다 7777777777. 따라서 우리는 사용자의 입력을 10 진수로 받아들이지 만 단항으로 저장됩니다.
6상단 스택 요소를 이스케이프 처리합니다 (각 인스턴스를 변경 7합니다 1; 이것은 전체로 구성된 문자열 7이 이스케이프되는 방식입니다 772). 따라서 우리의 데이터는 이제 다음과 같습니다 7721111111111.
- 마지막으로,
3해당 스택 요소를 출력하고 기본 초기 스택의 일부인 빈 스택 요소를 팝합니다. 그 값의 개수 고려하여 산출된다 1(S) 및 7(S)을, 그리고 숫자 감산 0들 및 6들. ( 2가장 중간에는 무시됩니다. 문자열의 끝에 있으면 무시하지 않고 후행 줄 바꿈이되지만 PPCG 규칙은이를 신경 쓰지 않습니다.) 따라서 출력은 원래입니다 입력 플러스 2.
이 시점에서 스택에는 유용하지 않으며 프로그램에는 아무것도 없으므로 프로그램이 종료됩니다.
이것을 어떻게 되돌 립니까? 11to 를 변경하는 것은 간단한 일 00이므로 입력에 2를 더하는 대신 2를 낮추는 문자를 추가합니다. 프로그램에는 008 개의 8 진수 가 편리하게 숨겨져 있으므로 8 진수와 바이트가 서로 정렬되므로 11시작시 간단히 8 진수로 바꿉니다 .