रेटिना , 56 37 बाइट्स
यह समाधान सभी आवश्यक इनपुट मूल्यों के साथ काम करता है।
इस चुनौती में सबसे बड़ी समस्या रेटिना का सामना करना है, यह तथ्य यह है कि इसके तारों की अधिकतम लंबाई 2 ^ 30 वर्ण है, इसलिए संख्याओं (सामान्य प्रतिनिधित्व) से निपटने का सामान्य तरीका 2 ^ 30 से अधिक मूल्यों के साथ काम नहीं करता है।
इस समस्या को हल करने के लिए, मैंने एक अलग दृष्टिकोण अपनाया, जिसमें संख्याओं के दशमलव निरूपण को ध्यान में रखते हुए, लेकिन जहां प्रत्येक अंक को unary में लिखा गया है (मैं इसे प्रतिनिधित्व अंकसूची कहूँगा )। उदाहरण के लिए संख्या 341
को 111#1111#1#
अंकों के रूप में लिखा जाएगा । इस प्रतिनिधित्व के साथ अब हम 2^30/10
अंकों की संख्या (~ सौ मिलियन अंक) के साथ काम कर सकते हैं । यह मनमाने ढंग से अंकगणित के लिए मानक यूनिरी से कम व्यावहारिक है, लेकिन थोड़े प्रयास से हम किसी भी तरह के ऑपरेशन कर सकते हैं।
नोट: सिद्धांत रूप में अंकगणित किसी अन्य आधार का उपयोग कर सकता है (जैसे बाइनरी बेस 2 डिजिटरी में 110
हो सकता 1#1##
है), लेकिन चूंकि रेटिना में दशमलव और यूनरी के बीच कनवर्ट करने के लिए बिल्डिंग्स हैं और अन्य ठिकानों से निपटने के लिए कोई सीधा रास्ता नहीं है, इसलिए दशमलव शायद सबसे अधिक प्रबंधनीय आधार है।
मैंने जिस एल्गोरिथ्म का उपयोग किया था वह दो तक क्रमिक पूर्णांक विभाजन बना रहा है जब तक कि हम शून्य तक नहीं पहुंच जाते हैं, हमने जो विभाजन किए हैं वह इस संख्या का प्रतिनिधित्व करने के लिए आवश्यक बिट्स की संख्या है।
तो, हम अंकों में दो को कैसे विभाजित करते हैं? यहाँ रेटिना स्निपेट है कि यह करता है:
(1*)(1?)\1# We divide one digit, the first group captures the result, the second group captures the remainder
$1#$2$2$2$2$2 The result is put in place of the old number, the remainder passes to the next digit (so it is multiplied by 10) and is divided by two there -> 5 times the remainder goes to the next digit
यह प्रतिस्थापन 2 से एक अंकों की संख्या को विभाजित करने के लिए पर्याप्त है, हमें बस मूल संख्या विषम होने पर अंत से संभव 5 को निकालने की आवश्यकता है।
इसलिए, यहां पूर्ण कोड है, हम दो को तब तक विभाजित करते रहते हैं जब तक कि संख्या में अभी भी अंक नहीं होते हैं, और n
प्रत्येक पुनरावृत्ति पर स्ट्रिंग के सामने एक शाब्दिक रखा जाता है : n
अंत में संख्या का परिणाम होता है।
. |
$*1# Convert to digitunary
{`^(.*1) Loop:|
n$1 add an 'n'
(1*)(1?)\1# |
$1#$2$2$2$2$2 divide by 2
)`#1*$ |
# erase leftovers
n Return the number of 'n's in the string
इसे ऑनलाइन आज़माएं!
नवीनीकृत समाधान, 37 बाइट्स
बहुत से अच्छे विचारों के साथ बड़ी सफलता, जो मार्टिन एंडर के लिए धन्यवाद, लंबाई के एक तिहाई के बारे में है!
मुख्य विचार _
हमारे एकाकी प्रतीक के रूप में उपयोग करने के लिए है : इस तरह से हम अपनी स्ट्रिंग में नियमित अंकों का उपयोग कर सकते हैं, जब तक हम उन्हें _
जरूरत पड़ने पर वापस एस में बदल देते हैं : इससे हमें विभाजन पर कई बाइट्स बचाने और कई के सम्मिलन पर अंक।
यहाँ कोड है:
<empty line> |
# put a # before each digit and at the end of the string
{`\d Loop:|
$*_ Replace each digit with the corrisponding number of _
1`_ |
n_ Add an 'n' before the first _
__ |
1 Division by 2 (two _s become a 1)
_# |
#5 Wherever there is a remainder, add 5 to the next digit
}`5$ |
Remove the final 5 you get when you divide odd numbers
n Return the number of 'n's in the string
इसे ऑनलाइन आज़माएं!