संख्याओं को बाइनरी में कनवर्ट करें ... लेकिन आपको ट्वॉस का भी उपयोग करने की अनुमति है


20

इस संख्यात्मक वीडियो में वर्णित "बाइनरी, लेकिन ट्वोस के साथ" संकेतन के आधार पर , एक फ़ंक्शन लिखें जो एकल संख्या को इनपुट के रूप में लेता है और एक "बाइनरी" सिस्टम में उस संख्या के सभी रूपों को आउटपुट करता है जहां ट्वॉस की अनुमति है।

नियम

  • कोड केवल एक फ़ंक्शन / विधि होना चाहिए, न कि एक पूर्ण कार्यक्रम
  • इनपुट एक पूर्णांक है जो फ़ंक्शन के एकमात्र पैरामीटर के रूप में पारित होता है
  • आउटपुट "बाइनरी, लेकिन ट्वोस" संकेतन के साथ परिवर्तित इनपुट संख्या के सभी वैध रूपांतर हैं
  • आउटपुट फ़ंक्शन का रिटर्न वैल्यू है, लेकिन जब तक यह स्पष्ट है, तब तक जो भी प्रारूप सुविधाजनक है, उसमें हो सकता है (जैसे, 3 इनट्स, 3 स्ट्रिंग्स, कॉमा / स्पेस सीमांकित स्ट्रिंग, इन्ट्स की सरणी आदि), आदेश महत्वहीन है
  • इस घटना की संभावना नहीं है कि एक भाषा में परिणाम प्राप्त करने के लिए एक अंतर्निहित फ़ंक्शन होता है, यह अस्वीकृत है
  • बाइट्स में सबसे छोटा कोड विजेता होता है

आउटपुट का स्पष्टीकरण

उदाहरण के लिए, यदि आप संख्या पार कर चुके हैं, तो आप 9इसे बाइनरी में बदल सकते हैं 1001, लेकिन यदि आपने 2प्रत्येक स्थिति में एस की अनुमति दी है , तो आप इसे 201(यानी 2*4 + 0*2 + 1*1), या 121(यानी 1*4 + 2*2 + 1*1) के रूप में भी लिख सकते हैं , जैसा कि इस तालिका में दिखाया गया है:

+----+----+----+----+
| 8s | 4s | 2s | 1s |
+----+----+----+----+
|  1 |  0 |  0 |  1 |
|  0 |  2 |  0 |  1 |
|  0 |  1 |  2 |  1 |
+----+----+----+----+

इसलिए, यदि पास हो गया 9, तो आपके फ़ंक्शन को तीन नंबर और 1001, 201और वापस करने की आवश्यकता होगी 121

स्वरूप और व्यवस्था जब तक यह स्पष्ट है के रूप में (यानी अप्रासंगिक है, तो [121,201,1001], "0201 0121 1001", ("1001","121","201")वैध परिणाम हैं जब की एक इनपुट दिया 9)।

उदाहरण

  • 2 => 10, 2
  • 9 => 1001, 201, 121
  • 10 => 1010, 210, 202, 1002, 122
  • 23 => 2111, 10111
  • 37 => 100101, 20101, 100021, 20021, 12101, 12021, 11221


1
दो? बाइनरी में? क्या यह क्वांटम कंप्यूटिंग है?
मैथ्यू रो

जवाबों:


10

गोल्फस्क्रिप्ट (25 बाइट्स) / सीजेएम ( 19 17 बाइट्स)

GolfScript:

{:^.*,{3base}%{2base^=},}

यह एक अनाम फ़ंक्शन बनाता है (अनाम फ़ंक्शन की अनुमति के बारे में मेटा चर्चा देखें )।

ऑनलाइन डेमो

CJam में एक सीधा अनुवाद है ( मार्टिन बोयटनर को धन्यवाद देने के लिए कि कुछ पात्रों को शेविंग के लिए)

{:X_*,3fb{2bX=},}

विच्छेदन

{             # Function boilerplate
  :^          # Store parameter as variable ^
  .*          # Square parameter - see detailed explanation below
  ,{3base}%   # Produce an array of 0 to ^*^-1 in ternary
  {2base^=},  # Filter to those which evaluate to ^ in binary
}

स्क्वेरिंग ऑपरेशन का कारण यह है कि हमें सबसे बड़े संभावित मूल्य तक पुनरावृति करने की आवश्यकता है जिसका द्विआधारी प्रतिनिधित्व द्विआधारी में व्याख्या के बराबर है ^। चूंकि 2 = 10, "सामान्य" बाइनरी प्रतिनिधित्व वह ^है जो मायने रखता है। अगर हम इसे टर्नरी में परिवर्तित करते हैं, तो हम पाते हैं कि "सबसे खराब" मामले 2 की शक्तियां हैं। तर्क को सत्ता तक ले जाने के लिए एक इष्टतम तरीका होगा।ln 3/ln 2 ~= 1.585 , लेकिन स्क्वेरिंग बहुत कम है।


मैं शर्त लगाता हूं कि सीजेम अनुवाद बहुत छोटा होगा।
ऑप्टिमाइज़र

1
@ ऑप्टिमाइज़र आगे बढ़ें ;-)
जॉन ड्वोरक

GolfScript? यार मैं ऐसा
नोब

8

अजगर 2 (59 बाइट्स)

S=lambda n,B="":[B][n:]or~n%2*S(n/2-1,"2"+B)+S(n/2,`n&1`+B)

