बेस-इन बेस रूपांतरण के बिना बेस 10 से बेस 2 में कनवर्ट करें


16

पृष्ठभूमि :

आपको आधार संख्या रूपांतरण कार्यों का उपयोग किए बिना आधार 10 संख्याओं को आधार 2 में बदलने का काम दिया गया है। आप किसी भी आयातित पुस्तकालयों का उपयोग नहीं कर सकते हैं।

समस्या :

बेस 10 (दशमलव) से बेस 2 (बाइनरी) तक इनपुट स्ट्रिंग में कनवर्ट करें। आप किसी भी आधार आधार रूपांतरण कोड / कार्यों / विधियों, या आयातित पुस्तकालयों का उपयोग नहीं कर सकते हैं। चूंकि यह , बाइट्स में सबसे छोटा जवाब जीत जाएगा।

इनपुट -32768 से 32767 तक कुछ भी होगा (अपने कोड में साइन बाइट हैंडलिंग शामिल करें)


3
प्रश्न: "साइन बाइट हैंडलिंग" का क्या अर्थ है - क्या मैं ऋणात्मक संख्या के लिए "-xxxx" का उत्पादन करूंगा? फिर हम में से कुछ गलत हैं, incl। मुझे, जैसा कि मैं -1 के लिए "11 ... 11" आउटपुट करता हूं (अहस्ताक्षरित उर्फ)
blabla999

साइन बाइट हैंडलिंग - यदि वे नकारात्मक हैं तो हस्ताक्षर किए गए चर का MSB नियंत्रित करता है
TheDoctor

1
यकीन है, लेकिन क्या मुझे <> साइन के रूप में उन्हें प्रिंट करना है '-' इसके बाद परिमाण?
blabla999

@ blabla999 - नहीं आप नहीं
TheDoctor

3
the MSB of signed variables controls if they are negative- यह संकेत बिट की तरह लगता है, हालांकि जैसा कि सीमा से -32768..32767पता चलता है, आप 2 के पूरक चाहते हैं। तो आप क्या चाहते हैं? ..
mniip

जवाबों:


4

गोल्फस्क्रिप्ट - 17 बाइट्स

~{.1&\2/}16*;]-1%

बिल्ट-इन की तुलना में बहुत अधिक क्रिया नहीं है ~2base


1
मैं गोल्फस्क्रिप्ट नहीं जानता, लेकिन कुछ नमूने मुझे इस निष्कर्ष पर ~
पहुंचाते हैं

@ace क्योंकि प्रारंभिक इनपुट एक स्ट्रिंग है "37", उदाहरण के लिए, ऑपरेशन "37" & 1(इनफ़िक्स में) एक सेट-वार ऑपरेशन है। ~मोर्चे पर एक पूर्णांक के लिए इनपुट बदल देता है।
प्रिमो

मैंने अपना परीक्षण यहाँ golfscript.apphb.com/ पर किया था। क्या इसका मतलब यह है कि यह दुभाषिया गलत है? (क्षमा करें, मैं वास्तव में गोल्फ के बारे में कुछ नहीं जानता)
user12205

2
दुभाषिया सही है; क्योंकि आपने 10स्टैक पर पूर्णांक मान धकेल दिया है , इसलिए इसका मूल्यांकन करना आवश्यक नहीं है। हालांकि, जब से पढ़ा जाता है stdin, तो इनपुट एक स्ट्रिंग ( यहां परीक्षण ) होगा। समस्या का विवरण भी स्पष्ट रूप से बताता है कि इनपुट एक स्ट्रिंग है।
प्रिमो

12

जावास्क्रिप्ट, ४६

for(x=prompt(o='');x;x>>>=1)o=(x&1)+o;alert(o)

योग्य, मुझे यह भी नहीं पता था कि एक 4-चरित्र ऑपरेटर ( >>>=) मौजूद था! +1 (इसके अलावा, अगर आप इसे कंसोल में चलाने के लिए, आप पिछले 9 पात्रों बचा सकता है।)
दरवाज़े

1
यह 4-वर्ण नहीं है, यह दो ऑपरेटर हैं: >>> 0-फिलिंग बिटवाइज़ राइट शिफ्ट है, इसके बाद एक असाइनमेंट है। कोशिश करें: x=8; x>>>=1; x;और x=8; x>>>1; x;- पहले मामले में, एक्स का मूल्य बदल गया है; दूसरे में, यह नहीं है।
ग्राहम चार्ल्स

3
@GrahamCharles >>>=एक एकल ऑपरेटर है
प्रिमो

खैर, वह देखो! धन्यवाद, @primo ... आप हर दिन कुछ सीखते हैं!
ग्राहम चार्ल्स

