Teilen Sie ein Byte-Array in ein Bit-Array auf

24

Schreiben Sie eine Funktion, die bei Angabe eines Puffers b(1 - 104857600 Byte lang) und einer Anzahl von Bits n(1 <= n <= 64) den Puffer in Bitblöcke aufteilt n. Füllen Sie den letzten Block mit 0s bis zu nBits mit der rechten Maustaste aus.

z.B

Geben Sie den Puffer b = "f0oBaR"oder äquivalent [102,48,111,66,97,82]und n = 5zurück

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

Dies liegt daran, dass der obige Puffer, wenn er als Binärdatei dargestellt wird, folgendermaßen aussieht:

01100110 00110000 01101111 01000010 01100001 01010010

Und wenn in 5s neu gruppiert sieht das so aus:

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

Welches, wenn es zurück in Dezimalzahl umgewandelt wird, die Antwort gibt.

Anmerkungen

  • Sie können jeden Datentyp verwenden, der in Ihrer Sprache am sinnvollsten ist, um den Puffer darzustellen. In PHP würden Sie wahrscheinlich eine Zeichenfolge verwenden, in Node möchten Sie möglicherweise einen Puffer verwenden
    • Wenn Sie eine Zeichenfolge zur Darstellung des Puffers verwenden, nehmen Sie an, dass es sich bei der Konvertierung char -> int um ASCII handelt
    • Sie können ein Array von Ints (0-255) für die Eingabe verwenden, wenn Sie dies vorziehen
  • Der Rückgabewert muss ein Array oder eine Liste von Ints sein

Testfälle

> 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
mpen
quelle
2
Soll es für Werte ngrößer als 8 funktionieren ? Wenn ja, was ist mit Werten ngrößer als 64, was größer ist als die Ganzzahlgenauigkeit der meisten Sprachen?
Speedplane
2
Warum muss der Rückgabewert ints sein ?
wizzwizz4
2
@ wizzwizz4 Das glaube ich nicht. Sie können keine Bytes sein, da sie keine 8 Bits haben. Bitweise Operatoren arbeiten normalerweise mit Ints und nicht viel anderem. Wenn Sie einen besseren Vorschlag haben, dann höre ich, aber ansonsten ist es ints.
Mpen
3
@ wizzwizz4 Weil ich nicht möchte, dass Leute einen Schritt überspringen können. Ich möchte keine Antworten wie "Die ersten 5 Bits dieses Bytes enthalten die Antwort" - das Ergebnis sollte keine überflüssigen Informationen enthalten, und es sollte leicht wieder in ASCII oder eine Zeichenabbildung konvertiert werden können (eine reale Verwendung). Fall). Angesichts der Anzahl der Antworten scheint dies auch kein Problem zu sein.
Mpen
1
@mpen Ich sehe die Verwirrung. charist eine ganze Zahl , die zufällig ein Byte lang ist.
wizzwizz4

Antworten:

15

Pyth, 18 17 Bytes

iR2c.[t.B+C1z\0QQ

Danke an @lirtosiast für ein 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))
Türknauf
quelle
13

Jelly, 13 Bytes

1;ḅ256æ«BḊsḄṖ

Dies nimmt die Eingabe als eine Liste von ganzen Zahlen. Probieren Sie es online!

Wie es funktioniert

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).
Dennis
quelle
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])

Dies ist eine Funktion, die ein Ganzzahl-Array und eine Ganzzahl akzeptiert und ein Ganzzahl-Array zurückgibt. Es ist eine Übung zum Missbrauch von Funktionsargumenten.

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
Alex A.
quelle
Warum haben Sie es vorübergehend gelöscht?
CalculatorFeline
@CatsAreFluffy Ich stellte fest, dass ich anfangs etwas falsch gemacht hatte, sodass es für den Testfall funktionierte, aber nicht unbedingt im Allgemeinen. Sollte jetzt aber alles gut sein. :)
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])

Rekursives Bit-Twiddling auf Integer-Arrays. 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;
        }
    }
}
Neil
quelle
@WashingtonGuedes Ich habe es geschafft, weitere 9 Bytes von meinem eigenen Golf Ihrer Lösung abzuspielen, aber es sind immer noch 129 Bytes, sorry:"(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
Bist du sicher, dass dieser läuft? Die ungolfed Version stürzt Chrome ab.
Mpen
@mpen Die Golfversion läuft definitiv auf Firefox. Die ungolfed Version kann Fehler enthalten.
Neil
Aha! Und so ist es auch. Ich dachte, die JS-Engine von Chrome wäre der von FF voraus, aber ich denke nicht.
Mpen
1
@mpen Einige subtile Fehler in meinem ungolfed Code wurden für Sie behoben.
Neil
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}

Etwas sauberer:

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]
ängstlich
quelle
4

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]

Verwenden Sie den Iter-Trick , um die Zeichenfolge zu gruppieren

Ergebnisse

