Membagi array byte menjadi array bit

24

Tulis fungsi yang ketika diberi buffer b(panjang 1 - 104857600 byte) dan sejumlah bit n(1 <= n <= 64), pisahkan buffer menjadi potongan-potongan nbit. Pad kanan potongan terakhir dengan 0s hingga nbit.

misalnya

Diberi buffer b = "f0oBaR"atau setara [102,48,111,66,97,82]dan n = 5, kembali

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

Ini karena buffer di atas, ketika direpresentasikan sebagai biner terlihat seperti:

01100110 00110000 01101111 01000010 01100001 01010010

Dan ketika dikelompokkan ulang menjadi 5s terlihat seperti:

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

Yang ketika dikonversi kembali menjadi desimal memberikan jawabannya.

Catatan

  • Anda dapat menggunakan tipe data apa pun yang paling masuk akal dalam bahasa Anda untuk mewakili buffer. Di PHP Anda mungkin akan menggunakan string, di Node Anda mungkin ingin menggunakan Buffer
    • Jika Anda menggunakan string untuk mewakili buffer, anggap itu ASCII untuk konversi char -> int
    • Anda dapat menggunakan array int (0-255) untuk input jika Anda mau
  • Nilai pengembalian harus berupa array atau daftar int

Uji Kasus

> 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
sumber
2
Apakah ini seharusnya bekerja untuk nilai nlebih dari 8? Jika demikian, bagaimana dengan nilai nlebih dari 64, yang lebih besar dari presisi integer kebanyakan bahasa.
speedplane
2
Mengapa nilai pengembalian harus int ?
wizzwizz4
2
@ wizzwizz4 Saya rasa tidak. Mereka tidak dapat byte karena mereka tidak memiliki 8 bit. Operator bitwise biasanya bekerja pada int dan tidak banyak lagi. Jika Anda memiliki saran yang lebih baik maka saya mendengarkan, tetapi sebaliknya ints.
mpen
3
@ wizzwizz4 Karena saya tidak ingin orang lain dapat melewati satu langkah. Saya tidak ingin jawaban seperti "5 bit pertama dari byte ini mengandung jawaban" - hasilnya tidak boleh mengandung informasi yang berlebihan, dan harus dengan mudah dikonversi kembali ke ASCII atau pemetaan karakter (penggunaan kehidupan nyata - kasus). Juga, mengingat jumlah jawaban sejauh ini, tampaknya tidak menjadi masalah.
mpen
1
@ buka saya melihat kebingungan. charadalah bilangan bulat yang panjangnya satu byte.
wizzwizz4

Jawaban:

15

Pyth, 18 17 byte

iR2c.[t.B+C1z\0QQ

Terima kasih kepada @ lirtosiast untuk satu 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))
Gagang pintu
sumber
13

Jelly, 13 byte

1;ḅ256æ«BḊsḄṖ

Ini mengambil input sebagai daftar bilangan bulat. Cobalah online!

Bagaimana itu bekerja

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

Ini adalah fungsi yang menerima array integer dan integer dan mengembalikan array integer. Ini merupakan latihan dalam penyalahgunaan argumen fungsi.

Tidak Disatukan:

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.
sumber
Mengapa Anda menghapusnya sementara?
CalculatorFeline
@CatsAreFluffy Saya menyadari bahwa saya telah melakukan sesuatu yang salah pada awalnya sehingga berfungsi untuk kasus uji tetapi tidak harus secara umum. Seharusnya semuanya baik-baik saja sekarang. :)
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])

Memutar-mutar bit rekursif pada array integer. Tidak Disatukan:

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
sumber
@WashingtonGuedes Saya berhasil golf 9 byte dari golf saya sendiri dari solusi Anda, tetapi masih 129 byte, maaf:"(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
Anda yakin ini berjalan? Versi ungolfed sedang menabrak Chrome.
mpen
@mpen Versi golf pasti berjalan di Firefox. Versi ungolfed mungkin memiliki kesalahan di dalamnya.
Neil
Aha! Dan begitulah yang terjadi. Saya pikir mesin JS Chrome ada di depan FF tetapi saya kira tidak.
mpen
1
@mpen Memperbaiki beberapa bug halus dalam kode saya yang tidak serigala untuk Anda.
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]

gunakan trik iter untuk mengelompokkan string

  • s: string input / buffer
  • n: jumlah bit di setiap potongan

Hasil

>>> 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
sumber
Anda harus mendokumentasikan kode Anda untuk menjelaskan apa yang dilakukan param 'n'?
nullptr
@nullptr nmemiliki arti yang sama dengan pertanyaan:splits the buffer into chunks of n bits
Erwan
4

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

