C + x86组件,636
我知道这不会赢,但是感觉太不自然了,我不得不分享。没有数组或字符串(只要不计算输入参数)。其位数受32位范围的限制。
所以这是我所做的一些解释:
我以为我会在不使用任何数组或字符串的情况下执行此操作,然后想到了递归,但是当然,有了递归,我将无法从其他递归调用中交换值……然后我意识到有办法 将我的C程序与汇编函数链接起来后,我可以跳入堆栈并返回指向所需调用的基本指针的指针,这就是“ recursionStackAt”函数的作用。当然recursionStackAt是一个非常丑陋的函数,它的结果不仅取决于输入或程序的状态,还取决于调用者本身。请注意,这就是让我将索引从0更改为1的原因。
事不宜迟,这里是代码:
#include
#include
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
这是混淆的版本(不可读,但工作正常):
因此,如果LibreOffice不撒谎,我的混淆代码由646个字符组成(没有空格,我应该算出它们吗?),并且在满足所有其他条件的情况下,对于递增/递减选择,我会得到-10。
哦,要编译它,您应该这样做(在类Unix系统上)
gcc -c [-m32] recursionStackAt.s
gcc -o sortasort [-m32] sortasort.c recursionStackAt.o
请注意,仅当您使用64位计算机时,-m32标志才可用。您还需要32位库进行编译。