सामान्यीकृत ग्रे कोड


13

इनपुट: एक सरणी मैं की कश्मीर धनात्मक पूर्णांक। पूर्णांक 100 और k gers 100 से बड़ा नहीं होगा ।

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

उदाहरण

  • अगर मैं की एक सरणी है कश्मीर वाले तो यह वास्तव में सब कुछ खत्म हो पुनरावृत्ति की समस्या है ग्रे कोड चौड़ाई बिट की कश्मीर , सिवाय इसके कि पहली और आखिरी तत्व एक ही चरण में पहुंच योग्य होने की जरूरत नहीं है,।

  • यदि I = [2,1]तब आउटपुट सरणियों का एक संभावित आदेश है(0,0),(0,1),(1,1),(1,0),(2,0),(2,1)

  • यदि I = [2,1,3]तब आउटपुट सरणियों का एक संभावित आदेश है (0,0,0),(0,0,1),(0,0,2),(0,0,3),(0,1,3),(0,1,2),(0,1,1),(0,1,0),(1,1,0),(1,1,1),(1,1,2),(1,1,3),(2,1,3),(2,1,2),(2,1,1),(2,1,0),...

यह एक कोड-गोल्फ चुनौती है, जो सबसे कम लंबाई की जीत के साथ स्रोत कोड के साथ प्रस्तुत है। गोल्फिंग भाषाओं में छोटे उत्तरों को अन्य भाषाओं में उत्तर पोस्ट करने से हतोत्साहित न करें। किसी भी भाषा में सबसे कम उत्तर के साथ आने की कोशिश करें।

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

आप यह मान सकते हैं कि 64 बिट पूर्णांक पर सभी अंकगणित निरंतर समय में किए जा सकते हैं क्योंकि उन्हें पढ़ने और आउटपुट करने के साथ-साथ असाइनमेंट और सरणियों में मूल्यों को देख और बदल सकते हैं।

प्रतिबंधित-जटिलता का एक परिणाम यह है कि कार्यक्रम से बाहर निकलने पर केवल समाधान स्वीकार्य नहीं हैं।


1
("जोड़ने या घटाना चाहिए 1" modulo का प्रदर्शन किया I_i+1? क्या आप 0 से पहुंच सकते हैं I_i?)
user202729

@ user202720 नहीं, मेरा इरादा नहीं था।
अनुश

जब सीमित nऔर kसीमित होते हैं तो जटिलता कैसे काम करती है ? यह मानते हुए कि वे थोड़ी चौड़ाई के साथ अनंत तक जाते हैं
l4m2

@ l4m2 जटिलता विश्लेषण के प्रयोजनों के लिए कश्मीर अनंत तक जाता है।
अनुष्का

@ अशुश तो बिट चौड़ाई कैसे जाती है?
l4m2

जवाबों:


4

पायथन 3 , 116 बाइट्स

def f(a):
 l=len(a);t=[0]*l;d=[1]*l
 while 1:
  i=0;yield t
  while not-1<t[i]+d[i]<=a[i]:d[i]*=-1;i+=1
  t[i]+=d[i]

इसे ऑनलाइन आज़माएं!

धन्यवाद स्मरक के लिए -1 बाइट।

जनरेटर समारोह। (मुझे याद दिलाने के लिए धन्यवाद डेनिस, मैं सुविधा को भूल गया) यदि आउटपुट को स्टडआउट में मुद्रित किया जाना चाहिए तो print(t,flush=1)9 अतिरिक्त बाइट्स के लिए उपयोग करें , या यदि पायथन को बुलाया जाता है -u, तो print(t)+1 बाइट्स के लिए पर्याप्त है।

त्रुटि के साथ रुकता है ( IndexError)। यदि आप इस फ़ंक्शन को कॉल करना चाहते हैं और फिर प्रोग्राम जारी रखें, तो आपको इसे पकड़ना होगा।


लूप के लिए आंतरिक कब तक चलता है?
अनुश

अधिक से अधिक @Anush kक्योंकि हर कदम पर कदम, iद्वारा बढ़ जाती है 1और बाद में kचरणों का i==kऔर d[i]एक त्रुटि का कारण बनता है।
user202729

यह बहुत अच्छा उपाय है।
अनुश

आप को बदल कर एक बाइट बचा सकता है not 0<=के साथ not-1<

1
के yield tबजाय आप का उपयोग कर सकते हैं print(t,flush=1)?
डेनिस

2

स्टेक्स , 22 बाइट्स

▒)∙ñ╚▀NK♀F☺S(A#P`░]╪Db

इसे चलाएं और डीबग करें

यहाँ एक बड़ा है कि स्पर्शोन्मुख व्यवहार प्रेस चलाने के लिए।

अनपैक्ड, अनगुल्फेड और टिप्पणी की गई, यह इस तरह दिखता है।

,           pop from input to main stack
W           run the rest of the program repeatedly until explicitly cancelled
  cJP       copy top of stack and print, delimited by spaces
            get the index to mutate
  i^            iteration index + 1
  x{^|%}I       repeatedly apply divmod using l[k]+1 from input
                get the index of the first value that returns modulus >0
  cU=C      if the result is -1 (no match), then terminate the program
            get the direction to mutate
  s             get the "div" part of the last div operation called "d"
  ^|1           -1 ^ (d+1)
  ~{+}&     increment element in array at the index by the calculated amount

इसको चलाओ


1
बिट जटिलता में मापने, पुनरावृत्ति सूचकांक O(k)बिट्स है, इसलिए विभाजन का kसमय लग सकता है O(k²)...
user202729

1

जावास्क्रिप्ट (Node.js) , 114 बाइट्स

a=>{b=a.map(_=>0);c=a.map(_=>1);for(i=0;a[i];b[i]+=c[i]||-1){console.log(b);for(i=0;b[i]==a[i]*c[i];i++)c[i]^=1;}}

इसे ऑनलाइन आज़माएं! Ungolfed:

function ggray(maxima) {
    var current = Array(maxima.length).fill(0);
    var flag = Array(maxima.length).fill(1);
    for (;;) {
        console.log(current);
        for (var i = 0; ; i++) {
            if (i == maxima.length) return;
            if (current[i] != maxima[i] * flag[i]) break;
            flag[i] = 1 - flag[i];
        }
        if (flag[i]) current[i]++;
        else current[i]--;
    }
}

1

कोटलिन , 181 178 बाइट्स

इसके लिए धन्यवाद: अनुष ने बताया कि मैंने 2 बाइट्स बचाने की चुनौती को गलत समझा। ovs ने 1 बाइट बचत बताई।

val p={a:List<Int>->var l=a.size
val v=Array(l,{0})
val i=Array(l,{1})
l-=1
o@while(0<1){println(v)
var p=l
while(v[p]+i[p]!in 0..a[p]){i[p]*=-1
p-=1
if(p<0)break@o}
v[p]+=i[p]}}

इसे ऑनलाइन आज़माएं!


1
2 1 3 के साथ प्रश्न में उदाहरण के लिए आपके कोड को इनपुट के रूप में 3 2 4 की आवश्यकता है।
अनुश

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