C 、int
: 138 123バイト、long
:152 131バイト
作業最大入力の課題の限界が0x100000000
少し奇妙に思えたので、私はこれの2つのバージョンを作成しました。1つのバージョンは32ビットの整数で動作し(明らかな理由で制限に失敗します)、もう1つのバージョンは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の場合、出力は再帰の前に実行されます。この場合、負の数字を正しく処理するために値を1ずつ増やします。これには、剰余をゼロに変更するという追加の利点があり、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);
}
さらに可能ですが、破壊的なゴルフ: