আমাকে অর্ধেক বিভক্ত


15

আপনি একটি নম্বর দেওয়া হবে x, যেখানে 0 <= x <= 2^32 - 1

বাইনারি ফর্ম্যাটটিতে পুনরাবৃত্ত বিভাজনের পরে দশমিকের মধ্যে আপনাকে সংখ্যার একটি তালিকা আউটপুট করা উচিত।

উদাহরণ:

উদাহরণ 1:

255 -> 255 15 15 3 3 3 3 1 1 1 1 1 1 1 1

বর্তমান তালিকা ঠিক 255

বাইনারি উপস্থাপনা 255হয় 1111 1111। এটি বিভক্ত করা, আমরা পাই 1111এবং 1111, দশমিক যে হয় 15এবং 15

আমরা সেগুলিকে তালিকায় যুক্ত করি, সুতরাং আমাদের তা হবে 255 15 15

এখন সংখ্যার 15এবং 15ইনপুট এবং এই সংখ্যা হিসেবে পরিবেশন করা হবে বিভক্ত করা হয়।

এটি আবার করে, আমরা ( 3 3উভয় 15গুলি) থেকে পেয়েছি : 255 15 15 3 3 3 3.

যুক্তি অব্যাহত রাখলে, চূড়ান্ত তালিকা হবে 255 15 15 3 3 3 3 1 1 1 1 1 1 1 1 । এবং যেহেতু 1আর ভাগ করা যায় না, আউটপুট বন্ধ হয়ে যায়।

উদাহরণ 2:

225 -> 225 14 1 3 2 1 1 1 0

আরম্ভের তালিকাটি হ'ল 225

বাইনারি উপস্থাপনা 225হয় 1110 0001। এটি বিভক্ত করা, আমরা পাই 1110এবং 0001যেটি দশমিক14এবং 1

এগুলি তালিকায় যুক্ত করা, আমরা পাই 225 14 1

এখন সংখ্যা 14 এবং 1ইনপুট এবং এই সংখ্যা হিসেবে পরিবেশন করা হবে বিভক্ত করা হয়।

যেহেতু 1কোনও বিভাজনযোগ্য নয়, আউটপুট হবে225 14 1 3 2

উদাহরণ 3:

32 -> 32 4 0 1 0

পরিবেশ :

  1. বাইনারি সংখ্যার সংখ্যাটি যদি বিজোড় হয় তবে প্রথম সংখ্যার পরেরটির চেয়ে কম বাইনারি সংখ্যা থাকবে have উদাহরণস্বরূপ, দশমিক আউটপুট 20 (10100)হিসাবে 10এবং হিসাবে বিভক্ত হবে1002 এবং 4
  2. স্ট্যান্ডার্ড লুফোলের বিধি প্রযোজ্য।
  3. 0গুলি এবং 1 s আরও প্রচার করে না।
  4. অত্যধিক সংখ্যা প্রদর্শনের চেষ্টা করার জন্য প্রোগ্রাম ক্র্যাশ করা একটি বৈধ প্রস্থান শর্ত।

মাত্র একটি পরামর্শ তবে 0দৈর্ঘ্যটি বিজোড় হলে বাইনারি অঙ্কগুলি কীভাবে প্যাড করা হবে ?
কেয়ার্ড কোইনারিংহিংহ

1
@ শয়তানের সান যদি আপনি সামনে প্যাড করেন তবে তা বর্ণনার সমান।
isaacg

1
নির্দিষ্ট আউটপুট অর্ডার প্রয়োজনীয় বা কেবল মানগুলি?
জনাথন অ্যালান

@ শয়তানের সনের সাথে কোন প্যাডিং নেই 0
ctrl-shift-esc

1
@ জোনাথান অ্যালান নির্দিষ্ট আউটপুট অর্ডার প্রয়োজন।
ctrl-shift-esc

উত্তর:


13

পাইথ, 18 বাইট

