Podziel tablicę bajtów na tablicę bitów

24

Napisz funkcję, która otrzyma bufor b(o długości 1–104857600 bajtów) i liczbę bitów n(1 <= n <= 64), dzieląc bufor na części nbitów. Prawym padem ostatni kawałek z 0s do nbitów.

na przykład

Biorąc pod uwagę bufor b = "f0oBaR"lub równoważnie [102,48,111,66,97,82]i n = 5, wróć

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

Wynika to z faktu, że powyższy bufor, reprezentowany jako plik binarny, wygląda następująco:

01100110 00110000 01101111 01000010 01100001 01010010

A po ponownym zgrupowaniu w 5s wygląda następująco:

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

Które po przeliczeniu z powrotem na dziesiętne daje odpowiedź.

Notatki

  • Możesz użyć dowolnego typu danych, który najbardziej odpowiada Twojemu buforowi w twoim języku. W PHP prawdopodobnie użyjesz ciągu, w Węźle możesz chcieć użyć Bufora
    • Jeśli używasz ciągu do reprezentowania bufora, załóż, że jest to ASCII dla konwersji char -> int
    • Możesz użyć tablicy ints (0-255) do wprowadzania danych, jeśli wolisz
  • Zwracana wartość musi być tablicą lub listą liczb całkowitych

Przypadki testowe

> 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
źródło
2
Czy ma działać dla wartości nwiększych niż 8? Jeśli tak, to co z wartościami nwiększymi niż 64, które są większe niż precyzja liczb całkowitych większości języków.
speedplane
2
Dlaczego wartością zwracaną muszą być ints ?
wizzwizz4
2
@ wizzwizz4 Nie sądzę. Nie mogą być bajtami, ponieważ nie mają 8 bitów. Operatory bitowe zwykle działają na ints i niewiele więcej. Jeśli masz lepszą sugestię, to słucham, ale poza tym jest.
mpen
3
@ wizzwizz4 Ponieważ nie chcę, aby ludzie mogli pominąć krok. Nie chcę odpowiedzi typu „pierwsze 5 bitów tego bajtu zawiera odpowiedź” - wynik nie powinien zawierać żadnych zbędnych informacji i powinien być łatwo przekonwertowany z powrotem do ASCII lub odwzorowania znaków (rzeczywiste zastosowanie - walizka). Biorąc pod uwagę liczbę dotychczasowych odpowiedzi, nie wydaje się to być problemem.
mpen
1
@mpen Widzę zamieszanie. charjest liczbą całkowitą o długości jednego bajta.
wizzwizz4

Odpowiedzi:

15

Pyth, 18 17 bajtów

iR2c.[t.B+C1z\0QQ

Dzięki @lirtosiast za bajt!

            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))
Klamka
źródło
13

Galaretka, 13 bajtów

1;ḅ256æ«BḊsḄṖ

To przyjmuje dane wejściowe jako listę liczb całkowitych. Wypróbuj online!

Jak to działa

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
źródło
5

Julia, 117 bajtów

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

Jest to funkcja, która akceptuje tablicę liczb całkowitych i liczb całkowitych i zwraca tablicę liczb całkowitych. Jest to ćwiczenie polegające na nadużywaniu argumentów funkcyjnych.

Nie golfowany:

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.
źródło
Dlaczego tymczasowo go usunąłeś?
CalculatorFeline
@ CatsAreFluffy Zdałem sobie sprawę, że początkowo zrobiłem coś złego, tak że zadziałało w przypadku testowym, ale niekoniecznie ogólnie. Teraz powinno być dobrze. :)
Alex A.
5

JavaScript (ES6), 120 bajtów

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

