创建一个二进制墙


33

给定以10为底的正整数数组,其中n > 0输出二进制墙的表示形式。

这是如何运作的?

  1. 将每个数字转换为其二进制表示形式。
  2. 用前导零填充表示形式到最长的零,即1, 2-> 1, 10-> 01, 10
  3. 1s为砖块而0s为砖块的情况下创建墙。

墙是一个字符块,其中任何可打印的字符代表一块砖块,而空格(32)代表丢失的砖块。您可以为砖块选择任何字符,只要它不是空白字符,就不必在墙上有区别。缺少的砖块字符必须为空格。对于下面的示例,我使用*了积木。

输入:

[ 15, 7, 13, 11 ]
  1. [ 1111, 111, 1101, 1011 ]
  2. [ 1111, 0111, 1101, 1011 ]
  3. 输出:

    ****
     ***
    ** *
    * **
    

规则

  • 输入必须以10为基数,如果您的语言接受其他基数,则您可能不使用它们。
  • 允许前导和尾随新行。
  • 输入可以视为整数列表,单独的参数或任何合理的格式。
  • 输出可以采用任何合理的格式:新行分隔的字符串,行数组,二维数组等。
  • 不允许出现标准漏洞

测试用例

请注意,在第一个测试用例中,所有层的末尾都有一块空砖。

[ 14, 4, 6, 2 ]

*** 
 *  
 ** 
  * 

[ 1, 2, 4, 8, 16 ]

    *
   * 
  *  
 *   
*

[ 15, 11, 15, 15 ]

****
* **
****
****

[ 11, 10, 9, 8 ]

* **
* * 
*  *
*   

这是代码高尔夫球,所以最短的代码获胜!


输出可以是行数组还是2d字符数组?
ovs '17

@ovs抱歉,我指定了,是的,您可以输出数组或2d数组等。任何合理的格式。
TheLethalCoder

对于2D数组,我们可以使用数字代替积木吗?例如[[1, " ", 1, " "], ...]
Arnauld

@Arnauld是的,看起来不错。
TheLethalCoder

1
@Giuseppe仅用于换行,否则它将对空砖块感到困惑。
TheLethalCoder

Answers:


13

MATL,5个字节

B42*c

在线尝试!

说明

B     % Implicitly input an array of numbers. Convert to binary. 
      % Gives a matrix with each row corresponding to a number
42    % Push 42 (ASCII code of '*')
*     % Multiply
c     % Convert to char. Char 0 is displayed as space. Implicitly display

您可以为砖块选择任何字符,只要它不是空白字符,就不必在墙上有区别。是的,这意味着您可能不需要42*什么……
Outgolfer的Erik

@EriktheOutgolfer我可以选择其他任何数字,但我确实需要这三个字节。
路易斯·门多

如果内置一个1字节100或其他数字怎么办?
暴民埃里克(Erik the Outgolfer)



8

八度,22字节

@(x)[dec2bin(x)-16,'']

在线尝试

说明:

感谢Luis Mendo,节省了一些字节!另外,我没有注意到,我不仅可以选择使用哪个角色来建造墙*

@(x)                    % Take the input as a column vector
    dec2bin(x)          % Convert each row of the input to a string with 1 and 0
                        % It gets automatically padded with zeros, to fit the longest number
    dec2bin(x)-16       % Subtract 16, to get from the ASCII-values of 1/0 (48/49)
                        % to 32/33 (space and !)
@(x)[dec2bin(x)-16,'']  % Concatenate with the empty string to convert it to a string.

或搭配de2bi

说明:

@(x)                          % Take the input as a column vector
               de2bi(x)       % Convert each row of the input to a binary number.
                              % Gets automatically padded to fit the longest number
            42*de2bi(x)       % Multiply the matrix by 42, which is the ASCII-value for *
           [42*de2bi(x),'']   % Concatenate the matrix with the empty string to convert
                              % it to a string. 0 are automatically displayed as spaces
@(x)fliplr([42*de2bi(x),''])

以下内容适用于TIO,需要7个字节以上的空间:

@(x)fliplr([42*(dec2bin(x)>48),''])

在这里尝试


5

Python 3中88个84 71 74 72字节

一个lambda,它返回代表每个行的字符串列表。

lambda n:[bin(x)[2:].replace(*'0 ').rjust(len(bin(max(n)))-2)for x in n]

在线尝试!(链接到换行符分隔的版本)

说明

  • lambda n:-使用参数创建一个(匿名)lambda n。隐式返回。

  • [...] -创建列表理解。

  • bin(x)[2:] -获取数字的二进制表示形式。

  • .replace(*'0 ')- 0用空格替换所有出现的。

  • .rjust(len(bin(max(n)))-2) -将二进制表示填充到最长的一个。

  • for x in n- n使用变量进行遍历x


变更日志

  • - 1 - 3字节由于@Rod,-(...)+2= 2-(...),使用的rjust()

  • 添加了带有的版本bin(),该版本无效,因为它不适用于12

  • 使用修复了上述错误format()

  • 将返回类型更改为字符串列表,因为OP允许它。

  • 修复了另一个错误rjust(),该错误使用并切换回bin()了@Rod发现并修复。


5

JavaScript(ES6),81 79字节

如Rick Hitchcock所建议,通过使用数字而不是字符来节省2个字节

返回带有1的砖的2D数组。

f=(a,b=[],x=1)=>a.every(n=>n<x)?a.map(n=>b.map(i=>n&i?1:' ')):f(a,[x,...b],x*2)

测试用例




4

Ruby,63个 59字节

-4字节,在Alexis Andersen的帮助下

->*n{puts n.map{|i|("%#{('%b'%n.max).size}b"%i).tr'0',' '}}

在线尝试!


1
您不需要字符串格式的0。你可以通过更换刮胡子一个字节n.max.to_s(2).size('%b'%n.max).size你实际上并不需要更换1*
亚历克西斯安徒生

@AlexisAndersen谢谢:)
daniero

4

R,87 88字节

墙块以表示8,因为很多都是八。

write(ifelse((I=sapply(scan(),intToBits))[(M=max(which(I>0,T)[,1])):1,],8,' '),1,M,,'')

在线尝试!

输入整数列表将转换为尾随0位并反转的位数组。

然后使用write和修剪数组时确定的列宽输出缩小的数组。

ifelse() 不幸的是,这是唯一对向量有效的IF选项。


@Vlo指出您可以使用,1而不是将其""用于输出文件write
朱塞佩

@Giuseppe感谢您的提示
MickyT


3

APL(Dyalog)30 22 20 14字节

@Adám节省了6个字节

' *'[⍉2⊥⍣¯1⊢⎕]

在线尝试!

(假设⎕IO←0这是许多计算机上的默认设置)

这将输入作为数组并返回具有*s和s 的矩阵。

说明

2⊥⍣¯1⊢⎕       Convert input to binary (returns a transposed matrix of 1s and 0s)
              Transpose
' *'[ ... ]    Index into this string

保存6个字节' *'[⍉2⊥⍣¯1⊢⎕]
亚当

@Adám感谢您提供提示,我不知道可以删除¨
Kritixi Lithos

3

T-SQL,290个字节

declare @ int;select @=max(log(a,2))+1from @i;with t as(select convert(varchar(max),a%2)b,a/2c,@-1m,ROW_NUMBER()over(order by(select 1))r from @i union all select convert(varchar(max),concat(c%2,b))b,c/2c,m-1,r from t where m>0)select replace(b,0,' ')from t where m=0group by r,b order by r

用途1为砖块,假定输入来自表@

松散,有一些解释

-- assume input is presented in an input table
declare @input table (a int)
insert into @input values (15), (7), (13), (11)

---- start here

-- figure out how many characters are needed, by taking log2
declare @max int
select @max = max(log(a, 2)) + 1
from @input

