แยกอาร์เรย์ไบต์เป็นบิตอาร์เรย์


24

เขียนฟังก์ชั่นที่ให้บัฟเฟอร์b(1 - 104857600 ไบต์ยาว) และจำนวนบิตn(1 <= n <= 64) ให้แบ่งบัฟเฟอร์ออกเป็นส่วนnๆ ขวาแผ่นอันสุดท้ายด้วย0s ถึงnบิต

เช่น

รับบัฟเฟอร์b = "f0oBaR"หรือเทียบเท่า[102,48,111,66,97,82]และn = 5ส่งคืน

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

นี่เป็นเพราะบัฟเฟอร์ข้างต้นเมื่อแสดงเป็นไบนารีดูเหมือนว่า:

01100110 00110000 01101111 01000010 01100001 01010010

และเมื่อจัดกลุ่มเป็น 5s อีกครั้งจะมีลักษณะดังนี้:

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

ซึ่งเมื่อแปลงกลับเป็นทศนิยมจะให้คำตอบ

หมายเหตุ

  • คุณอาจใช้ชนิดข้อมูลใดก็ได้ที่เหมาะสมที่สุดในภาษาของคุณเพื่อใช้แทนบัฟเฟอร์ ใน PHP คุณอาจใช้สตริงใน Node คุณอาจต้องการใช้Buffer
    • หากคุณใช้สตริงเพื่อแทนบัฟเฟอร์ให้ถือว่าเป็น ASCII สำหรับการแปลงถ่าน -> int
    • คุณสามารถใช้อาร์เรย์ของ ints (0-255) สำหรับการป้อนข้อมูลหากคุณต้องการ
  • ค่าส่งคืนต้องเป็นอาร์เรย์หรือรายการของ ints

กรณีทดสอบ

> 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
มันควรจะทำงานกับค่าที่nมากกว่า 8 หรือไม่? ถ้าเป็นเช่นนั้นแล้วค่าใดที่nมากกว่า 64 ซึ่งมากกว่าความแม่นยำจำนวนเต็มของภาษาส่วนใหญ่
speedplane

2
ทำไมค่าตอบแทนจะต้องมีการints ?
wizzwizz4

2
@ wizzwizz4 ฉันไม่คิดอย่างนั้น ไม่สามารถเป็นไบต์ได้เนื่องจากไม่มี 8 บิต ตัวดำเนินการบิตเร็ตปกติทำงานบน ints และไม่มาก หากคุณมีข้อเสนอแนะที่ดีกว่าฉันกำลังฟังอยู่
mpen

3
@ wizzwizz4 เพราะฉันไม่ต้องการให้คนอื่นข้ามขั้นตอนได้ ฉันไม่ต้องการคำตอบเช่น "5 บิตแรกของไบต์นี้มีคำตอบ" - ผลลัพธ์ไม่ควรมีข้อมูลที่ฟุ่มเฟือยใด ๆ และควรแปลงกลับเป็น ASCII หรือการแมปอักขระได้อย่างง่ายดาย (ชีวิตจริงใช้ - กรณี). นอกจากนี้เมื่อพิจารณาจำนวนคำตอบจนถึงไม่ปรากฏว่ามีปัญหา
mpen

1
@mpen ฉันเห็นความสับสน charเป็นจำนวนเต็มที่มีความยาวหนึ่งไบต์
wizzwizz4

คำตอบ:


15

Pyth, 18 17 ไบต์

iR2c.[t.B+C1z\0QQ

ขอบคุณ@lirtosiastสำหรับ byte!

            z      get input
         +C1       prepend a 0x01 to prevent leading zeroes from disappearing
       .B          convert to binary string
      t            remove the leading 1 from ^^
    .[       \0Q   pad right with zeroes to multiple of second input
   c            Q  get chunks/slices of length second input
iR2                map(x: int(x, 2))

13

เยลลี่ขนาด 13 ไบต์

1;ḅ256æ«BḊsḄṖ

สิ่งนี้ใช้อินพุตเป็นรายการของจำนวนเต็ม ลองออนไลน์!

มันทำงานอย่างไร

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 ไบต์

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

นี่คือฟังก์ชั่นที่ยอมรับอาร์เรย์จำนวนเต็มและจำนวนเต็มและส่งคืนอาร์เรย์จำนวนเต็ม มันเป็นแบบฝึกหัดในการใช้อาร์กิวเมนต์ฟังก์ชั่นการละเมิด

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

เหตุใดคุณจึงลบชั่วคราว
CalculatorFeline

@CatsAreFluffy ฉันรู้ว่าฉันได้ทำอะไรผิดไปตั้งแต่แรกมันใช้งานได้กับกรณีทดสอบ แต่ไม่จำเป็นต้องเป็นแบบทั่วไป ควรจะดีตอนนี้ :)
Alex A.

5

Python 3, 102 ไบต์

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]

