반으로 나눠줘


15

당신은 x어디 에서 번호를 받게 될 것 0 <= x <= 2^32 - 1입니다.

이진 형식으로 재귀 분할 한 후 숫자 목록을 10 진수로 출력해야합니다.

예 :

예 1 :

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

현재 목록은 255입니다.

이진 표현은 255입니다 1111 1111. 분할은, 우리가 얻을 수 11111111소수점에있는, 15그리고 15.

우리는 그것들을 목록에 추가하므로 우리는 가질 것 255 15 15입니다.

이제 숫자 1515입력으로 사용되며이 숫자는 분리됩니다.

다시하면 우리는 ( 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. 분할은, 우리가 얻을 수 11100001소수점에있는, 14그리고 1.

그것들을 목록에 추가하면 얻을 수 225 14 1있습니다.

이제 숫자 141입력으로 사용되며이 숫자는 분리됩니다.

이후 1에는 분열성없고, 출력 될 것이다 225 14 1 3 2.

예 3 :

32 -> 32 4 0 1 0

조건 :

  1. 이진수의 수가 홀수 인 경우, 첫 번째 숫자는 다음 숫자보다 이진 숫자가 하나 적습니다. 예를 들어, 10 진수 출력은 및 20 (10100)10, 로 분리됩니다 .10024
  2. 표준 허점 규칙이 적용됩니다.
  3. 0s 1는 더 이상 전파되지 않습니다.
  4. 너무 많은 숫자를 표시하려고 할 때 프로그램이 종료되는 것은 유효한 종료 조건입니다.

그냥 제안하지만 0길이가 홀수 일 때 이진수가 s 로 채워지 는 것은 어떻습니까?
caird coinheringaahing

1
@ Satan'sSon 앞에서 패딩하면 설명과 같습니다.
isaacg

1
지정된 출력 순서가 필요합니까 아니면 값만 필요합니까?
Jonathan Allan

@ Satan'sSon 패딩이 없습니다 0.
ctrl-shift-esc

1
@JonathanAllan 지정된 출력 순서가 필요합니다.
ctrl-shift-esc

답변:


13

Pyth, 18 바이트

u+QiR2smc2+0dt#.BM

테스트 스위트

이 코드는 uPyth의 고정 소수점 연산자 인으로 까다 롭고 영리한 작업을 수행 합니다.

함수 이외의 모든 함수 본문 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

이 코드는 0과 1을 제거하고 모든 숫자를 나누고 입력을 앞에 추가합니다.

u 결과의 변경이 멈출 때까지 함수의 이전 결과에서이 함수를 실행합니다.

어떤 초기 값을 u사용합니까? 그것은 영리한 부분입니다. 코드는 사용할 값을 지정하지 않으므로 기본값이 입력입니다. 그러나 입력은 숫자의 목록이 아닙니다. 숫자입니다. Pyth는 루프를 통해 주먹 시간의 숫자를 암시 적으로 숫자의 범위로 강제합니다 [0, 1, ..., Q-1]. 그것은 우리가 얻고 싶은 결과물과 같지 않습니다. 다행히도 u초기 입력이 무엇인지에 관계없이 올바른 결과를 찾을 수 있습니다. 원하는 출력이 기능의 유일한 고정 점이며 반복 된 응용 프로그램이 항상 도달합니다.

input과 함께 프로그램의 중간 값을 살펴 보자 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 만 사용하므로 8 비트 인코딩 대신 7 비트 인코딩을 사용하여 압축 할 수 있습니다. 따라서 위의 프로그램은 16 바이트로 묶을 수 있습니다. 결과 프로그램은 다음과 같습니다.

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

16 진 덤프 :

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

통역사는 여기에 있습니다 . 입력을 명령 행 인수로 제공하십시오.

이 언어 (Packed Pyth)의 코드 페이지는 ASCII의 0-127 범위이며 모든 문자는 끝에 7 비트로 채워집니다. 따라서 읽을 수없는 16 진수 덤프는 다음을 나타냅니다.

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

자바 스크립트 (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 바이트는 모나 딕 체인을 제거한 다음 빈 목록이 바이너리에서 0으로 변환되는 결과를 처리합니다.

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

이것은 어떻게 작동합니까?
caird coinheringaahing

@ Satan'sSon 나는 지금 설명을 추가했습니다
Jonathan Allan

D : 당신은 내가 주석 같은 시간에 그것을 추가
케어 드 coinheringaahing

@ ØrjanJohansen 두 방법 모두 같은 바이트 비용을
Jonathan Allan

오, Pyth의 대답을 먼저 보지 못했습니다. 이미 그 트릭을 사용했습니다.
Ørjan Johansen

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

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örg Hü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
Martin Barker

@MartinBarker 헤더 버전의 입력을 변경해야합니다. 변수 변경 $argn이 변수는 -R옵션 을 사용하여 명령 행에서 PHP를 실행하는 경우 사용할 수 있습니다. 다음은 입력 255의 예입니다 . 온라인으로 사용해보십시오!
Jörg Hülsermann

그것이 내가 온라인 시스템을 사용해보십시오에 따라 작동하지 않았다고 말한 것입니다. (게시물에 링크)
마틴 바커에게


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.