बिट्स के एक चर संख्या के लिए पूर्णांक से विशेषण मानचित्रण


11

बिट्स की एक चर संख्या 0 या अधिक बिट्स की एक सरणी है। तो [0, 1]बिट्स की एक चर संख्या है, लेकिन ऐसा है []

एक फ़ंक्शन या प्रोग्राम लिखें, जो एक nonnegative पूर्णांक दिया गया बिट्स की एक चर संख्या देता है जैसे कि प्रत्येक पूर्णांक में एक सरणी के साथ एक-से-एक (विशेषण) मैपिंग होती है।

इस तरह के मैपिंग की एक अनंत राशि है, आप कृपया निर्माण के लिए स्वतंत्र हैं, लेकिन यह एक-से-एक होना चाहिए। आपके मानचित्रण को मनमाने ढंग से आकार पूर्णांक के लिए वैचारिक रूप से एक-से-एक होना चाहिए , लेकिन यह ठीक है अगर आपका कार्यान्वयन आपकी पसंदीदा भाषा (जैसे सी int) में संख्यात्मक प्रकार की सीमाओं के कारण बड़े पूर्णांकों के लिए विफल हो जाता है ।

एक-से-एक मैपिंग नहीं होने के उदाहरण के रूप में , बस पूर्णांक के द्विआधारी अंकों को सूचीबद्ध कर रहा है। ऐसी प्रणाली में 5 बन जाता है [1, 0, 1](या 0b101), लेकिन यह एक-से-एक नहीं है, क्योंकि 0b0101या [0, 1, 0, 1]इसका मतलब भी 5 है।

यह स्पष्ट रूप से स्पष्ट होना चाहिए कि एक मैपिंग एक-से-एक नहीं है यदि यह एक पूर्णांक को छोड़ देता है (जैसे कि यह 5 के लिए काम नहीं करता है), लेकिन मैं यह स्पष्ट करना चाहूंगा कि एक चर बिट सरणी को छोड़ना भी एक नहीं है -एक को। आपको हर संभव चर बिट सरणी सहित मैप करना होगा []


बाइट्स में सबसे छोटा कोड जीतता है।


क्या हम 0 और 1 की स्ट्रिंग लौटा सकते हैं?
xnor

@ xnor हां, 0 और 1 s की एक स्ट्रिंग ठीक है।
orlp

जवाबों:



10

पायथन, 20 बाइट्स

lambda n:bin(~n)[4:]

परीक्षा:

>> [bin(~n)[4:] for n in range(16)]
['', '0', '1', '00', '01', '10', '11', '000', '001', '010', '011', '100', '101', '110', '111', '0000']

कर lambda n:bin(n+1)[3:]इनपुट बढ़ाता है, फिर हटाए गए पहले प्रतीक के साथ द्विआधारी प्रतिनिधित्व लेता है ( [3:]क्योंकि उपसर्ग 0bदो चार वर्ण है)। चूंकि बाइनरी में कोई भी सकारात्मक संख्या 1 से शुरू होती है, यह विशिष्ट रूप से एक बाइनरी प्रतिनिधित्व देता है।

एक बाइट को ~nनकार को प्राप्त करने के लिए बिट पूरक का उपयोग करके बचाया जाता है -(n+1), और एक और प्रतीक को काटकर नकारात्मक चिह्न को हटा दिया जाता है।


1
उलटा: lambda s:int('1'+s,2)-1
orlp

2

अजगर, 5 बाइट्स

t.BhQ

बस Pyth में xnor के जवाब का अनुवाद ।

Qeval () 'd' इनपुट है (), hइसे बढ़ाता है, .Bइसे बाइनरी स्ट्रिंग में परिवर्तित करता है, और t"टेल" (जो कि पहले वर्ण को छोड़कर सब कुछ है) लेता है।


2

हास्केल, 41 38 30 29 बाइट्स

l="":[b:x|x<-l,b<-"01"]
(l!!)

प्रयोग उदाहरण: (l!!) 4-> "10"

पहले तत्व के रूप में खाली सूची के साथ शुरू, सूची के माध्यम से आलसी होकर चलना और वर्तमान तत्व को उसके सामने 0और उसके साथ जोड़ना 1

संपादित करें: @xnor ने 3 11 बाइट्स बचाए । धन्यवाद!


दिलचस्प विचार है। पुनरावृत्त फ़ंक्शन को लिखा जा सकता है[(0:),(1:)]<*>
xnor

@xnor: ओह, आपने मुझे <*>पहले की चाल दिखाई , लेकिन मैं इसके बारे में भूल गया। एक बार फिर धन्यवाद!
nimi

ऊह, आप पूरी सूची को आलसी से परिभाषित कर सकते हैं l=[]:[b:x|x<-l,b<-[0,1]];(l!!):।
22

@ एक्सनॉर: बढ़िया! आपका बहुत बहुत धन्यवाद! ओह, स्ट्रिंग्स पर स्विच करना एक और बाइट बचाता है।
nimi

मुझे लगता है कि [b:x|x<-l,b<-"01"]किसी उत्पाद या कॉनकट-मैप के साथ व्यक्त करने के लिए कुछ छोटे तरीके होने चाहिए , लेकिन उत्पाद की अभिव्यक्ति (:)<$>[0,1]<*>lगलत क्रम में हो जाती है, पहले 0 से सब कुछ के लिए, कभी भी 1 से नहीं मिल रहा है क्योंकि सूची अनंत है। आपके पास कोई विचार है?
xnor

1

जावास्क्रिप्ट (ईएस 6), 29 बाइट्स

x=>(~x).toString(2).slice(2)

एक ही विचार xnor के रूप में।

f=x=>(~x).toString(2).slice(2);
[...Array(100)].map((v,x)=>A.textContent+=x + ': ' + f(x) + '\n')
<pre id=A></pre>


यह आसानी से codegolf.stackexchange.com/q/78990 के
नील


1

हास्केल, 35 बाइट्स

h 1=[]
h n=mod n 2:h(div n 2)
h.(+1)

हास्केल में बाइनरी बिल्ट-इन नहीं है, इसलिए (उलट) रूपांतरण मैन्युअल रूप से किया जाता है। प्रारंभिक 1 को हटाने के लिए, बेस केस है1 खाली सूची बदल दिया गया है।

संपादित करें: +1इसके बजाय संयुग्मित करके एक बाइट को बचाया ।

h 0=[]
h m=1-mod m 2:h(div(m+1)2-1)

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