Rekurencyjne kręcenie bitami na tablicach liczb całkowitych. Nie golfowany:

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
źródło
@WashingtonGuedes Udało mi się zagrać w golfa o kolejne 9 bajtów poza własnym golfem twojego rozwiązania, ale wciąż jest 129 bajtów, przepraszam:"(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
Jesteś pewien, że to działa? Wersja bez golfa powoduje awarię Chrome.
mpen 22.03.16
@mpen Gra w golfa zdecydowanie działa w przeglądarce Firefox. Wersja bez golfa może zawierać błędy.
Neil
Aha! I tak się dzieje. Myślałem, że silnik JS Chrome wyprzedza FF, ale chyba nie.
mpen
1
@mpen Naprawiłem dla ciebie kilka subtelnych błędów w moim niepoznanym kodzie.
Neil
5

Python 3, 102 bajty

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]

użyj iterującej sztuczki, aby zgrupować ciąg

  • s: łańcuch wejściowy / bufor
  • n: liczba bitów w każdej podzielonej porcji

Wyniki

>>> 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
źródło
Powinieneś udokumentować swój kod, aby wyjaśnić, co robi par 'n'?
nullptr
@nullptr nma takie samo znaczenie jak pytanie:splits the buffer into chunks of n bits
Erwan
4

Rubin, 114 bajtów

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

Nieco czystsze:

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]
obolały
źródło
4

Perl 6, 93 68 bajtów

{@^a».&{sprintf "%08b",$_}.join.comb($^b)».&{:2($_~0 x$b-.chars)}}
Skróty klawiszowe
źródło
3

PHP, 262 217 189 bajtów

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

(zaktualizowany o wskazówki od Ismael Miguel )

Sformatowane dla czytelności:

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

Przykład:

> implode(', ',f(array_map('ord',str_split('f0oBaR')),5));
"12, 24, 24, 6, 30, 16, 19, 1, 10, 8"
mpen
źródło
1
Zamiast tego str_pad($s,8,'0',STR_PAD_LEFT)możesz użyć str_pad($s,8,0,0). Możesz usunąć cytaty bindeci decbinzapisać 4 bajty. Aby zaoszczędzić więcej, możesz zapisać array_mapw zmiennej i przekazać ją zamiast tego. Proszę bardzo: 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 bajty).
Ismael Miguel
Dzięki @IsmaelMiguel myślę, że otrzymuje implodesię $Mzbyt chociaż.
mpen
1
Jeśli tak, to przez pomyłkę. Bardzo przepraszam. Ale cieszę się, że podobała ci się moja odmiana twojego kodu.
Ismael Miguel
3

CJam, 30 bajtów

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

Wypróbuj online!

Jest to blok bez nazwy, który oczekuje bufora int i ilości porcji na stosie i pozostawia wynik na stosie.

Postanowiłem spróbować CJam. Zajęło mi to tylko 2 godziny ^ ^ To prawdopodobnie zbyt długo, sugestie są bardzo mile widziane!

Wyjaśnienie

_ e # zduplikuj liczbę porcji
@ e # obróć stos, tablica teraz na górze, a porcja liczy się na dole
{e # rozpocznij nowy blok
 2b e # przekonwertować na binarny
 8 0e [e # dodaj zera po lewej stronie, więc plik binarny ma 8 bitów
} e # kończy poprzedni blok
% e # zastosuj ten blok do każdego elementu tablicy (mapy)
e_ e # spłaszczanie tablicy
0 a e # wypchnij tablicę z pojedynczym zerem na stos
@ e # obróć stos, stos zawiera teraz n [tablica] [0] n
* e # powtórz tablicę [0] n razy
+ e # konkatuje dwie tablice
/ e # podzielone na kawałki o długości n, teraz stosy zawierają tylko tablicę
-1 <e # odrzuć ostatnią porcję
{2b}% e # przekonwertuj każdą porcję z powrotem na dziesiętne
Denker
źródło
1. Możesz pisać 2b8Tzamiast 2b8 0zapisywać bajt (zmienna Tjest wstępnie zainicjalizowana 0). 2. Odrzucanie ostatniego fragmentu można wykonać za pomocą W<(zmienna Wjest inicjalizowana -1) lub );(wyjmij ostatni element i odrzuć go).
Esolanging Fruit
Zredukowałem to do 25 .
Esolanging Fruit
3