Pembersih sedikit:

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]
bersemangat
sumber
4

Perl 6, 93 68 byte

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

(diperbarui dengan tips dari Ismael Miguel )

Diformat agar mudah dibaca:

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

Contoh:

> implode(', ',f(array_map('ord',str_split('f0oBaR')),5));
"12, 24, 24, 6, 30, 16, 19, 1, 10, 8"
Mpen
sumber
1
Alih-alih str_pad($s,8,'0',STR_PAD_LEFT), Anda bisa menggunakan str_pad($s,8,0,0). Anda dapat menghapus tanda kutip bindecdan decbinmenyimpan 4 byte. Untuk menyimpan lebih banyak, Anda dapat menyimpan array_mapdalam variabel dan meneruskannya. Ini dia: 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
Terima kasih @IsmaelMiguel Saya pikir Anda mengganti implodedengan $Mterlalu sekalipun.
mpen
1
Jika saya melakukannya, itu karena kesalahan. Aku sangat menyesal. Tapi saya senang Anda menyukai variasi kode saya.
Ismael Miguel
3

CJam, 30 byte

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

Cobalah online!

Ini adalah blok tanpa nama yang mengharapkan buffer int dan jumlah potongan pada stack dan meninggalkan hasilnya pada stack.

Memutuskan untuk mencoba CJam. Hanya butuh saya 2 jam untuk menyelesaikannya ^^ Ini mungkin terlalu lama, saran sangat diterima!

Penjelasan

_ e # menduplikasi jumlah chunk
@ e # rotate stack, letakkan sekarang di atas dan jumlah chunk di bawah
{e # memulai blok baru
 2b e # dikonversi ke biner
 8 0e [e # tambahkan nol di sebelah kiri, jadi binernya 8 bit
} e # akhiri blok sebelumnya
% e # menerapkan blok ini untuk setiap elemen-array (peta)
e_ e # ratakan array
0a e # dorong sebuah array dengan nol tunggal ke stack
@ e # rotate stack, stack mengandung sekarang n [array] [0] n
* e # ulangi array [0] n kali
+ e # menggabungkan dua array
/ e # dipecah menjadi potongan-potongan dengan panjang n, sekarang tumpukan hanya berisi array
-1 <e # buang potongan terakhir
{2b}% e # konversi setiap potongan kembali menjadi desimal
Denker
sumber
1. Anda dapat menulis 2b8Tdaripada 2b8 0menyimpan byte (variabel Tdiinisialisasi ke 0) 2. Membuang potongan terakhir dapat dilakukan dengan W<(variabel Wdiinisialisasi ke -1) atau );(mengambil elemen terakhir dan membuangnya).
Buah Esolanging
Turun ke 25 .
Buah Esolanging
3

JavaScript (ES6) 104

Sedikit demi sedikit bermain-main,

Edit 5 byte, simpan 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)

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

Uji

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
sumber
1
Alih-alih menggandakan xsetiap kali, mengapa tidak menggeser bit yang xbenar i?
Neil
@Neil uh ... kenapa ... kebodohan?
edc65
Saya baru saja memperhatikan bahwa c-g?[...s,t<<c]:smungkin menghemat beberapa byte lagi.
Neil
@Neil ini membutuhkan beberapa pemikiran
edc65
2

J, 24 byte

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

Ini adalah fungsi anonim, yang mengambil nargumen kiri dan bsebagai angka sebagai argumen kanannya.

Uji:

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

Penjelasan:

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

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

Bagaimana itu bekerja

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
sumber
2

Java, 313 306 322 byte

Saya harap ini mengalahkan PHP ... Dan tidak. Nama fungsi panjang yang bodoh.

-7 terima kasih kepada @quartata untuk menyingkirkan publik +16 untuk memperbaiki kesalahan ketika perpecahan terjadi, terima kasih kepada @TheCoder untuk menangkapnya

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;}
Biru
sumber
5
Saya tidak berpikir Anda harus membuat fungsi publik.
spaghetto
Versi Java apa yang Anda jalankan ini? Ini tampaknya tidak mengkompilasi: ideone.com/3tonJt
mpen
@ buka Ah, wah. Saya lupa, saya mengubahnya di komputer saya sebelum memposting. Akan memperbaiki.
Biru
@JackAmmo ya, tentu saja. Keyboard ponsel mungil yang bodoh.
Biru
o[]=new int[b.length()*8/s+1]- Ini akan menetapkan ukuran yang salah Jika(b.length()*8)%s==0
The Coder
2

Ruby , 66 byte

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

Cobalah online!

Mengambil buffer input sebagai string, sehingga beberapa string uji dibangun langsung di footer untuk menghindari yang tidak diinginkan.

