Bir bayt dizisini bit dizisine bölme


24

Bir tampon b(1 - 104857600 bayt uzunluğunda) ve bir bit n(1 <= n <= 64) verildiğinde, tamponu nbit parçalarına bölen bir fonksiyon yazın . Son parçayı 0s ile nbitlere kadar sağlayın.

Örneğin

Tampon göz önüne alındığında b = "f0oBaR"ya da eşit [102,48,111,66,97,82]ve n = 5, geri dönüşü

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

Bunun sebebi ikili olarak temsil edilen yukarıdaki tamponun şu şekilde görünmesidir:

01100110 00110000 01101111 01000010 01100001 01010010

Ve 5'li gruplara yeniden gruplandığında şöyle görünür:

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

Ondalık basamağa dönüştürüldüğünde cevap verir.

notlar

  • Tamponu temsil etmek için kendi dilinizde en uygun veri türü ne olursa olsun kullanabilirsiniz. PHP'de muhtemelen bir dize kullanırsınız, Düğümde bir Tampon kullanmak isteyebilirsiniz
    • Tamponu temsil etmek için bir dize kullanırsanız, char -> int dönüşümünün ASCII olduğunu varsayalım.
    • İsterseniz giriş için bir dizi diziyi (0-255) kullanabilirsiniz.
  • Dönen değer bir dizi veya giriş listesi olmalıdır

Test Kılıfları

> 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
n8'den büyük değerler için çalışması gerekiyor mu? Öyleyse, n64'ten büyük, çoğu dilin tamsayı hassasiyetinden daha büyük olan değerler .
hız uçağı

2
Dönüş değeri neden ints olmalıdır ?
wizzwizz4

2
@ wizzwizz4 Sanmıyorum. Bayt olamazlar çünkü 8 bitleri yoktur. Bitsel operatörler normalde ints üzerinde çalışırlar ve başka bir şey yapmazlar. Daha iyi bir önerin varsa dinliyorum, ama başka türlü.
16'da

3
@ wizzwizz4 Çünkü insanların bir adımı atlayabilmelerini istemiyorum. "Bu baytın ilk 5 biti cevabı içerir" gibi cevaplar istemiyorum - sonuç gereksiz herhangi bir bilgi içermemeli ve kolayca ASCII'ye veya bazı karakter haritalarına dönüştürülmeli (gerçek yaşam kullanımı- vaka). Ayrıca, şu ana kadarki cevap sayısı göz önüne alındığında, bu bir sorun gibi görünmüyor.
16'da

1
@mpen Kargaşayı görüyorum. bir bayt uzunluğunda charolan bir tamsayıdır .
wizzwizz4 23.03.2016

Yanıtlar:


15

Pyth, 18 17 bayt

iR2c.[t.B+C1z\0QQ

Bir bayt için @ lirtosiast için teşekkürler !

            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

Jöle, 13 bayt

1;ḅ256æ«BḊsḄṖ

Bu, girişi tam sayıların bir listesi olarak alır. Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

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

Bu bir tamsayı dizisi ve bir tamsayı kabul eden ve bir tamsayı dizisi döndüren bir işlevdir. İşlev argümanı kötüye kullanımı konusunda bir alıştırma.

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

Neden geçici olarak sildiniz?
Hesap MakinesiFeline'da

@CatsAreFluffy Başlangıçta yanlış bir şey yaptığımı fark ettim, çünkü test davası için işe yaradı, ancak genel olarak mutlaka olmazdı. Şimdi her şey yolunda olmalı. :)
Alex A.

5

Python 3, 102 bayt

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]

dize gruplamak için iter hile kullanın

Sonuçlar

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

'N' paraminin ne yaptığını açıklamak için kodunuzu belgelemeliydiniz.
nullptr

5

JavaScript (ES6), 120 bayt

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

Tamsayılı diziler üzerinde özyinelemeli bit twunkling. 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 Çözümünüzün kendi golfünden 9 bayt daha golf oynamayı başardım, ancak hala 129 bayt, üzgünüm:"(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

Bunun çalıştığından emin misin? Ungolfed versiyonu Chrome çöküyor.
16'da

@mpen Golf sürümü kesinlikle Firefox'ta çalışıyor. Ungolfed versiyonunda hatalar olabilir.
Neil

