バイナリウォールの弱化

HyperNeutrino 08/18/2017. 14 answers, 1.278 views
code-golf number binary binary-matrix

インスピレーションを受けたバイナリウォールを作成する

正の整数のリストが与えられれば、例として[2, 6, 9, 4]ように、互いに上に書くことができます:

0010
0110
1001
0100 

私たちは壁としてこれを想像することができます:

..#.
.##.
#..#
.#.. 

しかし、これは非常に弱い壁です、そして、それは崩壊しました! 各1# )は「地面」または別の1# )に当たるまで下がります。 0秒(s)は1秒間移動したスポットに存在します。

これは次のようになります。

....
....
.##.
#### 

これは次のように翻訳されます:

0000
0000
0110
1111 

数字のリストとして[0, 0, 6, 15]ます。

別のテストケース

[10, 17, 19, 23] 

これは次のようになる:

01010
10001
10011
10111 

次のようになります。

00000
10011
10011
11111 

翻訳する:

[0, 19, 19, 31] 

チャレンジ

正の整数のリストが与えられたら、この変換をリストに適用します。 任意の妥当な形式で正の整数のリストとして入力/出力します。 標準の抜け穴が適用されます。

これはであるため、バイト単位の最短回答が勝ちます!

5 Comments
1 Leaky Nun 07/29/2017
より多くのテストケース? ご存知のとおり、非正方形のテストケースは良いでしょう。
HyperNeutrino 07/29/2017
@LeakyNun確かに。 私はそれをします。
Marcus Müller 07/30/2017
これはビット配列の並べ替えの問題です。
HyperNeutrino 07/30/2017
@MarcusMüllerあなたが正しいです - 私はそれがMATL答え後に実現した:P

14 Answers


Suever 07/29/2017.

MATL 、4バイト

BSXB 

MATLオンライン試しください

Explanation

% Implicitly grab input as an array 
    %   STACK: [10, 17, 19, 23]
B   % Convert each element to binary where each decimal number results in a row
    %   STACK: [0 1 0 1 0;
    %           1 0 0 0 1;
    %           1 0 0 1 1;
    %           1 0 1 1 1]
S   % Sort each column, placing all of the 1's at the bottom of each column
    %   STACK: [0 0 0 0 0;
    %           1 0 0 1 1;
    %           1 0 0 1 1;
    %           1 1 1 1 1] 
XB  % Convert each row from its binary representation to its decimal number
    %   STACK: [0, 19, 19, 31]
    % Implicitly display the result 
5 comments
HyperNeutrino 07/29/2017
o_Oこれはどのように動作するのですか:o
1 totallyhuman 07/29/2017
MATLは4 bytesだけJellyゴルフをしましたか? o_O
Leaky Nun 07/29/2017
今すぐ5バイト: - p
HyperNeutrino 07/29/2017
私は、底を下に移動するビルトインがあるとは考えなかったxD +1
1 JungHwan Min 07/29/2017
@totallyhumanまあ、デニスが来るまで待って

Anders Kaseorg 07/29/2017.

Python 、68バイト

 f=lambda a:a and[x|y&a[0]for x,y in zip([0]+f(a[1:]),f(a[1:])+[-1])] 

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


Neil 07/29/2017.

JavaScript(ES6)、50バイト

f=a=>a.map(_=>a.map((e,i)=>a[a[i]|=a[--i],i]&=e))&&a 

説明:壁の2つの行が次のようなものだったとします。

0011
0101 

結果は次のとおりです。

0001
0111 

言い換えれば、第1行は2行の論理積となり、第2行は2行の論理和となる。 これは、すべてのビットが下に落ちるのに十分な時間だけ繰り返す必要があります。


Leaky Nun 07/29/2017.

Justin Mariner 07/29/2017.

Japt 、16バイト

m¤z3 ®¬n qÃz mn2 

オンラインで試してみてください! -Qフラグを使用して配列結果をフォーマットします。

説明

m¤z3 ®¬n qÃz mn2    Implicit: U = input array.
                        [10, 17, 19, 23]
m¤z3                Map U to binary strings and rotate the array left 90°
                         1010       0111
                        10001   ->  1011
                        10011       0001
                        10111       1000
                                     111
®¬n qà              Sort each binary string, putting 0s and spaces at the start
                        0111
                        0111
                        0001
                        0001
                         111
z mn2               Rotate right 90° and convert each back to a number
                         0000       0
                        10011   ->  19
                        10011       19
                        11111       31
                    Implicit output of resulting array 
2 comments
ETHproductions 07/30/2017
thinkあなたがmì2 z3 mn z mì2バイトをセーブすることができるとthinkます
Justin Mariner 07/30/2017
@ETHproductions文字列の配列を回転させるのではなく、2D配列を回転させるように見えますが、各内部配列をnullなくnull埋めます。 それはうまくいかないようです。 そして、 nullは、左にソートされたスペースとは異なり、1sの右側にソートされます。

DanTheMan 07/30/2017.

Mathematica、64バイト

#~FromDigits~2&/@(Sort/@(PadLeft[#~IntegerDigits~2&/@#]))& 

は\[Transpose]

これは入力(数字のリスト)を数字のリストのリストに変換し、それを正方行列にパッディングし、転置し、1を "下降"させるように行をソートし、転置してから数値に変換します。


xnor 07/30/2017.

Python 3.5,60バイト

 def f(a,*t):
 if t:b,*r=f(*t);t=f(a|b,*r);a&=b
 return(a,*t) 

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

