Dividi un array di byte in un array di bit


24

Scrivi una funzione che quando viene dato un buffer b(lungo 1 - 104857600 byte) e un numero di bit n(1 <= n <= 64), divide il buffer in blocchi di nbit. Pad destro dell'ultimo pezzo con 0s fino a nbit.

per esempio

Dato il buffer b = "f0oBaR"o equivalentemente [102,48,111,66,97,82]e n = 5, restituire

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

Questo perché il buffer sopra, quando rappresentato come binario assomiglia a:

01100110 00110000 01101111 01000010 01100001 01010010

E quando riorganizzato in 5s appare come:

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

Che quando convertito nuovamente in decimale dà la risposta.

Gli appunti

  • È possibile utilizzare qualunque tipo di dato abbia più senso nella propria lingua per rappresentare il buffer. In PHP probabilmente useresti una stringa, in Node potresti voler usare un Buffer
    • Se usi una stringa per rappresentare il buffer, supponi che sia ASCII per la conversione char -> int
    • Se si preferisce, è possibile utilizzare una matrice di ints (0-255) per l'input
  • Il valore di ritorno deve essere un array o un elenco di ints

Casi test

> 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
Dovrebbe funzionare per valori nsuperiori a 8? In tal caso, che dire dei valori nmaggiori di 64, che è maggiore della precisione intera della maggior parte del linguaggio.
speedplane il

2
Perché il valore restituito deve essere ints ?
wizzwizz4,

2
@ wizzwizz4 Non credo. Non possono essere byte perché non hanno 8 bit. Gli operatori bit a bit normalmente lavorano su ints e non molto altro. Se hai un suggerimento migliore, allora sto ascoltando, ma per il resto lo è.
mpen

3
@ wizzwizz4 Perché non voglio che le persone possano saltare un passo. Non voglio risposte come "i primi 5 bit di questo byte contengono la risposta" - il risultato non dovrebbe contenere alcuna informazione superflua e dovrebbe essere facilmente riconvertito in ASCII o in qualche mappatura dei caratteri (un uso reale- Astuccio). Inoltre, dato il numero di risposte finora, non sembra essere un problema.
aprono il

1
@mpen vedo la confusione. charè un numero intero che sembra essere lungo un byte.
wizzwizz4,

Risposte:


15

Pyth, 18 17 byte

iR2c.[t.B+C1z\0QQ

Grazie a @lirtosiast per 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

Gelatina, 13 byte

1;ḅ256æ«BḊsḄṖ

Questo accetta l'input come un elenco di numeri interi. Provalo online!

Come funziona

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 byte

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

Questa è una funzione che accetta un array intero e un intero e restituisce un array intero. È un esercizio di abuso di argomenti di funzione.

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

Perché l'hai eliminato temporaneamente?
CalculatorFeline

@CatsAreFluffy Mi sono reso conto di aver fatto inizialmente qualcosa di sbagliato in modo tale che funzionasse per il caso di prova ma non sarebbe necessariamente in generale. Ora dovrebbe andare tutto bene. :)
Alex A.

5

JavaScript (ES6), 120 byte

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 ricorsivo che regola le matrici di numeri interi. 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 Sono riuscito a golf altri 9 byte dal mio golf della tua soluzione, ma sono ancora 129 byte, scusa:"(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

Sei sicuro che questo funzioni? Chrome non funziona con la versione non golfata.
aprono il

@mpen La versione golfizzata funziona sicuramente su Firefox. La versione non registrata potrebbe contenere errori.
Neil,

Aha! E così fa. Pensavo che il motore JS di Chrome fosse davanti a quello di FF, ma credo di no.
aprono il

1
@mpen Risolti un paio di bug sottili nel mio codice ungolfed per te.
Neil,

5

Python 3, 102 byte

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]

usa un trucco per raggruppare la stringa

  • s: la stringa / buffer di input
  • n: il numero di bit in ciascun blocco suddiviso

risultati

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

Avresti dovuto documentare il tuo codice per spiegare cosa fa 'n' param?
nullptr

@nullptr nha lo stesso significato della domanda:splits the buffer into chunks of n bits
Erwan

4

Rubino, 114 byte

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