Aha! Ve öyle yapar. Chrome'un JS motorunun FF'lerin önünde olduğunu sanıyordum ama sanırım değil.
16'da

1
@mpen Senin için ungolfed kodumdaki birkaç ince hata giderildi.
Neil

4

Ruby, 114 bayt

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

Biraz temizleyici:

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 bayt

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

( Ismael Miguel'in önerileriyle güncellendi )

Okunabilirlik için biçimlendirilmiş:

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

Örnek:

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

1
Bunun yerine str_pad($s,8,'0',STR_PAD_LEFT)kullanabilirsiniz str_pad($s,8,0,0). Tırnakları kaldırabilir bindecve decbin4 bayttan tasarruf edebilirsiniz. Daha fazla tasarruf etmek için array_mapbir değişkende saklayabilir ve bunun yerine geçirebilirsiniz. Buyrun: 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 bayt).
Ismael Miguel

Teşekkür Sana yerini düşünüyorum @IsmaelMiguel implodeile $Mçok olsa.
16'da

1
Yapsaydım, yanlışlıkla oldu. Gerçekten üzgünüm. Ama kodundaki varyasyonumu sevdiğine sevindim.
Ismael Miguel

3

CJam, 30 bayt

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

Çevrimiçi deneyin!

Bu int arabelleğini ve yığındaki yığın miktarını bekleyen ve sonucu yığında bırakan adsız bir bloktur.

CJam'ı denemeye karar verdi. Sadece beni halletmek için 2 saatimi aldı ^^ Bu muhtemelen çok uzun, önerilerinizi bekliyoruz!

açıklama

_ e # öbek sayısını çoğalt
@ e # yığını döndür, şimdi üstte diz ve altta öbek sayımı
{e # yeni bir blok başlat
 2b e # binary'ye dönüştür
 8 0e [e # solda sıfırlar ekler, böylece ikili 8 bit olur
} e # önceki bloğu sonlandır
% e # bu bloğu her dizi-elemanına (haritaya) uygular
e_ e # düzleştirici dizi
0a e # bir diziyi yığına tek bir sıfır ile bas
@ e # yığını döndür, yığın şimdi içeriyor n [dizi] [0] n
* e #, diziyi [0] n kere tekrar eder.
+ e # iki diziyi birleştiriyor
/ e # n uzunluğunda parçalara bölün, şimdi yığınlar yalnızca diziyi içeriyor
-1 <e # son parçayı at
{2b}% e # her bir parçayı ondalık basamağa dönüştür

1. Bir bayt kaydetmek 2b8Tyerine yazabilirsiniz 2b8 0(değişken Tönceden başlatılmıştır 0) 2. Son parçanın atılması W<(değişken Wbaşlangıç ​​durumuna getirilir -1) veya );(son öğeyi çıkartıp atın) ile yapılabilir.
Esolanging Fruit

Aşağı için Anladım 25 .
Esolanging Fruit

3

JavaScript (ES6) 104

Yinelemeli biraz hilkat garibesi,

5 bayt düzenle thx @Neil kaydet

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

Daha az golf oynadı

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

Ölçek

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
xHer seferinde iki katına çıkmak yerine neden xdoğru ibitleri değiştirmiyorsunuz ?
Neil

@Ne uh ... neden ... aptallık?
edc65

Sadece c-g?[...s,t<<c]:sbirkaç bayttan daha fazla tasarruf edebileceğini fark ettim .
Neil

@Neil bu bazı düşünceler gerektirir
edc65

2

J, 24 bayt

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

Bu, nsol argümanı ve bsağ argümanı gibi sayıları alan adsız bir işlevdir .

Ölçek:

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

Açıklama:

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

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

Kullanım örneği: 5 # [102,48,111,66,97,82] -> [12,24,24,6,30,16,19,1,10,8].

Nasıl çalışır

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 bayt

Umarım bu PHP yener ... Ve hayır. Aptal uzun işlev isimleri.

-7 Bölünmenin kesin olduğu bir hatayı düzeltmek için +16 genel halktan kurtulmak için @ quartata'ya teşekkürler, @TheCoder bunu yakalamak için teşekkürler

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
İşlevi halka açıklamanız gerektiğini düşünmüyorum.
Bir spaghetto

