二进制墙弱


21

受启发于创建二元墙

给定一个正整数列表,我们可以像这样将它们彼此重叠地写出来,[2, 6, 9, 4]例如:

0010
0110
1001
0100

我们可以将其想象成一堵墙:

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

但是,这是一堵非常薄弱的​​墙,已经倒塌了!每个1#)跌落直到撞到“地面”或另一个1#)。的0S(.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]

挑战

给定一个正整数列表,将此转换应用于列表。输入/输出为任何合理格式的正整数列表。有标准漏洞。

这是一个,因此最短答案以字节为单位!



1
更多的用例?您知道,非方形测试用例会很好。
Leaky Nun

@LeakyNun当然。我会去做。
HyperNeutrino

那只是位数组的排序问题。
MarcusMüller17年

@MarcusMüller你是对的-我意识到,在MATL答案之后:P
HyperNeutrino

Answers:


29

MATL,4个字节

BSXB

MATL Online上尝试

说明

    % 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

o_O工作原理:o
HyperNeutrino

1
MATL是否仅将Jelly拖了4个字节?o_O
totallyhuman '17

现在有5个字节:-p
Leaky Nun

我从没想过会有内置的将其移动到底部xD +1的功能
HyperNeutrino

1
@totallyhuman好吧,等到丹尼斯来
JungHwan Min


5

JavaScript(ES6),50个字节

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

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

0011
0101

结果需要是这样的:

0001
0111

换句话说,第一行成为两行的AND,第二行成为两行的OR。这仅需要重复足够的次数,以使所有位都下降到底部。



2

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

认为您可以使用mì2 z3 mn z mì2
ETHproductions

@ETHproductions似乎旋转2D数组,而不是旋转字符串数组,null而是用每个空格而不是空格填充内部数组。因此,这似乎不起作用。和null排序在1s 的右边,与空格不同,排序在左边。
贾斯汀·马里纳

2

Mathematica,64个字节

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

是 \[Transpose]

这会将输入(数字列表)转换为数字列表,将其填充为方阵,对其进行转置,对行进行排序,以使“ 1”的“落”到底部,向后转置,然后转换回数字。



2

八度,29 25字节

@Stewie节省了4个字节

@(x)bi2de(sort(de2bi(x)))

de2bi/bi2de以八度保存4个字节。在octave-online.net上工作。
Stewie Griffin

@StewieGriffin谢谢!
Suever

1

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

再次有二进制左填充+1。而且,您能否解释一下为什么您需要使用转置的逆,因为它只是转置?
扎卡里

@Zacharý逆用于取消对每一行进行排序之前使用的操作。的确,转置的逆只是转置,但是另一种查看方式是<convert from binary> <transpose> <sort each row> <transpose> <convert to binary> M,其中前两个函数只是后两个的逆。
英里


1

Dyalog APL, 24 21 19字节

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

在线尝试!(已修改,因此TryAPL将其视为有效)

怎么样?

  • 评估的输入(数组以空格分隔)
  • 2⊥⍣¯1⊢ 将每个参数转换为二进制(转置问题中的内容)
  • 将2D数组变成向量的向量
  • {⍵[⍋⍵]}¨ 对向量的每个元素进行排序
  • 将向量的向量再次转换为2D数组
  • 2⊥ 从二进制转换(由于它进行了转置,因此我们得出了正确的结果)

1

Dyalog APL(23个字符)

{2⊥¨↓⍉↑{⍵[⍋⍵]}¨↓2⊥⍣¯1⊢⍵}
  1. 将输入参数转换为二进制矩阵
  2. 将矩阵拆分为列
  3. 按升序对列进行排序
  4. 将排序的行转换回十进制

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

感谢Zacharý在这一方面对我的纠正。


您可以将替换(⊥⍣¯1)⍵⊥⍣¯1⊢⍵。另外,我认为您不需要分割(↓[1]=> )上的轴规范。
扎卡里

哦,您应该将其转换回列表!
扎卡里

这是无效的。
扎卡里

谢谢您,扎查里(Zacharý),我昨晚正在做这项工作,我想我误解了问题。我已经修改了解决方案。
James Heslip

1
好,做得好!(⊥⍣¯1确实需要内置)。感谢您正确使用我的用户名。
扎卡里

0

JavaScript,127125字节

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

在线尝试

母牛嘎嘎声 -2个字节


(1<<c)&e可以成为2**c&e
Kritixi Lithos

0

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º,然后从每一行中创建整数。


142个字节,您有一些多余的括号。
Xcoder先生17年

@ Mr.Xcoder,哦,是的,这很愚蠢
Daniel Daniel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.