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
(리눅스에서는 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이면 재귀하기 전에 출력이 수행됩니다. 이 경우 음수를 올바르게 처리하기 위해 값을 1 씩 증가시킵니다. 이것은 나머지를 0으로 변경하여 추가로 사용할 수 있다는 이점이 있습니다.value%3
재귀 후 조건의 조건 합니다.
변환 결과는 전역 버퍼에 배치됩니다. 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);
}
추가적이지만 파괴적인 골프 :