ใช้เคล็ดลับ iterเพื่อจัดกลุ่มสตริง

ผล

>>> 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' พารามิเตอร์ทำอะไร
nullptr

5

JavaScript (ES6), 120 ไบต์

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

วนซ้ำแบบสองบิตบนอาร์เรย์จำนวนเต็ม 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;
        }
    }
}

@ Washingtonton Guedes ฉันจัดการเพื่อเล่นกอล์ฟอีก 9 ไบต์จากสนามกอล์ฟของตัวเอง แต่ก็ยังมี 129 ไบต์ขออภัย:"(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

คุณแน่ใจหรือไม่ว่าอันนี้ทำงาน? เวอร์ชันที่ไม่ได้รับการอัปโหลดกำลังขัดข้อง Chrome
mpen

@mpen เวอร์ชัน golfed ทำงานบน Firefox อย่างแน่นอน เวอร์ชันที่ไม่ดีอาจมีข้อผิดพลาดอยู่
Neil

Aha! และมันก็เป็นเช่นนั้น ฉันคิดว่าเครื่องยนต์ JS ของ Chrome อยู่ข้างหน้า FF แต่ฉันเดาไม่ได้
mpen

1
@mpen แก้ไขข้อบกพร่องเล็กน้อยในโค้ด ungolfed ของฉันให้คุณ
Neil

4

Ruby, 114 ไบต์

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

ทำความสะอาดเล็กน้อย:

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ไบต์

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 )

จัดรูปแบบเพื่อให้อ่านง่าย:

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

ตัวอย่าง:

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

1
แทนที่จะคุณสามารถใช้str_pad($s,8,'0',STR_PAD_LEFT) str_pad($s,8,0,0)คุณสามารถลบเครื่องหมายคำพูดบนbindecและdecbinเพื่อบันทึก 4 ไบต์ เพื่อประหยัดมากขึ้นคุณสามารถเก็บไว้array_mapในตัวแปรและส่งแทน ไปเลย: 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 ไบต์)
Ismael Miguel

ขอบคุณ @IsmaelMiguel ฉันคิดว่าคุณแทนที่implodeด้วย$Mเหมือนกัน
mpen

1
ถ้าฉันทำมันเป็นความผิดพลาด ฉันขอโทษจริงๆ แต่ฉันดีใจที่คุณชอบรูปแบบของรหัสของฉัน
Ismael Miguel

3

CJam, 30 ไบต์

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

ลองออนไลน์!

นี่เป็นบล็อกที่ไม่มีชื่อซึ่งคาดว่าบัฟเฟอร์ภายในและจำนวนของชิ้นข้อมูลบนสแต็กและปล่อยผลลัพธ์ไว้บนสแต็ก

ตัดสินใจที่จะลองใช้ CJam ใช้เวลาเพียง 2 ชั่วโมงในการทำให้เสร็จ ^^ นี่อาจนานเกินไปคำแนะนำยินดีต้อนรับ!

คำอธิบาย