>>> 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]
Erwan
quelle
4

Perl 6, 93 68 Bytes

{@^a».&{sprintf "%08b",$_}.join.comb($^b)».&{:2($_~0 x$b-.chars)}}
Hotkeys
quelle
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)));}

(aktualisiert mit Tipps von Ismael Miguel )

Zur besseren Lesbarkeit formatiert:

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

Beispiel:

> implode(', ',f(array_map('ord',str_split('f0oBaR')),5));
"12, 24, 24, 6, 30, 16, 19, 1, 10, 8"
mpen
quelle
1
Stattdessen str_pad($s,8,'0',STR_PAD_LEFT)können Sie verwenden str_pad($s,8,0,0). Sie können die Anführungszeichen auf bindecund entfernen decbin, um 4 Bytes zu sparen. Um mehr zu sparen, können Sie array_mapin einer Variablen speichern und stattdessen übergeben. Hier gehts: 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
Dank @IsmaelMiguel Ich glaube , Sie das ersetzt implodemit $Mzu though.
Mpen
1
Wenn ich es tat, war es aus Versehen. Es tut mir wirklich leid. Aber ich bin froh, dass Ihnen meine Variation Ihres Codes gefallen hat.
Ismael Miguel
3

CJam, 30 Bytes

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

Probieren Sie es online!

Dies ist ein unbenannter Block, der den int-Puffer und die Anzahl der Chunks auf dem Stapel erwartet und das Ergebnis auf dem Stapel belässt.

Beschlossen, CJam zu versuchen. Ich habe nur 2 Stunden dafür gebraucht ^^ Das ist wahrscheinlich zu lang, Vorschläge sind sehr willkommen!

Erläuterung

_ e # duplizieren die Stückzahl
@ e # Stapel drehen, Array jetzt oben und Stückzahlen unten
{e # beginne einen neuen Block
 2b e # in binär konvertieren
 8 0e [e # füge links Nullen hinzu, so dass die Binärzahl 8 Bits beträgt
} e # den vorherigen Block beenden
% e # wende diesen Block auf jedes Array-Element (Map) an
e_ e # Array abflachen
0a e # Schieben Sie ein Array mit einer einzelnen Null auf den Stapel
@ e # Stapel drehen, Stapel enthält jetzt n [Array] [0] n
* e # Wiederholen Sie das Array [0] n-mal
+ e # konzentriere die beiden Felder
/ e # in n-Teile aufgeteilt, enthält der Stapel jetzt nur noch das Array
-1 <e # Letzten Block verwerfen
{2b}% e # konvertiert jeden Chunk zurück in eine Dezimalzahl
Denker
quelle
1. Sie können schreiben, 2b8Tanstatt 2b8 0ein Byte zu speichern (die Variable Tist vorinitialisiert für 0). 2. Sie können den letzten Block mit W<(die Variable Wist initialisiert für -1) oder );(das letzte Element herausnehmen und verwerfen) verwerfen.
Esolanging Fruit
Habe es auf 25 geschafft .
Esolanging Fruit
3

JavaScript (ES6) 104

Iterativ Stück für Stück herumspielen,

Bearbeiten Sie 5 Bytes und speichern Sie das @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)

Weniger golfen

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

Prüfung

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>

edc65
quelle
1
xWarum nicht jedes Mal die xrichtigen iBits verschieben, anstatt sie zu verdoppeln ?
Neil
@Neil uh ... warum ... Idiotie?
Edc65
Mir ist gerade aufgefallen, dass Sie c-g?[...s,t<<c]:smöglicherweise ein paar Bytes mehr sparen.
Neil
@Neil dies erfordert einige Gedanken
edc65
2

J, 24 Bytes

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

Dies ist eine anonyme Funktion, die nals linkes Argument und bals rechtes Argument Zahlen verwendet.

Prüfung:

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

Erläuterung:

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

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

Wie es funktioniert

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   
nimi
quelle
2

Java, 313 306 322 Bytes

Ich hoffe, das schlägt PHP ... Und nein. Dumme lange Funktionsnamen.

-7 danke an @quartata für das Entfernen von public +16, um einen Fehler zu beheben, wenn der Split genau war, danke an @TheCoder für das Abfangen

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;}
Blau
quelle
5
Ich glaube nicht, dass Sie die Funktion öffentlich machen müssen.
ein Spaghetto
In welcher Java-Version haben Sie das ausgeführt? Es scheint nicht zu kompilieren: ideone.com/3tonJt
mpen
@mpen Ah, whoops. Ich habe vergessen, ich habe es vor dem Posten auf meinem Computer geändert. Wird reparieren.
Blue
@ JackAmmo yup, sicher hat. Dumme winzige Telefontastatur.
Blue
o[]=new int[b.length()*8/s+1]- Dies wird falsche Größe zuweisen, wenn(b.length()*8)%s==0
Der Coder
2

Ruby , 66 Bytes

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

Probieren Sie es online!