Leggermente più pulito:

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 byte

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

(aggiornato con i suggerimenti di Ismael Miguel )

Formattato per la leggibilità:

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

Esempio:

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

1
Invece di str_pad($s,8,'0',STR_PAD_LEFT), puoi usare str_pad($s,8,0,0). È possibile rimuovere le virgolette su bindece decbinsalvare 4 byte. Per salvare di più, puoi archiviare array_mapin una variabile e passarla invece. Ecco qua: 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 byte).
Ismael Miguel,

Grazie @IsmaelMiguel Penso che è stato sostituito il implodecon $Mtroppo però.
aprono il

1
Se l'ho fatto, è stato per errore. Sono davvero dispiaciuto. Ma sono contento che ti sia piaciuta la mia variazione del tuo codice.
Ismael Miguel,

3

CJam, 30 byte

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

Provalo online!

Questo è un blocco senza nome che prevede il buffer int e la quantità di blocchi nello stack e lascia il risultato nello stack.

Ho deciso di provare CJam. Mi ci sono volute solo 2 ore per farlo ^^ Questo è probabilmente troppo lungo, i suggerimenti sono i benvenuti!

Spiegazione

_ e # duplica il conteggio dei blocchi
@ e # ruota lo stack, l'array ora in alto e il conteggio dei pezzi in basso
{e # avvia un nuovo blocco
 2b e # converti in binario
 8 0e [e # aggiunge zeri a sinistra, quindi il binario è di 8 bit
} e # termina il blocco precedente
% e # applica questo blocco a ciascun elemento dell'array (mappa)
e_ e # flatten array
0a e # spinge un array con un singolo zero nello stack
@ e # ruota lo stack, lo stack contiene ora n [array] [0] n
* e # ripete l'array [0] n volte
+ e # concatena i due array
/ e # diviso in blocchi di lunghezza n, ora le pile contengono solo l'array
-1 <e # scarta l'ultimo blocco
{2b}% e # converte ogni blocco in decimale

1. È possibile scrivere 2b8Tanziché 2b8 0salvare un byte (la variabile Tè preinizializzata in 0) 2. Scartare l'ultimo blocco può essere fatto con W<(la variabile Wè inizializzata su -1) o );(estrarre l'ultimo elemento e scartarlo).
Esolanging Fruit,

Sono arrivato a 25 .
Esolanging Fruit,

3

JavaScript (ES6) 104

Iterativo poco a poco giocherellando,

Modifica 5 byte salva 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)

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

Test

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
Invece di raddoppiare xogni volta, perché non spostare i bit xgiusti i?
Neil,

@Neil uh ... perché ... idiozia?
edc65,

Ho appena notato che c-g?[...s,t<<c]:spotrebbe salvarti un altro paio di byte.
Neil,

@Neil questo richiede alcuni pensieri
edc65

2

J, 24 byte

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

Questa è una funzione anonima, che assume ncome argomento di sinistra e bnumeri come argomento di destra.

Test:

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

Spiegazione:

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

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

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

Come funziona

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 byte

Spero che questo superi PHP ... E no. Stupidi nomi di funzioni lunghe.

-7 grazie a @quartata per sbarazzarsi del pubblico +16 per correggere un errore quando la divisione era esatta, grazie a @TheCoder per averlo scoperto

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
Non penso che tu debba rendere pubblica la funzione.
uno spaghetto il

In quale versione di Java hai eseguito questo? Non sembra compilare: ideone.com/3tonJt
mpen

@mpen Ah, whoops. Ho dimenticato, l'ho cambiato sul mio computer prima di pubblicare. Risolverà.
Blue

@JackAmmo sì, certo. Stupida tastiera per telefono minuscola.
Blue

o[]=new int[b.length()*8/s+1]- Questo assegnerà dimensioni errate Se(b.length()*8)%s==0
The Coder

2

Rubino , 66 byte

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

Provalo online!

Prende il buffer di input come una stringa, in modo che alcune stringhe di test siano state costruite direttamente nel piè di pagina per evitare non stampabili.


2

MATL , 9 byte

8&B!we!XB

Provalo online!

Prende l'input bcome una stringa delimitata da ''o come una matrice di valori separati da virgola come [102, 48, 111], quindi 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 byte

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

