बाइनरी में आउटपुट क्वाटर-काल्पनिक आधार नंबर


17

एक फ़ंक्शन या प्रोग्राम लिखें जो क्वाटर-काल्पनिक आधार को बाइनरी अंकों के रूप में प्रदर्शित करता है। संख्या आधार 2 i है , जहां मैं -1 का वर्गमूल है। I पर अधिक जानकारी के लिए कॉम्प्लेक्स नंबर देखें । प्रत्येक अंक की स्थिति 0 से 3 (चतुर्धातुक) तक जा सकती है, क्योंकि प्रत्येक वास्तविक और काल्पनिक भाग -4 से पिछले वास्तविक और काल्पनिक भाग जितना बड़ा होता है। बाइनरी में चतुर्धातुक अंक इस प्रकार हैं: , , और ।0: 001: 012: 103: 11

अंकों की स्थिति का टूटना:

re   im       16 -8i  -4  2i   1 -0.5i, etc.
 4    0        1   0   3   0   0        (quaternary representation)
              01  00  11  00  00        (binary representation)

संख्या 1001100001x16 + 3x-4 = 16 + -12 = 4 है।

re   im       16 -8i  -4  2i   1 -0.5i, etc.
 0    5        0   0   0   3   0   2    (quaternary representation)
              00  00  00  11  00 .10    (binary representation)

संख्या 1100.13x2 i + 2x-0.5 i = 6 i + - i = 5 i है

आपका कोड संख्याओं की एक जोड़ी लेगा, जो पूर्णांक या फ्लोटिंग पॉइंट हो सकता है, और बाइनरी अंकों की एक स्ट्रिंग के रूप में जटिल संख्या को आउटपुट करेगा। पहला नंबर वास्तविक होगा, दूसरा इनपुट नंबर काल्पनिक मूल्य होगा। एक बाइनरी पॉइंट को केवल तभी प्रिंट किया जाना चाहिए जब 1 के नीचे गैर-शून्य संख्या स्थिति हो (यानी यदि -0.5 i , -0.25, 0.125 i के लिए कोई भी स्थिति , आदि गैर-शून्य अंक है)। यदि किसी अन्य अंक नहीं हैं, तो द्विआधारी बिंदु से पहले एक शून्य अंक को छोड़कर अग्रणी शून्य और अनुगामी शून्य की अनुमति नहीं है। आउटपुट बाइनरी पॉइंट (* 00.1- गलत, 0.1- सही, * .1- गलत, * 0.10- गलत) से शुरू नहीं होना चाहिए । आप मान सकते हैं कि सभी इनपुट नंबरों में परिमित बाइनरी प्रतिनिधित्व होगा।

परीक्षण संख्या:

re   im            output
 0    0                 0
 1    0                 1
 2    0                10
 3    0                11
 4    0         100110000
-1    0             10011
-2    0             10010
-3    0             10001
 0    1               100.1
 0    2               100
 0    3              1000.1
 0    4              1000
 0   -1                 0.1
 0   -2           1001100
 0   -3           1001100.1
 3    4              1011
 4    3         100111000.1
 6   -9         101110010.1
-6    9       10011100110.1
-9   -6           1110111
 0.5 14.125   10011001101.001001

नोट: .1यदि काल्पनिक भाग विषम है तो सभी पूर्णांक मानों का आउटपुट समाप्त हो जाएगा ।

मानक कोड-गोल्फ।


4
यह एक अच्छी चुनौती है, लेकिन स्पष्टीकरण पूरी तरह से स्पष्ट हो सकता है। आपको प्रक्रिया को स्पष्ट करना चाहिए: यह जटिल संख्याओं से, एक interleaved चतुर्धातुक प्रतिनिधित्व के लिए, एक बाइनरी प्रतिनिधित्व मैपिंग के लिए जाता है 0 → 00, 1 → 01, 2 → 10, 3 → 11
लिन

@Mauris मैंने आपकी टिप्पणी को संबोधित करने के लिए संपादन का एक पूरा गुच्छा बनाया है। मुझे बताएं कि क्या मैं इसे और बेहतर कर सकता हूं।
सीजे डेनिस

2
क्या होगा अगर यह बाइनरी में आवर्ती है?
लीक नून

1
@LeakyNun यह चुनौती में सही कहता है: "आप मान सकते हैं कि सभी इनपुट नंबरों में परिमित बाइनरी प्रतिनिधित्व होगा।"
Mego

