बड़ी संख्या का प्रतिनिधित्व करने के लिए सामान्य सुझाव


21

कभी-कभी, गोल्फ करते समय, किसी को अपने कोड में बड़ी संख्या का प्रतिनिधित्व करने की आवश्यकता होती है। के रूप में उन्हें लिखना काफी बाइट-काउंट बढ़ा सकता है।

सामान्य रूप से कोड में लंबी संख्या का प्रतिनिधित्व करने के लिए आपके पास क्या सामान्य 1 सुझाव हैं?

कृपया प्रति उत्तर एक टिप पोस्ट करें।


1 के साथ सामान्य , मैं सुझाव दिए गए है कि एक ही भाषा की तुलना में अधिक करने के लिए लागू किया जा सकता मतलब है। भाषा-विशिष्ट युक्तियों के लिए, उनके संबंधित धागे में पोस्ट करें।




मैंने देखा कि कोई व्यक्ति इस प्रश्न को गलत समझ रहा है - शायद शीर्षक को यह कहना चाहिए कि यह गोल्फ के बारे में है।
अर्जन जोहान्सन

जवाबों:


15

विशेष संख्या के लिए बाहर देखो

कुछ भाषाओं में वर्ग के लिए अंतर्निहित कार्य, आधार 2 के साथ प्रतिरूपण , n -th प्रधानमंत्री, भाज्य या अन्य प्रक्रियाएं हैं जो बड़ी संख्या उत्पन्न कर सकती हैं। जाँच करें कि क्या आप संख्या उन श्रेणियों में से किसी में गिर जाते हैं

और अगर ऐसा नहीं होता है, तो ऐसा हो सकता है कि एक बड़ी संख्या जो आपके उद्देश्यों के लिए फिट होगी और इसके बजाय इसका उपयोग किया जा सकता है।


4
यहां तक ​​कि अगर आप जो नंबर चाहते हैं वह एक बिलियन फ़ंक्शन के साथ उत्पन्न नहीं किया जा सकता है, तो एक संख्या उत्पन्न करना संभव हो सकता है जिसे आप अपने नंबर पर आने के लिए एक साधारण गणना के आधार के रूप में उपयोग कर सकते हैं, जबकि अभी भी इसे लिखने से बाइट्स बचा रहा है।
झबरा

7
+1 "बड़ी संख्या" के लिए - यदि 1.01e6पुनरावृत्तियों के लिए पर्याप्त है, तो 1e7चल रहे समय की कीमत पर 3 बाइट्स बचाता है।
क्रिस एच।

13

बिटवाइज़ बुलियन ऑपरेटरों का उपयोग करें

कुछ भाषाओं में बिटवाइज़ और OR, XOR और कभी-कभी नहीं होते हैं।

एक्सप्रेशन या लेफ्ट शिफ्ट के परिणाम के रूप में एक विशिष्ट बड़ी संख्या को एक बिटवाइज़ के संयोजन के रूप में व्यक्त करना और दूसरी संख्या आपको आपकी आवश्यक संख्या को ठीक करने के लिए प्राप्त कर सकती है। यह आमतौर पर केवल इसके लायक है अगर संख्या काफी बड़ी हो जाती है।

उदाहरण के लिए, 214748372210 बाइट्स है, लेकिन 2<<30^74(74 के साथ 2 ^ 31 बिटवाइस-XORed) केवल 8 है।


3
शिफ्ट ऑपरेटर को घातांक से बदला जा सकता है, अगर भाषा में वह ऑपरेटर हो (जैसे bc)। और XOR से अधिक कभी नहीं उपयोगी है +और -: इस मामले में, XOR और एक ही परिणाम दे जोड़ने के लिए, लेकिन सभी मामलों में कुछ पूर्णांक जो जोड़ा या एक पूर्णांक के साथ XOR के रूप में एक ही परिणाम का उत्पादन करने घटाया जा सकता है, और योज्य है कोई बड़ा और कभी छोटा।
रिसी

