বাইনারি সরল করুন


20

চ্যালেঞ্জ

কোনও উপায়ের মাধ্যমে ইনপুট হিসাবে একটি বাইনারি নম্বর দেওয়া, একটি পূর্ণ প্রোগ্রাম বা একটি ফাংশন ব্যবহার করে নম্বরটি "সরল করুন"।

ইনপুট

[binary]
  • binary বাইনারি একটি সংখ্যা যা 0 এর বেশি।

আউটপুট

ইনপুটটি ধরুন, বিল্টিন ব্যবহার না করে এটিকে বেস 10 এ রূপান্তর করুন, তারপরে যদি সেই সংখ্যায় কেবল 1s এবং 0s থাকে তবে এটিকে বেস 10 সংখ্যায় রূপান্তর করুন যেন এটি অন্য বাইনারি সংখ্যা। প্রক্রিয়াটি পুনরাবৃত্তি করুন যতক্ষণ না নম্বরটি বাইনারি এবং সেই সংখ্যাটিকে আউটপুট না পড়তে পারে।

অন্যান্য তথ্য

  • যদি ইনপুটটি 1 হয়, কেবল আউটপুট 1। আপনার প্রোগ্রামটি অসীম সরলকরণ 1 এ যাওয়া উচিত নয়।

  • এটি কোড গল্ফ, তাই মঙ্গলবার (17 নভেম্বর) মধ্যে বাইটে সংক্ষিপ্ত উত্তর answer

  • যদি কিছু বিভ্রান্তিকর হয় তবে আমার কী পরিষ্কার করতে হবে তা উল্লেখ করে একটি মন্তব্য করুন এবং আমি সে অনুযায়ী এটি সম্পাদনা করব।

  • বেস রূপান্তরকরণের জন্য বিল্টিনগুলি অনুমোদিত নয়।

উদাহরণ

     Input | Output

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

4
একটি দম্পতি পরীক্ষার কেস ব্যবহার করতে পারে।
isaacg

ইনপুটটি কি একটি এএসসিআইআই স্ট্রিং, বা আসলে 1 এবং 0 এর?
টম কার্পেন্টার

@ টমকার্পেন্টার 1 এস এবং 0 এস।
The_Basset_Hound

আউটপুট হিসাবে 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ʀɪᴇɴ এর রহস্য হচ্ছে পাইথ।
isaacg

8

সিজেএম, 24 23 বাইট

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

সিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন ।

কিভাবে এটা কাজ করে

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"করে ""যদি পূর্ণসংখ্যার একক অঙ্ক থাকে into এটি নিশ্চিত করে যে কোডটি অসীম লুপের মধ্যে না চলে।
ডেনিস

2
মনোমুগ্ধকর, অধিনায়ক। }: ^ |
DLosc

7

পিপ, 28 27 বাইট

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

কমান্ড-লাইন আর্গুমেন্ট হিসাবে ইনপুট নেয়। পর্যন্ত আমরা লুপ করতে চান a=1বা a0 এবং 1 এর পরিবর্তে কিছু অক্ষর (গুলি) রয়েছে। এই আধুনিক শর্ত দ্বারা পরীক্ষা করা হয় RM'থেকে সমস্ত অক্ষর ing 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)gfn=0gn>1


ভাল Lrepr
লাগল

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 এর চেয়ে বড় কিনা তা পরীক্ষা করে
  • সংখ্যার ascii উপস্থাপনের তালিকাতে পূর্ণসংখ্যা রূপান্তর করে
  • সমস্ত সংখ্যা 0 বা 1 হয় তা পরীক্ষা করে
  • ascii তালিকাটিকে বাইনারি পূর্ণসংখ্যার তালিকায় রূপান্তর করে
  • বাইনারি পূর্ণসংখ্যা তালিকা দশমিক সংখ্যায় রূপান্তর করে
  • recurses
  • প্রিন্টে যখন একটি শিকারী ব্যর্থ হয়।

সম্পাদনা করুন: ও -এর সাথে পি-ক্লজগুলিকে একত্র করে 8 বাইট সংরক্ষণ করা হয়েছে।


3

গণিত 107 106

ডিএলকাস দ্বারা সংরক্ষিত একটি বাইট সহ।

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 টি ফল দেয় yield


এখানে আমরা 1011 দিয়ে শুরু করে পরীক্ষা করি।

j[1011]

3


3

জাভাস্ক্রিপ্ট, 132 , 123 বাইট

