C int
:138123字节,long
:152131字节
我创建了两个版本,因为最大工作输入的挑战极限0x100000000
似乎有些奇怪。一个版本使用32位整数(出于显而易见的原因,该限制失败),另一个版本使用64位(超出给定限制,但额外增加了14 8个字节)。
32位版本:
char b[22],*r=b;f(v,l)char*l;{v%3>1?*r++=*l,v++:0;v&&f(v/3,l+1);v%3?*r++=*l:0;}g(v){f(v,"139ABCDEFGHIJKLMNOPQR");*r=0;r=b;}
64位版本:
char b[22],*r=b;f(long v,char*l){v%3>1?*r++=*l,v++:0;v&&f(v/3,l+1);v%3?*r++=*l:0;}g(long v){f(v,"139ABCDEFGHIJKLMNOPQR");*r=0;r=b;}
除了声明整数变量为long
(Linux上为64位)之外,这是相同的。
非高尔夫long
版本:
char buffer[22],*result=buffer;
f(long value,char*letter){
if(value%3>1){
*result++=*letter,value++;
}
if(value){
f(value/3,letter+1);
}
if(value%3){
*result++=*letter;
}
}
g(long value){
f(value,"139ABCDEFGHIJKLMNOPQR");
*result=0;
result=buffer;
}
如您所见,这通过递归体面的方式起作用:如果余数为1,则在递归调用之后将各个字符附加到输出字符串。如果余数为2,则在递归之前执行输出。在这种情况下,我还将值增加一以正确处理负数。这具有将余数更改为零的附加好处,使我可以将value%3
if作为递归后的条件。
转换结果放入全局缓冲区。该g()
包装具有零正确终止得到的字符串,并以重置工作result
指针,它的启动(这也是如何g()
“回报”的结果)。
long
使用以下代码测试版本:
#include <stdio.h>
char b[22],*r=b;f(long v,char*l){v%3>1?*r++=*l,v++:0;v&&f(v/3,l+1);v%3?*r++=*l:0;}g(long v){f(v,"139ABCDEFGHIJKLMNOPQR");*r=0;r=b;}
void printConversion(long value) {
g(value);
printf("%ld: %s\n", value, r);
}
int main() {
for(long i = 0; i <= 40; i++) {
printConversion(i);
}
printConversion(0x7fffffff);
printConversion(0xffffffffu);
printConversion(0x100000000);
}
可能进行的但破坏性的打高尔夫球: