Dividir uma matriz de bytes em uma matriz de bits


24

Escreva uma função que, quando recebe um buffer b(1 - 104857600 bytes) e um número de bits n(1 <= n <= 64), divide o buffer em pedaços de nbits. Aperte com o botão direito o último pedaço com 0s até nbits.

por exemplo

Dado o buffer b = "f0oBaR"ou equivalentemente [102,48,111,66,97,82]e n = 5, retorne

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

Isso ocorre porque o buffer acima, quando representado como binário, se parece com:

01100110 00110000 01101111 01000010 01100001 01010010

E quando agrupados em 5s se parece com:

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

Que, quando convertido novamente em decimal, fornece a resposta.

Notas

  • Você pode usar qualquer tipo de dado que faça mais sentido no seu idioma para representar o buffer. No PHP você provavelmente usaria uma string, no Node você pode querer usar um Buffer
    • Se você usar uma string para representar o buffer, assuma que seja ASCII para a conversão char -> int
    • Você pode usar uma matriz de entradas (0-255) para entrada, se preferir
  • O valor de retorno deve ser uma matriz ou lista de entradas

Casos de teste

> 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
É suposto funcionar para valores nmaiores que 8? Nesse caso, e quanto a valores nmaiores que 64, maiores que a precisão inteira da maioria dos idiomas.
speedplane 22/03

2
Por que o valor de retorno precisa ser ints ?
Wizzwizz4

2
@ wizzwizz4 Acho que não. Eles não podem ser bytes porque não têm 8 bits. Operadores bit a bit normalmente trabalham com ints e não muito mais. Se você tem uma sugestão melhor, então eu estou ouvindo, mas de outra forma é.
MPEN

3
@ wizzwizz4 Porque eu não quero que as pessoas possam pular um passo. Não quero respostas como "os 5 primeiros bits deste byte contêm a resposta" - o resultado não deve conter informações supérfluas e deve ser facilmente convertido de volta para ASCII ou algum mapeamento de caracteres (um uso na vida real) caso). Além disso, dado o número de respostas até agora, não parece ser um problema.
MPEN

11
@pen Eu vejo a confusão. charé um número inteiro que possui um byte de comprimento.
wizzwizz4

Respostas:


15

Pitão, 18 17 bytes

iR2c.[t.B+C1z\0QQ

Obrigado a @lirtosiast por um byte!

            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

Gelatina, 13 bytes

1;ḅ256æ«BḊsḄṖ

Isso leva a entrada como uma lista de números inteiros. Experimente online!

Como funciona

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

Julia, 117 bytes

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

Esta é uma função que aceita uma matriz inteira e um inteiro e retorna uma matriz inteira. É um exercício de abuso de argumentos de função.

Ungolfed:

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

Por que você o excluiu temporariamente?
CalculatorFeline

@CatsAreFluffy Eu percebi que tinha feito algo errado inicialmente, de modo que funcionou para o caso de teste, mas não necessariamente em geral. Agora deve estar tudo bem agora. :)
Alex A.

5

JavaScript (ES6), 120 bytes

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

Bit recursivo girando em matrizes inteiras. Ungolfed:

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 Eu consegui jogar outros 9 bytes no meu próprio campo de golfe da sua solução, mas ainda são 129 bytes, desculpe:"(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

Tem certeza de que este funciona? A versão não destruída está travando o Chrome.
MPEN

@mpen A versão para golfe definitivamente roda no Firefox. A versão não-gasta pode conter erros.
Neil

Aha! E assim é. Eu pensei que o mecanismo JS do Chrome estava à frente do FF, mas acho que não.
MPEN

11
@mpen Corrigido alguns bugs sutis no meu código não destruído para você.
Neil

5

Python 3, 102 bytes

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]

use o truque iter para agrupar string

  • s: a string / buffer de entrada
  • n: o número de bits em cada pedaço dividido

Resultados

>>> 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]

Você deveria ter documentado seu código para explicar o que os 'n' param fazem?
nullptr

O @nullptr ntem o mesmo significado que a pergunta:splits the buffer into chunks of n bits
Erwan

4

Ruby, 114 bytes

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

Ligeiramente mais limpo:

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

Perl 6, 93 68 bytes

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

3

PHP, 262 217 189 bytes

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

(atualizado com dicas de Ismael Miguel )

Formatado para facilitar a leitura:

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

Exemplo:

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

11
Em vez de str_pad($s,8,'0',STR_PAD_LEFT), você pode usar str_pad($s,8,0,0). Você pode remover as aspas bindece decbinsalvar 4 bytes. Para economizar mais, você pode armazenar array_mapem uma variável e passá-la. Aqui você vai: 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

Obrigado @IsmaelMiguel Eu acho que você substituiu o implodecom $Mtambém.
MPEN

11
Se eu fiz, foi por engano. Eu realmente sinto muito. Mas estou feliz que você tenha gostado da minha variação do seu código.
Ismael Miguel

3

CJam, 30 bytes

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

Experimente online!

Este é um bloco sem nome que espera o buffer int e a quantidade de pedaços na pilha e deixa o resultado na pilha.

Decidiu experimentar CJam. Levei apenas 2 horas para fazer ^ ^ Isso provavelmente é muito longo, sugestões são muito bem-vindas!

Explicação

