바이트 배열을 비트 배열로 분할


24

버퍼 b(1-104857600 바이트 길이)와 비트 수 n(1 <= n <= 64) 가 주어지면 버퍼를 n비트 단위로 분할 하는 함수를 작성하십시오 . 0s n비트 까지 마지막 청크를 오른쪽으로 채 웁니다 .

예 :

버퍼 감안할 때 b = "f0oBaR"또는 동등 [102,48,111,66,97,82]하고 n = 5, 수익을

[12, 24, 24, 6, 30, 16, 19, 1, 10, 8]

바이너리로 표현 될 때 위의 버퍼가 다음과 같기 때문입니다.

01100110 00110000 01101111 01000010 01100001 01010010

그리고 5로 다시 그룹화하면 다음과 같습니다.

01100 11000 11000 00110 11110 10000 10011 00001 01010 010[00]

십진수로 다시 변환하면 답이됩니다.

노트

  • 버퍼를 나타 내기 위해 언어에서 가장 적합한 데이터 유형을 사용할 수 있습니다. PHP에서는 아마도 문자열을 사용하고, Node에서는 버퍼 를 사용하고 싶을 것입니다
    • 버퍼를 나타내는 데 문자열을 사용하는 경우 char-> int 변환의 ASCII라고 가정하십시오.
    • 원하는 경우 입력을 위해 int (0-255) 배열을 사용할 수 있습니다
  • 반환 값은 배열 또는 정수 목록이어야합니다

테스트 사례

> b = "Hello World", n = 50
318401791769729, 412278856237056

> b = [1,2,3,4,5], n = 1
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1

> b = "codegolf", n = 32
1668244581, 1735355494

> b = "codegolf" n = 64
7165055918859578470

> b = "codegolf" n = 7
49, 91, 108, 70, 43, 29, 94, 108, 51, 0

> b = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque vel est eu velit lacinia iaculis. Nulla facilisi. Mauris vitae elit sapien. Nullam odio nulla, laoreet at lorem eu, elementum ultricies libero. Praesent orci elit, sodales consectetur magna eget, pulvinar eleifend mi. Ut euismod leo ut tortor ultrices blandit. Praesent dapibus tincidunt velit vitae viverra. Nam posuere dui quis ipsum iaculis, quis tristique nisl tincidunt. Aliquam ac ligula a diam congue tempus sit amet quis nisl. Nam lacinia ante vitae leo efficitur, eu tincidunt metus condimentum. Cras euismod quis quam vitae imperdiet. Ut at est turpis.", n = 16
19567, 29285, 27936, 26992, 29557, 27936, 25711, 27759, 29216, 29545, 29728, 24941, 25972, 11296, 25455, 28275, 25955, 29797, 29813, 29216, 24932, 26992, 26995, 25449, 28263, 8293, 27753, 29742, 8272, 25964, 27749, 28276, 25971, 29045, 25888, 30309, 27680, 25971, 29728, 25973, 8310, 25964, 26996, 8300, 24931, 26990, 26977, 8297, 24931, 30060, 26995, 11808, 20085, 27756, 24864, 26209, 25449, 27753, 29545, 11808, 19809, 30066, 26995, 8310, 26996, 24933, 8293, 27753, 29728, 29537, 28777, 25966, 11808, 20085, 27756, 24941, 8303, 25705, 28448, 28277, 27756, 24876, 8300, 24943, 29285, 25972, 8289, 29728, 27759, 29285, 27936, 25973, 11296, 25964, 25965, 25966, 29813, 27936, 30060, 29810, 26979, 26981, 29472, 27753, 25189, 29295, 11808, 20594, 24933, 29541, 28276, 8303, 29283, 26912, 25964, 26996, 11296, 29551, 25697, 27749, 29472, 25455, 28275, 25955, 29797, 29813, 29216, 28001, 26478, 24864, 25959, 25972, 11296, 28789, 27766, 26990, 24946, 8293, 27749, 26982, 25966, 25632, 28009, 11808, 21876, 8293, 30057, 29549, 28516, 8300, 25967, 8309, 29728, 29807, 29300, 28530, 8309, 27764, 29289, 25445, 29472, 25196, 24942, 25705, 29742, 8272, 29281, 25971, 25966, 29728, 25697, 28777, 25205, 29472, 29801, 28259, 26980, 30062, 29728, 30309, 27753, 29728, 30313, 29793, 25888, 30313, 30309, 29298, 24878, 8270, 24941, 8304, 28531, 30053, 29285, 8292, 30057, 8305, 30057, 29472, 26992, 29557, 27936, 26977, 25461, 27753, 29484, 8305, 30057, 29472, 29810, 26995, 29801, 29045, 25888, 28265, 29548, 8308, 26990, 25449, 25717, 28276, 11808, 16748, 26993, 30049, 27936, 24931, 8300, 26983, 30060, 24864, 24864, 25705, 24941, 8291, 28526, 26485, 25888, 29797, 28016, 30067, 8307, 26996, 8289, 28005, 29728, 29045, 26995, 8302, 26995, 27694, 8270, 24941, 8300, 24931, 26990, 26977, 8289, 28276, 25888, 30313, 29793, 25888, 27749, 28448, 25958, 26217, 25449, 29813, 29228, 8293, 29984, 29801, 28259, 26980, 30062, 29728, 28005, 29813, 29472, 25455, 28260, 26989, 25966, 29813, 27950, 8259, 29281, 29472, 25973, 26995, 28015, 25632, 29045, 26995, 8305, 30049, 27936, 30313, 29793, 25888, 26989, 28773, 29284, 26981, 29742, 8277, 29728, 24948, 8293, 29556, 8308, 30066, 28777, 29486