Kirill L.
sumber
2

MATL , 9 byte

8&B!we!XB

Cobalah online!

Mengambil input bsebagai string yang dibatasi oleh ''atau sebagai larik nilai yang dipisahkan koma seperti [102, 48, 111], kemudian 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
sumber
2

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

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

Cobalah online!

Membutuhkan Data::Dumpmodul.

Mengambil nbaris input pertama dan angka pada setiap baris setelah itu.

Output ke STDERR (bidang Debug pada TIO).

Diuraikan dan dirapikan:

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

Ambil buffer dan konversikan ke char array dan kemudian array integer. Untuk masing-masing konversi ke biner, pad entri dengan 0 di mana diperlukan, dan bergabung sebagai satu string besar. Pisahkan string itu pada n karakter dan letakkan blank yang sudah dibuat. Setiap elemen dari split diisi (hanya elemen terakhir yang benar-benar membutuhkannya) dan dikonversi kembali menjadi integer. Output adalah sebuah array

Mat
sumber
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

Meskipun ini mungkin lama, ini, dalam pengetahuan saya, adalah jalan terpendek untuk menerima kedua fungsi dan array tanpa kesalahan, dan masih mampu mempertahankan beberapa akurasi di Python 3.5.

R. Kap
sumber
1

Java, 253 247 byte

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

Tidak disatukan

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

Jelly , 13 byte

+256BḊ€Ẏsz0ZḄ

Cobalah online!

Berbeda dengan jawaban Dennis.

Catatan: Input sebenarnya adalah daftar bilangan bulat non-negatif, tetapi tautan TIO memudahkan Anda, dan menerima daftar atau string semacam itu.

Erik the Outgolfer
sumber
1

Stax , 12 byte

è■àåk┘K¥xk└╣

Jalankan dan debug itu

Ini bukan fungsi seperti yang ditentukan dalam tantangan, tetapi sebuah program, karena stax tidak mendukung fungsi. Ini mendukung input string atau array literal.

rekursif
sumber
1

Python 2 , 101 byte

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

Cobalah online!

Chas Brown
sumber
1

Dyalog APL , 36 byte

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

Cobalah online!

Ini mungkin bisa diturunkan lebih banyak.

Zacharý
sumber
1

Elixir , 63 60 byte

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

Cobalah online!

Mengambil input sebagai biner Elixir, menampilkan daftar bilangan bulat.

Kode ini memanfaatkan pemahaman generator bitstring Elixir untuk memotong input biner &1menjadi bit blok dengan ukuran yang disediakan sebagai argumen &2. Untuk menjelaskan bit sisa di akhir, kami mengisi biner dengan &2 - 1nol bit. Di sini juga ada tempat di mana beberapa verbositas yang tidak diinginkan muncul: Elixir mengeluh jika kita tidak secara eksplisit menyatakan &1sebagai bitstring, dan itu juga tidak mendukung ekspresi size(...), maka diperlukan penugasan variabel tambahan.

Telur Paskah: di footer, ganti IO.inspectdengan IO.puts, dan fungsi kita secara ajaib "menerjemahkan" Lorem ipsum dari bahasa Latin ke bahasa Mandarin - Cobalah secara online!

Kirill L.
sumber
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;}

Cobalah online!

Diimplementasikan sebagai fungsi, buffer input adalah array int dan mengembalikan array int.

Keluaran

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

Verifikasi semua kasus uji

640KB
sumber
Bagus! Cukup sedikit lebih pendek dari milikku.
mpen
0

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

kode dan tes yang dikomentari:

  ⍝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
sumber
0

Japt , 16 byte

Setelah seharian rapat, rasanya saya sudah lupa bagaimana cara bermain golf! Akan bermain-main dengan ini di kereta pulang nanti, lihat apakah aku bisa memperbaikinya.

c_¤ùT8ÃòV úTV mÍ

Cobalah

Shaggy
sumber
Apakah Anda mengatakan ini 16 byte jika Anda menyandikannya IEC 8859-1? Apakah itu sah? Apakah Anda menemukan celah? Apakah mereka tidak menentukan bahwa itu harus UTF-8? Karena itu adalah 22 byte dari UTF-8.
buka
@mpen 1.Setiap bahasa bebas untuk digunakan encoding / codepage sendiri. 2.ISO-8859-1 adalah penyandian standar yang digunakan oleh banyak bahasa dan tidak khusus untuk Japt, atau solusi khusus ini. 3.Spec Anda tidak menyatakan bahwa kami harus menghitung dalam UTF-8. 4.Jika ya, Anda akan sangat tidak disarankan untuk melakukannya.
Shaggy