2
@ComFreek अंकों के क्रम को उलट देगा
कॉपी

4

ब्रेनफ * सीके, 98 77

जाहिर है यह जीतने के उद्देश्य के लिए नहीं है, लेकिन अगर यह एक brainfk समाधान नहीं है तो एक प्रतियोगिता क्या होगी

++++[>++++<-]>>,<[->>++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]++++++[->++++++++<]>.[-]>[-<<<+>>>]<<<<]

चूंकि ब्रेनफेक केवल 8 बिट पूर्णांक और कोई नकारात्मक नहीं संभाल सकता है, मुझे लगता है कि यह पूरी तरह से नियमों का पालन नहीं करता है, लेकिन हे मैं इसे जीतने के लिए कभी नहीं था।

यह वास्तव में 16-बिट इनपुट के लिए काम करता है यदि आपका दुभाषिया समर्थन करता है

मैं भी इसे ascii मूल्यों में उत्पादन करने के लिए मिला है

यहाँ एनोटेट कोड है:

++[>++++<-]                       preload 8 onto cell 1
>>,<                                input into cell 2
[-                                  iterate over cell 1
    >>++<                               put 2 in cell 3
    [->-[>+>>]>[+[-<+>]>+>>]<<<<<]      division algorithm: converts {n d} into {0 d_minus_n%d n%d n/d}
    >[-]++++++[->++++++++<]>           clears cell 4 and puts 48(ascii of 0) into cell 5
    .[-]                                output n%2 and clear it (the bit)
    >[-<<<+>>>]                         bring n/2 into cell 2 (to be used for division in next iteration)
<<<<]                               end iterate

कम एल्गोरिथ्म (77):

+>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+>+>+>+>+>+>+<<<<<<<<]>[.>]

यह केवल 8 बिट पूर्णांक संभाल सकता है।