-- recursive cte
-- will join against itself, recursively finding each digit in the binary string
;with cte as
(
    select 
        convert(varchar(max), a % 2) as b, -- is the least significant bit 1 or 0
        a / 2 as c, -- remove least significant bit, for the next run
        @max - 1 as max, -- keep track of iterations left
        ROW_NUMBER() over (order by (select 1)) as rn -- keep the order of the input
    from @input

    union all -- recursive loop
              -- below columns follow the same pattern

    select convert(varchar(max), 
        concat(cte.c % 2, cte.b)) as b, -- prepend the current binary string with the newest least significant bit
        cte.c / 2 as c, 
        cte.max - 1, 
        cte.rn
    from cte
    where cte.max > 0
)
select replace(b, 0, ' ') -- swap 0s for space
from cte
where max = 0 -- only take the last iteration
group by rn, b -- grab each unique input, 
               -- need to group by row number so it can be ordered by
               -- need to group by binary string, so it can be selected
order by rn -- sort by the order the input arrived in

3

Mathematica,40个字节

Grid@PadLeft@IntegerDigits[#,2]/. 0->""&

砖是1s

Mathematica,48个字节

Grid@PadLeft@IntegerDigits[#,2]/.{0->"",1->"#"}& 

砖是#


您只需要在斜线一个//.。(/.表示“替换一次”,//.表示“继续替换,直到事情停止改变”。)
不是树

ok-fixed-thanks
J42161217

IntegerDigits函数中的逗号后不需要空格。
Mark S.

是的,我知道,这种情况发生在您从笔记本复制/粘贴时。
修复 J42161217

2

C#(.NET Core)112 + 18 = 130 86 + 41 = 127字节

a=>a.Select(n=>C.ToString(n,2).Replace("0"," ").PadLeft(C.ToString(a.Max(),2).Length))

在线尝试!

字节计数包括中的41个字节using System.Linq;using C=System.Convert;。用途1为字符墙上。尽管如此,对于C#来说,这太长了。


放入namespace System.Linq{}以保存一些字节。是a.Max()保证是真实的(我敢肯定,这是我刚才不是最聪明的二进制:P)?会class Convert{}节省任何字节吗?
TheLethalCoder

1
如果我将程序放在给定的名称空间中,是否应该提交整个程序而不是lambda?我不确定该怎么做……
查理(Charlie)

我通常只是使用lambda放置在命名空间中。我认为这没有问题,它在C#提示页面中。
TheLethalCoder

我认为这无效,因为如果不使用静态导入就无法编译它。
MetaColon

2
@MetaColon就是我在using System.Linq;using C=System.Convert;字节数中添加字节的原因,因为这两个using指令对于代码的编译是必需的。
查理

2

视网膜,63字节

.+
$*#<
+`(#+)\1
$1 
 #
#
{T`<`_`^(<.+(¶|$))+$
m`^<
 <
(.)<
<$1

在线尝试!说明:

.+
$*#<

转换为一元,并在后缀a <

+`(#+)\1
$1 
 #
#

转换为二进制。

{T`<`_`^(<.+(¶|$))+$

所有<s到达左侧后,将其全部删除。

m`^<
 <

在任何<已到达左侧的s 之前插入一个空格。

(.)<
<$1

将所有<s左移一步。冲洗并重复。


2

PowerShell,100字节

$args|%{if(($c=($a=[convert]::ToString($_,2)).length)-gt$l){$l=$c}$a-replace0,' '}|%{$_.padleft($l)}

在线尝试!

convertPowerShell ,在PowerShell中使用二进制文件是如此痛苦。另外.lengthŸ调用-replace0用空格,再加上长时间.padLeft()通话,使他们都是一样的.length,一切都增加了一个长提交。

欢迎打高尔夫球的建议低于100。


2

PHP,84字节

while(++$i<$argc)echo strtr(sprintf("\n%".-~log(max($argv),2).b,$argv[$i]),10,"* ");

幸运的是,位运算将log结果转换为int。浮动在这里不起作用。

在线尝试


2

Clojure,185个字节

(fn[i](let[b(map #(Long/toBinaryString %)i)](map #(clojure.string/replace(clojure.string/replace(format(str"%0"(reduce(fn[l i](max l(count i)))0 b)"d")(read-string %))"1""#")"0"" ")b)))

非高尔夫版本:

(fn [i]
    (let [b (map #(Long/toBinaryString %) i)]
        (map
            #(clojure.string/replace
                (clojure.string/replace
                    (format
                        (str "%0"
                            (reduce
                                (fn [l i] (max l(count i))) 0 b)
                            "d")
                        (read-string %))
                        "1"
                        "#")
                "0"
                " ")
        b)))

将参数作为列表的匿名函数。将行作为列表返回。

阅读其他答案,我敢打赌它可能会更小。clojure.string/replace要写一些淫秽的字符。


2

Japt33个 30字节

¡'0p(¡X¤lÃn o)-X¤l)+X¤)£" *"gX

在线尝试!

由于节省了3个字节 @Justin Mariner

说明

¡                              // map input integers
    (¡X¤lÃn o)                 // longest binary string length
              -X¤l)            // minus current binary string length
 '0p                           // repeat zero
                   +X¤)        // concat with current binary string
                       £       // map chars of binary string
                        " *"gX // swap 0 and 1 with ' ' and '*'

您可以删除最后3个字符,只返回一个字符串数组,并使用该-R标志(未添加到字节数)查看换行连接的输出:here
贾斯汀·马里纳

2

Python 3中92 90个字节

lambda a:[' '*(len(bin(max(a)))-len(i)-2)+i for i in[bin(i)[2:].replace(*'0 ')for i in a]]

在线尝试!

返回行列表。将它们堆叠起来表明它们确实确实对齐。

['111 ', ' 1  ', ' 11 ', '  1 ']
>>>
 111 
  1  
  11 
   1 

细目

本质上是将数组转换为二进制,然后用空格替换全0。N在每行的前面添加一定数量的空格N = [length of longest line] - [length of line]

-1 bytes 感谢Xoder先生

在线尝试!


输出中不能包含前导或尾随空格。
TheLethalCoder

@TheLethalCoder哦,一定是看错了规则!感谢您抓住这一点。
引力

90个字节,替换'0',' '*'0 '
Xcoder先生17年

@ Mr.Xcoder有趣的是,永远不会想到这一点。谢谢!
重力1998年

2

Japt,11个字节

m¤z3 z ·r0S

在线尝试!

说明

m¤z3 z ·r0S  Implicit input of array
m¤           Map the array to binary strings
  z3 z       Rotate right 270° and then right 90°. This adds left padding to each string
       ·r0S  Join with newlines and replace 0s with spaces

很好的利用z3 z。不确定为什么y y不能在那里工作,我稍后再研究...
ETHproductions's

2

Java 7中,130个 108 88字节

@TheLethalCoder保存22感谢@Xanderhall

void a(int[]b){for(int i:b)System.out.println(Long.toBinaryString(i).replace('0',' '));}

取消高尔夫:

void a(int[]b){
    for(int i:b)
        System.out.println(Long.toBinaryString(i).replace('0', ' '));       
}

1
i在处增加增量b[i]以保存一个字节。您可以保留带有的输出,1因此不需要.replace('1','*')。改用Java 8并编译为lambda以节省字节。如果您不想这样做,则会int[]b节省一个字节。
TheLethalCoder

谢谢!您能否解释一下“在b [i]处增加i以节省字节”。手段?
Java贡萨尔

i++求值i然后将其递增(反之++i),因此您可以将其i++移出for循环并使用它b[i++]。哦,虽然我们在这样做,但是循环中只有一行,因此不需要大括号。
TheLethalCoder

真正!
了不起

2
您可以通过将循环切换到foreach循环来节省一些字节。for(int x:i)另外,可以使用Long.toBinaryString而不是Integer版本来节省3个字节。
Xanderhall '17

1

Python 2,217字节

经过2个小时的编码后,我认为numpy并不是一个好主意

import numpy as n
i=n.loadtxt("i")
o=[n.copy(i)]
o[0].fill(10)
while n.count_nonzero(i)>0:
 o.append(i%2+32)
 i=n.vectorize(lambda x:x//2)(i)
print n.fliplr(n.array(o).T).astype('uint8').view('c').tostring().decode()

在Ubuntu中的用法

安装numpy

python2 -m pip install numpy

创建以i输入格式命名的文件14 4 6 2

python2 prog.py

1

第八232个 254 250字节

0 >r a:new swap ( nip 2 base drop >s decimal s:len r> n:max >r a:push ) a:each drop a:new swap ( nip '0 G:c# r@ G:#> s:fmt a:push ) a:each drop rdrop a:new swap ( nip /0/ " " s:replace! a:push ) a:each drop ( nip /1/ "*" s:replace! . cr ) a:each drop

带注释的非高尔夫版本

\ convert to binary and save longest string length
: f 0 >r a:new swap ( nip 2 base drop >s decimal s:len r> n:max >r a:push ) a:each drop ;

\ pad binary number with zero
: f1 a:new swap ( nip '0 G:c# r@ G:#> s:fmt a:push ) a:each drop rdrop ;

\ replace every 0 with space
: f2 a:new swap ( nip /0/ " " s:replace! a:push ) a:each drop ;

\ replace every 1 with * and print each line of bricks
: f3 ( nip /1/ "*" s:replace! . cr ) a:each drop ;

这些单词必须按顺序调用(请参见示例)

用法和示例

ok> [15,7,13,11] 0 >r a:new swap ( nip 2 base drop >s decimal s:len r> n:max >r a:push ) a:each drop a:new swap ( nip '0 G:c# r@ G:#> s:fmt a:push ) a:each drop rdrop a:new swap ( nip /0/ " " s:replace! a:push ) a:each drop ( nip /1/ "*" s:replace! . cr ) a:each drop
****
 ***
** *
* **

或更清楚

ok> [15,11,15,15] f f1 f2 f3
****
* **
****
****


1

Excel VBA中,170个 161字节

打高尔夫球

匿名VBE立即窗口功能,它接受1 2 3 .. n范围内格式的输入,[A1]并通过范围将相应的二进制墙输出到VBE立即窗口[B1,C1,2:2]

n=Split([A1]):[A2].Resize(1,UBound(n)+1)=n:[C1]="=Int(1+Log(B1,2))":For Each i In n:[B1]=i:?Replace(Replace([Right(Rept(0,C1)&Dec2Bin(B1),C1)],1,"*"),0," "):Next

格式:

n=Split([A1])
[A2].Resize(1,UBound(n)+1)=n
[C1]="=Int(1+Log(B1,2))"
For Each i In n
[B1]=i
?Replace(Replace([Right(Rept(0,C1)&Dec2Bin(B1),C1)],1,"*"),0," ")
Next

不打高尔夫球

完整的Sub例程,它接受格式的输入,Array(1, 2, 3...)并通过范围将相应的二进制墙输出到VBE立即窗口[A1,B1,2:2]

Sub a(ByRef n As Variant)
    Let Range("A1").Resize(1,UBound(n)+1) = n
    Let Range("C1").Value = "=Int(1+Log(A1,2))"
    Dim i As Integer
    For Each i In n
        Let Range("A1").Value = i
        Debug.Print Replace(
                            Replace(
                                    [Right( Rept( 0, C1) & Dec2Bin( B1), C1)],
                                    1,
                                    "*"
                            ),
                            0,
                            " "
                    )
    Next
End Sub

1

木炭,20字节

WS«⸿≔IιιWι«←§ *ι≧÷²ι

在线尝试!链接是详细版本的代码。通过手动将每个输入数字转换为二进制但按从右到左的顺序打印它来工作。我将输入作为换行符终止的字符串,因为Charcoal没有输入列表的好方法,否则我会写这样的东西,不幸的是当前需要21个字节:

WS⊞υIιW⌈υ«Eυ﹪κ²↓⸿≧÷²υ

在线尝试!链接是详细版本的代码。此版本在输入数组上进行矢量化,尽管其输出被硬编码为-s,从而节省了一个字节。

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.