Розділити байтовий масив на бітовий масив


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 ви, мабуть, використовуватимете рядок, у Вузлі ви можете використовувати буфер
    • Якщо ви використовуєте рядок для представлення буфера, припустіть, що це ASCII для перетворення char -> 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, що більше, ніж ціла точність більшості мови.
швидкісний літак

2
Чому повернене значення повинно бути ints ?
wizzwizz4

2
@ wizzwizz4 Я так не думаю. Вони не можуть бути байтами, оскільки у них немає 8 біт. Побітові оператори зазвичай працюють на ints і не дуже багато іншого. Якщо у вас є краща пропозиція, то я слухаю, але в іншому випадку є.
квітня 16-16

3
@ wizzwizz4 Тому що я не хочу, щоб люди могли пропустити крок. Я не хочу відповіді на кшталт "перші 5 біт цього байти містять відповідь" - результат не повинен містити зайвої інформації, і його слід легко перетворити назад в ASCII або деяке відображення символів (використання в реальному житті- випадок). Крім того, враховуючи кількість відповідей поки що, це не є проблемою.
квітня 16-16

1
@mpen Я бачу плутанину. charце ціле число, яке, здається , буде одним байтом.
wizzwizz4

Відповіді:


15

Піт, 18 17 байт

iR2c.[t.B+C1z\0QQ

Дякуємо @lirtosiast за байт!

            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

Джулія, 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])

Це функція, яка приймає цілий масив і ціле число і повертає цілий масив. Це вправа зловживання аргументами функцій.

Безголівки:

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 Я зрозумів, що я зробив щось не так спочатку, щоб воно працювало для тестового випадку, але не обов'язково взагалі. Хоча зараз все буде добре. :)
Олексій А.

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

Рекурсивне подвійне подрібнення на цілих масивах. Безголівки:

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 Мені вдалося переграти ще 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
Ніл

Ви впевнені, що цей працює? Неробочена версія розбиває Chrome.
квітня 1616

@mpen Гольф-версія безумовно працює на Firefox. У версії, що не має волі, в ній можуть бути помилки.
Ніл

Ага! І так воно і робить. Я думав, що двигун JS від Chrome випереджав FF, але, мабуть, ні.
квітня 16-16

1
@mpen Виправлено декілька тонких помилок у моєму коді, що не має волі.
Ніл

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]

використовувати трюк ітера для групування рядків

  • s: рядок вводу / буфер
  • n: кількість бітів у кожному розділеному фрагменті

Результати

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

@nullptr nмають те саме значення, що й питання:splits the buffer into chunks of n bits
Ерван

4

Рубін, 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)));}

(оновлено порадами Ісмаїла Мігеля )

Відформатовано для читабельності:

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 байти).
Ісмаїл Мігель

Завдяки @IsmaelMiguel я думаю , що ви замінили implodeз $Mхоча теж.
квітня

1
Якщо я це робив, то це було помилково. Мені дуже шкода. Але я радий, що тобі сподобався мій варіант вашого коду.
Ісмаїл Мігель

3

CJam, 30 байт

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

Спробуйте в Інтернеті!

Це неназваний блок, який очікує вкладення буфера та кількість фрагментів на стеку та залишає результат у стеку.

Вирішив спробувати CJam. На це мені знадобилося лише 2 години ^^ Це, мабуть, занадто довго, пропозиції дуже вітаються!

Пояснення

_ e # дублювати кількість фрагментів
@ e # поворот стека, масив тепер зверху, а шматок рахується внизу
{e # почати новий блок
 2b e # перетворити у двійкове
 8 0e [e # додайте нулі зліва, тому двійковий код становить 8 біт
} e # кінець попереднього блоку
% 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) або );(вийміть останній елемент і відкиньте його).
Esolanging Fruit

Зніс до 25 .
Esolanging Fruit

3

JavaScript (ES6) 104

Повторне ітеративне хитання,

Редагуйте 5 байтів, збережіть 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)

Менше гольфу

( 
 // 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 uh ... чому ... ідіотизм?
edc65

Я щойно помітив, що c-g?[...s,t<<c]:sможе заощадити ще пару байтів.
Ніл

@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 Ах, ну. Я забув, я змінив його на своєму комп’ютері перед публікацією. Виправимо.
Синій

@JackAmmo yup, звичайно. Дурна крихітна клавіатура телефону.
Синій

o[]=new int[b.length()*8/s+1]- Це призначить неправильний розмір Якщо(b.length()*8)%s==0
Кодер

2

Рубін , 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 (поле налагодження в 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

Потужність 146 байт

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

Візьміть у буфер і перетворіть його у масив char, а потім у цілий масив. Для кожного з них, перетворених у двійкові, прокладіть записи записом 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

Еліксир , 63 60 байт

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

Спробуйте в Інтернеті!

Приймає вхід як двійковий Elixir, виводить список цілих чисел.

Цей код використовує розуміння генератора біткордних рядків Elixir, щоб скинути вхідний двійковий код &1в бітові блоки розміру, подані в якості аргументу &2. Щоб врахувати будь-які біти, що залишилися в кінці, ми підбиваємо двійковий код з &2 - 1нульовими бітами. Тут також знаходиться місце, де починається небажане багатослів’я: Elixir скаржиться, якщо ми не &1оголосимо прямо як бітстринг, і він також не підтримує вирази size(...), отже, необхідність у додатковому призначенні змінної.

Великоднє яйце: у виносці, замініть IO.inspectз IO.puts, і наша функція магічним чином «переводить» Lorem Ipsum з латині на китайський - Спробуйте його в Інтернеті!


1

Japt , 16 байт

Після довгого дня зустрічей відчувається, що я забув, як грати в гольф! Пізніше пограю з цим у поїзді додому, подивіться, чи зможу я покращити його.

c_¤ùT8ÃòV úTV mÍ

Спробуй це


Ви кажете, що це 16 байт, якщо ви кодуєте його IEC 8859-1? Це навіть законно? Ви знайшли лазівку? Вони не вказали, що це повинен бути UTF-8? Тому що це 22 байти UTF-8.
mpen

@mpen 1.Кожна мова може безкоштовно використовувати власну кодування / кодову сторінку. 2.ISO-8859-1 - це досить стандартне кодування, яке використовується багатьма мовами і не стосується Japt, або цього конкретного рішення. 3.У вашій специфікації не зазначено, що ми повинні рахувати в UTF-8. 4.Якби це сталося, ви були б сильно відбиті від цього.
Кудлатий

Я нічого не намагаюся нав’язувати, я просто хотів дізнатися, чи було це загальноприйнято, і, здається, ти цілком правильний codegolf.meta.stackexchange.com/a/17800/23090 Оцінки TIO Зробити так само, що може бути простішим способом визначити це tio.run/##y0osKPn/Pzn@0JLDO0MsDjcf3hSmcHhXSJhC7uHe//8B редагувати 3: о, ваше посилання в значній мірі TIO.
mpen

1

PHP ,135 129 124 байти

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

Спробуйте в Інтернеті!

Реалізований як функція, вхідний буфер є масивом 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 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.