बाइनरी को सरल बनाएं


20

चुनौती

किसी भी माध्यम से एक द्विआधारी संख्या को इनपुट के रूप में देखते हुए, पूर्ण प्रोग्राम या फ़ंक्शन का उपयोग करके संख्या को "सरल" करें।

इनपुट

[binary]
  • binary बाइनरी में एक संख्या है जो 0 से अधिक है।

उत्पादन

इनपुट लें, इसे बिना बेसिन का उपयोग किए आधार 10 में परिवर्तित करें, फिर यदि उस संख्या में केवल 1s और 0 s हैं, तो इसे आधार संख्या 10 में परिवर्तित करें जैसे कि यह कोई अन्य बाइनरी नंबर हो। उस प्रक्रिया को दोहराएं जब तक कि संख्या को बाइनरी में नहीं पढ़ा जा सकता है और उस संख्या को आउटपुट कर सकता है।

अन्य सूचना

  • यदि इनपुट 1 है, तो बस आउटपुट करें 1। आपका कार्यक्रम असीम रूप से सरल 1 नहीं होना चाहिए।

  • यह कोड गोल्फ है, इसलिए मंगलवार (17 नवंबर) तक बाइट्स में सबसे कम जवाब मिला।

  • यदि कुछ भी भ्रमित हो रहा है, तो एक टिप्पणी निर्दिष्ट करें जो मुझे स्पष्ट करने की आवश्यकता है उसे छोड़ दें और मैं इसे तदनुसार संपादित करूंगा।

  • आधार रूपांतरण के लिए बिल की अनुमति नहीं है।

उदाहरण

     Input | Output

         1 | 1
      1010 | 2
      1011 | 3
   1100100 | 4
   1100101 | 5
1111110011 | 3

4
कुछ परीक्षण मामलों का उपयोग कर सकता है।
आईएसएएसीजी

क्या इनपुट ASCII स्ट्रिंग है, या वास्तव में 1 और 0 है?
टॉम कारपेंटर

@ टोमकारपेंटर 1 एस और 0 एस।
The_Basset_Hound

@isaacg ने आउटपुट के रूप में 1-5 प्राप्त करने के तरीके जोड़े।
The_Basset_Hound

क्या ऐसे कार्य हैं जो किसी स्ट्रिंग को दिए गए आधार में परिवर्तित करते हैं?
isaacg

जवाबों:


14

अजगर, 20 16 बाइट्स

u?-GTG`u+yNsTG0z

जकुबे के लिए 4 बाइट्स धन्यवाद

कोड का आधा ( u+yNsTG0) बस आधार रूपांतरण कोड है।

परीक्षण सूट

u?-GTG`u+yNsTG0z
                    z = input() (The string of 1s and 0s)
                    T = 10
u              z    Apply until the value stops changing, starting with z
                    G is the current value, a string of 0s and 1s.
 ?-GT               If G - T, e.g., G with the digits 1 and 0 removed is not empty,
     G              Return G, to end the iteration.
       u     G0     Else, reduce over G with initial value 0.
         yN         Double the running total
        +  sT       and add the next digit, cast to an int.
      `             Convert to string.

इनपुट 1को इस तथ्य से नियंत्रित किया जाता है कि uनोटिस ने मूल्य बदलना बंद कर दिया है।


4
बधाई हो, आपने डेनिस को नाराज कर दिया! फिलहाल ...
कॉनर ओ'ब्रायन

9
@ C @O'Bʀɪᴇɴ रहस्य है पायथ।
2

8

सीजेएम, 24 23 बाइट्स

q{:~{1$++}*s__,(As*-!}g

CJam दुभाषिया में इसे ऑनलाइन आज़माएं ।

यह काम किस प्रकार करता है

q                        Read all input.
 {                   }g  Do:
  :~                       Evaluate each character. Maps '0' -> 0 and '1' -> 1.
    {    }*                Fold; for each integer but the first:
     1$                      Copy the second-topmost integer.
       ++                    Add all three integers on the stack.
           s__             Cast to string and push two copies.
              ,(           Calculate string length and subtract 1.
                As         Push the string "10".
                  *        Repeat the string length-1 times.
                   -       Remove its elements from the string representation
                           of the integer.
                    !      Apply logical NOT.
                         If `!' pushed 1, repeat the loop.