एल्गोरिथ्म एक बाइनरी काउंटर का उपयोग करके काम करता है जो वास्तव में बहुत छोटा है (एक वेतन वृद्धि है >[->]++[-<+]-<-जो तब बिट्स को बाहर करता है। मुद्दा यह है कि सभी बिट्स को प्रिंट करना मुश्किल है

अंतिम एल्गोरिथ्म को बाइट्स की कीमत पर किसी भी संख्या में बिट्स फिट करने के लिए अनुकूलित किया जा सकता है। एन बिट पूर्णांक से निपटने में सक्षम होने के लिए, इसे एनकोड करने के लिए 53 + 3 * एन बाइट्स की आवश्यकता होती है।

उदाहरण:

(1 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+<]>[.>]
(2 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+<<]>[.>]
(3 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+>+<<<]>[.>]
etc

3

अनिवार्य एपीएल उत्तर - 21 22

"01"[1+2|⌊⎕÷2⋆⊖0,⍳15]

उदाहरण:

      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: 0
0000000000000000
      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: 13
0000000000001101
      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: 9999
0010011100001111
      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: -3
1111111111111101
      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: 32767
0111111111111111

आप ⎕IO←0स्ट्रिंग के बजाय लगभग 50% का उपयोग करके और बिट्स के एक सरणी को वापस करके कम कर सकते हैं 2|⌊⎕÷2*⊖⍳16:।
अडंम

3

ट्यूरिंग मशीन कोड, 272 बाइट्स

हमेशा की तरह, मैं यहाँ परिभाषित नियम सारणी का उपयोग कर रहा हूँ आप इसे उस साइट पर या वैकल्पिक रूप से इस जावा कार्यान्वयन का उपयोग करके परीक्षण कर सकते हैं

बहुत सारे कोड मेरे दशमलव-से-हेक्स कनवर्टर से कॉपी किए गए हैं।

0 * * l B
B * * l C
C * 0 r D
D * * r E
E * * r A
A _ * l 1
A * * r *
1 0 9 l 1
1 1 0 l 2
1 2 1 l 2
1 3 2 l 2
1 4 3 l 2
1 5 4 l 2
1 6 5 l 2
1 7 6 l 2
1 8 7 l 2
1 9 8 l 2
1 _ * r Y
Y * * * X
X * _ r X
X _ _ * halt
2 * * l 2
2 _ _ l 3
3 * 1 r 4
3 1 0 l 3
4 * * r 4
4 _ _ r A

आधार 2 में 0 से गिनती करते हुए बेस 10 में इनपुट से नीचे गिना जाता है। शून्य पर डीग्रीमेंट करने पर, यह इनपुट ब्लॉक मिटा देता है और समाप्त हो जाता है।



2

पर्ल, 44

यह मेरा अब तक का पहला पर्ल प्रोग्राम है, इसलिए कृपया मुझे क्षमा करें, अगर इसे आसानी से आगे बढ़ाया जा सके। संपादित करें: मेरे उत्तर से 7 वर्ण दूर करने के लिए @primo धन्यवाद।

$x=<>;do{@s=($x&1,@s)}while($x>>=1);print@s

$x=<>;do{push@s,$x&1}while($x>>=1);print reverse@s

तर्क अनिवार्य रूप से मेरे पिछले सी समाधान के समान है।

इसके अलावा, 64 बिट्स का उपयोग करता है।


1
आप reverseसरणी को पीछे की ओर बनाकर बचा सकते हैं @s=($x&1,@s):।
Primo

1
अब जब प्रतियोगिता समाप्त हो गई है, तो मैंने पाया कि 34: था $\=$_%2 .$\while$_=$_>>1||<>;print। या, यदि कमांड लाइन विकल्प एक-एक बाइट की गिनती करते हैं, तो 27: 1while$\=$_%2 .$\,$_>>=1}{का उपयोग कर -p
प्राइमो

2

जावास्क्रिप्ट - ५६ ४as और ३६ २ 48 अक्षर

  • नकारात्मक संख्याओं के साथ काम नहीं करता है।

8 पात्रों के शेविंग के लिए @ ब्लेंडर का धन्यवाद।

यह फ़ॉर्म इनपुट लेता है और आउटपुट दिखाता है, 48 वर्ण:

x=prompt();for(a="";x;x=~~(x/2))a=x%2+a;alert(a)

यदि केवल एक निर्देश जो एक चर aमें द्विआधारी रूप में एक चर डालता xहै (और आप xसाइड-इफेक्ट के रूप में मूल्य को नष्ट करने में परेशान नहीं करते हैं ), यहां यह 28 वर्णों के साथ है:

for(a="";x;x=~~(x/2))a=x%2+a

1
आप बदल सकते हैं Math.floorके साथ ~~, के रूप में संख्या के लिए रेंज छोटा है।
ब्लेंडर

@ ब्लेंडर थैंक्स, मुझे पता था कि किसी तरह से अस्तित्व में है, बस नहीं मिल सका।
विक्टर स्टाफ़ुसा

@ विक्टर मुझे जावास्क्रिप्ट नहीं पता है इसलिए मैं गलत हो सकता हूं लेकिन अंत में जब आप कहते हैं कि a=x%2+aइसे छोटा किया जा सकता है a+=x%2? यह उन सभी भाषाओं में काम करता है जिन्हें मैं जानता हूं।
अल्बर्ट रेनशॉ

@AlbertRenshaw नहीं, यह वैसा ही होगा a=a+x%2, लेकिन यह +स्ट्रिंग के लिए है। यानी, आपके सुझाव का परिणाम पीछे के क्रम के अंकों में होता है।
विक्टर स्टैफुसा

@ विक्टर आह! धन्यवाद!
अल्बर्ट रेनशॉ

2

पायथन - 61 60 वर्ण

x=input();print"".join("01"[x>>i&1]for i in range(15,-1,-1))

2
आप के बीच की जगह से छुटकारा पा सकते हैं printऔर ""
ब्लेंडर

@ ब्लेंडर मैं सिर्फ एक ही बात का सुझाव देने वाला था :)
अल्बर्ट

@ ब्लेंडर हा सच, नोटिस भी नहीं किया। किया हुआ!
C0deH4cker

यदि आप इसे कमांड-लाइन से बुलाते हैं, तो आप एक तरफ छोड़ सकते हैं printक्योंकि यह स्वचालित रूप से परिणाम देता है
paul.oderso

2

सी, 55 वर्ण

एक अतिरिक्त अग्रणी शून्य (2 बाइट्स के लिए) प्रिंट करता है।
पुनरावृत्ति printfप्रिंट क्रम को उलट देता है, इसलिए एल्गोरिथ्म बिट्स को दाएं-बाएं छोड़ता है लेकिन बाएं-दाएं प्रिंट करता है।

संपादित करें : के putcharबजाय का उपयोग करके एक चरखी को बचाया printf

f(x){(x*=x<0?-printf("-"):1)&&f(x/2);putchar(48+x%2);}

2

दिल्लोग एपीएल , 11 बाइट्स

2|⌊⎕÷2*⌽⍳16

2|{0, 1, 2, ..., 15} में से प्रत्येक की शक्ति के लिए दो में से प्रत्येक द्वारा विभाजित इनपुट
के गोल डाउन मूल्य के आधा होने पर विभाजन शेष रहता है।