Bunu hangi Java sürümünde çalıştırdınız? Derleme görünmüyor: ideone.com/3tonJt
mpen

@ sıkma Ah, vurgun. Unuttum, göndermeden önce bilgisayarımda değiştirdim. Düzeltecek.
Mavi,

@ JackAmmo yup, elbette. Aptal minik telefon klavyesi.
Blue

o[]=new int[b.length()*8/s+1]- Bu yanlış boyut verecek.(b.length()*8)%s==0
Kodlayıcı

2

Ruby , 66 bayt

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

Çevrimiçi deneyin!

Girdi tamponunu bir dizge olarak alır, böylece birkaç test dizisi yazdırılamayanları önlemek için doğrudan altbilgiye yerleştirilir.


2

MATL , 9 bayt

8&B!we!XB

Çevrimiçi deneyin!

Girdiyi , o zamanki gibi , virgülle ayrılmış değerler dizisi ile bsınırlandırılmış bir dize ''olarak alır .[102, 48, 111]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 bayt

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

Çevrimiçi deneyin!

Gerektirir Data::DumpModül .

Alır n girdi ilk satırında ve bundan sonra her satırda numaraları.

STDERR'ye çıktı (TIO'daki Hata Ayıklama alanı).

Sınırdışı ve düzenli:

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 bayt

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

Tamponun içine alın ve onu bir char dizisine ve ardından bir tamsayı dizisine dönüştürün. İkili dosyaya dönüştürülenlerin her biri için, girişleri gerektiğinde 0'larla doldurun ve büyük bir dize olarak katılın. Bu dizgiyi n karakterlere bölün ve oluşturulan boşlukları bırakın. Bölmeden gelen her eleman doldurulur (sadece son eleman gerçekten ihtiyaç duyar) ve tekrar bir tam sayıya dönüştürülür. Çıktı bir dizi


1

Python 3,5 - 312 292 bayt:

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

Bu uzun olsa da, bu, bildiğim kadarıyla içinde, koruyabilme hala hem fonksiyonları ve diziler hatasız ve kabul etmek en kısa yoldur bazı Python 3.5 doğruluğunu.


1

Java, 253 247 bayt

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

Jöle , 13 bayt

+256BḊ€Ẏsz0ZḄ

Çevrimiçi deneyin!

Dennis'in cevabından farklı.

Not: Girdi aslında negatif olmayan tam sayıların bir listesidir, ancak TIO bağlantısı sizin için acıyı hafifletir ve böyle bir listeyi veya dizeyi kabul eder.


1

Stax , 12 bayt

è■àåk┘K¥xk└╣

Koş ve hata ayıkla

Bu, mücadelede belirtildiği gibi bir işlev değil, bir program çünkü stax işlevleri desteklemiyor. Dizelerin veya dizi değişmezlerinin girişini destekler.




1

PHP , 135 bayt

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

Çevrimiçi deneyin!

Bir işlev olarak uygulanan giriş arabelleği bir ints dizisidir ve bir ints dizisi döndürür.

Çıktı

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

Tüm test durumlarını doğrulayın


Güzel! Benimkinden biraz daha kısa.
53'te mpen

0

APL (NARS), 471 karakter, 942 bayt

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

yorumlanmış kod ve 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 

0

İksir , 63 60 bayt

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

Çevrimiçi deneyin!

Elixir binary olarak girdi alır, bir tamsayı listesi çıkarır.

Bu kod, Elixir bitstring jeneratör kavramayı, giriş ikili dosyasını &1argüman olarak sağlanan bit büyüklükteki bloklar halinde yığınlamak için kullanır &2. Sonunda kalan bitleri hesaba katarsak, ikiliyi &2 - 1sıfır bitlerle doldururuz. Burada ayrıca, bazı istenmeyen ayrıntıların başladığı yer de var: Elixir &1, açıkça bir bit yayını olarak ilan etmememizden şikayet ediyor ve ayrıca ifadelerini desteklemiyorsasize(...) , dolayısıyla ekstra bir değişken ataması gerekmiyor.

Paskalya yumurtası: altbilgi, yerini IO.inspectile IO.putsve bizim işlevi sihirli Latin Çince Lorem ipsum "çevirir" - Online Deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.