सी int
:: 138 123 बाइट्स long
: 152 131 बाइट्स
मैंने इसके दो संस्करण बनाए हैं, क्योंकि चुनौतियों का एक अधिकतम काम के अधिकतम इनपुट की सीमा 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 है, तो आउटपुट पुनरावर्तन से पहले किया जाता है। इस मामले में, मैं नकारात्मक अंक को सही ढंग से संभालने के लिए एक से एक मूल्य बढ़ाता हूं। इससे शेष को शून्य में बदलने का अतिरिक्त लाभ है, जिससे मुझे उपयोग करने की अनुमति मिलती है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);
}
आगे संभव है, लेकिन विनाशकारी गोल्फिंग:
-4 बाइट्स: पॉइंटर रीसेट को हटाकर फ़ंक्शन को एक-शॉट बनाते हैं g()
।
-5 बाइट्स: कॉलर को स्ट्रिंग टर्मिनेशन करने के लिए मजबूर करें, स्ट्रिंग को बिना टर्मिनेशन के लौटाए और स्ट्रिंग buffer
के अंत में result
।