÷
2*
⍳16

⎕IO←0कई सिस्टम पर डिफ़ॉल्ट की आवश्यकता होती है।

TryAPL ऑनलाइन!


1

सी, 81

char b[17];i=15;main(x){scanf("%d",&x);while(i+1)b[i--]=(x&1)+48,x>>=1;puts(b);}

आउटपुट में 16 बिट्स (पैडिंग ज़ीरो सहित) कड़ाई से है


1

एप्स स्क्रिप्ट + गूगल शीट्स, 147 144 121 बाइट्स

लिपि

function j(decNumb){var str='';do{str=String(decNumb%2)+str;decNumb=decNumb/2|0;}while(decNumb>=1);return parseInt(str);}

चादर

=j(b1)

ZygD द्वारा इस स्क्रिप्ट का संशोधित संस्करण ।


क्या आप कोई रिक्त स्थान निकाल सकते हैं?
NoOneIsHere 20

1

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

c 0=0
c n=c(div n 2)*10+mod n 2
b('-':r)='-':b r
b r=show.c.read$r

के साथ बुलाओ b "-1023", जोड़ोmain=interact b एक पूर्ण कार्यक्रम के लिए या Ideon पर प्रयास करें।

cधनात्मक पूर्णांक के लिए रूपांतरण करता है।
b r=show.c.read$rएक स्ट्रिंग को एक संख्या में cपरिवर्तित करता है , लागू करता है और वापस स्ट्रिंग में परिवर्तित करता है।
b('-':r)='-':b rस्ट्रिप्स एक संभावित अग्रणी है -और इसे परिणाम में फिर से जोड़ देता है।


1

पॉवरशेल, 59 87 82 70 बाइट्स

नकारात्मक संख्याओं का समर्थन करने के लिए 5: बाइट्स।
-12 बाइट्स @ ASCII- केवल के लिए धन्यवाद

param($d)$m=$d-lt0;while($d){$n="01"[$d%2]+$n;$d=($d-$d%2)/2}'-'*$m+$n

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

इस कोड से अनुकूलित किया गया । एक कमांडलाइन पैरामीटर के माध्यम से इनपुट लेता है -d


साइन के साथ संख्याओं के बारे में क्या?
माज़ी



ओह इंतजार 70
केवल

1

एपीएल (एनएआरएस), 17 चार्ट, 34 बाइट्स

{2∣⌊⍵÷2*(⍺-1)..0}

यह आदम उत्तर /codegolf//a/90107 की कॉपी और संशोधित है, जिस तरह से बिट्स के पैरामीटर को जोड़ सकते हैं, और इस फ़ंक्शन के लिए forIO (यहां =IO = 1) चाहिए कोई महत्व नहीं है ...

  f←{2∣⌊⍵÷2*(⍺-1)..0}
  16 f 2
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 
  32 f 2
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 
  32 f ¯1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
  16 f ¯1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
  64 f ¯12345678
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 

यह इस तरह से बिट की संख्या को संभालने में आसान लगता है (मैंने सोचा कि अंतिम परिणाम सही होना चाहिए)


0

स्मॉलटॉक (स्मॉलटाक / एक्स), 63/78

पहला संस्करण एक मध्यवर्ती स्ट्रिंग (78) बनाता है:

t:=Number readFrom:Stdin.
((15to:1by:-1)collect:[:i|$0+(t>>i&1)]as:String)print

वास्तव में, स्ट्रिंग बनाने की कोई आवश्यकता नहीं है; बस आउटपुट चार (63):

t:=Number readFrom:Stdin.
15to:1by:-1 do:[:i|($0+(t>>i&1))print]

mhmh - क्या किसी संख्या को पढ़ने का एक छोटा तरीका है?


0

पायथन 3.x: 65 वर्ण

