बाइट गिनती आईएसओ 8859-1 एन्कोडिंग मानती है।
+%`\B
¶$`:
1
इसे ऑनलाइन आज़माएं!
दूसरा तरीका:
+1`\B
:$`:
1
व्याख्या
यह शायद मेरे पुराने, कम गोल्फ वाले, संस्करण के आधार पर समझाने में आसान होगा और फिर दिखाऊंगा कि मैंने इसे कैसे छोटा किया। मैं इस तरह बाइनरी को दशमलव में परिवर्तित करता था:
^
,
+`,(.)
$`$1,
1
रेटिना में एक दशमलव संख्या बनाने का एकमात्र समझदार तरीका चीजों को गिनना है (क्योंकि रेटिना में कुछ विशेषताएं हैं जो इसे एक राशि का प्रतिनिधित्व करने वाले दशमलव संख्या को प्रिंट करने देती हैं)। तो वास्तव में एकमात्र संभव दृष्टिकोण बाइनरी को एकात्मक में बदलना है, और फिर एक अंक की संख्या की गणना करना है। अंतिम पंक्ति गिनती करती है, इसलिए पहले चार बाइनरी को एकात्मक में परिवर्तित करते हैं।
हम यह कैसे करे? सामान्य तौर पर, बिट्स की सूची से एक पूर्णांक में बदलने के लिए, हम परिणाम को इनिशियलाइज़ करते हैं 0
और फिर बिट्स से कम से कम महत्वपूर्ण से गुजरते हैं, हमारे पास पहले से मौजूद मूल्य को दोगुना करते हैं और वर्तमान बिट को जोड़ते हैं। उदाहरण के लिए, यदि बाइनरी नंबर है 1011
, तो हम वास्तव में गणना करेंगे:
(((0 * 2 + 1) * 2 + 0) * 2 + 1) * 2 + 1 = 11
^ ^ ^ ^
जहाँ मैंने स्पष्टता के लिए अलग-अलग बिट्स को चिह्नित किया है।
इसे unary में करने की ट्रिक) a है जो कि दोहरीकरण का अर्थ है संख्या और b को दोहराना) क्योंकि हम 1
अंत में s को गिन रहे हैं , हमें प्रक्रिया में 0
s और 1
s के बीच अंतर करने की आवश्यकता नहीं है। यह एक सेकंड में स्पष्ट हो जाएगा।
प्रोग्राम क्या करता है कि यह पहली बार एक अल्पविराम को मार्कर के रूप में जोड़ता है कि हमारे द्वारा पहले से संसाधित किए गए इनपुट का कितना हिस्सा है:
^
,
मार्कर के बाईं ओर, हमारे पास वह मूल्य होगा जो हम जमा कर रहे हैं (जो कि शून्य के यूनिरी प्रतिनिधित्व के लिए सही ढंग से आरंभीकृत है), और मूल्य का अधिकार प्रक्रिया के लिए अगला बिट होगा। अब हम एक लूप में निम्नलिखित प्रतिस्थापन लागू करते हैं:
,(.)
$`$1,
बस देखते हुए ,(.)
और $1,
, यह मार्कर को हर बार दाईं ओर ले जाता है। लेकिन हम यह भी सम्मिलित करते हैं $`
, जो मार्कर के सामने सब कुछ है, अर्थात वर्तमान मूल्य, जिसे हम दोगुना कर रहे हैं। इनपुट को संसाधित करते समय यहां व्यक्तिगत चरण दिए गए हैं 1011
, जहां मैंने $`
प्रत्येक पंक्ति के ऊपर डालने का परिणाम चिह्नित किया है (यह पहले चरण के लिए खाली है):
,1011
1,011
_
110,11
___
1101101,1
_______
110110111011011,
आप देखेंगे कि हमने हर चीज के साथ शून्य को बनाए रखा है और दोगुना कर दिया है, लेकिन जब से हम उन्हें अंत में अवहेलना कर रहे हैं, इससे कोई फर्क नहीं पड़ता कि हमने कितनी बार उन्हें दोगुना किया है, जब तक कि संख्या कितनी 1
है। सही बात। यदि आप उन्हें गिनते हैं, तो उनमें 11
से कुछ हैं, बस हमें जो चाहिए।
तो यह सवाल है कि यह कैसे 12 बाइट्स नीचे गोल्फ के लिए छोड़ देता है। 18-बाइट संस्करण का सबसे महंगा हिस्सा मार्कर का उपयोग करने के लिए है। उससे छुटकारा पाने का लक्ष्य है। हम वास्तव में हर बिट के उपसर्ग को दोगुना करना चाहते हैं, इसलिए पहला विचार यह हो सकता है:
.
$`$&
समस्या यह है कि ये प्रतिस्थापन एक साथ होते हैं, इसलिए पहले बिट प्रत्येक के लिए दोगुना नहीं होता है , लेकिन यह हर बार एक बार कॉपी हो जाता है। इनपुट के लिए 1011
हम (सम्मिलित अंकन $`
) प्राप्त करेंगे:
_ __ ___
1101011011
हमें अभी भी इनपुट को पुनरावर्ती रूप से संसाधित करने की आवश्यकता है ताकि पहले से दोगुना उपसर्ग दोबारा दूसरे और इसी तरह दोगुना हो जाए। एक विचार हर जगह मार्करों को सम्मिलित करना है और बार-बार उन्हें उपसर्ग के साथ बदलना है:
\B
,
+%`,
¶$`
प्रत्येक मार्कर को पहली बार उपसर्ग के साथ बदलने के बाद, हमें यह याद रखने की आवश्यकता है कि इनपुट की शुरुआत कहां हुई थी, इसलिए हम लाइनफीड भी डालते हैं और %
यह सुनिश्चित करने के लिए विकल्प का उपयोग करते हैं कि अगला$`
केवल निकटतम लाइनफीड की चीजों को उठाता है।
यह काम करता है, लेकिन यह अभी भी बहुत लंबा है (16 बाइट्स जब 1
अंत में गणना करता है)। हम चीजों को कैसे घुमाते हैं? वे स्थान जहाँ हम मार्करों को सम्मिलित करना चाहते हैं, उनकी पहचान \B
(दो अंकों के बीच की स्थिति) द्वारा की जाती है। हम केवल उन पदों में उपसर्ग क्यों नहीं डालते हैं? यह लगभग काम करता है, लेकिन अंतर यह है कि पिछले समाधान में, हमने वास्तव में प्रत्येक प्रतिस्थापन में एक मार्कर को हटा दिया था, और प्रक्रिया को सफल बनाने के लिए महत्वपूर्ण है। हालांकि, \B
चरित्र नहीं हैं , लेकिन सिर्फ स्थिति है, इसलिए कुछ भी नहीं हटाया जाता है। हम हालांकि रोक सकते हैं\B
इस स्थान पर एक गैर-अंक वर्ण डालने के बजाय मिलान से । यह गैर-शब्द सीमा को शब्द सीमा में बदल देता है, जो पहले वर्ण वर्ण को हटाने के बराबर है। और यही 12-बाइट समाधान करता है:
+%`\B
¶$`:
पूर्णता के लिए, यहां प्रोसेसिंग के अलग-अलग चरण हैं 1011
, प्रत्येक चरण के बाद एक खाली लाइन के साथ:
1
1:0
10:1
101:1
1
1:0
1
1:0:1
1
1:0
10:1:1
1
1:0
1
1:0:1
1
1:0
1
1:0:1:1
फिर, आप पाएंगे कि अंतिम परिणाम में ठीक 11 1
s शामिल हैं ।
पाठक के लिए एक अभ्यास के रूप में, आप देख सकते हैं कि कैसे यह सामान्य रूप से अन्य आधारों (आधार में कुछ अतिरिक्त बाइट्स प्रति वृद्धि के लिए) के लिए काफी आसानी से होता है?