गणना करें कि एक क्यूब को कितने क्यूब्स में काटा जा सकता है


9

कुछ घन की कल्पना करें जिसे हम शेष टुकड़ों के बिना छोटे क्यूब्स में काट सकते हैं।

पता लगाएं कि एक क्यूब को कितने क्यूब्स में काटा जा सकता है।

उदाहरण के लिए, एक क्यूब को 8, 27 (स्पष्ट रूप से पूर्णांक की 3 शक्तियां) और 20 (19 छोटे क्यूब्स के साथ-साथ अन्य का आकार आठ गुना, छवि देखें) में काटा जा सकता है।
यहाँ देखें कुछ मदद: http://mathworld.wolfram.com/CubeDissection.html

यहां छवि विवरण दर्ज करें प्रोग्राम को इनपुट पूर्णांक n( 0 <= n <= 1 000) के रूप में लेना चाहिए और सभी संख्याओं को कम या बराबर प्रिंट करना चाहिए nताकि क्यूब को क्यूब्स की संख्या में काटा जा सके। मान लीजिए कि क्यूब को 1 क्यूब में काटा जा सकता है और 0 क्यूब्स में नहीं।

आप 64-बिट्स से अधिक आकार के केवल अभिन्न डेटा-प्रकार (कोई सरणियाँ, ऑब्जेक्ट आदि) का उपयोग कर सकते हैं। सबसे छोटा कोड जीतता है।


इसमें क्षमता है लेकिन आपको इसे और अधिक स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है। एक क्यूब को वास्तव में 20 क्यूब्स में काटा जा सकता है: इसे 27 क्यूब्स में काटने के बजाय 1/3 मूल में, इसे 19 क्यूब्स में काट दें 1/3 मूल और जो 8 गुना बड़ा है (साइड 2/3 मूल।) हां मुझे लगता है कि एक तस्वीर उपयोगी होगी
लेवल रिवर सेंट

यह एक बहुत ही मोटा घन है जिसे मैंने खींचा है, इसे बदलने के लिए स्वतंत्र महसूस करें। पहली नजर में यह मामूली लगता है, लेकिन मुझे लगता है कि 125-216 (5 ^ 3-6 ^ 3) के आसपास एक दिलचस्प रेंज है। यह बहुत बड़ी संख्या के लिए संभव है कि लगभग सभी डिवीजन संभव हैं।
स्तर नदी सेंट

हम देखेंगे कि क्या कुछ सीमा के बाद सभी नंबर संभव होंगे।
सोमनियम

3
जवाब वास्तव में यहाँ है: mathworld.wolfram.com/CubeDissection.html
लेवल रिवर सेंट

1
जब से हम अब एक काफी तुच्छ समाधान है, तो आप कोड गोल्फ को यह वापस बदलने के लिए या कुछ डाल करने के लिए चाहते हो सकता है वास्तव में प्रस्तुतियाँ पर कठिन प्रतिबंध।
मार्टिन एंडर

जवाबों:


1

गोल्फस्क्रिप्ट, 55 (या 43 42)