b=lambda n:n<2 and'01'[n]or b(n//2)+b(n%2);print(b(int(input())))

0

बैश, ४४

f=b+=n/2**e%2*10**e,2**e++/n?f=b:f;echo $[f]

पर्यावरण चर के माध्यम से स्क्रिप्ट के लिए एक इनपुट मान पास करें n । बाइनरी परिणाम का दशमलव प्रतिनिधित्व पार नहीं कर सकता है LONG_MAX

यह भी संगत होना चाहिए ksh93और zshअगर bऔर eइसे आरंभिक किया जाता है 0और उचित अंकगणितीय विस्तार का उपयोग किया जाता है।


1
मुझे विश्वास नहीं है कि यह मान्य है क्योंकि यह मानता है कि nपहले से ही परिभाषित है, यह एक स्निपेट बनाता है यह एक कमांड लाइन तर्क के रूप में इनपुट लेने और nआपकी स्क्रिप्ट में उस पर सेट करके तय किया जा सकता है ।
एक

शेल में गणित के संदर्भ में @quartata चर स्पष्ट रूप से शून्य हैं। गोल्फ के उद्देश्य से यह करने के लिए और अधिक समझ में आता n=127 sh -c '...'है sh -c 'n=$1 ...' _ 127। इस मामले में एक के बाद एक को पसंद करने का कोई कारण नहीं है क्योंकि वे दोनों मूल्यों को पारित करने के लिए पूरी तरह से विशिष्ट हैं।
ormaaj

0

सी # - 104

string p(int d){var r="";long i=1;while(r.Length<=64){var g=d&i;r=(g!=0)? "1"+r:"0"+r;i=i<<1;}return r;}

यह विधि दशमलव को बाइनरी तक बदल देगी 64 बिट्स में ।

जब Linqpad में उपरोक्त विधि निष्पादित - आरआर = पी (-32768); rr.Dump ();

आउटपुट: 01111111111111111111111111111111111111111111111111000000000000000


कल्पना "एक इनपुट स्ट्रिंग" के लिए कहता है। ऐसा लगता है कि यह तरीका स्वीकार करता है int
पोक

0

जावा 8, 80 71 बाइट्स

n->{String r="";for(int i=n<0?-n:n;i>0;i/=2)r=i%2+r;return n==0?"0":r;}

टिप्पणी में एक नियम के कारण -9 बाइट्स .. नकारात्मक बेस -10 इनपुट स्पष्ट रूप से आउटपुट के रूप में सकारात्मक / पूर्ण आधार -2 मान वापस कर सकते हैं।

स्पष्टीकरण:

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

n->{                   // Method with integer parameter and String return-type
  String r="";         //  Result-String, starting empty
  for(int i=n<0?-n:n;  //  Start `i` at the absolute (non-negative) value of the input
      i>0;             //  Loop as long as `i` is not 0
      i/=2)            //    After every iteration: integer-divide `i` by 2
    r=i%2+r;           //   Prepend the result with `i` modulo-2
  return n==0?         //  If the input is 0:
          "0"          //   Return literal "0"
         :             //  Else:
          r;           //   Return the result-String


0

छोटा बेसिक , 133 बाइट्स

एक स्क्रिप्ट जो इनपुट से और TextWindowकंसोल से आउटपुट करती है।

n=TextWindow.Read()
While n>0
c=c+1
x[c]=Math.Remainder(n,2)
n=Math.Floor(n/2)
EndWhile
For i=0To c-1
TextWindow.Write(x[c-i])
EndFor

SmallBasic.com पर इसे आज़माएं, इसके लिए सिल्वरलाइट की आवश्यकता होती है और इस प्रकार इसे IE में चलाया जाना चाहिए।

I / O को ब्लैक कंसोल से लिया / दिया गया है।

-22 बाइट्स @ @ नील को धन्यवाद


क्या आप उपयोग नहीं कर सकते For i=0To c-1?
नील

@ नील - मैं बिल्कुल कर सकता हूँ। शानदार कैच!
टेलर स्कॉट

0

MATL , 15 17 बाइट्स

t0<?16Ww+]`2&\t]x

इसे MATL ऑनलाइन पर आज़माएं

TIO

(+2 बाइट्स नकारात्मक संख्याओं के लिए 0 को हटाते हुए, साइन बिट पहले बिट होना चाहिए।)

MATL ऑनलाइन पर आउटपुट को नीचे-ऊपर पढ़ा जाना चाहिए (MSB सबसे नीचे है)।

मुख्य भाग बहुत सरल है: `2&\t = जबकि मान 0 से अधिक है, 2 से विभाजित करें और अवशेषों को जमा करें।

नकारात्मक संख्याओं को संभालना और उन्हें 2 का पूरक प्रतिनिधित्व देना मुश्किल हिस्सा था। अंत में मैं "से घटाना " गया2एन"नंबर के दो के पूरक होने की विधि। चूंकि हम केवल उन मूल्यों को संभालने के लिए आवश्यक हैं जो -32768, कोड बनाता है नकारात्मक संख्याओं के लिए 216=65536इसके साथ 16W, उस इनपुट को जोड़ता है (जैसे। 65536 + (-42)), जो MATLAB को सकारात्मक संख्या के रूप में देखता है, लेकिन 16-बिट फॉर्म में इनपुट के हस्ताक्षरित बाइनरी प्रतिनिधित्व का प्रतिनिधित्व करता है।




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