f(2, 6, 9, 4) 2,6,9,4)のような入力を受け取ります。 入力が空でないと仮定します。 多くのタプル展開を使用します。


Suever 07/30/2017.

オクターブ、29〜25バイト

4 bytes saved thanks to @Stewie

@(x)bi2de(sort(de2bi(x))) 
2 comments
Stewie Griffin 07/30/2017
de2bi/bi2deは4バイトをオクターブで保存します。 octave-online.net上で動作します。
Suever 07/30/2017
@StewieGriffinありがとう!

miles 07/29/2017.

J 、13バイト

/:~"1&.|:&.#: 

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

説明

/:~"1&.|:&.#:  Input: array M
           #:  Convert each in M to binary with left-padding
       |:&     Transpose
/:~"1&         Sort each row
     &.|:      Inverse of transpose (which is just transpose)
         &.#:  Inverse of converting to binary 
2 comments
Zacharý 07/30/2017
そのバイナリ左パディングが再びあります。+1。 また、トランスポーズの逆数を使用する必要がある理由について説明してください。
miles 08/01/2017
@Zacharý逆は、各行をソートする前に使用した操作を元に戻すために使用されます。 transposeの逆数は単なる転置であることは事実ですが、これを見るもう一つの方法は Mです。最後の2つの逆。

Erik the Outgolfer 07/30/2017.

05AB1E 、9バイト

bí0ζR€{øC 

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

Magicとは別のアルゴリズム。

3 comments
Magic Octopus Urn 07/31/2017
ζ 、犯人。 削除された鉱山、私の+1を取る。
Erik the Outgolfer 07/31/2017
@MagicOctopusUrnなぜあなたはあなたを削除しましたか? する必要がない。
Magic Octopus Urn 07/31/2017
実際にはアルゴリズムの点でそれほど違いはありませんが、これは25%優れています。

Zacharý 07/30/2017.

Dyalog APL、 24 21 19バイト

2⊥↑{⍵[⍋⍵]}¨↓2⊥⍣¯1⊢⎕ 

オンラインで試してみてください! (TryAPLはそれを有効とみなして変更しました)

どうやって?

  • 評価された入力(配列はスペースで区切られている)
  • 2⊥⍣¯1⊢それぞれの引数をそれぞれ2⊥⍣¯1⊢変換します(問題に置き換えられます)
  • 2D配列をベクトルのベクトルに変換する
  • {⍵[⍋⍵]}¨ベクトルの各要素をソートする
  • は、ベクトルのベクトルを再び2D配列に変換します。
  • 2⊥バイナリからの変換(それは並べ替えのため、正しい結果が得られます)

James Heslip 07/30/2017.

ダイロッグAPL(23文字)

NO 
  1. 入力引数を2進行列に変換する
  2. 行列を列に分割する
  3. 列を昇順にソートする
  4. ソートされた行を10進数に戻します。

{2⊥¨↓⍉↑{⍵[⍋⍵]}¨↓2⊥⍣¯1⊢⍵}10 17 19 23
      0 19 19 31 

Zacharýに感謝してくれてありがとうございました。

5 comments
Zacharý 07/30/2017
あなたは(⊥⍣¯1)⍵⊥⍣¯1⊢⍵置き換えることができます。 また、split( ↓[1] => )で軸指定が必要ではないと思います。
Zacharý 07/30/2017
ああ、あなたはリストに戻す必要があります!
Zacharý 07/30/2017
これは無効です。
James Heslip 07/30/2017
ありがとう、Zacharý、私はこの昨夜遅くに取り組んでいました。私は問題を誤解したと思います。 今私のソリューションを変更しました。
1 Zacharý 07/30/2017
さて、良い仕事! ( ⊥⍣¯1本当に⊥⍣¯1する必要があります)。 実際に私のユーザー名を正しく取得してくれてありがとう。

ThePirateBay 07/29/2017.

JavaScript、 127 125バイト

a=>a[m='map'](_=>b[m]((n,i)=>n&&(b[i]--,d|=1<a[m](e=>d+=!!(2**c&e),d=0)&&d)).reverse() 

オンラインで試してみてください

-2 bytes thanks to Cows quack

1 comments
Cows quack 07/29/2017
(1<2**c&e

Dopapp 07/30/2017.

Python 2、142バイト

...とまだゴルフを...うまくいけば - どんな助けもよろしく!

 def c(l):b=[bin(n)[2:]for n in l];print[int(n,2)for n in map(''.join,zip(*map(sorted,zip(*['0'*(len(max(b,key=len))-len(x))+x for x in b]))))] 

これの大きなチャンクは、数字をゼロで埋めるためのものです。

より読みやすい:

 def collapse(nums):
    bins = [bin(n)[2:] for n in nums]
    bins = [('0'*(len(max(bins, key = len)) - len(x))) + x for x in bins]
    print [int(n, 2) for n in map(''.join, zip(*map(sorted, zip(*bins))))] 

これは、バイナリ文字列表現の配列を作成し、それをパディングし、時計回りに90度回転させ、各行をソートし、90度回転させてから、各行から整数を作成します。

2 comments
Mr. Xcoder 07/30/2017
142バイトの場合、冗長な括弧があります。
Dopapp 07/30/2017
@ Mr.Xcoder、ああ、それは愚かだった

Related questions

Hot questions

Language

Popular Tags