क्या आपको "10"स्ट्रिंग length-1बार दोहराना है , या क्या आप गिरावट को छोड़ सकते हैं?
DLosc

लंबाई से 1 घटाना पूर्णांक "10"में बदल जाता है ""यदि पूर्णांक में एक अंक हो। यह सुनिश्चित करता है कि कोड एक अनंत लूप में नहीं आता है।
डेनिस

2
आकर्षक, कप्तान। }: ^ |
DLosc

7

पिप, 28 27 बाइट्स

Ta=1|aRMta:$+(^a)*2**RV,#aa

कमांड-लाइन तर्क के रूप में इनपुट लेता है। हम जब तक लूप करना चाहते हैं a=1या a0 और 1 के अलावा कुछ चरित्र (रों) शामिल हैं। इस बाद की स्थिति को RM' से t= में सभी वर्णों द्वारा जांचा जाता 10है a। अगर कुछ बचा है, तो हालत सच्चाई है।

लूप के अंदर, रूपांतरण निम्नानुसार काम करता है:

a:$+(^a)*2**RV,#a

              ,#a  range(len(a))
            RV     reversed
         2**       2 to the power of each element
    (^a)*          multiplied item-wise with each digit in split(a)
  $+               Sum
a:                 and assign back to a

लाना aयह अंत ऑटो प्रिंट पर।

28 बाइट्स में एक पुनरावर्ती समाधान:

a<2|aRMt?a(f$+(^a)*2**RV,#a)

6

अजगर 2, 52

f=lambda n:n>1<'2'>max(`n`)and f(n%10+2*f(n/10))or n

इसे दो पुनरावर्ती कार्यों के रूप में सोचना आसान है:

g=lambda n:n and n%10+2*g(n/10)
f=lambda n:n>1<'2'>max(`n`)and f(g(n))or n

फ़ंक्शन gएक दशमलव मान को बाइनरी में कनवर्ट करता है, और फ़ंक्शन बार-बार fलागू होता gहै जब तक कि इसका तर्क अंक 0 और 1 ( '2'>max(`n`)) से बना है और नहीं है 1। गोल्फर कोड के साथ पुनरावर्ती कॉल की जगह के g(n)लिए f(n), की परिभाषा सम्मिलित करके उन्हें एक एकल फ़ंक्शन में ढह gजाता है f। के आधार मामले n=0की gस्वचालित रूप से चेक द्वारा नियंत्रित किया जाता है n>1


अच्छा :) केवल बात यह है कि हमेशा की तरह समस्या लागू होता है - परेशान करने Lसे repr...
Sp3000

4

प्रोलॉग, 220 212 बाइट्स

:-use_module(library(clpfd)).
x(B,N):-reverse(B,C),foldl(y,C,0-0,_-N).
y(B,J-M,I-N):-B in 0..1,N#=M+B*2^J,I#=J+1.
b(N,I):-N>47,N<50,I is(N-48).
p(N):-N>1,number_codes(N,L),maplist(b,L,Y),x(Y,B),p(B);write(N).

स्पष्टीकरण
पी मुख्य कार्य है और निम्नलिखित चरणों (बी, एक्स, वाई की मदद से) करता है:

  • जाँच करें कि क्या वर्तमान संख्या 1 से बड़ी है
  • पूर्णांक को अंको के अभ्यावेदन के अंकों की सूची में परिवर्तित करता है
  • जाँच करता है कि सभी संख्याएँ 0 या 1 हैं
  • ascii सूची को बाइनरी पूर्णांक सूची में परिवर्तित करता है
  • बाइनरी पूर्णांक सूची को दशमलव संख्या में परिवर्तित करता है
  • recurses
  • प्रिंट जब एक विधेय विफल रहता है।

संपादित करें: OR के साथ p-clauses को एकीकृत करके 8 बाइट्स सहेजे गए।


3

गणितज्ञ १०atic १०६

एक बाइट के साथ DLosc द्वारा बचाई गई।