(चैट में मदद करने के लिए @grc, @xnor और @PeterTaylor को बहुत धन्यवाद)

सरल पुनरावृत्ति, साथ S(23)या समान कॉल करें ।

व्याख्या

सामान्य विचार यह है कि यदि nबाइनरी विस्तार एक में समाप्त होता है 1, तो किसी भी छद्म बाइनरी ("बाइनरी, लेकिन ट्वोस" के साथ) विस्तार भी एक के साथ समाप्त होना चाहिए 1। अन्यथा इसके साथ 0या समाप्त हो सकता है 2

इसलिए हम अंतिम बिट को देखते हैं n, विभाजित करते हैं और तदनुसार शाखा करते हैं।

विच्छेदन

S=lambda n,B="":           # Lambda expression
[B][n:]or                  # Short circuit, return [B] if n==0 else what follows
~n%2*                      # Keep next list result if n is even else turn into []
S(n/2-1,"2"+B)             # Add a "2" to B, recurse
+
S(n/2,`n&1`+B)             # Add "0" or "1" to B depending on n's last bit, recurse

चर:

  • n: जिस संख्या को हम छद्म-बाइनरी विस्तार ढूंढना चाहते हैं
  • B: एक छद्म-बाइनरी स्ट्रिंग को दाएं-से-बाएं बनाया जा रहा है

5

बैश + कोरुटिल्स, 77

f()(seq `dc -e2o$1p`|sed '/[3-9]/d;s/.*/&n9P2i&pAi/'|dc|grep -Po ".*(?= $1)")

(यह TABgrep अभिव्यक्ति में एक चरित्र है।)

यह इस नियम को थोड़ा झुका रहा है:

"इस घटना की संभावना नहीं है कि एक भाषा में परिणाम प्राप्त करने के लिए एक अंतर्निहित फ़ंक्शन होता है, यह अस्वीकृत है"

यह चला है कि बाहर dcहै रिवर्स है। उदाहरण के लिए यदि हम इनपुट बेस को 2 पर सेट करते हैं और बाइनरी नंबर को दो के साथ इनपुट करते हैं, तो यह सही ढंग से पार्स करेगा। (इसी प्रकार यदि इनपुट मोड बेस 10 है, तो AF को दशमलव "अंक" 10-15 के रूप में रखा जाता है।

seqn के मानक बाइनरी प्रतिनिधित्व तक सभी दशमलव संख्याओं की एक सूची बनाता है, जिसे दशमलव के रूप में पार्स किया गया है। फिर सभी संख्याओं में {0,1,2} के अलावा कुछ भी शामिल हैं उन्हें फ़िल्टर किया जाता है। फिर dcबचे हुए नंबरों को बाइनरी के रूप में देखता है जो कि वापस एन का मूल्यांकन करते हैं।

बैश फ़ंक्शंस केवल "रिटर्न" स्केलर पूर्णांक 0-255 कर सकते हैं। इसलिए मैं "वापस लौटने" के अपने तरीके के रूप में सूची को प्रिंट करने की स्वतंत्रता ले रहा हूं। यह शेल स्क्रिप्ट के लिए मुहावरेदार है।

आउटपुट:

$ f 2
2   
10  
$ f 9
121 
201 
1001    
$

4

हास्केल, 82

t n=[dropWhile(==0)s|s<-mapM(\_->[0..2])[0..n],n==sum[2^(n-i)*v|(i,v)<-zip[0..]s]]

यह सिर्फ एक जानवर बल समाधान है। यह बहुत अक्षम है, क्योंकि यह 3 ^ n संभावनाओं के माध्यम से क्रंच करने की उम्मीद है।


3

जेली , 10 बाइट्स, भाषा चुनौती देती है

ṗ@3Ḷ¤Ḅ=¥Ðf

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

इनपुट के बराबर कई हाइपरबिट्स का एक ब्रूटफोर्स सॉल्यूशन (यह प्रारूप "हाइपरबिनरी" के रूप में जाना जाता है)। जैसे, यह अविश्वसनीय रूप से अक्षम है, ओ (3 एन ) में चल रहा है ।

व्याख्या

ṗ@3Ḷ¤Ḅ=¥Ðf
ṗ@            Construct all lists with the given length, and elements taken from
  3Ḷ¤         the list [0,1,2]
        Ðf    then take only those elements which
     Ḅ=¥      when interpreted as binary, equal {the original number}

2

PHP, 138 बाइट्स

function p($v,$i=0,$r=""){global$a;if($v==0)$a[]=$r?:0;elseif($v>0)for(;$l<3;)p($v-2**$i*$l,$i+1,+$l++.$r);}p($argv[1]);echo join(",",$a);

टूट - फूट

function p($v,$i=0,$r=""){
    global$a;
    if($v==0)$a[]=$r?:0;  # fill result array
    elseif($v>0) # make permutations
        for(;$l<3;)
            p($v-2**$i*$l,$i+1,+$l++.$r); #recursive
}
p($argv[1]);
echo join(",",$a); # Output


1

k, 21 बाइट्स

पीटर टेलर के गोल्फस्क्रिप्ट उत्तर के समान विधि का उपयोग करता है

{X@&x=2/:'X:3\:'!x*x}

उदाहरण:

k) {X@&x=2/:'X:3\:'!x*x}9
(1 2 1;2 0 1;1 0 0 1)
k) {X@&x=2/:'X:3\:'!x*x}10
(1 2 2;2 0 2;2 1 0;1 0 0 2;1 0 1 0)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.