Chia tôi làm đôi


15

Bạn sẽ được cung cấp một số x, ở đâu 0 <= x <= 2^32 - 1.

Bạn nên xuất một danh sách các số ở dạng thập phân, sau khi chia đệ quy ở định dạng nhị phân.

Ví dụ:

Ví dụ 1:

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

Danh sách hiện tại chỉ là 255.

Các đại diện nhị phân 2551111 1111. Tách nó, chúng ta có được 11111111, trong số thập phân là 1515.

Chúng tôi thêm chúng vào danh sách, vì vậy chúng tôi sẽ có 255 15 15.

Bây giờ các số 1515sẽ đóng vai trò là đầu vào và những số này sẽ được chia.

Làm lại, chúng tôi nhận được ( 3 3từ cả hai 15) : 255 15 15 3 3 3 3.

Tiếp tục logic, danh sách cuối cùng sẽ được 255 15 15 3 3 3 3 1 1 1 1 1 1 1 1. Và vì 1không thể phân tách được nữa, đầu ra dừng lại.

Ví dụ 2:

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

Danh sách bắt đầu là 225.

Các đại diện nhị phân 2251110 0001. Tách nó, chúng ta có được 11100001, trong số thập phân là 141.

Thêm chúng vào danh sách, chúng tôi nhận được 225 14 1.

Bây giờ các số 141sẽ đóng vai trò là đầu vào và những số này sẽ được chia.

1không thể chia tách, đầu ra sẽ là 225 14 1 3 2.

Ví dụ 3:

32 -> 32 4 0 1 0

Điều kiện :

  1. Nếu số chữ số nhị phân là số lẻ, số đầu tiên sẽ có ít hơn một chữ số nhị phân so với số tiếp theo. Ví dụ, 20 (10100)sẽ được phân chia thành 10100, với đầu ra thập phân là 24.
  2. Quy tắc kẽ hở tiêu chuẩn áp dụng.
  3. 0s và 1s không tuyên truyền thêm.
  4. Sự cố chương trình vì cố hiển thị quá nhiều số là điều kiện thoát hợp lệ.

Chỉ là một gợi ý nhưng những gì về việc có các chữ số nhị phân được đệm bằng 0s khi độ dài là số lẻ?
caird coinheringaahing

1
@ Satan'sSon Nếu bạn đệm trước, điều đó tương đương với mô tả.
isaacg

1
Là thứ tự đầu ra được chỉ định cần thiết hoặc chỉ các giá trị?
Jonathan Allan

@ Satan'sSon Không có phần đệm với 0s.
ctrl-shift-esc

1
@Jonathan ALLan Thứ tự đầu ra được chỉ định là bắt buộc.
ctrl-shift-esc

Câu trả lời:


13

Bình thường, 18 byte

u+QiR2smc2+0dt#.BM

Bộ kiểm tra

Mã này thực hiện một cái gì đó rất phức tạp và thông minh với utoán tử điểm cố định của Pyth.

Phần thân của hàm, là tất cả mọi thứ ngoài phần u, khá đơn giản:

+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

Mã này loại bỏ 0 và 1, chia tách mọi số và thêm đầu vào ở phía trước.

u sẽ chạy hàm này trên kết quả trước của hàm cho đến khi kết quả dừng thay đổi.

Giá trị ban đầu nào usử dụng? Đó là phần thông minh: mã không chỉ định giá trị nào sẽ sử dụng, vì vậy nó mặc định cho đầu vào. Nhưng đầu vào không phải là một danh sách các số - đó là một số. Pyth ngầm ép số vào thời gian nắm tay thông qua vòng lặp đến phạm vi của số - [0, 1, ..., Q-1]. Điều đó không giống bất cứ thứ gì mà chúng ta muốn có. May mắn thay, usẽ tìm thấy kết quả chính xác bất kể đầu vào ban đầu là gì - đầu ra mong muốn là điểm cố định duy nhất của hàm và ứng dụng lặp lại sẽ luôn đạt tới nó.