Provalo online!

Richiede il Data::Dump modulo.

Prende n la prima riga di input e i numeri su ciascuna riga successiva.

Output su STDERR (il campo Debug su TIO).

Deparato e riordinato:

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 byte

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

Prendi il buffer e convertilo in un array di caratteri e quindi in un array intero. Per ognuno di quelli convertiti in binario, riempire le voci con 0 dove necessario e unirle come una stringa grande. Dividi quella stringa su n caratteri e rilascia gli spazi vuoti che vengono creati. Ogni elemento della divisione viene imbottito (solo l'ultimo elemento ne avrebbe davvero bisogno) e convertito nuovamente in un numero intero. L'output è un array


1

Python 3.5 - 312 292 byte:

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

Anche se questo può essere lungo, questo è, a mia conoscenza, il modo più breve per accettare sia le funzioni che le matrici senza errori e riuscire comunque a mantenere una certa precisione in Python 3.5.


1

Java, 253 247 byte

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

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ý,

1

Gelatina , 13 byte

+256BḊ€Ẏsz0ZḄ

Provalo online!

Diverso dalla risposta di Dennis.

Nota: l'input è in realtà un elenco di numeri interi non negativi, ma il collegamento TIO allevia il dolore per te e accetta tale elenco o una stringa.


1

Stax , 12 byte

è■àåk┘K¥xk└╣

Esegui ed esegui il debug

Questa non è una funzione come specificato nella sfida, ma un programma, poiché stax non supporta le funzioni. Supporta input di stringhe o valori letterali di array.




1

Elisir , 63 60 byte

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

Provalo online!

Accetta input come binario Elixir, genera un elenco di numeri interi.

Questo codice utilizza la comprensione del generatore di bitstring di elisir per inserire binario di input binario &1in blocchi di bit di dimensioni forniti come argomento &2. Per tenere conto di eventuali bit rimanenti alla fine, riempiamo il binario di &2 - 1zero bit. Ecco anche il luogo in cui entrano in gioco alcune verbosità indesiderate: l'elisir si lamenta se non dichiariamo esplicitamente &1come bittring e inoltre non supporta le espressioni insize(...) , quindi la necessità di un'assegnazione variabile aggiuntiva.

Uovo di Pasqua: a piè di pagina, sostituiscilo IO.inspectcon IO.putse la nostra funzione "traduce" magicamente Lorem ipsum dal latino al cinese - Provalo online!


1

Japt , 16 byte

Dopo una lunga giornata di incontri, mi sento come se avessi dimenticato come giocare a golf! Giocherò con questo sul treno verso casa più tardi, vedo se riesco a migliorarlo.

c_¤ùT8ÃòV úTV mÍ

Provalo


Stai dicendo che sono 16 byte se lo codifichi IEC 8859-1? È legale? Hai trovato una scappatoia? Non hanno specificato che deve essere UTF-8? Perché sono 22 byte di UTF-8.
mpen

@mpen 1.Ogni lingua è libera di usare la propria codifica / codepage. 2.ISO-8859-1 è una codifica abbastanza standard utilizzata da molte lingue e non particolare per Japt, o questa soluzione specifica. 3.Il tuo spec non afferma che noi dobbiamo contare in UTF-8. 4.Se così fosse, ne saresti fortemente scoraggiato.
Shaggy

Non sto cercando di imporre nulla, volevo solo sapere se questo era generalmente accettato, e sembra che tu abbia ragione codegolf.meta.stackexchange.com/a/17800/23090 punteggi TIO Japt allo stesso modo, che potrebbe essere un modo più semplice per qualificarlo tio.run/##y0osKPn/Pzn@0JLDO0MsDjcf3hSmcHhXSJhC7uHe//8B modifica 3: oh il tuo link è praticamente TIO.
mpen

1

PHP ,135 129 124 byte

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

Provalo online!

Implementato come una funzione, il buffer di input è un array di ints e restituisce un array di ints.

Produzione

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

Verifica tutti i casi di test


Bello! Abbastanza un po 'più corto del mio.
Aprire il

0

APL (NARS), 471 caratteri, 942 byte

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

codice commentato e test:

  ⍝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 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.