ঠিক আছে, এটি সেরা উত্তর নয়, তবে ..

এফওয়াইআই, যদি কোনও অবৈধ ইনপুট দেওয়া হয় তবে এটি ব্যবহারকারীর কাছে এটি প্রদর্শন করে।

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())
মামা ফান রোল

@ অন্তর্ভুক্তকারীর নাম, পরামর্শের জন্য ধন্যবাদ, তবে আমি c=x=>শুরুতে বুঝতে পারিনি, ক্রোম বা ফায়ারফক্স কনসোলটিতে কাজ করিনি। :( @ ן nɟuɐɯɹɐ ן oɯ, XOR শর্তটি এবং তার x=0|x/10‌পরিবর্তে আমার মাথাটি গুটিয়ে রাখতে পারেনি parseInt, আমি বাকী পরিবর্তনগুলি অন্তর্ভুক্ত করেছি Thanks ধন্যবাদ ..
লার্নিং

@ গৌতম পিজে আমি দুঃখিত, অনুলিপি করার সময় কোনওভাবে কোডটি ভেঙে গেছে এবং এতে ছাপিয়ে যায় না এমন অক্ষর। এখানে সঠিক সংস্করণ: 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())। এটি স্পষ্টভাবে ফায়ারফক্স ৪২ এ চলেছে , এই ঝাঁকুনির চেষ্টা করুন । নোট করুন যে এটি আরও গল্ফযুক্ত সংস্করণ এবং আপনার মূল কোডটিও কাজ করে না 1এবং একটি অন্তহীন লুপে চলে আসবে। " তীর ফাংশন " দেখার c=x=>মতো । function c(x){}
সন্নিবেশকারী নাম এখানে

2

জাভাস্ক্রিপ্ট ES6, 52

একটি ফাংশন হিসাবে. ফাংশন আর্গুমেন্টটি অবশ্যই বাইনারি ডিজিটের একটি স্ট্রিং বা এমন একটি সংখ্যা হতে হবে যার দশমিক প্রতিনিধিত্ব কেবলমাত্র 1 এবং 0 রয়েছে।

নীচে স্নিপেটটি একটি ইকামাস্ক্রিপ্ট comp অনুবর্তী ব্রাউজারে চালনার পরীক্ষা করুন - তীর ফাংশন, টেম্পলেট স্ট্রিং এবং স্প্রেড অপারেটর প্রয়োগ করে (আমি ফায়ারফক্স ব্যবহার করি)

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

জাভাস্ক্রিপ্ট (ES7) 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

জাভাস্ক্রিপ্ট (ES6) 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

𝔼𝕊𝕄𝕚𝕟, 37 অক্ষর / 54 বাইট

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

Try it here (Firefox only).

+অপারেটর বাইনারি রূপান্তর জন্য অন্তর্নির্মিত হিসাবে গণনা করা হয় তা নিশ্চিত না ...



1

পিএইচপি, 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

পিএইচপি, 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

বাকিগুলি সরাসরি এগিয়ে রয়েছে: মানটি স্থানান্তর করে এবং বর্তমান বিটটি যুক্ত করে বিটগুলি দিয়ে লুপ করুন, শেষ পর্যন্ত বাহ্যিক লুপ পরীক্ষার জন্য সংখ্যাটি (স্ট্রিংয়ে কাস্ট করুন) অনুলিপি করুন।


0

কফিস্ক্রিপ্ট, 92 89 বাইট

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

জাভাস্ক্রিপ্ট (ES6), 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

ডেমো

ফায়ারফক্স এবং মাইক্রোসফ্ট এজ এর মতো কেবল ES6- অনুবর্তী ব্রাউজারগুলিতে কাজ করে

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>


আপনি যদি ইওল ব্যবহার করেন তবে আপনি একটি অন্তর্নিহিত রিটার্ন বন্ধ করতে সক্ষম হতে পারেন might
মামা ফান রোল


@। Nɟuɐɯɹɐ ן oɯ কিছু কারণে eval'd ফাংশনটি কাজ করে না 1। কারণ এটি যে লুপটি আমি ধরে নিয়েছি তা প্রবেশ করে না
rink.attendant.6

1
@ আন্ডারস্কোর ধন্যবাদ, তবে পুনরাবৃত্তি ছিল 4 বাইট সংক্ষিপ্ত :-)
rink.attendant.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

মতলব (১১৫)

@(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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.