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 n
bits. Aperte com o botão direito o último pedaço com 0
s até n
bits.
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
n
maiores que 8? Nesse caso, e quanto a valoresn
maiores que 64, maiores que a precisão inteira da maioria dos idiomas.char
é um número inteiro que possui um byte de comprimento.Respostas:
Pitão,
1817 bytesObrigado a @lirtosiast por um byte!
fonte
Gelatina, 13 bytes
Isso leva a entrada como uma lista de números inteiros. Experimente online!
Como funciona
fonte
Julia, 117 bytes
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:
fonte
JavaScript (ES6), 120 bytes
Bit recursivo girando em matrizes inteiras. Ungolfed:
fonte
"(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
Python 3, 102 bytes
use o truque iter para agrupar string
s
: a string / buffer de entradan
: o número de bits em cada pedaço divididoResultados
fonte
n
tem o mesmo significado que a pergunta:splits the buffer into chunks of n bits
Ruby, 114 bytes
Ligeiramente mais limpo:
fonte
Perl 6,
9368 bytesfonte
PHP,
262217189 bytes(atualizado com dicas de Ismael Miguel )
Formatado para facilitar a leitura:
Exemplo:
fonte
str_pad($s,8,'0',STR_PAD_LEFT)
, você pode usarstr_pad($s,8,0,0)
. Você pode remover as aspasbindec
edecbin
salvar 4 bytes. Para economizar mais, você pode armazenararray_map
em 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).implode
com$M
também.CJam, 30 bytes
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
fonte
2b8T
vez de2b8 0
salvar um byte (a variávelT
é pré-inicializada para0
) 2. O descarte do último bloco pode ser feito comW<
(a variávelW
é inicializada em-1
) ou);
(retire o último elemento e descarte-o).JavaScript (ES6) 104
Iterativo pouco a pouco,
Editar 5 bytes, salvar thx @Neil
Menos golfe
Teste
fonte
x
cada vez, por que não mudar os bitsx
certosi
?c-g?[...s,t<<c]:s
você pode economizar mais alguns bytes.J, 24 bytes
Esta é uma função anônima, que assume
n
como argumento à esquerda eb
em números como argumento à direita.Teste:
Explicação:
fonte
Haskell,
112109 bytesExemplo de uso:
5 # [102,48,111,66,97,82]
->[12,24,24,6,30,16,19,1,10,8]
.Como funciona
fonte
Java,
313306322 bytesEspero 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
fonte
o[]=new int[b.length()*8/s+1]
- Isso atribuirá tamanho errado Se(b.length()*8)%s==0
Ruby , 66 bytes
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.
fonte
MATL , 9 bytes
Experimente online!
Recebe a entrada
b
como uma sequência delimitada por''
ou como uma matriz de valores separados por vírgula como[102, 48, 111]
, entãon
.fonte
Perl 5
-nl -MData::Dump=pp
, 96 bytesExperimente 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:
fonte
Powershell 146 bytes
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
fonte
Python 3.5 -
312292 bytes: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.
fonte
Java,
253247 bytesGolfe
UnGolfed
fonte
c, 2
=>c,2
;((l=f.length())%n)>0
=>(l=f.length())%n>0
;Gelatina , 13 bytes
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.
fonte
Stax , 12 bytes
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.
fonte
Python 2 , 101 bytes
Experimente online!
fonte
Dyalog APL , 36 bytes
Experimente online!
Provavelmente isso poderia ser jogado mais para baixo.
fonte
PHP ,
135129 bytesExperimente online!
Implementado como uma função, o buffer de entrada é uma matriz de entradas e retorna uma matriz de entradas.
Saída
Verifique todos os casos de teste
fonte
APL (NARS), 471 caracteres, 942 bytes
código e teste comentados:
fonte
Elixir ,
6360 bytesExperimente 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
&1
bits 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 - 1
zero 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õessize(...)
, daí a necessidade de uma atribuição extra de variável.Ovo de Páscoa: no rodapé, substitua
IO.inspect
porIO.puts
e nossa função "traduz" magicamente Lorem ipsum do latim para o chinês - Experimente on-line!fonte
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.
Tente
fonte