C + x86 어셈블리, 636
나는 이것이 이길 수 없다는 것을 알고 있지만 너무 부자연스럽고 꼬여서 그것을 공유해야한다고 느꼈습니다. 입력 인수를 계산하지 않는 한 배열이나 문자열이 없습니다. 32 비트 범위로 제한되는 자릿수입니다.
여기 내가 한 일에 대한 약간의 설명이 있습니다.
배열이나 문자열을 사용하지 않고이 작업을 수행 한 다음 재귀를 염두에 두었다고 생각했지만 물론 재귀를 사용하면 다른 재귀 호출의 값을 바꿀 수 없었습니다. 방법이있었습니다. 내 C 프로그램을 어셈블리 함수와 연결 스택에서 점프하여 원하는 호출의 기본 포인터에 대한 포인터를 반환 할 수 있습니다. 이것이 바로 "recursionStackAt"함수입니다. 물론 recursionStackAt는 매우 추악한 함수이며 결과는 입력 또는 프로그램의 상태뿐만 아니라 호출자 자체에 달려 있습니다. 그것이 인덱스를 0에서 1로 변경하게 만든 것입니다.
더 이상 고민하지 않고 코드는 다음과 같습니다.
#include <stdio.h>
#include <stdlib.h>
int numberToSort;
int totalLength = 0;
int decreasing;
int* recursionStackAt(int pos); //Here's the magic
void swapAtStack(int pos1, int pos2) {
int a = *(recursionStackAt(pos1)+3);
*(recursionStackAt(pos1)+3) = *(recursionStackAt(pos2)+3);
*(recursionStackAt(pos2)+3) = a;
}
int getAt(i) {
return *(recursionStackAt(i)+3);
}
void printNumber(int len) {
int i = 0;
for(i = 1; i <= len; ++i) {
printf("%d",*(recursionStackAt(i)+3));
}
printf("\n");
}
void computeNextDigit(int remainingNumber, int nextDigit) {
if(remainingNumber == 0) {
//Bubble sort cause I was lazy and it's quite compact
++totalLength;
int i, j;
for(i = 1; i <= totalLength; ++i)
for(j = 1; j <= totalLength-1; ++j) {
if(decreasing) {
if(getAt(j) > getAt(j+1))
swapAtStack(j,j+1);
}
else {
if(getAt(j) < getAt(j+1))
swapAtStack(j,j+1);
}
}
printNumber(totalLength);
}
else {
++totalLength;
computeNextDigit(remainingNumber/10, remainingNumber%10);
}
}
int main(int argc, char* argv[]) {
if(argc == 3) {
numberToSort = atoi(argv[1]);
decreasing = atoi(argv[2]);
}
else exit(1);
computeNextDigit(numberToSort/10, numberToSort%10);
}
물론 recursionStackAt 함수의 x86 (AT & T sintax, btw) 어셈블리 코드 :
.text
.align 4
.globl recursionStackAt
.type recursionStackAt, @function
recursionStackAt:
pushl %ebp
movl %esp,%ebp
pushl %esi
movl $0, %esi #i = 0
movl (%ebp), %eax #pointer
while:
cmp %esi, 8(%ebp)
je endwhile
movl (%eax),%eax
incl %esi
jmp while
endwhile:
popl %esi
movl %ebp, %esp
popl %ebp
ret
출력에 대한 몇 가지 예 : (1은 증가하고 0은 감소 함을 의미)
$ ./sortasort 6543210 1
0123456
$ ./sortasort 32507345 1
02334557
$ ./sortasort 32507345 0
75543320
다음은 난독 처리 된 버전입니다 (읽을 수 없지만 제대로 작동 함).
http://pastebin.com/XkYt9DLy(C 코드)
http://pastebin.com/h0S0dfeU(x86 코드)
따라서 LibreOffice가 거짓말하지 않으면 난독 화 된 코드는 646 자로 구성되며 (공백없이 계산해야합니까?) 다른 모든 조건이 충족되면 증가 / 감소 선택에 대해 -10을 얻습니다.
아, 그리고 이것을 컴파일하려면 (유닉스 계열 시스템에서)
gcc -c [-m32] recursionStackAt.s
gcc -o sortasort [-m32] sortasort.c recursionStackAt.o
-m32 플래그는 64 비트 시스템 인 경우에만 해당됩니다. 또한 컴파일하려면 32 비트 라이브러리가 필요합니다.
" "
로 간주 됩니까 ? 하나의 문자는 "멀티"로 간주되지 않습니다 ...