JavaScript (ES6) 104

Iteracyjne krok po kroku

Edytuj 5 bajtów, zapisz 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)

Mniej golfa

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

edc65
źródło
1
Zamiast za xkażdym razem podwajać , dlaczego nie przesunąć xodpowiednich ibitów?
Neil
@Neil uh ... dlaczego ... idiotyzm?
edc65
Właśnie zauważyłem, że c-g?[...s,t<<c]:smoże zaoszczędzić ci kilka bajtów.
Neil
@ Nee to wymaga przemyślenia
edc65
2

J, 24 bajty

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

Jest to funkcja anonimowa, która przyjmuje nza swój lewy argument i bjako liczby za prawy argument.

Test:

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

Wyjaśnienie:

[:#.-@[>\;@(_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
źródło
2

Haskell, 112 109 bajtów

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

Przykład użycia: 5 # [102,48,111,66,97,82]-> [12,24,24,6,30,16,19,1,10,8].

Jak to działa

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
źródło
2

Java, 313 306 322 bajtów

Mam nadzieję, że to pobije PHP ... I nie. Głupie długie nazwy funkcji.

-7 podziękowania dla @quartata za pozbycie się publicznego +16, aby naprawić błąd, gdy podział był dokładny, dzięki @TheCoder za złapanie go

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;}
niebieski
źródło
5
Nie sądzę, że musisz upublicznić tę funkcję.
spaghetto
W jakiej wersji Java to uruchomiłeś? Wydaje się, że nie można go skompilować: ideone.com/3tonJt
mpen
@mpen Ah, ups. Zapomniałem, zmieniłem to na komputerze przed wysłaniem. Naprawię.
Blue
@JackAmmo tak, na pewno. Głupia malutka klawiatura telefonu.
Blue
o[]=new int[b.length()*8/s+1]- To przypisze niewłaściwy rozmiar If(b.length()*8)%s==0
The Coder
2

Rubin , 66 bajtów

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

Wypróbuj online!

Pobiera bufor wejściowy jako ciąg, dzięki czemu kilka ciągów testowych zostało zbudowanych bezpośrednio w stopce, aby uniknąć niedrukowalności.

Kirill L.
źródło
2

MATL , 9 bajtów

8&B!we!XB

Wypróbuj online!

Pobiera dane wejściowe bjako ciąg rozdzielany przez ''lub jako tablicę wartości oddzielonych przecinkami [102, 48, 111], takich jak 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
źródło
2

Perl 5 -nl -MData::Dump=pp , 96 bajtów

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

Wypróbuj online!

Wymaga Data::Dump modułu.

Trwa n pierwszy wiersz wprowadzania, a następnie liczby w każdym wierszu.

Dane wyjściowe do STDERR (pole debugowania w TIO).

Wydzielone i uporządkowane:

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
źródło
1

Powershell 146 bajtów

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

Weź bufor i przekonwertuj go na tablicę char, a następnie na tablicę liczb całkowitych. Dla każdego z nich przekonwertuj na binarny, wstaw w razie potrzeby wpisy z zerami i połącz jako jeden duży ciąg. Podziel ten ciąg na n znaków i upuść utworzone puste pola. Każdy element z podziału jest dopełniany (tylko ostatni element naprawdę go potrzebuje) i przekształcany z powrotem w liczbę całkowitą. Dane wyjściowe to tablica

Matt
źródło
1

Python 3.5 - 312 292 bajtów:

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

Chociaż może to być długie, to, według mojej wiedzy, jest to najkrótszy sposób na zaakceptowanie zarówno funkcji, jak i tablic bez błędów, i nadal jest w stanie zachować pewną dokładność w Pythonie 3.5.

R. Kap
źródło
1

Java, 253 247 bajtów

Grał w golfa

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;
}
The Coder
źródło
c, 2=> c,2; ((l=f.length())%n)>0=> (l=f.length())%n>0;
Zacharý,
1

