C int
: 138 123 Bytes long
: 152 131 Bytes
Ich habe zwei Versionen davon erstellt, da die Grenze der Herausforderungen bei einem maximalen Arbeitseingang von 0x100000000
etwas seltsam erschien. Eine Version arbeitet mit 32-Bit-Ganzzahlen (die aus offensichtlichen Gründen das Limit verfehlen), die andere Version arbeitet mit 64 Bit (die weit über das angegebene Limit hinausgehen und 14 8 zusätzliche Bytes kosten ).
32 Bit Version:
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 Bit Version:
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;}
Dies ist identisch mit der Ausnahme, dass die Ganzzahlvariable als long
(64-Bit unter Linux) deklariert wird.
Die ungolfed long
Version:
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;
}
Wie Sie sehen, funktioniert dies bei rekursivem Anstand: Wenn der Rest 1 ist, wird das entsprechende Zeichen nach dem rekursiven Aufruf an die Ausgabezeichenfolge angehängt. Wenn der Rest 2 ist, wird die Ausgabe vor der Rekursion ausgeführt. In diesem Fall erhöhe ich auch den Wert um eins, um die negative Ziffer richtig zu behandeln. Dies hat den zusätzlichen Vorteil, dass der Rest auf Null gesetzt wird und ich ihn value%3
als Bedingung für die Nachrekursion verwenden kann, wenn.
Das Ergebnis der Konvertierung wird in den globalen Puffer gestellt. Der g()
Wrapper hat die Aufgabe, die resultierende Zeichenkette korrekt mit Null zu beenden und den result
Zeiger auf den Anfang zurückzusetzen (was auch so ist)g()
das Ergebnis "zurückgegeben" wird).
Testen Sie die long
Version mit diesem Code:
#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);
}
Mögliches weiteres, aber zerstörerisches Golfen:
-4 Bytes: Machen Sie die Funktion zu einem One-Shot, indem Sie den Zeiger entfernen, der in zurückgesetzt wurde g()
.
-5 Bytes: Der Aufrufer wird gezwungen, die String-Terminierung durchzuführen, wobei der String ohne Terminierung in buffer
und das Ende des Strings in zurückgegeben werden result
.