u+QiR2smc2+0dt#.BM

পরীক্ষা স্যুট

এই কোডটি খুব চতুর এবং চতুর সাথে কিছু করে u পাইথের ফিক্সড পয়েন্ট অপারেটরটির ।

ফাংশনটির দেহ, যা ব্যতীত অন্য সমস্ত uকিছু মোটামুটি সোজা:

+QiR2smc2+0dt#.BM
+QiR2smc2+0dt#.BMG    Implicit variable
                      G will store the list of numbers from the previous iteration.
              .BMG    Map each number to its binary representation
            t#        Filter out the ones of length 1 (0 and 1)
      m               Map the remaining binary
         +0d          Prefix with a 0
       c2             Chop in half.
                      Since c puts the larger half first, prefixing with a 0
                      makes the chop work out right, and doesn't change the value.
     s                Concatenate
  iR2                 Map back to binary
+Q                    Add the input to the front of the list

এই কোডটি 0s এবং 1 গুলি সরিয়ে দেয়, প্রতিটি সংখ্যা বিভক্ত করে এবং সামনে ইনপুট যুক্ত করে।

u ফলাফল পরিবর্তন বন্ধ হওয়া অবধি এই ফাংশনটি পূর্বের ফাংশনটিতে চালাবে।

কোন প্রাথমিক মান uব্যবহার করে? এটি চতুর অংশ: কোডটি কোন মানটি ব্যবহার করতে হবে তা নির্দিষ্ট করে না, তাই এটি ইনপুটটিতে ডিফল্ট হয়। তবে ইনপুটটি সংখ্যাগুলির তালিকা নয় - এটি একটি সংখ্যা। পাইথ সুস্পষ্টভাবে মুষ্টির সময়টিতে সংখ্যার সীমাতে লুপের মাধ্যমে সংখ্যাটি জোর করে [0, 1, ..., Q-1]। আমরা যে আউটপুট পেতে চাই তা দেখতে কিছুই দেখতে পায় না। সৌভাগ্যবসত,u প্রাথমিক ইনপুটটি নির্বিশেষে সঠিক ফলাফলটি খুঁজে পাবেন - কাঙ্ক্ষিত আউটপুট হ'ল ফাংশনের একমাত্র স্থির বিন্দু, এবং পুনরাবৃত্তি প্রয়োগ সর্বদা এটিতে পৌঁছে যাবে।

আসুন ইনপুট দিয়ে প্রোগ্রামটির মধ্যবর্তী মানগুলি দেখি 7। আমি ফলাফলের উপসর্গটি হাইলাইট করেছি যা প্রাথমিক ইনপুট নির্বিশেষে সঠিক হওয়ার গ্যারান্টিযুক্ত:

  1. 7(স্পষ্টভাবে [0, 1, 2, 3, 4, 5, 6])

  2. [7,1, 0, 1, 1, 1, 0, 1, 1, 1, 2]

  3. [7, 1, 3,1, 0]

  4. [7, 1, 3, 1, 1]

যা আউটপুট।


প্যাকড পাইথ, 16 বাইট

নোট করুন যেহেতু পাইথ ASCII এর কেবল 0-127 ব্যাপ্তি ব্যবহার করে তাই এটি 8 বিট এনকোডিংয়ের পরিবর্তে 7-বিট এনকোডিং ব্যবহার করে সংকুচিত হতে পারে। সুতরাং, উপরের প্রোগ্রামটি 16 বাইটে প্যাক করা যায়। ফলাফল প্রোগ্রামটি হ'ল:

ꮎ�L����[
    ���4

hexdump:

0000000: eaae 8e9a 4cb9 edc6 c95b 0c9d 11ae 8534  ....L....[.....4

দোভাষী এখানে পাওয়া যায় । কমান্ড লাইন আর্গুমেন্ট হিসাবে ইনপুট সরবরাহ করুন।

এই ভাষার কোড প্যাক (প্যাকড পাইথ) ASCII এর 0-127 পরিসীমা এবং প্রতিটি অক্ষর শেষে 7 টি বিট দিয়ে উপস্থাপিত হয়। সুতরাং, উপরের অপঠনযোগ্য হেক্সডাম্প প্রতিনিধিত্ব করে:

u+QiR2smc2+0dt#.BM

তবে 16 বাইটে


6

05 এ বি 1 ই , 21 20 18 17 বাইট

,¸[Žrbvy0ì2äCʒ=1›

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

,¸[Žrbvy0ì2äCʒ=1›   Argument n
,¸                  Print n and push n as array
  [Ž                Loop until stack is empty
    r               Reverse stack
     b              Convert elements in array to binary
      v             For each y in array
       y0ì2ä        Prepend '0' to y and split it into 2 elements
                    (the first element will take the additional character)
            C       Convert elements to decimal
             ʒ=1›   Keep only elements greater than 1, while printing each element

@ জোনাথান অ্যালান ইয়েপ এখনই এটি ঠিক করেছেন। একটি সমস্যা বলে মনে হচ্ছে উদাহরণগুলি কভার করে না, ধন্যবাদ :)
কলসওয়ারাস

ʒ- এই নতুন কোডপেজ ... 05 এবি 1 ই জেলি কখন থেকে? আমার মত।
ম্যাজিক অক্টোপাস উরন

4

জাভাস্ক্রিপ্ট (ES6), 99 বাইট

এটি দেখতে অনেক দীর্ঘ looks সঠিক অর্ডার পাওয়ার আরও ভাল উপায় হতে পারে।

f=(n,p=(a=[],1),i=33-Math.clz32(n)>>1)=>(a[p]=n)>1?f(n>>i,p*=2)&&f(n&(1<<i)-1,p+1):a.filter(n=>1/n)

ডেমো


4

জেলি , 21 20 বাইট

-1 বায়ার একটি monadic চেইন অপসারণ করে এবং তারপর একটি শূন্য তালিকার ফলাফল সাথে ডাইনার পরে বাইনারি ফলন থেকে রূপান্তরিত হচ্ছে।

ỊÐḟBUœs€2UḄF
WÇÐĿṖUF

একটি মোনাডিক লিঙ্ক একটি নম্বর নিয়েছে এবং নির্দিষ্ট তালিকাটি ফিরিয়ে দিচ্ছে।

এটি অনলাইন চেষ্টা করুন!

কিভাবে?

ỊÐḟBUœs€2UḄF - Link 1, perform an iteration: list of numbers
 Ðḟ          - filter out if:
Ị            -   insignificant (absolute value <= 1 - hence any 0s or 1s)
   B         - convert to a binary list (vectorises)
    U        - upend (reverse each)
     œs€2    - split €ach into 2 equal chunks (the first half is longer if odd ...hence
         U   - upend (reverse each)         ...this upend and the previous one)
          Ḅ  - convert from binary list to number (vectorises, although when the filter
             -                                     removes everything a zero is yielded)
           F - flatten the resulting list of lists to a single list

WÇÐĿṖUF - Main link: number
W       - wrap in a list
  ÐĿ    - loop and collect results until no change occurs:
 Ç      -   call last link (1) as a monad
    Ṗ   - pop (remove the last element - a list containing a single zero which results
        -     from the effect of Ḅ when link 1's input only contained ones and zeros)
     U  - upend (put the iterations into the required order)
      F - flatten to yield a single list

কিভাবে কাজ করে?
কেয়ার্ড কোইনারিংহিংহ

@ শয়তানসন আমি এখনই একটি ব্যাখ্যা যুক্ত করেছি
জোনাথন অ্যালান

আপনি এটি একই সময়ে যুক্ত করেছিলেন আমি মন্তব্য করেছি: ডি
সিয়ার্ড কোইনারিংহিংহ

@ আরজান জোহানসেন উভয় পথেই একই বাইট ব্যয় রয়েছে
জোনাথন অ্যালান

ওহ, পাইথ উত্তরটি আগে দেখেনি, যা ইতিমধ্যে সেই কৌশলটি ব্যবহার করেছিল।
janrjan জোহানসেন

2

জাভা 7, 541 বাইট

import java.util.*;List l=new ArrayList(),L=new ArrayList();String c(int n){l.add(x(n));return a(n+" ",l,n);}String a(String r,List q,Integer n){boolean e=q.equals(l),E=q.equals(L);if(e)L.clear();else l.clear();for(String i:new ArrayList<String>(q)){int s=i.length()/2,a=n.parseInt(i.substring(0,s),2),z=n.parseInt(i.substring(s),2);r+=a+" "+z+" ";if(e&a>1)L.add(x(a));if(e&z>1)L.add(x(z));if(E&a>1)l.add(x(a));if(E&z>1)l.add(x(z));}if(e&L.size()>0)r=a(r,L,n);if(E&l.size()>0)r=a(r,l,n);return r;}String x(Integer n){return n.toString(n,2);}

মূল অর্ডার বজায় রাখা আমাকে বড়-বড় সময়ে ডেকে এনেছে, অন্যথায় এটি কেবল একটি সহজ লুপ এবং পুনরাবৃত্তির কল নীতি হবে। তবুও, অর্ডার বজায় রেখে মজাদার চ্যালেঞ্জ।

ব্যাখ্যা:

import java.util.*;                    // Required import for List and Array List

List l=new ArrayList(),L=new ArrayList(); 
                                       // Two Lists on class-level

String c(int n){                       // Method (1) with integer parameter and String return-type
  l.add(x(n));                         //  Start by adding the binary-String of the input integer to list `l`
  return a(n+" ",l,n);                 //  And let the magic begin in method `a` (2)
}                                      // End of method (1)

String a(String r,List q,Integer n){   // Method (2) with a bunch of parameters and String return-type
  boolean e=q.equals(l),E=q.equals(L); //  Determine which of the two class-level Lists the parameter-List is
  if(e)                                //  If it's `l`:
    L.clear();                         //   Empty `L`
  else                                 //  If it's `L` instead:
    l.clear();                         //   Empty `l`
  for(String i:new ArrayList<String>(q)){
                                       //  Loop over the input list (as new ArrayList to remove the reference)
    int s=i.length()/2,                //   Get the length of the current item in the list divided by 2
                                       //   NOTE: Java automatically floors on integer division,
                                       //   which is exactly what we want for the splitting of odd-length binary-Strings
    a=n.parseInt(i.substring(0,s),2),  //   Split the current binary-String item in halve, and convert the first halve to an integer
    z=n.parseInt(i.substring(s),2);    //   And do the same for the second halve
    r+=a+" "+z+" ";                    //   Append the result-String with these two integers
    if(e&a>1)                          //   If the parameter List is `l` and the first halve integer is not 0:
      L.add(x(a));                     //    Add this integer as binary-String to list `L`
    if(e&z>1)                          //   If the parameter List is `l` and the second halve integer is not 0:
      L.add(x(z));                     //    Add this integer as binary-String to List `L`
    if(E&a>1)                          //   If the parameter List is `L` and the first halve integer is not 0:
      l.add(x(a));                     //    Add this integer as binary-String to List `l`
    if(E&z>1)                          //   If the parameter List is `L` and the second halve integer is not 0:
      l.add(x(z));                     //    Add this integer as binary-String to List `l`
  }                                    //  End of loop
  if(e&L.size()>0)                     //  If the parameter List is `l` and List `L` now contains any items:
    r=a(r,L,n);                        //   Recursive call with List `L` as parameter
  if(E&l.size()>0)                     //  If the parameter List is `L` and List `l` now contains any items:
    r=a(r,l,n);                        //   Recursive call with List `l` as parameter
  return r;                            //  Return the result-String with the now appended numbers
}                                      // End of method (2)

String x(Integer n){                   // Method (3) with Integer parameter and String return-type
  return n.toString(n,2);              //  Convert the integer to its Binary-String
}                                      // End of method (3)

পরীক্ষার কোড:

এখানে চেষ্টা করুন।

import java.util.*;
class M{
  List l=new ArrayList(),L=new ArrayList();String c(int n){l.add(x(n));return a(n+" ",l,n);}String a(String r,List q,Integer n){boolean e=q.equals(l),E=q.equals(L);if(e)L.clear();else l.clear();for(String i:new ArrayList<String>(q)){int s=i.length()/2,a=n.parseInt(i.substring(0,s),2),z=n.parseInt(i.substring(s),2);r+=a+" "+z+" ";if(e&a>1)L.add(x(a));if(e&z>1)L.add(x(z));if(E&a>1)l.add(x(a));if(E&z>1)l.add(x(z));}if(e&L.size()>0)r=a(r,L,n);if(E&l.size()>0)r=a(r,l,n);return r;}String x(Integer n){return n.toString(n,2);}

  public static void main(String[] a){
    M m=new M();
    System.out.println(m.c(255));
    m.l.clear();
    m.L.clear();
    System.out.println(m.c(225));
    m.l.clear();
    m.L.clear();
    System.out.println(m.c(32));
  }
}

আউটপুট:

255 15 15 3 3 3 3 1 1 1 1 1 1 1 1 
225 14 1 3 2 1 1 1 0 
32 4 0 1 0 



2

পিএইচপি, 132 বাইট

for($r=[$argn];""<$n=$r[+$i++];)$n<2?:[$r[]=bindec(substr($d=decbin($n),0,$p=strlen($d)/2)),$r[]=bindec(substr($d,$p))];print_r($r);

এটি অনলাইন চেষ্টা করুন!


এই পৃষ্ঠায় এটি চেষ্টা করুন অনলাইন সিস্টেম অনুসারে এটি কাজ করে না
মার্টিন বার্কার

@ মার্টিন বার্কার আপনার অর্থ কি?
জার্গ হালসারম্যান

tio.run/nexus/… => Array( [0] => 225 [1] => 14 [2] => 1 [3] => 3 [4] => 2 [5] => 1 [6] => 1 [7] => 1 [8] => 0 )এটি = 255 15 15 3 3 3 3 1 1 1 1 1 1 1
মার্টিন বার্কার

@ মার্টিন বার্কার আপনাকে অবশ্যই শিরোনাম সংস্করণে ইনপুটটি পরিবর্তন করতে হবে। ভেরিয়েবল পরিবর্তন করুন $argnআপনি যদি -Rবিকল্পটি দিয়ে কমান্ড লাইন থেকে পিএইচপি চালাচ্ছেন তবে এই পরিবর্তনশীলটি উপলব্ধ । ইনপুট 255 এর জন্য এটির
Jurg Hülsermann

এটিই আমি বলার চেষ্টা করছিলাম এটি চেষ্টা করে এটি অনলাইন সিস্টেমের অনুযায়ী কাজ করে না। (পোস্টে লিঙ্কযুক্ত)
মার্টিন বার্কার


1

রুবি , 98 বাইট

f=->*a{a==[]?a:a+=f[*a.flat_map{|i|s='%b'%i;i>1?[s[0...h=s.size/2].to_i(2),s[h..-1].to_i(2)]:[]}]}

এটি অনলাইন চেষ্টা করুন!

মূল্য কালি এর উত্তরের কেবল একটি প্রাথমিক অপ্টিমাইজেশন কালিয়ের : মানচিত্রের পরিবর্তে ফ্ল্যাট_ম্যাপ ব্যবহার করুন ... সমতল করুন এবং ব্যবহার করুন

a==[]?a পরিবর্তে a==[]?[]

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