Dividir una matriz de bytes en una matriz de bits


24

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

2
¿Se supone que funciona para valores nsuperiores a 8? Si es así, ¿qué pasa con los valores nsuperiores a 64, que es mayor que la precisión entera de la mayoría de los idiomas?
Speedplane

2
¿Por qué el valor de retorno tiene que ser ints ?
wizzwizz4

2
@ wizzwizz4 No lo creo. No pueden ser bytes porque no tienen 8 bits. Los operadores bit a bit normalmente trabajan en ints y no mucho más. Si tiene una mejor sugerencia, entonces estoy escuchando, pero de lo contrario, lo es.
mpen

3
@ wizzwizz4 Porque no quiero que las personas puedan omitir un paso. No quiero respuestas como "los primeros 5 bits de este byte contienen la respuesta": el resultado no debe contener ninguna información superflua, y debe convertirse fácilmente de nuevo a ASCII o algún mapeo de caracteres (un uso de la vida real- caso). Además, dada la cantidad de respuestas hasta ahora, no parece ser un problema.
mpen

1
@mpen veo la confusión. chares un entero que resulta ser de un byte de largo.
wizzwizz4 23/03/2016

Respuestas:


15

Pyth, 18 17 bytes

iR2c.[t.B+C1z\0QQ

¡Gracias a @lirtosiast por un 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

Jalea, 13 bytes

1;ḅ256æ«BḊsḄṖ

Esto toma la entrada como una lista de enteros. Pruébalo en línea!

Cómo 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 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:

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 qué lo borraste temporalmente?
CalculatorFeline

@CatsAreFluffy Me di cuenta de que había hecho algo mal inicialmente, de modo que funcionó para el caso de prueba, pero no necesariamente en general. Sin embargo, debería estar todo bien ahora. :)
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 que gira en matrices enteras. Sin golf:

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 Logré jugar otros 9 bytes de mi propia solución de golf, pero todavía es 129 bytes, lo siento:"(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

¿Estás seguro de que este corre? La versión no golfista está fallando Chrome.
mpen

@mpen La versión de golf definitivamente se ejecuta en Firefox. La versión sin golf puede tener errores.
Neil

¡Ajá! Y así es. Pensé que el motor JS de Chrome estaba por delante del FF, pero supongo que no.
mpen

1
@mpen Se corrigieron un par de errores sutiles en mi código no protegido por ti.
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 su truco para agrupar cadenas

  • s: la cadena de entrada / buffer
  • n: el número de bits en cada fragmento 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]

Deberías haber documentado tu código para explicar qué hace el 'n' param?
nullptr

@nullptr ntiene el mismo significado que la pregunta:splits the buffer into chunks of n bits
Erwan hace

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}

Ligeramente más limpio:

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]


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

(actualizado con consejos de Ismael Miguel )

Formateado para facilitar la lectura:

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

Ejemplo:

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

1
En lugar de str_pad($s,8,'0',STR_PAD_LEFT), puedes usar str_pad($s,8,0,0). Puede eliminar las comillas bindecy decbinguardar 4 bytes. Para ahorrar más, puede almacenar array_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).
Ismael Miguel

Gracias @IsmaelMiguel Creo que también reemplazaste el implodecon $M.
mpen

1
Si lo hice, fue por error. Lo siento mucho. Pero me alegra que te haya gustado mi variación de tu código.
Ismael Miguel

3

CJam, 30 bytes

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

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 decimal

1. Puede escribir en 2b8Tlugar de 2b8 0guardar un byte (la variable Testá preinicializada en 0) 2. Se puede descartar el último fragmento con W<(la variable Wse inicializa en -1) o );(saque el último elemento y deséchelo).
Esolanging Fruit

Lo bajé a 25 .
Esolanging Fruit

3

JavaScript (ES6) 104

Iterativo poco a poco violín,

Editar 5 bytes guardar 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 golf

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

Prueba

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
En lugar de duplicar xcada vez, ¿por qué no cambiar los bits xcorrectos i?
Neil

@Neil eh ... ¿por qué ... idiotez?
edc65

Acabo de notar que eso c-g?[...s,t<<c]:spodría ahorrarle un par de bytes más.
Neil

@Neil esto requiere algunas reflexiones
edc65

2

J, 24 bytes

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

Esta es una función anónima, que toma n como argumento izquierdo yb como números como argumento derecho.

Prueba:

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

Explicación:

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

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

Cómo 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 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

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

55
No creo que tengas que hacer pública la función.
un spaghetto

¿En qué versión de Java ejecutó esto? No parece compilar: ideone.com/3tonJt
mpen

@mpen Ah, whoops. Lo olvidé, lo cambié en mi computadora antes de publicar. Arreglará.
Azul

@JackAmmo, sí, claro que sí. Estúpido pequeño teclado de teléfono.
Azul

o[]=new int[b.length()*8/s+1]- Esto asignará un tamaño incorrecto Si(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}}

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.


2

MATL , 9 bytes

8&B!we!XB

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

Prué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:

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

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


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

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.


1

Java, 253 247 bytes

Golfed

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

Sin golf

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

Jalea , 13 bytes

+256BḊ€Ẏsz0ZḄ

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.


1

Stax , 12 bytes

è■àåk┘K¥xk└╣

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.




1

Elixir , 63 60 bytes

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

Prué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 expresiones size(...), de ahí la necesidad de una asignación de variable adicional.

Huevo de Pascua: en el pie de página, reemplácelo IO.inspectcon IO.puts, y nuestra función "traduce" mágicamente Lorem ipsum del latín al chino. ¡ Pruébelo en línea!


1

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.

c_¤ùT8ÃòV úTV mÍ

Intentalo


¿Estás diciendo que son 16 bytes si lo codificas IEC 8859-1? ¿Eso es legal? ¿Encontraste una escapatoria? ¿No especificaron que tiene que ser UTF-8? Porque son 22 bytes de UTF-8.
mpen hace

@mpen 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.
Shaggy hace

No estoy tratando de imponer nada, solo quería saber si esto fue generalmente aceptado, y parece que tienes toda la razón codegolf.meta.stackexchange.com/a/17800/23090 TIO puntajes Japt de la misma manera, eso podría ser una manera más fácil de calificarlo tio.run/##y0osKPn/Pzn@0JLDO0MsDjcf3hSmcHhXSJhC7uHe//8B edit 3: oh, tu enlace es bastante TIO.
mpen hace

1

PHP ,135 129 129 124 bytes

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

Prué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

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

Verificar todos los casos de prueba


¡Agradable! Bastante más corto que el mío.
mpen

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 comentado y prueba:

  ⍝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 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.