3
@rici सच है अगर सभी पूर्णांकों को सरल दशमलव के रूप में लिखा जाता है, लेकिन यह संभव है कि पूर्णांक का उपयोग xor के साथ किया जाए, इसे उन तरीकों से छोटा किया जा सकता है जिनमें पूर्णांक को प्लस या माइनस के साथ उपयोग किया जा सकता है: कुछ ऐसा सोचें 1e9^2e9
HVD

2
@rici आप एक्सोर के 9<<49^7<<19बजाय जोड़ का उपयोग कैसे व्यक्त करेंगे ?
L3viathan 18

2
@rici नहीं, मेरा मतलब है कि मैंने क्या लिखा है। यह 1286561280जावास्क्रिप्ट और पर्ल (और शायद अन्य भाषाओं में) का मूल्यांकन करता है , और यह समान मूल्य का उपयोग करके +या उस मूल्य का उत्पादन करने के लिए एक छोटी अभिव्यक्ति है -
hvd

@hvd: ठीक है, बिंदु लिया गया।
रिसी

11

दोहराव संख्या के लिए स्ट्रिंग्स का उपयोग करें

ऐसे नंबरों के लिए जो बहुत ही दोहराव वाले होते हैं, आप स्ट्रिंग्स का इस्तेमाल कर सकते हैं और उन्हें इंटेगर में डाल सकते हैं। उदाहरण के लिए, जावास्क्रिप्ट में

+"1".repeat(100) // returns 100 1s (saves 84 bytes!)

2
या आप 1e100/9इस मामले में एक बहुत बड़े अंश का उपयोग कर सकते हैं ।
ETHproductions

11

वैज्ञानिक संकेतन का उपयोग करें

वैज्ञानिक अंकन लंबी संख्या के मामले में बाइट्स को बचा सकते हैं। उदाहरण के लिए:

3564e-8 // returns 0.00003564 (saves 3 bytes!)

3
सिर्फ 3564e-8उस मामले में उपयोग क्यों नहीं ?
जॉय

@ जोय हाँ, बिल्कुल! धन्यवाद! :)
अर्जुन

दी गई, आप आमतौर पर अन्य संख्या को लिख सकते हैं .00003564, जो कि एक बाइट से भी छोटा है।
जॉय

@Joey हर भाषा नहीं करती है, इसलिए, मैं इसे संपादित नहीं करूंगा।
अर्जुन

क्या यह जानबूझकर है कि 3564 (बाएं) 354 (दाएं) बन जाता है या यह टाइपो है?
एरिक

10

इसके बजाय उपयोग करने के लिए दूसरे नंबर की तलाश करें

यह एक गैर-उत्तर की तरह लग सकता है, लेकिन यह हमेशा स्पष्ट नहीं होता है कि बड़ी संख्या की गणना छोटे कोड द्वारा की जा सकती है। एक उदाहरण मुझे याद है कि आउटपुट एक स्ट्रिंग की गोगोल प्रतियां है , जहां स्पष्ट उत्तरों के लिए 10 100 की गणना की आवश्यकता होती है । जैसा कि यह पता चला है, 10 100 में से किसी भी एक की गणना करना समान रूप से सही होता है, लेकिन कुछ भाषाओं में, कम जवाब। डेनिस का जवाब वहाँ 100 100 का उपयोग करता है , मेरा अपना 250 255 का उपयोग करता है ।


4
इसका एक अन्य उदाहरण CJam है जहां आप वर्तमान टाइमस्टैम्प प्राप्त कर सकते हैं esयदि आपको केवल एक बड़ी संख्या की आवश्यकता है, लेकिन इसके मूल्य (या यह हमेशा समान है) के बारे में परवाह नहीं करें।
मार्टिन एंडर

10

आधार संपीड़न

आधार विघटन कोड काफी जटिल हो सकता है, लेकिन अगर आपके पास वास्तव में बहुत बड़ी संख्या है, तो इसे 10 से अधिक आधार में संपीड़ित करने में मदद मिल सकती है।