Galaretka , 13 bajtów

+256BḊ€Ẏsz0ZḄ

Wypróbuj online!

Różni się od odpowiedzi Dennisa.

Uwaga: Dane wejściowe to w rzeczywistości lista liczb całkowitych nieujemnych, ale link TIO łagodzi ból i akceptuje taką listę lub ciąg znaków.

Erik the Outgolfer
źródło
1

Stax , 12 bajtów

è■àåk┘K¥xk└╣

Uruchom i debuguj

Nie jest to funkcja określona w wyzwaniu, ale program, ponieważ stax nie obsługuje funkcji. Obsługuje wprowadzanie ciągów lub literałów tablicowych.

rekurencyjny
źródło
1

Python 2 , 101 bajtów

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

Wypróbuj online!

Chas Brown
źródło
1

Dyalog APL , 36 bajtów

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

Wypróbuj online!

Prawdopodobnie można by to bardziej pograć w golfa.

Zacharý
źródło
1

Eliksir , 63 60 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako plik binarny Elixir, wyświetla listę liczb całkowitych.

Ten kod wykorzystuje zrozumienie generatora ciągów &1bitów Elixir do wprowadzania danych binarnych na bloki bitowe o wielkości podanej jako argument &2. Aby uwzględnić ewentualne resztki bitów na końcu, wypełniamy plik binarny &2 - 1zerowymi bitami. Tutaj również pojawia się niechciana gadatliwość: Elixir narzeka, jeśli nie oświadczamy tego wprost&1 jako ciąg bitów, a także nie obsługuje wyrażeń wsize(...) , stąd potrzeba dodatkowego przypisania zmiennej.

Pisanka: w stopce, wymienić IO.inspectsię IO.puts, a nasza funkcja magicznie „przekłada” Lorem ipsum z łaciny na chiński - Spróbuj online!

Kirill L.
źródło
1

Japt , 16 bajtów

Po długim dniu spotkań mam wrażenie, że zapomniałem, jak grać w golfa! Później bawię się tym w pociągu do domu, sprawdzę, czy mogę to poprawić.

c_¤ùT8ÃòV úTV mÍ

Spróbuj

Kudłaty
źródło
Czy mówisz, że ma 16 bajtów, jeśli go zakodujesz IEC 8859-1? Czy to w ogóle legalne? Znalazłeś lukę? Czy nie sprecyzowali, że musi to być UTF-8? Ponieważ to 22 bajty UTF-8.
mpen
@mpen 1.Każdy język może używać własnego kodowania / strony kodowej. 2.ISO-8859-1 jest dość standardowym kodowaniem stosowanym w wielu językach, a nie w szczególności dla Japt lub tego konkretnego rozwiązania. 3.Twój specyfikacja nie określa, że należy liczyć w UTF-8. 4.Gdyby tak było, byłbyś do tego mocno zniechęcony.
Kudłaty
Nie próbuję niczego narzucać, chciałem tylko wiedzieć, czy zostało to ogólnie zaakceptowane i wygląda na to, że masz całkowitą rację codegolf.meta.stackexchange.com/a/17800/23090 TIO ocenia Japt w ten sam sposób, to może być łatwiejszym sposobem zakwalifikowania go tio.run/##y0osKPn/Pzn@0JLDO0MsDjcf3hSmcHhXSJhC7uHe//8B edytuj 3: oh twój link jest prawie TIO.
mpen
1

PHP ,135 129 124 bajty

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

Wypróbuj online!

Zaimplementowany jako funkcja, bufor wejściowy jest tablicą liczb całkowitych i zwraca tablicę liczb wewnętrznych.

Wydajność

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

Sprawdź wszystkie przypadki testowe

640 KB
źródło
Miły! Trochę krótszy niż mój.
mpen
0

APL (NARS), 471 znaków, 942 bajty

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

skomentowany kod i 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
źródło