Hãy xem xét các giá trị trung gian của chương trình với đầu vào 7. Tôi đã nhấn mạnh tiền tố của kết quả được đảm bảo là chính xác, bất kể đầu vào ban đầu:

  1. 7(Ngẫu nhiên [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]

Đó là đầu ra.


Gói Pyth, 16 byte

Lưu ý rằng vì Pyth chỉ sử dụng phạm vi 0-127 của ASCII, nên nó có thể được nén bằng cách sử dụng mã hóa 7 bit thay vì mã hóa 8 bit. Vì vậy, chương trình trên có thể được đóng gói thành 16 byte. Chương trình kết quả là:

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

hexdump:

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

Thông dịch viên được tìm thấy ở đây . Cung cấp đầu vào như một đối số dòng lệnh.

Trang mã của ngôn ngữ này (Gói Pyth) là phạm vi 0-127 của ASCII và mỗi ký tự được thể hiện bằng 7 bit, được đệm ở cuối. Do đó, hexdump không thể đọc được ở trên đại diện cho:

u+QiR2smc2+0dt#.BM

Nhưng trong 16 byte.


6

05AB1E , 21 20 18 17 byte

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

Hãy thử trực tuyến!

Giải trình

,¸[Ž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

@Jonathan ALLan Yep đã sửa nó ngay bây giờ. Có vẻ là một vấn đề mà các ví dụ không bao gồm, cảm ơn :)
kalsowerus

ʒ- Codepage mới này ... Từ khi nào là 05AB1E Jelly? Tôi thích.
Bạch tuộc ma thuật Urn

4

JavaScript (ES6), 99 byte

Điều này có vẻ hơi quá dài. Có thể có một cách tốt hơn để có được thứ tự chính xác.

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)

Bản giới thiệu


4

Thạch , 21 20 byte

-1 byte bằng cách loại bỏ một chuỗi đơn âm và sau đó xử lý hậu quả của một danh sách trống được chuyển đổi từ nhị phân mang lại 0 sau đó.

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

Một liên kết đơn âm lấy một số và trả về danh sách được chỉ định.

Hãy thử trực tuyến!

Làm sao?

ỊÐḟ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

Cái này hoạt động ra sao?
caird coinheringaahing

@ Satan'sSon Tôi vừa thêm một lời giải thích
Jonathan Allan

Bạn đã thêm nó cùng lúc tôi nhận xét: D
caird coinheringaahing

@ RjanJohansen cả hai cách có cùng chi phí byte
Jonathan Allan

Ồ, không thấy câu trả lời đầu tiên, đã sử dụng mánh khóe đó.
Ørjan Johansen

2

Java 7, 541 byte

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);}

Giữ trật tự ban đầu làm tôi khó chịu trong thời gian dài, nếu không nó sẽ chỉ là một vòng lặp dễ dàng và nguyên tắc gọi đệ quy. Tuy nhiên, thử thách thú vị để tìm ra trong khi giữ trật tự.

Giải trình:

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)

Mã kiểm tra:

Hãy thử nó ở đây.

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));
  }
}

Đầu ra:

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

PHP, 132 byte

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);

Hãy thử trực tuyến!


Điều này không hoạt động, theo hệ thống Dùng thử trực tuyến trong trang này,
Martin Barker

@MartinBarker có nghĩa là gì?
Jörg Hülsermann

tio.run/nexus/ Kẻ => Array( [0] => 225 [1] => 14 [2] => 1 [3] => 3 [4] => 2 [5] => 1 [6] => 1 [7] => 1 [8] => 0 )khi nó không = 255 15 15 3 3 3 3 1 1 1 1 1 1 1 1
Martin Barker

@MartinBarker Bạn phải thay đổi đầu vào trong Phiên bản tiêu đề. Thay đổi biến Biến $argnnày có sẵn nếu bạn chạy PHP từ dòng lệnh với -Rtùy chọn. Dưới đây là một ví dụ cho đầu vào 255 Hãy thử trực tuyến!
Jörg Hülsermann

Đó là những gì tôi đã cố gắng nói rằng nó không hoạt động theo hệ thống thử trực tuyến. (được liên kết trong bài)
Martin Barker


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.