Nimmt den Eingabepuffer als Zeichenfolge, sodass einige Testzeichenfolgen direkt in der Fußzeile erstellt wurden, um nicht druckbare Zeichenfolgen zu vermeiden.

Kirill L.
quelle
2

MATL , 9 Bytes

8&B!we!XB

Probieren Sie es online!

Nimmt Eingaben bals Zeichenfolge, die durch ''oder als ein Array von durch Kommas getrennten Werten begrenzt [102, 48, 111]ist 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
Giuseppe
quelle
2

Perl 5 -nl -MData::Dump=pp , 96 Bytes

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

Probieren Sie es online!

Benötigt das Data::DumpModul.

Übernimmt ndie erste Eingabezeile und die Zahlen in jeder Zeile danach.

Ausgaben an STDERR (das Debug-Feld auf TIO).

Deparsed und aufgeräumt:

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

Nehmen Sie den Puffer auf und konvertieren Sie ihn in ein char-Array und dann in ein Integer-Array. Füllen Sie bei jeder Konvertierung in eine Binärdatei die Einträge bei Bedarf mit Nullen auf und fügen Sie sie zu einer großen Zeichenfolge zusammen. Teilen Sie diese Zeichenfolge in n Zeichen auf und löschen Sie die erstellten Leerzeichen. Jedes Element aus dem Split wird aufgefüllt (nur das letzte Element würde es wirklich brauchen) und wieder in eine Ganzzahl umgewandelt. Die Ausgabe ist ein Array

Matt
quelle
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

Obwohl dies lang sein mag, ist dies meines Wissens der kürzeste Weg, um sowohl Funktionen als auch Arrays fehlerfrei zu akzeptieren und dennoch eine gewisse Genauigkeit in Python 3.5 beizubehalten .

R. Kap
quelle
1

Java, 253 247 Bytes

Golf gespielt

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;
}
Der Coder
quelle
c, 2=> c,2; ((l=f.length())%n)>0=> (l=f.length())%n>0;
Zacharý
1

Jelly , 13 Bytes

+256BḊ€Ẏsz0ZḄ

Probieren Sie es online!

Anders als Dennis 'Antwort.

Hinweis: Die Eingabe ist eigentlich eine Liste nicht negativer Ganzzahlen, aber der TIO-Link erleichtert Ihnen die Arbeit und akzeptiert entweder eine solche Liste oder eine Zeichenfolge.

Erik der Outgolfer
quelle
1

Stax , 12 Bytes

è■àåk┘K¥xk└╣

Führen Sie es aus und debuggen Sie es

Dies ist keine in der Challenge angegebene Funktion, sondern ein Programm, da stax keine Funktionen unterstützt. Es unterstützt die Eingabe von Strings oder Array-Literalen.

rekursiv
quelle
1

Python 2 , 101 Bytes

lambda a,n:[int(''.join(bin(x+256)[3:]for x in a+[0]*n)[n*i:][:n],2)for i in range((len(a)*8-1)/n+1)]

Probieren Sie es online!

Chas Brown
quelle
1

Dyalog APL , 36 Bytes

{2∘⊥¨↓A⍴(×/A←⍺,⍨⌈⍺÷⍨8×≢⍵)↑∊↓⍉⍵⊤⍨8/2}

Probieren Sie es online!

Dies könnte wahrscheinlich mehr Golf gespielt werden.

Zacharý
quelle
1

PHP , 135 Bytes

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

Probieren Sie es online!

Der als Funktion implementierte Eingabepuffer ist ein Array von Ints und gibt ein Array von Ints zurück.

Ausgabe

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

Überprüfen Sie alle Testfälle

640 KB
quelle
Nett! Ziemlich viel kürzer als ich.
3.
0

APL (NARS), 471 Zeichen, 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)}

kommentierter Code und 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 
RosLuP
quelle
0

Elixier , 63 bis 60 Bytes

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

Probieren Sie es online!

Übernimmt die Eingabe als Elixir-Binärdatei und gibt eine Liste von Ganzzahlen aus.

Dieser Code verwendet das Verständnis des Elixir-Bitstring-Generators, um die Binäreingabe in Bitblöcke &1mit der als Argument angegebenen Größe aufzuteilen &2. Um verbleibende Bits am Ende zu berücksichtigen, füllen wir die Binärdatei mit &2 - 1Null-Bits auf. Hier ist auch die Stelle, an der unerwünschte Ausführlichkeit einsetzt: Elixir beklagt sich, wenn wir nicht ausdrücklich &1als Bitstring deklarieren , und es unterstützt auch keine Ausdrücke in size(...), weshalb eine zusätzliche variable Zuweisung erforderlich ist.

Osterei: in der Fußzeile, ersetzen Sie IO.inspectmit IO.putsund unsere Funktion magisch „übersetzt“ Lorem ipsum aus dem Lateinischen zu Chinesisch - Probieren Sie es online!

Kirill L.
quelle