यह भी मदद करता है कि कुछ भाषाओं में, आधार संपीड़न कोड बहुत सरल है। उदाहरण के लिए, PHP के पास base64_decode(_), Python है int(_,36), JavaScript है parseInt(_,36), और कई गोल्फिंग भाषाओं में आधार विघटन निर्मित है। उदाहरण के लिए, CJam में:

"+ÜTbô±"256b

इसमें एक अप्राप्य है। इसे ऑनलाइन आज़माएं!

यह प्रदान करता है:

12345678987654321

9

बड़े दोहराव वाले नंबरों के लिए घातीय अंशों का उपयोग करें

मान लीजिए कि आप 100 1 से बनी संख्या उत्पन्न करना चाहते थे। आप उपयोग कर सकते हैं int("1"*100), +"1".repeat(100)आदि। लेकिन आप इस तथ्य का भी लाभ उठा सकते हैं कि यह बहुत करीब है

1e100/9

यह बहुत ही दोहराव वाली संख्याओं के लिए सबसे अच्छा काम करता है, जैसे कि एक अंक का बना हुआ। एक युगल दोहराया अंक भी काफी अच्छी तरह से काम करता है:

12e100/99  // Generates 121212121212... (100 digits)

कभी-कभी आपको कुछ अन्य अजीब पैटर्न मिलेंगे, जो इस पद्धति में भी काफी प्रतिनिधित्व कर सकते हैं। यदि आप की जरूरत है int("123456790"*11), उदाहरण के लिए:

1e100/81

हालांकि सावधान रहें: इस तरह की संख्याओं के int("1234567890"*10)पास इतना आसान प्रतिनिधित्व नहीं है।


9

2 के घातांक के लिए बिटवाइस लेफ्ट शिफ्ट का उपयोग करें

हालांकि, कई भाषाएं हैं जो एक्सप्रेशन के लिए ऑपरेटर का समर्थन करती हैं, कुछ नहीं। और जो नहीं करते हैं, उन्हें आमतौर पर कॉलिंग फ़ंक्शंस (या क्लास / ऑब्जेक्ट मेथड) की आवश्यकता होती है, जिसमें कुछ बाइट्स खर्च हो सकते हैं।

जब आप सत्ता में 2 को बढ़ाने के लिए की जरूरत है लेकिन आप कुछ बाइट्स बचा सकते हैं n बिटवाइस वाम शिफ्ट ऑपरेटर का उपयोग करके <<के रूप में 1<<n। ध्यान दें कि यह केवल आपको बाइट्स को बचाएगा यदि n 17 से अधिक या इसके बराबर है। हालांकि, यह हमेशा बाइट्स को बचाएगा यदि n गतिशील है। कुछ उदाहरण:

1<<2 // returns 4 (3 bytes more :( )
1<<3 // returns 8 (3 bytes more :( )
1<<6 // returns 64 (2 bytes more :( )
1<<14 // returns 16384 (no bytes saved)
1<<17 // returns 131072 (saves 1 byte!)
1<<18 // returns 262114 (saves 1 byte!)

4
ध्यान दें कि आप 1. के बजाय अन्य मूल्यों का उपयोग कर सकते 8<<9 // 4096करने के लिए तो हम प्राप्त कर सकते हैं 99<<616 बाइट्स में है, जो बराबर 6,917,529,027,641,081,85613 बाइट्स की बचत!
ड्रेको 18

@ Draco18s हाँ, और यह यहाँ कवर किया गया है
अर्जुन

यह एक और बूलियन बिटवाइज़ ऑपरेटरों को कवर करता है। हां, इसमें बिटशिफ्टिंग भी है, लेकिन यह XOR में दो बड़ी संख्याओं का उपयोग करने की बात कर रहा है और तीसरा, विशिष्ट नंबर प्राप्त कर सकता है।
Draco18s

7

चीनी अवशेष प्रमेय

यदि मनमाने ढंग से बड़े पूर्णांक अक्सर दिखाई देते हैं, या लक्ष्य प्रोग्रामिंग भाषा में बड़ा पूर्णांक प्रतिनिधित्व बहुत अधिक बाइट का खर्च करता है, तो आप चाइनीज़ रेमिनेडर प्रमेय का उपयोग करने पर विचार कर सकते हैं।