_ e # ซ้ำจำนวนอัน
@ e # หมุนสแต็กตอนนี้อยู่ด้านบนสุดแล้วนับเป็นก้อนที่ด้านล่าง
{e # เริ่มบล็อกใหม่
 2b e # แปลงเป็นไบนารี
 8 0e [e # เพิ่มศูนย์ทางซ้ายดังนั้นเลขฐานสองคือ 8 บิต
} e # end บล็อกก่อนหน้า
% e # ใช้บล็อกนี้กับแต่ละองค์ประกอบอาร์เรย์ (แผนที่)
e_ e # อาร์เรย์ที่เรียบ
0a e # ดันอาร์เรย์ด้วยศูนย์เดียวไปยังสแต็ก
@ e # หมุนสแต็คสแต็คมีตอนนี้ n [อาร์เรย์] [0] n
* e # ทำซ้ำอาร์เรย์ [0] n ครั้ง
+ e # concat ทั้งสองอาร์เรย์
/ e # แบ่งออกเป็นส่วน ๆ ของความยาว n ตอนนี้สแต็กมีเฉพาะอาร์เรย์
-1 <e # ละทิ้งก้อนสุดท้าย
{2b}% e # แปลงก้อนทั้งหมดกลับเป็นทศนิยม

1. คุณสามารถเขียน2b8Tแทน2b8 0การบันทึกไบต์ (ตัวแปรTถูกกำหนดไว้ล่วงหน้าเป็น0) 2. การละทิ้งชิ้นสุดท้ายที่สามารถทำได้ด้วยW<(ตัวแปรWถูกกำหนดค่าเริ่มต้นเป็น-1) หรือ);(นำองค์ประกอบสุดท้ายออกแล้วละทิ้ง)
แยกผลไม้

ได้มันลงไปที่25
แยกผลไม้

3

JavaScript (ES6) 104

วนซ้ำทีละน้อยเล่นซอ

แก้ไข 5 ไบต์บันทึกขอบคุณ @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)

น้อย golfed

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

ทดสอบ

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
แทนที่จะเพิ่มเป็นสองเท่าxในแต่ละครั้งทำไมไม่ลองเปลี่ยนบิตxขวาiล่ะ
Neil

@Neil เอ่อ ... ทำไม ... งี่เง่า
edc65

ฉันเพิ่งสังเกตเห็นว่าc-g?[...s,t<<c]:sอาจช่วยให้คุณประหยัดอีกสองสามไบต์
Neil

@Neil สิ่งนี้ต้องใช้ความคิดบางอย่าง
edc65

2

J, 24 ไบต์

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

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อซึ่งใช้nเป็นอาร์กิวเมนต์ซ้ายและbเป็นตัวเลขเป็นอาร์กิวเมนต์ที่ถูกต้อง

ทดสอบ:

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

คำอธิบาย:

[:#.-@[>\;@(_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 ไบต์

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

ตัวอย่างการใช้งาน: ->5 # [102,48,111,66,97,82][12,24,24,6,30,16,19,1,10,8]

มันทำงานอย่างไร

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 ไบต์

ฉันหวังว่านี้จะชนะ PHP ... และไม่ ชื่อฟังก์ชั่นยาวโง่

-7 ขอบคุณ @quartata สำหรับการกำจัดสาธารณะ +16 เพื่อแก้ไขข้อผิดพลาดเมื่อการแยกเป็นจริงขอบคุณ @TheCoder สำหรับการจับ

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
ฉันไม่คิดว่าคุณต้องทำให้ฟังก์ชั่นเป็นสาธารณะ
สปาเก็ตตี้

คุณใช้ Java รุ่นใดใน ดูเหมือนจะไม่ได้รวบรวม: ideone.com/3tonJt
mpen

@mpen อ๊ะโอ้โห ฉันลืมฉันเปลี่ยนมันในคอมพิวเตอร์ก่อนโพสต์ จะแก้ไข
Blue

@JackAmmo yup แน่ใจแล้วใช่ไหม คีย์บอร์ดโทรศัพท์ขนาดจิ๋วโง่
Blue

o[]=new int[b.length()*8/s+1]- สิ่งนี้จะกำหนดขนาดผิดถ้า(b.length()*8)%s==0
The Coder

2

Ruby , 66 ไบต์

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

ลองออนไลน์!

ใช้บัฟเฟอร์อินพุตเป็นสตริงเพื่อให้มีการสร้างสตริงการทดสอบเพียงเล็กน้อยในส่วนท้ายเพื่อหลีกเลี่ยงการไม่พิมพ์


2

MATL , 9 ไบต์

8&B!we!XB

ลองออนไลน์!

จะเข้าbเป็นสตริงคั่นด้วย''หรือเป็นอาร์เรย์ของค่าคั่นด้วยเครื่องหมายจุลภาคเช่นนั้น[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 ไบต์

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

ลองออนไลน์!

ต้องใช้Data::Dumpโมดูล

ใช้เวลาnในบรรทัดแรกของการป้อนข้อมูลและตัวเลขในแต่ละบรรทัดหลังจากนั้น

เอาต์พุตไปยัง STDERR (ฟิลด์ Debug บน TIO)

แยกออกและจัดเรียง:

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 ไบต์

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

ใช้ในบัฟเฟอร์และแปลงเป็นอาร์เรย์ถ่านแล้วอาร์เรย์จำนวนเต็ม สำหรับแต่ละการแปลงเป็นไบนารีให้คั่นรายการด้วย 0 หากจำเป็นและเข้าร่วมเป็นสตริงขนาดใหญ่หนึ่งรายการ แยกสตริงนั้นให้เป็นอักขระnและปล่อยช่องว่างที่สร้างขึ้น องค์ประกอบจากการแยกแต่ละรายการจะถูกเพิ่ม (เฉพาะองค์ประกอบสุดท้ายเท่านั้นที่ต้องการจริงๆ) และแปลงกลับเป็นจำนวนเต็ม เอาท์พุทเป็นอาร์เรย์


1

Python 3.5 - 312 292 ไบต์:

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

แม้ว่านี่อาจจะนาน แต่ในความรู้ของฉันนี่เป็นวิธีที่สั้นที่สุดในการยอมรับทั้งฟังก์ชั่นและอาร์เรย์โดยไม่มีข้อผิดพลาดและยังสามารถรักษาความถูกต้องบางอย่างไว้ใน Python 3.5


1

Java, 253 247 ไบต์

แข็งแรงเล่นกอล์ฟ

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

เยลลี่ขนาด 13 ไบต์

+256BḊ€Ẏsz0ZḄ

ลองออนไลน์!

แตกต่างจากคำตอบของเดนนิส

หมายเหตุ: อินพุตนั้นเป็นรายการของจำนวนเต็มที่ไม่เป็นลบ แต่ลิงก์ TIO ช่วยลดความเจ็บปวดให้คุณและยอมรับรายการหรือสตริงดังกล่าว


1

Stax , 12 ไบต์

è■àåk┘K¥xk└╣

เรียกใช้และแก้ไขข้อบกพร่อง

นี่ไม่ใช่ฟังก์ชันตามที่ระบุในการท้าทาย แต่เป็นโปรแกรมเนื่องจาก stax ไม่รองรับฟังก์ชั่น สนับสนุนอินพุตของสตริงหรือตัวอักษรอาร์เรย์




1

PHP , 135 ไบต์

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

ลองออนไลน์!

นำมาใช้เป็นฟังก์ชั่นอินพุตบัฟเฟอร์เป็นอาร์เรย์ของ ints และส่งกลับอาร์เรย์ของ ints

เอาท์พุต

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

ตรวจสอบกรณีทดสอบทั้งหมด


ดี! ค่อนข้างสั้นกว่าของฉันเล็กน้อย
mpen

0

APL (NARS), 471 ตัวอักษร, 942 ไบต์

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

รหัสความคิดเห็นและการทดสอบ:

  ⍝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

Elixir , 63 60 bytes

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

ลองออนไลน์!

รับอินพุตเป็น Elixir ไบนารีเอาต์พุตรายการจำนวนเต็ม

รหัสนี้ทำให้การใช้ยาอายุวัฒนะ bitstring เข้าใจกำเนิดไฟฟ้าเพื่อป้อนข้อมูลไบนารีก้อนลงในบล็อกบิตของขนาดให้เป็นอาร์กิวเมนต์&1 &2ในการอธิบายบิตที่เหลือใด ๆ ในตอนท้ายเราจะวางไบนารีด้วย&2 - 1ศูนย์บิต ที่นี่ยังเป็นสถานที่ซึ่งความฟุ่มเฟื่อยที่ไม่พึงประสงค์เตะใน: ยาอายุวัฒนะบ่นถ้าเราไม่ได้ประกาศอย่างชัดเจน&1เป็น bitstring และมันยังไม่สนับสนุนการแสดงออกในsize(...)ดังนั้นจึงจำเป็นต้องมีการกำหนดตัวแปรเพิ่มเติม

ไข่อีสเตอร์: ในส่วนท้ายแทนที่IO.inspectด้วยIO.putsและฟังก์ชั่นของเราอย่างน่าอัศจรรย์ "แปล" Lorem ipsum จากละตินเป็นจีน - ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.