> b = [2,31,73,127,179,233], n = 8
2, 31, 73, 127, 179, 233

2
n8보다 큰 값으로 작동 합니까? 그렇다면 n64보다 큰 값은 대부분의 언어 정수 정밀도보다 큽니다.
speedplane

2
왜 반환 값이 정수 여야 합니까?
wizzwizz4

2
@ wizzwizz4 나는 그렇게 생각하지 않습니다. 그들은 8 비트가 없기 때문에 바이트가 될 수 없습니다. 비트 연산자는 일반적으로 int에서 작동하지만 그다지 많지 않습니다. 당신이 더 나은 제안을한다면 나는 듣고 있지만, 그렇지 않으면 int입니다.
mpen

3
@ wizzwizz4 사람들이 한 걸음 건너 뛰기를 원하지 않기 때문입니다. "이 바이트의 첫 5 비트에 응답이 포함되어 있습니다"와 같은 응답을 원하지 않습니다. 결과에 불필요한 정보가 포함되어서는 안되며 ASCII 또는 문자 매핑으로 쉽게 변환해야합니다 (실제 사용 케이스). 또한 지금까지 답변 수를 감안할 때 문제가되지 않습니다.
mpen

1
@mpen 혼란을 봅니다. 1 바이트 길이 char의 정수 입니다.
wizzwizz4

답변:


15

Pyth, 18 17 바이트