कुछ जोड़ो में चुनें अपेक्षाकृत प्रधानमंत्री पूर्णांक m मैं > = 2, और आप एलसीएम 0 से एक बड़ी संख्या को व्यक्त कर सकते (एम 1 , एम 2 , ..., m मैं ) -1

उदाहरण के लिए, मैं 2, 3, 5, 11, 79, 83, 89, 97 का चयन करता हूं, फिर मैं 18680171730 से कम की संख्या को विशिष्ट रूप से व्यक्त कर सकता हूं। 10000000000 (1e10) को 0,1,0,1,38,59,50,49 (1e10 मॉड 2, 3 ..., 97) के रूप में व्यक्त किया जा सकता है, जिसे विशेष बिग इंटेगर वर्ग / संरचना के रूप में व्यक्त नहीं किया जा सकता है, जो बचा सकता है कुछ प्रोग्रामिंग भाषा में कुछ बाइट्स।

इस प्रतिनिधित्व का उपयोग करके जोड़ और घटाव सीधे किया जा सकता है। उदाहरण:

(0,1,0,1,38,59,50,49)+(0,2,0,6,23,20,16,53) = 1e10 + 5000 
                                            = (0+0 mod 2, 1+2 mod 3, 0+0 mod 5, 1+6 mod 11, 38+23 mod 79, 59+20 mod 83, 50+16 mod 89, 49+53 mod 97)

1
उस पर विस्तार से ध्यान दें?
स्काइड्सडेव

@ माय्यूब मैंने कुछ स्पष्टीकरण जोड़ा है, लेकिन मुझे संदेह है कि यह ज्यादातर मामलों में बेकार है।
अरिया एक्स

1
यह "शेष प्रमेय" है।
अर्जन जोहान्सन

6

स्ट्रिंग पैडिंग (जहां संभव हो) का उपयोग करें

यदि किसी बड़ी संख्या में शुरुआत या अंत में एक दोहराव वाला अंक शामिल है, तो आप अपनी संख्या के एक स्ट्रिंग का निर्माण करने के लिए अपनी भाषा के पैडिंग तरीकों का उपयोग करके बाइट्स को बचाने में सक्षम हो सकते हैं, जिसे आप तब एक में बदल सकते हैं पूर्णांक।


उदाहरण

1111111111111111111111112जावास्क्रिप्ट में संख्या (25 बाइट्स) उत्पन्न करने के लिए (ईएस 8):

+"2".padStart(25,1) // 19 bytes

3

एक्सपोर्टर्स का इस्तेमाल करें

यदि आपकी भाषा में एक घातांक ऑपरेटर है, तो आप इसे उत्पन्न करने में सक्षम हो सकते हैं, यदि आप जो संख्या चाहते हैं, तो कम से कम एक संख्या आप एक साधारण गणना कर सकते हैं या अपने नंबर पर आने के लिए 2 पर। ऑपरेटर के बिना भी, आप अभी भी एक अंतर्निहित फ़ंक्शन या विधि के साथ बाइट्स को बचाने में सक्षम हो सकते हैं।

उदाहरण

जावास्क्रिप्ट में अधिकतम सुरक्षित पूर्णांक है 9007199254740991जो 16 अंक लंबा है,। ES7 में, इसकी गणना निम्नलिखित 7 बाइट्स के साथ की जा सकती है:

2**53-1

ES6 और इससे पहले के समतुल्य, जबकि इस उदाहरण में पूर्णांक के समान लंबाई, प्रदर्शित करता है कि अधिक वर्बोज़ विधि का उपयोग करना आवश्यक नहीं है कि आपको किसी भी बाइट का खर्च करना पड़े।

Math.pow(2,53)-1

हालांकि, उपरोक्त, यदि कम हो सकता है , उदाहरण के लिए, आप पहले से ही Mathअपने कोड में कहीं भी एक ही चरित्र के लिए aliased है।


2

फ्लोट के स्थान पर भिन्न का उपयोग करें

उदाहरण: 1./3के स्थान पर0.333333333

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.