j@d_:=(p=0;v=IntegerDigits@d;
Which[d<2,1,Complement[v,{0,1}]=={},j@Fold[#+#2 2^p++&,0,Reverse@v],1<2,d])

इनपुट को उसके अंकों में तोड़ें। यदि इनपुट 1, आउटपुट 1 है।

यदि इनपुट 0 और 1 की संख्या वाला है, तो उसे दशमलव में परिवर्तित करें और फिर से चलाएं।

अन्यथा, इनपुट वापस करें।


j[1]

1


j[11010001]

209


j[1111110001]

1009


j[1111110011]

3

पहला कदम 1011 देता है जो बदले में 3 पैदावार देता है।


यहां हम 1011 से परीक्षण शुरू करते हैं।

j[1011]

3


3

जावास्क्रिप्ट, 132 , 123 बाइट्स

खैर, यह सबसे अच्छा जवाब नहीं है, लेकिन ..

FYI करें, यदि कोई अमान्य इनपुट दिया जाता है, तो यह उपयोगकर्ता को वही प्रदर्शित करता है।

function c(x){while(x!=0&&!/[2-9]/.test(x)){for(i=r=0;x;i++)r+=x%10*Math.pow(2,i),x=parseInt(x/10);x=r}alert(x)}c(prompt())


1
आप सकता बचाने के 19 बाइट्स का उपयोग करके forबजाय whileऔर बयान में सीधे मान सेट (यह भी कुछ कम कर देता है {}), कुछ को त्यागकर ;, का उपयोग कर ES6 समारोह विवरण, वेतन वृद्धि iइनलाइन। वह ऐसा दिखाई देगा: c=x=>{for(r=0;x&&!/[2-9]/.test(x);x=r)for(i=0;x>0;r+=x%10*Math.pow(2,i++),x=parseInt(x/10));alert(x)};c(prompt())
प्रविष्टि

1
114:function c(x){while(x^0&&!/[2-9]/.test(x)){for(i=r=0;x;i++)r+=x%10*Math.pow(2,i),x=0|x/10;x=r}alert(x)}c(prompt())
मामा फन रोल

@insertusernamehere, सुझाव के लिए धन्यवाद, लेकिन मैं c=x=>शुरुआत में समझ नहीं पाया, क्रोम या फ़ायरफ़ॉक्स कंसोल पर काम नहीं किया। :( @ ן nɟuɐɯɹɐ ן oɯ, XOR हालत के आसपास मेरे सिर लपेटो नहीं कर सकता है और x=0|x/10‌बजाय parseInt, मैं शेष परिवर्तन शामिल किया गया है धन्यवाद ..।
LearningDeveloper

@GauthamPJ मैं क्षमा चाहता हूँ, किसी तरह कोड को कॉपी करते समय टूट गया और अनपेक्षित वर्ण समाहित हो गया। यहाँ सही संस्करण है c=x=>{for(r=0;x!=0&&!/[2-9]/.test(x);x=r)for(i=r=0;x;)r+=x%10*Math.pow(2,i++),x=parseInt(x/10);alert(x)};c(prompt()):। यह फ़ायरफ़ॉक्स 42 में निश्चित रूप से चलता है, इस फिडेल को आज़माएं । ध्यान दें कि यह अधिक गोल्फ संस्करण और आपका मूल कोड भी काम नहीं करता है 1और एक अंतहीन लूप में चलेगा। " ऐरो फ़ंक्शंस " देखना c=x=>पसंद है । function c(x){}
सम्मिलित

2

जावास्क्रिप्ट ईएस 6, 52

एक समारोह के रूप में। फ़ंक्शन का तर्क या तो बाइनरी अंकों का एक स्ट्रिंग होना चाहिए या एक संख्या जिसका दशमलव प्रतिनिधित्व केवल 1 और 0 होता है।

एक EcmaScript 6 अनुरूप ब्राउज़र में नीचे स्निपेट का परीक्षण करना - तीर के कार्यों को लागू करना, टेम्पलेट स्ट्रिंग्स और प्रसार ऑपरेटर (मैं उपचार का उपयोग करें)

f=s=>s<2|[...s+''].some(c=>(n+=+c+n,c>1),n=0)?s:f(n)

// To test
console.log=(...x)=>O.innerHTML+=x+'\n';

// Basic test cases
;[[1,1],[1010,2],[1011,3],[1100100,4],[1100101,5],[1111110011,3]]
.forEach(t=>console.log(t[0]+' -> '+f(t[0])+' expected '+t[1]))

function longtest() {
  var o=[],i;
  for (i=1;i<1e6;i++)
    b=i.toString(2),v=f(b),v!=i?o.push(b+' '+v):0;
  O.innerHTML=o.join`\n`
}
Click to run the long test <button onclick="longtest()">go</button>
<pre id=O></pre>


1
n+=+c+nद्विआधारी रूपांतरण के लिए वास्तव में पसंद है । बहुत खूबसूरत ...
nderscore

2

गणितज्ञ, 62 59 55 48 बाइट्स

मार्टिन ब्यूटनर को धन्यवाद 7 बाइट्स बचाए।

#//.a_/;Max[b=IntegerDigits@a]<2:>Fold[#+##&,b]&

1

जावास्क्रिप्ट (ईएस 7) 87 80 78 77 74 बाइट्स

ब्राउज़र का समर्थन करने के लिए स्निपेट डेमो (वर्तमान में केवल फ़ायरफ़ॉक्स रात्रिकालीन एक्सपोनेंट ऑपरेटर का समर्थन करता है)

f=x=>[...x].reverse(i=y=j=0).map(z=>(j|=z,y+=z*2**i++))&&j<2&y>1?f(y+[]):x
<input type="text" id="x" value="1111110011"><button onclick="o.innerHTML=f(x.value)">Run</button><div id="o"></div>

f=x=>
[...x].reverse(i=y=j=0) // reverse string as array, initialize vars
.map(z=>( // iterate over the all chatacters
    j|=z, // keep track of whether a digit higher than 1 is encountered
    y+=z*2**i++ // build decimal result from binary
))&&
j<2&y>1? // if we encountered only 1's and 0's and result > 1
    f(y+[]) // then call recursively and cast to a string
    :x // else return x

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

ब्राउज़र का समर्थन करने के लिए स्निपेट डेमो

f=x=>[...x].reverse(i=y=j=0).map(z=>y+=z*Math.pow(2,i++,j|=z))&&j<2&y>1?f(y+[]):x
<input type="text" id="x" value="1111110011"><button onclick="o.innerHTML=f(x.value)">Run</button><div id="o"></div>


1

S, 37 चार्ट / 54 बाइट्स

↺;ï>1⅋(⬯+ï)ĉ/^[01]+$⌿);)ï=+('ᶀ'+ï);ôï

Try it here (Firefox only).

सुनिश्चित नहीं है कि अगर +बाइनरी रूपांतरण के लिए ऑपरेटर एक अंतर्निहित के रूप में गिना जाता है ...



1

PHP, 210 204 बाइट्स

यह मेरा पहली बार यहाँ पोस्टिंग है, तो आशा है कि आप लोग इसे पसंद करेंगे! यहां तक ​​कि अगर यह स्पष्ट रूप से इसे लिखने का सबसे अच्छा तरीका नहीं है, तो भी मुझे इसे यहाँ दिखाने की खुशी है!

कोड

<?function j($a){$c=0;if($a==1){return 1;}else{if(preg_match("#^[01]+$#",$a)){$b=strlen($a);$a=str_split($a);foreach($a as$d){$c+=($d==0?0:2**($b-1));$b--;}return j($c);}else{return$a;}}}echo j($_GET[0]);

मैंने एक पुनरावर्ती फ़ंक्शन "j" बनाया है जो पहले जांच करेगा कि इनपुट 1 के बराबर है। यदि हां, तो फ़ंक्शन 1 अपेक्षा के अनुरूप देता है, अन्यथा यह दशमलव मान की गणना करने के लिए एक सरणी में संख्या को विभाजित करेगा, लेकिन केवल यदि संख्या एक द्विआधारी है। यदि यह नहीं है, तो यह संख्या को वापस कर देगा।

अघोषित कोड

<?
function j($a) {
  $c = 0;
  if ($a == 1) {
    return 1;
  }
  else {
    if (preg_match("#^[01]+$#", $a) {
      $b = strlen($a);
      $a = str_split($a);
      foreach ($a as $d) {
        $c += ($d == 0 ? 0 : 2 ** ($b - 1));
        $b--;
      }
      return j($c);
    }
    else {
      return $a;
    }
  }
}
echo j($_GET[0]);

मैंने अपने "प्रारंभिक" के बजाय "एक" के लिए "फॉरचेट" स्टेटमेंट का उपयोग किया है, जिससे मुझे 6 बाइट्स का लाभ मिलता है, लेकिन मुझे पूरा यकीन है कि अभी बहुत कुछ करना बाकी है।


1

PHP, 114 112 बाइट्स

के लिए भी काम करता है 0। साथ चलाना -r

for($n=$argv[1];count_chars($s="$n",3)<2&$s>1;)for($i=$n=0;""<$c=$s[$i++];)$n+=$n+$c;echo$s;

count_chars($s,3)स्ट्रिंग से सभी वर्णों वाली स्ट्रिंग देता है (जैसे array_uniqueसरण के लिए करता है)। बाइनरी नंबर के लिए, यह होगा 0, 1या 01। अन्य संख्याओं के लिए, इसमें एक अंक बड़ा होगा 1, इसलिए<2 केवल बाइनरी संख्याओं के लिए सही होगा।

&$s>1विशेष मामले के लिए आवश्यक है 1

बाकी सीधे आगे है: मूल्य को शिफ्ट करने और वर्तमान बिट को जोड़ने के साथ बिट्स के माध्यम से लूप करें, अंत में बाहरी लूप टेस्ट के लिए संख्या (स्ट्रिंग को) को $ s पर कॉपी करें।


0

कॉफ़ीस्क्रिप्ट, 92 89 बाइट्स

f=(x)->x>1&/^[01]+$/.test(x)&&f(''+x.split('').reverse().reduce ((p,v,i)->p+v*2**i),0)||x

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

f=y=>y>1&/^[01]+$/.test(y)?f(''+[...y].reverse().reduce(((p,v,i)=>p+v*Math.pow(2,i)),0)):y

डेमो

केवल फ़ायरफ़ॉक्स और माइक्रोसॉफ्ट एज जैसे ईएस 6-अनुरूप ब्राउज़रों में काम करता है

f=y=>y>1&/^[01]+$/.test(y)?f(''+[...y].reverse().reduce(((p,v,i)=>p+v*Math.pow(2,i)),0)):y

// Snippet stuff
$(`form`).submit((e) => {
  document.getElementById(`y`).textContent = f(document.getElementById(`x`).value);
  e.preventDefault()
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
  <label>Input:
    <input pattern=^[01]+$ required id=x>
  </label>
  <button type=submit>Go</button>
  <p>Output:
    <output id=y></output>
  </p>
</form>


यदि आप eval का उपयोग करते हैं, तो आप एक निहित रिटर्न को खींचने में सक्षम हो सकते हैं।
मामा फन रोल 5

5 बाइट्स eval और बेनामी फंक्शन्स के साथ छोटे
डाउनगैट

@ Some n reasonuɐɯɹɐ ɯ oɯ किसी कारण से eval'd फ़ंक्शन के साथ काम नहीं करता है 1। क्योंकि यह मेरे द्वारा ग्रहण किए गए लूप में प्रवेश नहीं करता है
rink.attenders.6

1
@nderscore धन्यवाद, लेकिन पुनरावृत्ति 4 बाइट्स छोटी थी :-)
rink.attenders.6

0

स्काला, 128 बाइट्स

def b(s:String):String=if(s.matches("[10]{2,}"))b(""+s.reverse.zipWithIndex.collect{case('1',i)=>Math.pow(2,i)}.sum.toInt)else s

0

मतलाब (115)

@(a)num2str(sum((fliplr(a)-48).*arrayfun(@(x)2^x,0:nnz(a)-1)));a=ans(input('','s'));while(find(a<50))a=ans(a);end,a

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