जवाबों:


2

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

f=x=>[0,...x.toString(16)].reverse().map(d=>s=d<'.'?s:d<`0`?d+s.slice(0,-1):`${(c=+`0x${d}`+(c>>4)+m^m)>>2&3}${c&3}`+s,c=s='.',m=x<0?3:12)&&s
g=(s,t,n=s.indexOf`.`,m=t.indexOf`.`)=>n<m?g(0+s,t):n>m?g(s,0+t):t[s.length]?g(s+0,t):s.replace(/\d/g,(c,i)=>`${t[i]>>1}${t[i]&1}${c>>1}${c&1}`).replace(/^0+(\d)|\.?0*$/g,'$1')
(r,i)=>g(f(r),f(i/2))

fकिसी संख्या को आधार में परिवर्तित करता है -4( .यदि संख्या पूर्णांक है तो अनुगामी के साथ )। gदो आधार -4संख्याएँ लेता है , उन्हें एक ही लंबाई और .स्थिति के दोनों सिरों पर पैड करता है, अंकों को एक साथ फेरबदल करता है, आधार से आधार 4तक सब कुछ परिवर्तित करता है 2, फिर अंत में अग्रणी और अनुगामी शून्य बनाता है।

स्पष्टीकरण: संशोधित-आधार में दिए गए जटिल संख्या 2iका प्रतिनिधित्व करने के लिए हमें आधार के वास्तविक भाग और आधे हिस्से का प्रतिनिधित्व करने की आवश्यकता है (यानी काल्पनिक भाग को विभाजित करके 2i) आधार 2i²(यानी -4) में, अंकों को एक साथ फेरबदल करें, और फिर उन्हें आधार में परिवर्तित करें 4आधार के लिए 2। आधार में वास्तविक संख्या का प्रतिनिधित्व करने के लिए -4हम आधार 4रूपांतरण से शुरू करते हैं । वैकल्पिक अंकों में सही चिह्न होता है (सकारात्मक संख्या के मामले में, ये सम स्थिति में अंक होते हैं, ऋणात्मक संख्या के मामले में, ये विषम स्थिति में अंक होते हैं) लेकिन शेष अंकों में गलत संकेत होते हैं और एक सुधार लागू करने की आवश्यकता है। उदाहरण:

 0 -> 000 -> 000 (no correction needed)
 4 -> 010 -> 130 }
 8 -> 020 -> 120 } (correction includes carry)
12 -> 030 -> 110 }

जैसा कि आप देख सकते हैं, सुधार 8न्यूनतम अंक, मॉड है 8। हालाँकि थोड़ा अधिक सुविधाजनक गणना मूल अंक है, प्लस 3, xor 3 (वास्तव में 32-बिट पूर्णांक अंकगणित में वह नहीं लिख सकता है)+0xCCCCCCCC^0xCCCCCCCC एक बार में पूरी संख्या को बदलने के लिए हैं)। अंत में जैसा कि सुधार वैकल्पिक अंकों पर लागू होता है, आधार के लिए प्रारंभिक रूपांतरण करना सरल होता है 16जो स्वचालित रूप से आधार 4अंकों के जोड़े उठाता है , फिर 3या तो 0xCउचित के रूप में एक कारक का उपयोग करके सही करें । यह सिर्फ -संकेत को नजरअंदाज करने के लिए बनी हुई है ।


0

पर्ल - 313 बाइट्स

चूंकि किसी ने भी जवाब नहीं दिया है, इसलिए मुझे लगा कि मैं इसे खुद से दूर करूंगा।

$r=$ARGV[0];$i=$ARGV[1]/2;$m=1;while($r!=int($r)||$i!=int($i)){$c++;$m*=-1;$i*=4;$r*=4}while($r||$i){$r-=($d[$n++]=$r/$m%4)*$m;$i-=($d[$n++]=$i/$m%4)*$m;$m*=-4}$_=join("",map({sprintf"%02b",$_}reverse splice(@d,$c*2)))||"0";@d and$_.=".".join("",map({sprintf"%02b",$_}reverse@d));s/^0+1/1/;s/(\.\d*1)0+$/$1/;print

मुझे यकीन है कि इसे आगे बढ़ाने के लिए बहुत सारे अवसर हैं।

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