แยกฉันครึ่ง


15

คุณจะได้รับจำนวนที่x0 <= 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ซึ่งในทศนิยมเป็นและ1515

255 15 15เราได้เพิ่มเหล่านั้นไปยังรายการดังนั้นเราจะต้อง

ตอนนี้ตัวเลข15และ15จะทำหน้าที่เป็นอินพุตและตัวเลขเหล่านี้จะถูกแยกออก

ทำมันอีกครั้งที่เราได้รับ ( 3 3จากทั้งs):15255 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ซึ่งในทศนิยมเป็นและ141

225 14 1เพิ่มเหล่านั้นไปยังรายการที่เราได้รับ

ตอนนี้ตัวเลข14และ1จะทำหน้าที่เป็นอินพุตและตัวเลขเหล่านี้จะถูกแยกออก

เนื่องจาก1ไม่มี splittable 225 14 1 3 2เอาท์พุทจะเป็น

ตัวอย่างที่ 3:

32 -> 32 4 0 1 0

เงื่อนไข :

  1. หากจำนวนของเลขฐานสองเป็นเลขคี่หมายเลขแรกจะมีเลขฐานสองน้อยกว่าหนึ่งเลขต่อไป ตัวอย่างเช่น20 (10100)จะแยกเป็น10และ100มีผลผลิตทศนิยมเป็นและ24
  2. ใช้กฎช่องโหว่มาตรฐาน
  3. 0s และ1s ไม่เผยแพร่เพิ่มเติม
  4. โปรแกรมหยุดทำงานเมื่อพยายามแสดงตัวเลขมากเกินไปเป็นเงื่อนไขการออกที่ถูกต้อง

เพียงข้อเสนอแนะ แต่สิ่งที่เกี่ยวกับการมีเลขฐานสองหุ้มด้วย0s เมื่อความยาวเป็นเลขคี่
caird coinheringaahing

1
@ ซาตานซันถ้าคุณเดินไปข้างหน้านั่นเท่ากับคำอธิบาย
isaacg

1
จำเป็นต้องมีคำสั่งส่งออกที่ระบุหรือเพียงแค่ค่าหรือไม่
Jonathan Allan

@ Satan'sSon ไม่มี padding กับ0s
ctrl-shift-esc

1
@JonathanAllan ต้องมีคำสั่งส่งออกที่ระบุ
ctrl-shift-esc

คำตอบ:


13

Pyth, 18 ไบต์

u+QiR2smc2+0dt#.BM

ชุดทดสอบ

รหัสนี้ทำสิ่งที่ยุ่งยากและชาญฉลาดมากด้วยuตัวดำเนินการจุดคงที่ของ Pyth

ร่างกายของฟังก์ชั่นซึ่งเป็นทุกอย่างนอกเหนือจาก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 และ 1s แยกทุกหมายเลขและเพิ่มอินพุตด้านหน้า

u จะเรียกใช้ฟังก์ชันนี้กับผลลัพธ์ก่อนหน้าของฟังก์ชันจนกว่าผลลัพธ์จะหยุดการเปลี่ยนแปลง

ค่าเริ่มต้นอะไรบ้าง uใช้ นั่นคือส่วนที่ฉลาด: รหัสไม่ได้ระบุค่าที่จะใช้ดังนั้นจึงเป็นค่าเริ่มต้นสำหรับอินพุต แต่อินพุตไม่ใช่รายการของตัวเลข - มันคือตัวเลข Pyth โดยปริยาย coerces จำนวนในเวลากำปั้นผ่านห่วงในช่วงของตัวเลข [0, 1, ..., Q-1]- ไม่เหมือนอะไรที่เราต้องการ โชคดีที่uจะพบผลลัพธ์ที่ถูกต้องโดยไม่คำนึงว่าอินพุตเริ่มต้นคืออะไรเอาต์พุตที่ต้องการเป็นเพียงจุดคงที่ของฟังก์ชั่นและแอปพลิเคชันซ้ำ ๆ จะเข้าถึง

ดู Let 's 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]

ซึ่งเป็นผลลัพธ์


บรรจุ Pyth ขนาด 16 ไบต์

โปรดทราบว่าเนื่องจาก Pyth ใช้เฉพาะช่วง 0-127 ของ ASCII จึงสามารถบีบอัดได้โดยใช้การเข้ารหัส 7 บิตแทนที่จะเข้ารหัส 8 บิต ดังนั้นโปรแกรมดังกล่าวสามารถบรรจุใน 16 ไบต์ โปรแกรมผลลัพธ์คือ:

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

hexdump:

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

พบล่ามที่นี่ที่นี่จัดเตรียมอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง

โค้ดเพจของภาษานี้ (Packed Pyth) คือช่วง 0-127 ของ ASCII และตัวละครทุกตัวจะถูกแสดงด้วย 7 บิตซึ่งจะเพิ่มในตอนท้าย ดังนั้น hexdump ที่อ่านไม่ได้ด้านบนแสดง:

u+QiR2smc2+0dt#.BM

แต่ใน 16 ไบต์


6

05AB1E , 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

@JonathanAllan Yep แก้ไขแล้วตอนนี้ ดูเหมือนจะมีปัญหาตัวอย่างไม่ครอบคลุมขอบคุณ :)
kalsowerus

ʒ- เพจรหัสใหม่นี้ ... ตั้งแต่เมื่อไหร่ที่ 05AB1E Jelly ฉันเปรียบ
Magic Octopus Urn

4

JavaScript (ES6), 99 ไบต์

มันดูยาวไปหน่อย อาจมีวิธีที่ดีกว่าในการรับลำดับที่ถูกต้อง

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 chain จากนั้นจัดการกับผลลัพธ์ของรายการเปล่าที่ถูกแปลงจากการให้ไบนารี่เป็น 0 ในภายหลัง

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

ลิงก์ monadic ที่ใช้ตัวเลขและส่งคืนรายการที่ระบุ

ลองออนไลน์!

อย่างไร?

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

มันทำงานอย่างไร
caird coinheringaahing

@ Satan'sSon ฉันได้เพิ่มคำอธิบายตอนนี้
Jonathan Allan

คุณเพิ่มในเวลาเดียวกันฉันแสดงความคิดเห็น: D
caird coinheringaahing

@ ØrjanJohansenทั้งสองวิธีมีค่าใช้จ่ายไบต์เดียวกัน
Jonathan Allan

โอ้ไม่เห็นคำตอบของ Pyth ก่อนซึ่งใช้เคล็ดลับนั้นแล้ว
Ørjan Johansen

2

Java 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

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

ลองออนไลน์!


สิ่งนี้ไม่ทำงานตามระบบออนไลน์ของ Try it ในหน้านี้
Martin Barker

@MartinBarker คุณหมายถึงอะไร
JörgHülsermann

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 1 1 1 1 1 1 1 1 1 1
Martin Barker

@MartinBarker คุณต้องเปลี่ยนอินพุตในเวอร์ชันหัวข้อ เปลี่ยนตัวแปรตัวแปร$argnนี้จะใช้ได้ถ้าคุณใช้ PHP จากบรรทัดคำสั่งด้วย-Rตัวเลือก นี่คือตัวอย่างสำหรับอินพุต 255 ลองออนไลน์!
JörgHülsermann

นั่นคือสิ่งที่ฉันพยายามจะบอกว่ามันไม่ทำงานตามระบบออนไลน์ของลองมัน (ลิงก์ในโพสต์)
Martin Barker


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.