Escriba una función que cuando se le da un búfer b(1 - 104857600 bytes de longitud) y una cantidad de bits n(1 <= n <= 64), divide el búfer en trozos de nbits. Rellene el último fragmento con 0s hasta nbits.
p.ej
Dado el búfer b = "f0oBaR"o equivalente [102,48,111,66,97,82]y n = 5, volver
[12, 24, 24, 6, 30, 16, 19, 1, 10, 8]
Esto se debe a que el búfer anterior, cuando se representa como binario, se ve así:
01100110 00110000 01101111 01000010 01100001 01010010
Y cuando se reagrupa en 5s se ve así:
01100 11000 11000 00110 11110 10000 10011 00001 01010 010[00]
Que cuando se convierte de nuevo a decimal da la respuesta.
Notas
- Puede usar cualquier tipo de datos que tenga más sentido en su idioma para representar el búfer. En PHP, probablemente usaría una cadena, en Node es posible que desee usar un Buffer
- Si usa una cadena para representar el búfer, suponga que es ASCII para la conversión char -> int
- Puede usar una matriz de entradas (0-255) para entrada si lo prefiere
- El valor de retorno debe ser una matriz o una lista de entradas
Casos de prueba
> 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

nsuperiores a 8? Si es así, ¿qué pasa con los valoresnsuperiores a 64, que es mayor que la precisión entera de la mayoría de los idiomas?chares un entero que resulta ser de un byte de largo.Respuestas:
Pyth,
1817 bytes¡Gracias a @lirtosiast por un byte!
fuente
Jalea, 13 bytes
Esto toma la entrada como una lista de enteros. Pruébalo en línea!
Cómo funciona
fuente
Julia, 117 bytes
Esta es una función que acepta una matriz de enteros y un entero y devuelve una matriz de enteros. Es un ejercicio de abuso de argumentos de función.
Sin golf:
fuente
JavaScript (ES6), 120 bytes
Bit recursivo que gira en matrices enteras. Sin golf:
fuente
"(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}`)".lengthPython 3, 102 bytes
use su truco para agrupar cadenas
s: la cadena de entrada / buffern: el número de bits en cada fragmento divididoResultados
fuente
ntiene el mismo significado que la pregunta:splits the buffer into chunks of n bitsRuby, 114 bytes
Ligeramente más limpio:
fuente
Perl 6,
9368 bytesfuente
PHP
262217189 bytes(actualizado con consejos de Ismael Miguel )
Formateado para facilitar la lectura:
Ejemplo:
fuente
str_pad($s,8,'0',STR_PAD_LEFT), puedes usarstr_pad($s,8,0,0). Puede eliminar las comillasbindecydecbinguardar 4 bytes. Para ahorrar más, puede almacenararray_mapen una variable y pasarla en su lugar. Aquí tienes: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).implodecon$M.CJam, 30 bytes
Pruébalo en línea!
Este es un bloque sin nombre que espera el búfer int y la cantidad de fragmentos en la pila y deja el resultado en la pila.
Decidí darle una oportunidad a CJam. Solo me tomó 2 horas terminarlo ^^ Esto probablemente sea demasiado largo, ¡las sugerencias son bienvenidas!
Explicación
_ e # duplicar el recuento de fragmentos @ e # rotate stack, array ahora en la parte superior y trozos en la parte inferior {e # comienza un nuevo bloque 2b e # convertir a binario 8 0e [e # agrega ceros a la izquierda, entonces el binario es de 8 bits } e # finaliza el bloque anterior % e # aplica este bloque a cada elemento de matriz (mapa) e_ e # aplanar matriz 0a e # empuja una matriz con un solo cero a la pila @ e # rotar pila, la pila contiene ahora n [matriz] [0] n * e # repite la matriz [0] n veces + e # concat las dos matrices / e # dividido en trozos de longitud n, ahora las pilas solo contienen la matriz -1 <e # descarta el último fragmento {2b}% e # convierte cada fragmento de nuevo a decimalfuente
2b8Tlugar de2b8 0guardar un byte (la variableTestá preinicializada en0) 2. Se puede descartar el último fragmento conW<(la variableWse inicializa en-1) o);(saque el último elemento y deséchelo).JavaScript (ES6) 104
Iterativo poco a poco violín,
Editar 5 bytes guardar thx @Neil
Menos golf
Prueba
fuente
xcada vez, ¿por qué no cambiar los bitsxcorrectosi?c-g?[...s,t<<c]:spodría ahorrarle un par de bytes más.J, 24 bytes
Esta es una función anónima, que toma
ncomo argumento izquierdo ybcomo números como argumento derecho.Prueba:
Explicación:
fuente
Haskell
112109 bytesEjemplo de uso:
5 # [102,48,111,66,97,82]->[12,24,24,6,30,16,19,1,10,8].Cómo funciona
fuente
Java,
313306322 bytesEspero que esto supere a PHP ... Y no. Estúpidos nombres largos de funciones.
-7 gracias a @quartata por deshacerse del público +16 para corregir un error cuando la división fue exacta, gracias a @TheCoder por detectarlo
fuente
o[]=new int[b.length()*8/s+1]- Esto asignará un tamaño incorrecto Si(b.length()*8)%s==0Ruby , 66 bytes
Pruébalo en línea!
Toma el búfer de entrada como una cadena, de modo que se construyeron algunas cadenas de prueba directamente en el pie de página para evitar que no se puedan imprimir.
fuente
MATL , 9 bytes
Pruébalo en línea!
Toma la entrada
bcomo una cadena delimitada por''o como una matriz de valores separados por comas como[102, 48, 111], entoncesn.fuente
Perl 5
-nl -MData::Dump=pp, 96 bytesPruébalo en línea!
Requiere el
Data::Dumpmódulo.Toma
nla primera línea de entrada y los números en cada línea después de eso.Salidas a STDERR (el campo Debug en TIO).
Despachado y ordenado:
fuente
Powershell 146 bytes
Tome el búfer y conviértalo en una matriz de caracteres y luego en una matriz de enteros. Para cada uno de los convertidos a binario, rellene las entradas con 0 cuando sea necesario y únase como una cadena grande. Divida esa cadena en n caracteres y suelte los espacios en blanco que se crean. Cada elemento de la división se rellena (solo el último elemento realmente lo necesitaría) y se convierte de nuevo en un número entero. La salida es una matriz
fuente
Python 3.5 -
312292 bytes:Aunque esto puede ser largo, esta es, según mi conocimiento, la forma más corta de aceptar funciones y matrices sin errores, y aún así poder mantener cierta precisión en Python 3.5.
fuente
Java,
253247 bytesGolfed
Sin golf
fuente
c, 2=>c,2;((l=f.length())%n)>0=>(l=f.length())%n>0;Jalea , 13 bytes
Pruébalo en línea!
Diferente de la respuesta de Dennis.
Nota: La entrada es en realidad una lista de enteros no negativos, pero el enlace TIO alivia el dolor por usted y acepta dicha lista o una cadena.
fuente
Stax , 12 bytes
Ejecutar y depurarlo
Esta no es una función como se especifica en el desafío, sino un programa, ya que stax no admite funciones. Admite la entrada de cadenas o literales de matriz.
fuente
Python 2 , 101 bytes
Pruébalo en línea!
fuente
Dyalog APL , 36 bytes
Pruébalo en línea!
Esto probablemente podría jugar más golf.
fuente
Elixir ,
6360 bytesPruébalo en línea!
Toma la entrada como binario Elixir, emite una lista de enteros.
Este código hace uso de la comprensión del generador de cadenas de bits Elixir para fragmentar la entrada binaria
&1en bloques de bits de tamaño proporcionados como argumento&2. Para tener en cuenta los bits restantes al final, rellenamos el binario con&2 - 1cero bits. Aquí también es el lugar donde entra en&1juego una verbosidad no deseada: Elixir se queja si no declaramos explícitamente como cadena de bits, y tampoco admite expresionessize(...), de ahí la necesidad de una asignación de variable adicional.Huevo de Pascua: en el pie de página, reemplácelo
IO.inspectconIO.puts, y nuestra función "traduce" mágicamente Lorem ipsum del latín al chino. ¡ Pruébelo en línea!fuente
Japt , 16 bytes
¡Después de un largo día de reuniones, parece que he olvidado cómo jugar golf! Jugaré con esto en el tren a casa más tarde, veré si puedo mejorarlo.
Intentalo
fuente
IEC 8859-1? ¿Eso es legal? ¿Encontraste una escapatoria? ¿No especificaron que tiene que ser UTF-8? Porque son 22 bytes de UTF-8.1.Cada idioma es libre de usar su propia codificación / página de códigos.2.ISO-8859-1 es una codificación bastante estándar utilizada por muchos idiomas y no es específica de Japt o de esta solución específica.3.Su especificación no indica que debemos contar en UTF-8.4.Si lo hiciera, te habrías desanimado fuertemente.PHP ,
135129 129124 bytesPruébalo en línea!
Implementado como una función, el búfer de entrada es una matriz de entradas y devuelve una matriz de entradas.
Salida
Verificar todos los casos de prueba
fuente
APL (NARS), 471 caracteres, 942 bytes
código comentado y prueba:
fuente