이 프로그램은 인쇄 할 수없는 문자로 가득 차 있으므로 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 명령어 일뿐입니다. 이것을 자세히 분석해 봅시다 :
73
73363
스택 위에 있는 것을 버립니다 .
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.
이 시점에서 스택에는 유용하지 않으며 프로그램에는 아무것도 없으므로 프로그램이 종료됩니다.
이것을 어떻게 되돌 립니까? 11
to 를 변경하는 것은 간단한 일 00
이므로 입력에 2를 더하는 대신 2를 낮추는 문자를 추가합니다. 프로그램에는 00
8 개의 8 진수 가 편리하게 숨겨져 있으므로 8 진수와 바이트가 서로 정렬되므로 11
시작시 간단히 8 진수로 바꿉니다 .