虚弱的二进制墙

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 Online上试试

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 ? O_O
Leaky Nun 07/29/2017
现在5个字节:-p
HyperNeutrino 07/29/2017
我从来没有想过会有一个内置的移动到底部xD + 1
1 JungHwan Min 07/29/2017
好了,等到丹尼斯来

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 

说明:假设墙的两排是这样的:

0011
0101 

结果需要是这样的:

0001
0111 

换句话说,第一行成为两行的“与”,第二行成为两行的“或”。 这只需要重复足够的时间,以使所有的位都落到底部。


Leaky Nun 07/29/2017.

果冻 ,9个字节

BUz0Ṣ€ZUḄ 

在线试用!


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保存一个字节
Justin Mariner 07/30/2017
@ETHproductions旋转二维数组,而不是旋转字符串数组,而是用null而不是空格填充每个内部数组。 所以这似乎并不奏效。 null值排序在1的右侧,不同于空格,它们排序在左侧。

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 f(2, 6, 9, 4) 。 假设输入是非空的。 使用大量的元组拆包


Suever 07/30/2017.

Octave, 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ý逆序用于撤消排序每行之前使用的操作。 确实,转置的反转只是转置,但另一种看到这种情况的方式是 M ,其中前两个函数只是倒数最后两个。

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⊢将每个参数转换为二进制(转置问题中的内容)
  • 将2D数组转换为矢量矢量
  • {⍵[⍋⍵]}¨对矢量的每个元素进行排序
  • 再次将矢量矢量转换为二维数组
  • 2⊥从二进制转换(因为它转换它,我们得到正确的结果)

James Heslip 07/30/2017.

Dyalog APL(23个字符)

NO 
  1. 将输入参数转换为二进制矩阵
  2. 将矩阵拆分为列
  3. 按升序对列进行排序
  4. 将排序的行转换回十进制

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

感谢Zacharý纠正我的错误。

5 comments
Zacharý 07/30/2017
你可以用(⊥⍣¯1)⍵替代(⊥⍣¯1)⍵ ⊥⍣¯1⊢⍵ 。 另外,我认为你不需要拆分轴的规格( ↓[1] => )。
Zacharý 07/30/2017
哦,你应该把它转换回列表!
Zacharý 07/30/2017
这是无效的。
James Heslip 07/30/2017
谢谢Zacharý,昨晚我正在研究这个问题,我想我误解了这个问题。 我现在修改了我的解决方案。
1 Zacharý 07/30/2017
好,干得好! ( ⊥⍣¯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