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 n
bits. Rellene el último fragmento con 0
s hasta n
bits.
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
n
superiores a 8? Si es así, ¿qué pasa con los valoresn
superiores a 64, que es mayor que la precisión entera de la mayoría de los idiomas?char
es 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}`)".length
Python 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
n
tiene el mismo significado que la pregunta:splits the buffer into chunks of n bits
Ruby, 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 comillasbindec
ydecbin
guardar 4 bytes. Para ahorrar más, puede almacenararray_map
en 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).implode
con$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
fuente
2b8T
lugar de2b8 0
guardar un byte (la variableT
está preinicializada en0
) 2. Se puede descartar el último fragmento conW<
(la variableW
se 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
x
cada vez, ¿por qué no cambiar los bitsx
correctosi
?c-g?[...s,t<<c]:s
podría ahorrarle un par de bytes más.J, 24 bytes
Esta es una función anónima, que toma
n
como argumento izquierdo yb
como 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==0
Ruby , 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
b
como 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::Dump
módulo.Toma
n
la 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
&1
en bloques de bits de tamaño proporcionados como argumento&2
. Para tener en cuenta los bits restantes al final, rellenamos el binario con&2 - 1
cero bits. Aquí también es el lugar donde entra en&1
juego 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.inspect
conIO.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