C - 120个字符
如果有额外的学分,则为129个字符
main(){char*p,*s,*r,x[99]="1",t[99];for(;r=t,puts(p=x);strcpy(x,t))
for(;*p;*r++=p-s+48,*r++=*s,*r=0)for(s=p;*++p==*s;);}
换行符只是为了方便阅读。
这会在至少15次迭代后发生段错误而停止。如果您的C库使用缓冲I/O,则在段错误之前可能看不到任何输出。如果是这样,请使用此代码进行测试:
#include<stdio.h>
main(){char*p,*s,*r,x[99]="1",t[99];for(;r=t,puts(p=x),fflush(stdout),1;
strcpy(x,t))for(;*p;*r++=p-s+48,*r++=*s,*r=0)for(s=p;*++p==*s;);}
这会在每个输出后添加一个
fflush
。
未压缩的代码看起来可能是这样的:
int main(){
char *p, *start, *result, number[99] = "1", temp[99];
while(1){
puts(number);
result = temp;
p = number;
while(*p){
start = p;
while(*p == *start)
p++;
*result++ = '0' + p - start;
*result++ = *start;
*result = 0;
}
strcpy(number, temp);
}
}
你可以在ideone上看到它的运行效果。
有了额外的加分项,代码看起来像这样:
main(){char*p,*s,*r,x[99],t[99];for(scanf("%s",x);r=t,puts(p=x);strcpy(x,t))
for(;*p;*r++=p-s+48,*r++=*s,*r=0)for(s=p;*++p==*s;);}