iR2c.[t.B+C1z\0QQ

바이트에 대한 @lirtosiast 에게 감사합니다 !

            z      get input
         +C1       prepend a 0x01 to prevent leading zeroes from disappearing
       .B          convert to binary string
      t            remove the leading 1 from ^^
    .[       \0Q   pad right with zeroes to multiple of second input
   c            Q  get chunks/slices of length second input
iR2                map(x: int(x, 2))

13

젤리, 13 바이트

1;ḅ256æ«BḊsḄṖ

입력을 정수 목록으로 사용합니다. 온라인으로 사용해보십시오!

작동 원리

1;ḅ256æ«BḊsḄṖ  Main link. Arguments: A (list), n (integer)

1;             Prepend 1 to A.
  ḅ256         Convert from base 256 to integer.
      æ«       Bitshift the result n units to the left.
        B      Convert to binary.
         Ḋ     Discard the first binary digit (corresponds to prepended 1).
          s    Split into chunks of length n.
           Ḅ   Convert each chunk from binary to integer.
            Ṗ  Discard the last integer (corresponds to bitshift/padding).

5

줄리아, 117 바이트

f(x,n,b=join(map(i->bin(i,8),x)),d=endof,z=rpad(b,d(b)+d(b)%n,0))=map(i->parse(Int,i,2),[z[i:i+n-1]for i=1:n:d(z)-n])

정수 배열과 정수를 허용하고 정수 배열을 리턴하는 함수입니다. 함수 인수 남용에 대한 연습입니다.

언 골프 드 :

function f(x::Array{Int,1},                  # Input array
           n::Int,                           # Input integer
           b = join(map(i -> bin(i, 8), x)), # `x` joined as a binary string
           d = endof,                        # Store the `endof` function
           z = rpad(b, d(b) + d(b) % n, 0))  # `b` padded to a multiple of n

    # Parse out the integers in base 2
    map(i -> parse(Int, i, 2), [z[i:i+n-1] for i = 1:n:d(z)-n])
end

왜 일시적으로 삭제 했습니까?
CalculatorFeline

@ CatsAreFluffy 나는 처음에 잘못하여 테스트 케이스에서 효과가 있었지만 반드시 일반적인 것은 아니라는 것을 깨달았습니다. 그래도 지금은 모두 좋을 것입니다. :)
Alex A.

5

파이썬 3, 102 바이트

j=''.join
lambda s,n:[int(j(k),2)for k in zip(*[iter(j([bin(i)[2:].zfill(8)for i in s+[0]]))]*n)][:-1]

iter trick 을 사용 하여 문자열 그룹화

결과

>>> f([102,48,111,66,97,82],4)
[6, 6, 3, 0, 6, 15, 4, 2, 6, 1, 5, 2, 0]

>>> f([102,48,111,66,97,82],5)
[12, 24, 24, 6, 30, 16, 19, 1, 10, 8]

>>> f([102,48,111,66,97,82],6)
[25, 35, 1, 47, 16, 38, 5, 18]

>>> f([102,48,111,66,97,82],8)
[102, 48, 111, 66, 97, 82]

'n'매개 변수의 기능을 설명하기 위해 코드를 문서화해야합니까?
nullptr

5

JavaScript (ES6), 120 바이트

f=(a,n,b=0,t=0,r=[])=>b<n?a.length?f(a.slice(1),n,b+8,t*256+a[0],r):b?[...r,t<<n-b]:r:f(a,n,b-=n,t&(1<<b)-1,[...r,t>>b])

정수 배열에서 재귀 비트 트위들 링. 언 골프 드 :

function bits(array, nbits) {
    var count = 0;
    var total = 0;
    var result = [];
    for (;;) {
        if (nbits <= count) {
            // We have enough bits to be able to add to the result
            count -= nbits;
            result.push(total >> count);
            total &= (1 << count) - 1;
        } else if (array.length) {
            // Grab the next 8 bits from the array element
            count += 8;
            total <<= 8;
            total += array.shift();
        } else {
            // Deal with any leftover bits
            if (count) result.push(total << nbits - count);
            return result;
        }
    }
}

@WashingtonGuedes 나는 당신의 솔루션의 내 자신의 골프에서 또 다른 9 바이트를 골프로 쳤지 만 여전히 129 바이트입니다."(s,n)=>(s.replace(/./g,x=>(256+x.charCodeAt()).toString(2).slice(1))+'0'.repeat(n-1)).match(eval(`/.{${n}}/g`)).map(x=>+`0b${x}`)".length
Neil

이거 확실 해요? ungolfed 버전이 Chrome에 충돌합니다.
mpen

@mpen 골프 버전은 Firefox에서 확실히 실행됩니다. ungolfed 버전에 오류가있을 수 있습니다.
Neil

아하! 그렇습니다. Chrome의 JS 엔진이 FF보다 앞서 있다고 생각했지만 그렇지 않습니다.
mpen

1
@mpen ungolfed 코드에서 몇 가지 미묘한 버그가 수정되었습니다.
Neil

4

루비, 114 바이트

->s,n{a=s.bytes.map{|b|b.to_s(2).rjust 8,?0}.join.split""
r=[]
r<<a.shift(n).join.ljust(n,?0).to_i(2)while a[0]
r}

약간 클리너 :

f = -> str, num {
    arr = str.bytes.map {|byte|
        byte.to_s(2).rjust(8, "0")
    }.join.split("")
    result = []
    while arr.size > 0
        result << arr.shift(num).join.ljust(num, "0").to_i(2)
    end
    result
}

puts f["f0oBaR", 5]

4

펄 6, 93 68 바이트

{@^a».&{sprintf "%08b",$_}.join.comb($^b)».&{:2($_~0 x$b-.chars)}}

3

PHP, 262 217 189 바이트

function f($b,$n){$M='array_map';return$M('bindec',$M(function($x)use($n){return str_pad($x,$n,0);},str_split(implode('',$M(function($s){return str_pad($s,8,0,0);},$M('decbin',$b))),$n)));}

( Ismael Miguel의 팁으로 업데이트 됨 )

가독성을위한 형식 :

function f($b, $n) {
    $M = 'array_map';
    return $M('bindec', $M(function ($x) use ($n) {
        return str_pad($x, $n, 0);
    }, str_split(implode('', $M(function ($s) {
        return str_pad($s, 8, 0, 0);
    }, $M('decbin', $b))), $n)));
}

예:

> implode(', ',f(array_map('ord',str_split('f0oBaR')),5));
"12, 24, 24, 6, 30, 16, 19, 1, 10, 8"

1
대신을 str_pad($s,8,'0',STR_PAD_LEFT)사용할 수 있습니다 str_pad($s,8,0,0). 당신은에 따옴표를 제거 할 수 있습니다 bindecdecbin4 바이트를 저장합니다. 더 많이 저장하기 위해 array_map변수에 저장 하고 대신 전달할 수 있습니다. 여기 있습니다 : function f($b,$n){$M=array_map;return$M(bindec,$M(function($x)use($n){return str_pad($x,$n,0);},str_split($M('',array_map(function($s){return str_pad($s,8,0,0);},$M(decbin,$b))),5)));}(184 bytes).
Ismael Miguel

덕분에 난 당신이 대체 생각 @IsmaelMiguel implode$M도하지만.
mpen

1
내가한다면 실수 였어 정말 죄송합니다. 그러나 코드의 변형을 좋아해서 기쁩니다.
Ismael Miguel

3

CJam, 30 바이트

{_@{2b8 0e[}%e_0a@*+/-1<{2b}%}

온라인으로 사용해보십시오!

이것은 이름없는 블록으로 int 버퍼와 스택의 청크 양을 예상하고 스택에 결과를 남깁니다.

CJam에게 시도하기로 결정했습니다. 이 작업을 완료하는 데 2 ​​시간 밖에 걸리지 않았습니다. ^^ 이것은 너무 길어, 제안은 매우 환영합니다!

설명

_ e # 청크 카운트 복제
@ e # 회전 스택, 상단에 배열 및 하단에 청크 수
{e # 새 블록을 시작
 2b e # 이진으로 변환
 8 0e [e # 왼쪽에 0을 더하므로 이진수는 8 비트입니다.
} e # 이전 블록 종료
% e #이 블록을 각 배열 요소에 적용합니다 (맵)
e_ e # 평평한 배열
0a e # 단일 0을 가진 배열을 스택에 푸시
@ e # 회전 스택, 스택에 n이 포함됨 n [배열] [0] n
* e # 배열 [0]을 n 번 반복
+ e # 두 배열을 연결
/ e #은 길이 n의 청크로 분할되었으며 이제 스택에는 배열 만 포함됩니다.
-1 <e # 마지막 청크를 버립니다
{2b} % e #는 모든 청크를 다시 십진수로 변환

1. 바이트를 저장 2b8T하지 않고 작성할 수 있습니다 2b8 0(변수 T는으로 사전 초기화 됨 0). 2. 마지막 청크 폐기는 W<(변수 W가로 초기화 됨 -1) 또는 );(마지막 요소를 꺼내서 버릴 수 있음) 수행 할 수 있습니다 .
Esolanging 과일

아래에 알았어요 (25) .
Esolanging 과일

3

자바 스크립트 (ES6) 104

조금씩 반복되는 반복

thx @Neil 저장 5 바이트 편집

(s,g,c=g,t=0)=>(s.map(x=>{for(i=8;i--;--c||(s.push(t),c=g,t=0))t+=t+(x>>i)%2},s=[]),c-g&&s.push(t<<c),s)

덜 골프

( 
 // parameters
 s, // byte source array
 g, // output bit group size
 // default parameters used as locals 
 c = g, // output bit counter
 t = 0  // temp bit accumulator
) => (
  s.map(x => 
    { // for each byte in s
      for(i = 8; // loop for 8 bits
        i--; 
        )
        // loop body
        t += t + (x>>i) % 2, // shift t to left and add next bit
        --c // decrement c,if c==0 add bit group to output and reset count and accumulator
          ||(s.push(t), c=g, t=0)
    }, 
    s=[] // init output, reusing s to avoid wasting another global
  ),
  c-g && s.push(t<<c), // add remaining bits, if any
  s // return result
)

테스트

f=(s,g,c=g,t=0)=>(s.map(x=>{for(i=8;i--;--c||(s.push(t),c=g,t=0))t+=t+(x>>i)%2},s=[]),c-g&&s.push(t<<c),s)

function test()
{
  var a = A.value.match(/\d+/g)||[]
  var g = +G.value
  var r = f(a,g)
  
  O.textContent = r
  K.innerHTML = a.map(x=>`<i>${(256- -x).toString(2).slice(-8)}</i>`).join``
  + '\n'+ r.map(x=>`<i>${(256*256*256*256+x).toString(2).slice(-g)}</i>`).join``
}  

test()
#A { width: 50% }
#G { width: 5% }
i:nth-child(even) { color: #00c }
i:nth-child(odd) { color: #c00 }
Input array <input id=A value="102,48,111,66,97,82">
Group by bits <input id=G value=5> (up to 32)<br>
Output <button onclick="test()">-></button>
<span id=O></span>
<pre id=K></pre>


1
x매번 두 배로 늘리는 대신 x오른쪽 i비트를 바꾸지 않겠습니까?
Neil

@Neil 어 ... 왜 ... 아이디 오시?
edc65

방금 c-g?[...s,t<<c]:s몇 바이트를 더 절약 할 수 있음을 알았습니다 .
Neil


2

J, 24 바이트

[:#.-@[>\;@(_8:{."1#:@])

이것은 익명 함수이며 n왼쪽 인수로 사용됩니다.b 숫자를 오른쪽 인수로 사용합니다.

테스트:

      5 ([:#.-@[>\;@(_8:{."1#:@])) 102 48 111 66 97 82
12 24 24 6 30 16 19 1 10 8

설명:

[:#.-@[>\;@(_8:{."1#:@])

                   #:@]   NB. Convert each number in `b` to bits
            _8:{."1       NB. Take the last 8 items for each
                          NB.    (padding with zeroes at the front)
         ;@               NB. Make a list of all the bits
    -@[                   NB. Negate `n` 
                          NB. (\ gives non-overlapping infixes if [<0)
       >\                 NB. Get non-overlapping n-sized infixes
 [:#.                     NB. Convert those back to decimal 

2

하스켈 112 109 바이트

import Data.Digits
import Data.Lists
n#x=unDigits 2.take n.(++[0,0..])<$>chunksOf n(tail.digits 2.(+256)=<<x)

사용 예 : 5 # [102,48,111,66,97,82]-> [12,24,24,6,30,16,19,1,10,8].

작동 원리

import Data.Digits                  -- needed for base 2 conversion
import Data.Lists                   -- needed for "chunksOf", i.e. splitting in
                                    -- sublists of length n

           (                  =<<x) -- map over the input list and combine the
                                    -- results into a single list:
            tail.digits 2.(+256)    -- convert to base two with exactly 8 digits    
         chunksOf n                 -- split into chunks of length n    
       <$>                          -- convert every chunk (<$> is map)
    take n.(++[0,0..])              -- pad with 0s
unDigits 2                          -- convert from base 2   

2

자바, 313 306 322 바이트

나는 이것이 PHP를 능가하기를 바랍니다 ... 그리고 아닙니다. 멍청한 긴 함수 이름.

@quartata는 @TheCoder 덕분에 스플릿이 정확했을 때 오류를 수정하기 위해 공개 +16을 제거 한 덕분에 -7 덕분에

int[] f(String b,int s){int i=0,o[]=new int[(int)Math.ceil(b.length()*8.0/s)],a=0;String x="",t;for(char c:b.toCharArray()){t=Integer.toString(c,2);while(t.length()<8)t="0"+t;x+=t;a+=8;while(a>=s){o[i++]=Integer.parseInt(x.substring(0,s),2);x=x.substring(s,a);a-=s;}}while(a++<s)x+="0";o[i]=Integer.parseInt(x,2);return o;}

5
나는 당신이 그 기능을 공개해야한다고 생각하지 않습니다.
스파게티

어떤 버전의 Java를 실행 했습니까? 컴파일되지 않는 것 같습니다 : ideone.com/3tonJt
mpen

@mpen 아아! 게시하기 전에 컴퓨터에서 변경 한 것을 잊었습니다. 해결됩니다.
Blue

@JackAmmo yup, 확실했습니다. 바보 같은 작은 전화 키보드.
Blue

o[]=new int[b.length()*8/s+1]-이 경우 잘못된 크기가 할당됩니다.(b.length()*8)%s==0
Coder

2

루비 , 66 바이트

->s,n{(s.unpack('B*')[0]+?0*~-n).scan(/.{#{n}}/).map{|x|x.to_i 2}}

온라인으로 사용해보십시오!

입력 버퍼를 문자열로 사용하여 인쇄 할 수없는 항목을 피하기 위해 바닥 글에 몇 개의 테스트 문자열을 직접 구성했습니다.


2

MATL , 9 바이트

8&B!we!XB

온라인으로 사용해보십시오!

입력을 받아 b문자열로 구분으로 ''또는 추천 쉼표로 구분 된 값의 배열로 [102, 48, 111]한 후, n.

8           # push 8
&B          # implicitly take input b, and use 2-element convert to binary
            # to push a binary matrix of 8 bits
!           # transpose, so each column represents an input
w           # implicitly take input n and swap it with binary matrix to top of stack
e           # reshape into n rows, padding with zeros at end
            # this matrix will have each column as an n-bit integer
!           # transpose, so each row is now the n-bit integer
XB          # convert each row to decimal
            # implicit output

2

펄 5 -nl -MData::Dump=pp , 96 바이트

$}=$_;pp map{$_=sprintf"%-$}s",$_;y/ /0/;oct"0b$_"}(join'',map{sprintf"%08b",$_}<>)=~m/.{1,$_}/g

온라인으로 사용해보십시오!

필요 Data::Dump모듈이 .

소요 n , 입력의 첫 번째 행과 그 후의 각 라인 숫자에.

STDERR (TIO의 디버그 필드)로 출력합니다.

출발 및 정리 :

BEGIN { $/ = "\n"; $\ = "\n"; }
use Data::Dump ( split( /,/, 'pp', 0 ) );
LINE: while ( defined( $_ = readline ARGV ) ) {
    chomp $_;
    $} = $_;
    pp(
        map( {
                $_ = sprintf( "%-$}s", $_ );
                tr/ /0/;
                oct "0b$_";
            } join( '', map( { sprintf '%08b', $_; } readline ARGV ) ) =~
              /.{1,$_}/g )
    );
}

1

Powershell 146 바이트

param([int[]][char[]]$b,$n)-join($b|%{[convert]::ToString($_,2).PadLeft(8,"0")})-split"(.{$n})"|?{$_}|%{[convert]::ToInt32($_.PadRight($n,"0"),2)}

버퍼를 가져 와서 char 배열로 변환 한 다음 정수 배열로 변환하십시오. 이진으로 변환하는 각 항목에 대해 필요한 경우 항목을 0으로 채우고 하나의 큰 문자열로 결합하십시오. 해당 문자열을 n 자로 나누고 작성된 공백을 삭제하십시오. 분할의 각 요소는 채워지고 (마지막 요소 만 실제로 필요함) 다시 정수로 변환됩니다. 출력은 배열입니다


1

파이썬 3.5 - (312) 292 바이트 :

def d(a, b):
    o=[];o+=([str(bin(g)).lstrip('0b')if str(type(g))=="<class 'int'>"else str(bin(ord(g))).lstrip('0b')for g in a]);n=[''.join(o)[i:i+b]for i in range(0,len(''.join(o)),b)];v=[]
    for t in n:
        if len(t)!=b:n[n.index(t)]=str(t)+'0'*(b-len(t))
    v+=([int(str(f),2)for f in n])
    return v

이것이 길지만, 이것은 내 지식으로는 오류없이 함수와 배열을 모두 받아들이고 Python 3.5에서 여전히 약간의 정확성 을 유지할 수있는 가장 짧은 방법 입니다.


1

자바, (253) 247 바이트

골프

int i,l,a[];Integer I;String f="";int[]c(String s,int n){for(char c:s.toCharArray())f+=f.format("%08d",I.parseInt(I.toString(c, 2)));while(((l=f.length())%n)>0)f+="0";for(a=new int[l=l/n];i<l;)a[i]=I.parseInt(f.substring(i*n,i++*n+n),2);return a;}

언 골프

int i,l,a[];
Integer I;
String f="";
int[]c(String s,int n) {
    for(char c:s.toCharArray())
        f+=f.format("%08d",I.parseInt(I.toString(c,2)));
    while(((l=f.length())%n)>0)
        f+="0";
    for(a=new int[l=l/n];i<l;)
        a[i]=I.parseInt(f.substring(i*n,i++*n+n),2);
    return a;
}

c, 2=> c,2; ((l=f.length())%n)>0=> (l=f.length())%n>0;
Zacharý


1

Stax , 12 바이트

è■àåk┘K¥xk└╣

실행 및 디버깅

이것은 챌린지에 지정된 기능이 아니라 stax가 기능을 지원하지 않기 때문에 프로그램입니다. 문자열 또는 배열 리터럴의 입력을 지원합니다.




1

PHP , 135 바이트

function($b,$n){foreach($b as$c)$a.=sprintf('%08b',$c);$d=[];foreach(str_split($a,$n)as$s)$d[]=bindec(sprintf("%0-$n".s,$s));return$d;}

온라인으로 사용해보십시오!

함수로 구현 된 입력 버퍼는 정수 배열이며 정수 배열을 반환합니다.

산출

> b = "f0oBaR", n = 5
[12,24,24,6,30,16,19,1,10,8]

> b = "Hello World", n = 50
[318401791769729,412278856237056]

> b = [1,2,3,4,5], n = 1
[0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1]

모든 테스트 사례 확인


좋은! 내 것보다 훨씬 짧습니다.
mpen

0

APL (NARS), 471 자, 942 바이트

TH←{v←↑⍴⍴⍵⋄v>2:64⋄v=2:32⋄(v=1)∧''≡0↑⍵:20⋄''≡0↑⍵:4⋄v=1:16⋄⍵≢+⍵:8⋄⍵=⌈⍵:2⋄1}
TV←{x←TH¨⍵⋄k←↑x⋄t←↑⍴⍵⋄t=+/x=2:2⋄t=+/x≤2:1⋄(k≤8)∧⍬≡x∼k:k⋄0}
T←{v←↑⍴⍴⍵⋄v>2:64+TV⍵⋄v=2:32+TV⍵⋄(v=1)∧''≡0↑⍵:20⋄''≡0↑⍵:4⋄v=1:16+TV⍵⋄⍵≢+⍵:8⋄⍵=⌈⍵:2⋄1}
RI←{t←T⍵⋄(t≠1)∧(t≠2)∧(t≠17)∧(t≠18):0⋄∧/((1⊃⍺)≤⍵)∧⍵≤(2⊃⍺)}
B←{(8⍴2)⊤⍵}⋄C←{¯1+⎕AV⍳⍵}⋄f←{t←T⍵⋄(0 255 RI⍵)∧18=t:∊B¨⍵⋄(0 255 RI x←C¨⍵)∧20=t:∊B¨x⋄,¯1}⋄W←{((↑⍴⍵)⍴2)⊥⍵}
q←{(∼1 64 RI,⍺)∨2≠T⍺:,¯1⋄x←f⍵⋄¯1=↑x:,¯1⋄t←↑⍴x⋄k←(⍺-m)×0≠m←⍺∣t⋄W⍉((t+k)÷⍺)⍺⍴(((t⍴1),k⍴0)\x)}

주석이 달린 코드 및 테스트 :

  ⍝TH⍵ return type its argument
  TH←{v←↑⍴⍴⍵⋄v>2:64⋄v=2:32⋄(v=1)∧''≡0↑⍵:20⋄''≡0↑⍵:4⋄v=1:16⋄⍵≢+⍵:8⋄⍵=⌈⍵:2⋄1}
  ⍝ TV⍵ check if type each element of array ⍵ is the same and basic 
  ⍝ (float(int and float too),int,char,complex) and return its number (or 0 if it is not basic)
  TV←{x←TH¨⍵⋄k←↑x⋄t←↑⍴⍵⋄t=+/x=2:2⋄t=+/x≤2:1⋄(k≤8)∧⍬≡x∼k:k⋄0}
  ⍝ T⍵ return the type of ⍵ [it would be ok if ⍵ is not a function]
  ⍝|1 Float|2 Int|4 Char|8 Complex,Quaternion or Oction|16 List|32 Matrix|64 Tensor
  ⍝|17 List Float|18 List Int|20 List Char=string|etc
  T←{v←↑⍴⍴⍵⋄v>2:64+TV⍵⋄v=2:32+TV⍵⋄(v=1)∧''≡0↑⍵:20⋄''≡0↑⍵:4⋄v=1:16+TV⍵⋄⍵≢+⍵:8⋄⍵=⌈⍵:2⋄1}
  ⍝ ⍺RI⍵ check if the numeric array ⍵ has elements in [1⊃⍺ 2⊃⍺]; if type is not ok return 0(false)
  RI←{t←T⍵⋄(t≠1)∧(t≠2)∧(t≠17)∧(t≠18):0⋄∧/((1⊃⍺)≤⍵)∧⍵≤(2⊃⍺)}

  B←{(8⍴2)⊤⍵}   ⍝ from decimal to binary of element 0..255
  C←{¯1+⎕AV⍳⍵}   ⍝ return the number of char that is in array AV seems the ascii number
  ⍝ f⍵ with ⍵ List int element in 0..255 or String with numeric element 0..255 
  ⍝ return the corrispondence disclosed binary array 
  f←{t←T⍵⋄(0 255 RI⍵)∧18=t:∊B¨⍵⋄(0 255 RI x←C¨⍵)∧20=t:∊B¨x⋄,¯1}
  W←{((↑⍴⍵)⍴2)⊥⍵} ⍝ from list of binary digit to decimal
  ⍝ the function for the exercise
  q←{(∼1 64 RI,⍺)∨2≠T⍺:,¯1⋄x←f⍵⋄¯1=↑x:,¯1⋄t←↑⍴x⋄k←(⍺-m)×0≠m←⍺∣t⋄W⍉((t+k)÷⍺)⍺⍴(((t⍴1),k⍴0)\x)}


  5 q    'f0oBaR'
12 24 24 6 30 16 19 1 10 8 
  50 q "Hello World"
318401791769729 412278856237056 
  1  q 1 2 3 4 5
0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 
  32 q "codegolf"
1668244581 1735355494 
  7 q "codegolf"
49 91 108 70 43 29 94 108 51 0 
  8 q 2 31 73 127 179 233
2 31 73 127 179 233 
  64 q 2 31 73 127 179 233
1.529217252E17 
  65 q 2 31 73 127 179 233
¯1 
  0 q 2 31 73 127 179 233
¯1 
  23 q '123'
1612057 4194304 
  23 q '123∞'
¯1 
  23 q '1' 2 3
¯1 
  23 q 2 3.3
¯1 
  23 q 2 
¯1 
  23 q '1'
¯1 
  23 q ,2 
65536 
  23 q ,'1'
1605632 

0

엘릭서 , 63 60 바이트

&(s=&2-1)&&for<<x::size(&2)<-<<"#{&1}",0::size(s)>> >>,do: x

온라인으로 사용해보십시오!

입력을 Elixir 이진수로 가져오고 정수 목록을 출력합니다.

이 코드는 Elixir 비트 스트링 생성기 이해를 사용 &1하여 인수로 제공된 크기의 비트 블록으로 입력 바이너리를 청크합니다 &2. 마지막에 남은 비트를 설명하기 위해 바이너리를 &2 - 10 비트로 채 웁니다. 여기에 원치 않는 자세한 표현이 나오는 곳도 있습니다 : Elixir는 명시 적 &1으로 비트 스트링 으로 선언하지 않으면 불평을 하고 size(...), 에서의 표현식도 지원하지 않으므로 추가 변수 할당이 필요합니다.

부활절 달걀 : 바닥 글에 교체 IO.inspectIO.puts, 우리의 기능은 마술 라틴어에서 중국어 로렘 입숨 "변환"을 - 온라인으로보십시오!

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