バイト配列をビット配列に分割します


24

バッファb(1〜104857600バイトの長さ)とビット数n(1 <= n <= 64)を指定すると、バッファをnビットのチャンクに分割する関数を記述します。最後のチャンクを0sまでnビットで右詰めします。

例えば

バッファb = "f0oBaR"または同等の[102,48,111,66,97,82]andを指定するとn = 5

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

これは、上記のバッファがバイナリとして表される場合、次のようになるためです。

01100110 00110000 01101111 01000010 01100001 01010010

そして、5に再グループ化すると、次のようになります。

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

10進数に戻すと、答えが得られます。

ノート

  • バッファを表すために、言語で最も意味のあるデータ型を使用できます。PHPではおそらく文字列を使用しますが、NodeではBufferを使用したい場合があります
    • 文字列を使用してバッファを表す場合、char-> int変換ではASCIIであると想定します
    • 必要に応じて、入力にintの配列(0〜255)を使用できます。
  • 戻り値は配列または整数のリストでなければなりません

テストケース

> 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より大きい値で機能するはずですか?その場合n、64より大きい値はどうでしょうか。これは、ほとんどの言語の整数精度よりも大きい値です。
スピードプレーン

2
戻り値が整数である必要があるのはなぜですか?
wizzwizz4

2
@ wizzwizz4そうは思いません。8ビットを持たないため、バイトにすることはできません。ビット演算子は通常、intで機能しますが、それ以外はあまり機能しません。あなたがより良い提案を持っている場合、私は聞いていますが、そうでない場合はそうです。
mpen

3
@ wizzwizz4人々がステップをスキップできるようにしたくないからです。「このバイトの最初の5ビットに回答が含まれる」などの回答は必要ありません-結果に余分な情報が含まれてはならず、ASCIIまたは一部の文字マッピングに簡単に変換して戻す必要があります(実際の使用-場合)。また、これまでの回答の数を考えると、問題ではないようです。
mpen

1
@mpen混乱が見られます。たまたま1バイトのchar整数です。
wizzwizz4

回答:


15

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

なぜ一時的に削除したのですか?
電卓

@CatsAreFluffy私は最初に何か間違ったことをしていたので、テストケースでは機能していましたが、必ずしも一般的なことではないことに気付きました。でも今はすべてうまくいくはずです。:)
アレックス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]

イタートリックを使用するを文字列をグループ化する

結果

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

整数配列での再帰的なビット調整。ゴルフをしていない:

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をクラッシュさせます。
mpen

@mpenゴルフバージョンは間違いなくFirefoxで動作します。改変されていないバージョンにはエラーがある可能性があります。
ニール

あぁ!そしてそうです。ChromeのJSエンジンはFFの先にあると思いましたが、そうではないと思います。
mpen

1
@mpen使用されていないコードのいくつかの微妙なバグを修正しました。
ニール

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

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し、decbin4つのバイトを保存します。さらに保存するに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あまりにもかかわらず。
mpen

1
もしそうなら、それは間違っていた。本当にごめんなさい。しかし、コードのバリエーションが気に入ってくれてうれしいです。
イスマエルミゲル

3

CJam、30バイト

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

オンラインでお試しください!

これは、intバッファとスタック上のチャンクの量を予期し、結果をスタックに残す名前のないブロックです。

CJamを試してみることにしました。完了までに2時間しかかかりませんでした^^これはおそらく長すぎるので、提案は大歓迎です!

説明

_ e#チャンクカウントを複製する
@ e#スタックを回転、配列が一番上、チャンク数が一番下
{e#新しいブロックを開始
 2b E#バイナリに変換
 8 0e [e#は左側にゼロを追加するため、バイナリは8ビットです
} e#end previous block
%e#このブロックを各配列要素(マップ)に適用します
e_ e#配列をフラット化
0a e#単一のゼロを持つ配列をスタックにプッシュします
@ e#スタックを回転、スタックにはn [配列] [0] nが含まれるようになりました
* e#配列[0]をn回繰り返す
+ e#2つの配列を連結
/ e#は長さnのチャンクに分割され、スタックには配列のみが含まれるようになりました
-1 <e#最後のチャンクを破棄
{2b}%e#すべてのチャンクを10進数に戻す

1.あなたは書くことができます2b8Tではなく、2b8 0(変数がバイトを保存するためTに前もって初期化された0最後のチャンクがで行うことができます破棄)2 W<(変数Wに初期化される-1)、または);(最後の要素を取り出し、それを捨てます)。
エソランジングフルーツ

25まで下げました。
エソランジングフルーツ

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毎回倍増する代わりに、xiビットをシフトしてみませんか?
ニール

@ニールええと...なぜ...ばかげている?
edc65

あとc-g?[...s,t<<c]:s2、3バイト節約できることに気付きました。
ニール

@ニールこれにはいくつかの考えが必要です
-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

ハスケル、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分割が正確であった場合にエラーを修正するためにパブリック+16を削除してくれた@quartataに感謝します。それをキャッチしてくれた@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
関数を公開する必要はないと思います。
spaghetto

どのバージョンのJavaでこれを実行しましたか?コンパイルしていないようです:ideone.com/3tonJt
MPEN

@mpenああ、おっと。投稿する前にコンピューターで変更しました。修正します。
ブルー

@JackAmmoうん、確かにした。愚かな小さな電話キーボード。
ブルー

o[]=new int[b.length()*8/s+1]-これは場合は、間違ったサイズを割り当てます(b.length()*8)%s==0
Coderの


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、96 -nl -MData::Dump=ppバイト

$}=$_;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

Powershell 146バイト

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

バッファを取得し、それをchar配列に変換してから整数配列に変換します。バイナリに変換するそれぞれについて、必要に応じてエントリに0を埋め込み、1つの大きな文字列として結合します。その文字列を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;
ザカリー





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

オンラインでお試しください!

入力バッファは関数として実装され、intの配列であり、intの配列を返します。

出力

> 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

エリクサー63 60バイト

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

オンラインでお試しください!

入力をElixirバイナリとして受け取り、整数のリストを出力します。

このコードはElixirビットストリングジェネレーターの内包表記を使用して、入力バイナリ&1を引数として提供されたサイズのビットブロックにチャンクします&2。最後に残ったビットを説明するために、バイナリにゼロビットを&2 - 1埋め込みます。不要な冗長性が発生する場所もここにあります。&1ビットストリングとして明示的に宣言しないと、Elixirは文句を言います。size(...)、のため、追加の変数割り当てが必要です。

イースターエッグ:フッターに置き換えるIO.inspectIO.puts、そして私達の機能は魔法のラテン語から中国語Loremのイプサムを「翻訳」 - オンラインそれをお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.