{.:^}{.47>20{.^>^@- 7%|!|}:/~1/38/39/{}{;}if^(}while;]`

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

विधि: दिए गए n से Iterate नीचे: यदि वर्तमान संख्या 47 या फॉर्म 1 + 7x, 20 + 7x, 38 + 7x, या 39 + 7x से अधिक है, जहां x = कोई भी गैर-नकारात्मक पूर्णांक है, तो इसे स्टैक पर रखें , अन्यथा इसे छोड़ दें।

संक्षिप्त उत्तर (43 बाइट्स):

{: / 6 +, {7 * / +}% |}: और;): एक, 48, ^ 1 & 20 & 38 & 39 & {एक <}, `

):a,48,^1{:/6+,{7*/+}%|}:&~20&38&39&{a<},`

विधि: समान, लेकिन कुछ सेट सिद्धांत ops के साथ। यह सरणियों का उपयोग करता है इसलिए यह तकनीकी रूप से स्वीकार्य उत्तर नहीं है। यहां परीक्षण किया जा सकता है । Btw: किसी ने कभी नहीं कहा कि उन्हें किसी विशेष क्रम में होना चाहिए;)


1

गणितज्ञ, 62 बाइट्स (या 52)

यह कठिन जवाब है, कुछ भी दिलचस्प नहीं है।

If[EvenQ@BitShiftRight[164015534735101,n],Print@n]~Do~{n,1000}

यह एक 52 बाइट्स लंबा है, लेकिन मेरे नियमों का उल्लंघन करता है - यह बड़े पूर्णांक (2 की शक्तियां) और सूचियों (रेंज) का उपयोग करता है।

Select[Range@1000,EvenQ@Floor[164015534735101/2^#]&]


0

सी, 72

i;main(){for(scanf("%d",&i);i;i--)0x952BD7AF7EFC>>i&1||printf("%d ",i);}

एक और हार्डकोड का जवाब। यह नीचे की ओर गिना जाता है (संख्याओं के आउटपुट के बारे में नियमों में कुछ भी नहीं है।) सिद्धांत रूप में इसे काम करना चाहिए। स्थिरांक में सभी संख्याओं के लिए 1 को थोड़ा सेट किया गया है जिसमें एक घन नहीं काटा जा सकता है, और संख्याओं के लिए 0 जो हो सकता है। सिद्धांत रूप में, स्थिरांक जब एक बहुत बड़ी संख्या द्वारा सही स्थानांतरित किया जाता है, तो बड़ी संख्या को हमेशा मुद्रित किया जाना चाहिए।

क्या दिलचस्प है कि व्यवहार में यह काम नहीं करता है। ऊपर का कोड कंपाइल करता है और GCC पर 65 तक ठीक चलता है। लेकिन उस नंबर के ऊपर कंपाइलर में एक बग (या "फीचर") होता है। यह व्याख्या 0x952BD7AF7EFC>>iकरता है 0x952BD7AF7EFC>>i%64। तो यह 71 (64 + 2 के माध्यम से 64 + 7) के माध्यम से संख्या (उदाहरण के लिए) 66 को छोड़ देता है।

विजुअल स्टूडियो में चलाने के लिए, थोड़ा अधिक बॉयलरप्लेट की आवश्यकता होती है (यह आपको निहित पूर्णांक और #includeएस जैसी चीजों से दूर नहीं होने देता है ।) एक बार प्रोग्राम के ऊपर और चलने के बाद, यह 257 तक ठीक है ... फिर यह 258 को छोड़ देता है। 263 (256 + 2 के माध्यम से 256 + 7।) तो यह ले रहा हैi%256.

मैं इसे बाद में ठीक कर सकता हूं (यदि मुझे परेशान किया जा सकता है।) नैतिक: संकलक मैनुअल आमतौर पर आपको बिटशिफ्ट्स पर ऊपरी सीमा नहीं बताते हैं। उसके लिए एक कारण है!


यह ठीक उसी सिद्धांत का उपयोग करता है जैसा कि मेरा उत्तर है)
सोमनियम

वास्तव में, हमारे पास मूल रूप से समान निरंतर (बिट शून्य अप्रयुक्त और बिट 1 नंबर 1 का प्रतिनिधित्व करने के साथ) सीआई में हेक्स में निरंतर निर्दिष्ट करके एक एकल बाइट बचाते हैं। मेरे पास 0बिट शून्य के लिए है, मैं इसे 1केस के लिए आपके जैसे i = 0 के लिए बदल सकता हूं । लेकिन यह कभी भी प्रदर्शित नहीं होता है।
लेवल रिवर सेंट

@steveverrill कृपया बताएं कि कैसे NUM>>iपरिवर्तन होता है NUM>>i%64। इसके अलावा अगर कोई 64-bitसंख्या 64 बार सही हो जाए तो उसे 5 से अधिक बार बदल देना चाहिएzero
mann mn

@ मानव वास्तव में शून्य हो जाना चाहिए। जैसा कि मैं कहता हूं, संकलक में एक बग है। NUM>>iहो जाता है NUM>>(i%64)या समकक्ष NUM>>(i&63)क्योंकि कंपाइलर iबिटशिफ्ट प्रदर्शन करने से पहले सबसे बाईं ओर के टुकड़े काट रहा है। जीसीसी केवल सबसे सही 6 बिट्स को मानता है। विजुअल स्टूडियो में एक ही बग है, लेकिन केवल सबसे सही 8 बिट्स को देखते हुए, यह थोड़ा बेहतर है NUM>>(i%256)। जिज्ञासा से बाहर मैं Ideone कोशिश करेंगे जब मैं काम से घर मिलता है।
लेवल रिवर सेंट

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