_ e # duplicar a contagem de pedaços
@ e # rotate stack, array agora no topo e chunk contam na parte inferior
{e # inicie um novo bloco
 2b e # converter para binário
 8 0e [e # adiciona zeros à esquerda, então o binário é 8 bits
} e # end bloco anterior
% e # aplica este bloco a cada elemento da matriz (mapa)
e_ e # achatar matriz
0a e # envia uma matriz com um único zero para a pilha
@ e # rodar pilha, a pilha contém agora n [matriz] [0] n
* e # repita o array [0] n vezes
+ e # concat os dois array
/ e # dividido em pedaços de comprimento n, agora as pilhas contêm apenas a matriz
-1 <e # descarta o último pedaço
{2b}% e # converte cada parte de volta em decimal

1. Você pode escrever em 2b8Tvez de 2b8 0salvar um byte (a variável Té pré-inicializada para 0) 2. O descarte do último bloco pode ser feito com W<(a variável Wé inicializada em -1) ou );(retire o último elemento e descarte-o).
Esolanging Fruit

Reduzi para 25 .
Esolanging Fruit

3

JavaScript (ES6) 104

Iterativo pouco a pouco,

Editar 5 bytes, salvar thx @Neil

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

Menos golfe

( 
 // 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
)

Teste

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>


11
Em vez de dobrar xcada vez, por que não mudar os bits xcertos i?
Neil

@ Neil uh ... por que ... idiotice?
Edc65 22/03

Acabei de perceber que c-g?[...s,t<<c]:svocê pode economizar mais alguns bytes.
Neil

@Neil isso requer alguns pensamentos
edc65

2

J, 24 bytes

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

Esta é uma função anônima, que assume ncomo argumento à esquerda e bem números como argumento à direita.

Teste:

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

Explicação:

[:#.-@[>\;@(_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

Haskell, 112 109 bytes

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

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

Como funciona

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

Java, 313 306 322 bytes

Espero que isso supere o PHP ... E não. Nomes estúpidos de funções longas.

-7 graças a @quartata por se livrar do público +16 para corrigir um erro quando a divisão era exata, graças a @TheCoder por detectá-lo

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
Eu não acho que você precise tornar a função pública.
a spaghetto

Em qual versão do Java você executou isso? Não parece para compilar: ideone.com/3tonJt
MPEN

Ah, ah! Eu esqueci, eu mudei no meu computador antes de postar. Fixará.
Azul

@JackAmmo sim, com certeza. Estúpido teclado de telefone minúsculo.
Azul

o[]=new int[b.length()*8/s+1]- Isso atribuirá tamanho errado Se(b.length()*8)%s==0
The Coder

2

Ruby , 66 bytes

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

Experimente online!

Leva o buffer de entrada como uma sequência, de modo que algumas sequências de teste foram construídas diretamente no rodapé para evitar imprimíveis.


2

MATL , 9 bytes

8&B!we!XB

Experimente online!

Recebe a entrada bcomo uma sequência delimitada por ''ou como uma matriz de valores separados por vírgula como [102, 48, 111], então 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

Perl 5 -nl -MData::Dump=pp , 96 bytes

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

Experimente online!

Requer o Data::Dump módulo.

Toma n na primeira linha de entrada e os números em cada linha depois disso.

Saídas para STDERR (o campo Debug no TIO).

Deparsed e arrumado:

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 bytes

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

Pegue o buffer e converta-o em uma matriz de caracteres e depois em uma matriz inteira. Para cada uma dessas conversões em binário, preencha as entradas com 0, quando necessário, e junte-as como uma sequência grande. Divida a sequência em n caracteres e elimine os espaços em branco criados. Cada elemento da divisão é preenchido (apenas o último elemento realmente precisaria dele) e convertido novamente em um número inteiro. Saída é uma matriz


1

Python 3.5 - 312 292 bytes:

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

Embora isso possa demorar, essa é, no meu conhecimento, a maneira mais curta de aceitar funções e matrizes sem erros e ainda ser capaz de manter alguma precisão no Python 3.5.


1

Java, 253 247 bytes

Golfe

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

UnGolfed

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ý 9/10/19

1

Gelatina , 13 bytes

+256BḊ€Ẏsz0ZḄ

Experimente online!

Diferente da resposta de Dennis.

Nota: A entrada é na verdade uma lista de números inteiros não negativos, mas o link TIO facilita a dor para você e aceita uma lista ou uma string.


1

Stax , 12 bytes

è■àåk┘K¥xk└╣

Execute e depure

Esta não é uma função especificada no desafio, mas um programa, pois o stax não suporta funções. Ele suporta entrada de strings ou literais de array.




1

PHP ,135 129 bytes

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

Experimente online!

Implementado como uma função, o buffer de entrada é uma matriz de entradas e retorna uma matriz de entradas.

Saída

> 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]

Verifique todos os casos de teste


Agradável! Um pouco mais curto que o meu.
mpen 03/04

0

APL (NARS), 471 caracteres, 942 bytes

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

código e teste comentados:

  ⍝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

Elixir , 63 60 bytes

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

Experimente online!

Recebe a entrada como Elixir binário, gera uma lista de números inteiros.

Esse código utiliza a compreensão do gerador de &1bits Elixir para dividir os binários de entrada em blocos de tamanho de bits fornecidos como argumento &2. Para contabilizar os bits restantes no final, preenchemos o binário com &2 - 1zero bits. Aqui também é o local em que ocorre alguma verbosidade indesejada: Elixir reclama se não declararmos explicitamente&1 como bitstring e também não suporta expressões size(...), daí a necessidade de uma atribuição extra de variável.

Ovo de Páscoa: no rodapé, substitua IO.inspectpor IO.putse nossa função "traduz" magicamente Lorem ipsum do latim para o chinês - Experimente on-line!


0

Japonês , 16 bytes

Após um longo dia de reuniões, parece que esqueci como jogar golfe! Vou brincar com isso no trem para casa mais tarde, ver se eu posso melhorar.

c_¤ùT8ÃòV úTV mÍ

Tente

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.