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を取得します。
ああ、これをコンパイルするには、Unixのようなシステムで行う必要があります
gcc -c [-m32] recursionStackAt.s
gcc -o sortasort [-m32] sortasort.c recursionStackAt.o
-m32フラグは、64ビットマシンを使用している場合にのみ注意してください。また、コンパイルするには32ビットライブラリが必要です。
" "
としてカウントマルチ文字列?単一の文字は、「マルチ」...とは考えられないだろう