产生盒子!


19

您的任务是使用给定输入的任何一个ASCII字符生成框。

测试用例

1 1   --> =====
          =   =
          =====

1 2   --> =========
          =   =   =
          =========

2 1   --> =====
          =   =
          =====
          =   =
          =====

2 2   --> =========
          =   =   =
          =========
          =   =   =
          =========

2 5   --> =====================
          =   =   =   =   =   =
          =====================
          =   =   =   =   =   =
          =====================

输入项

  • 输入可以从以下之一获取

    • stdin
    • 命令行参数
    • 函数参数(2个参数,每个数字一个)
  • 输入(如果stdin从命令行参数中获取)将包含两个正整数,以空格分隔。

  • 这两个数字表示每一列和每一行中的框数

输出量

  • 必须以stdout(或最接近的等价形式)输出框
  • 每个盒子中应有三个水平空间

规则

  • 两个数字都将大于0,但不会超过1000
  • 任何可见字符均可用于输出框。(只要它们对眼睛不太苛刻!)
  • 您可以编写完整的程序或函数。
  • 除可选的尾随换行符外,不应有不必要的字符。

计分

这是,因此最短的提交(以字节为单位)获胜。

Answers:



10

视网膜,57字节

1(?=.* (1*))
$1#$1#


1(?=(1*#1*#)*$)
=   
1
====
#
=#

以尾随换行符输入一元。

每行应转到其自己的文件,并且#应在文件中更改为换行符。这是不切实际的,但是您可以像使用-s标记一样作为一个文件来运行代码,同时保留#标记(并#在输入中更改尾随换行符)。#如果愿意,您可以在输出中将换回换行以提高可读性。例如:

> echo -n 11 111#|retina -s boxes|tr # '\n'
=============
=   =   =   =
=============
=   =   =   =
=============

方法:5个单取代步骤。前两个(前4行)创建一个1的2*N+1by M网格,接下来的3个步骤(6行)将其格式化为所需的输出。

中间字符串(以分隔-):

11 111
------------------
111
111
111
111
 111
------------------
111
111
111
111
111
------------------
111
=   =   =   
111
=   =   =   
111
------------------
============
=   =   =   
============
=   =   =   
============
------------------
=============
=   =   =   =
=============
=   =   =   =
=============

每行一个文件似乎总是一个非常奇怪的设计选择。
curiousdannii 2015年

1
@curiousdannii这样做是为了使换行符可以在正则表达式中使用而无需转义,但计划将其更改为更合理的1文件格式。
randomra 2015年

8

JavaScript(ES6),83

具有参数行和列的函数。使用模板字符串,有2条有意义的嵌入式换行符。

通过alert(弹出)输出。由于alert使用比例字体,因此使用宽度类似于空格的字母代替会获得更好的效果=

使用控制台在Firefox中进行测试,以获取真实的alert输出,或运行以下代码段。

f=(r,c)=>{for(x=y="|";c--;)x+="||||",y+="   |";for(o=x;r--;)o+=`
${y}
`+x;alert(o)}

// TEST

// redefine alert to avoid that annoying popup during test
alert=x=>O.innerHTML=x

test=_=>([a,b]=I.value.match(/\d+/g),f(a,b))

test()
<input id=I value='2 3'><button onclick="test()">-></button>
<pre id=O></pre>


运行代码段对我不起作用,只看到里面带有“ 2 3”的框和一个箭头,似乎提示您应单击它以获取结果。使用整页按钮或尝试使用其他浏览器不会更改任何内容。
Dennis Jaheruddin

@DennisJaheruddin,使用chrome(不支持ES6)时,我也会遇到同样的情况。尝试使用Firefox。
Spikatrix

1
@DennisJaheruddinTest in Firefox
edc65

7

JavaScript(ES6),75 73

使用大量repeat调用,我们重复|,然后|以尾随空格重复,然后重复这两个重复以创建行:

f=(y,x)=>alert(((s="|"[r="repeat"](x*4)+`|
`)+"|   "[r](x)+`|
`)[r](y)+s)

(根据edc65建议使用模板字符串,换行符很重要。)

片段:

<input id="x" type="range" max="10" min="1" step="1" value="3"><input id="y" type="range" max="10" min="1" step="1" value="2"><pre id="o"></pre><script>function f(y,x){return ((s="|"[r="repeat"](x*4)+"|\n")+"|   "[r](x)+"|\n")[r](y)+s};function redraw(){document.getElementById("o").innerHTML=f(document.getElementById("y").value,document.getElementById("x").value)};document.getElementById("x").onchange=redraw;document.getElementById("y").onchange=redraw;document.getElementById("x").oninput=redraw;document.getElementById("y").oninput=redraw;redraw();</script>

没有模板字符串,没有方法名重用,并且添加了空格:

f=(y,x)=>alert(
    (
      (s="|".repeat(x*4)+"|\n") + 
      "|   ".repeat(x)+"|\n"
    ).repeat(y)+s
)

(使用edc65的建议使用|以获得更好的视觉间距。)


7

点,29 24 = 23 +1字节

需要-n标志。将高度和宽度作为命令行参数,并构建的框1

([1X4m]XbRLa+1)@<v.1R0s

说明:

                         a,b are cmdline args; m is 1000; v is -1; s is " " (implicit)
 [1X4m]                  List containing 1111 and 1000
       Xb                String repetition of each element b times
         RLa+1           Repeat the list a+1 times
(             )@<v       Now we have one row too many at the end, so take everything
                         but the last item (equiv to Python x[:-1])
                  .1     Concatenate a 1 to the end of each row
                    R0s  Replace 0 with space
                         Print, joining list on newlines (implicit, -n flag)

该程序充分利用了字符串是数字,而数字是Pip中的字符串这一事实。(这些框中的三个空格恰好恰好可以利用内置m变量!)

这是使用输入构建列表的方式2 3

[1111;1000]
[111111111111;100010001000]
[111111111111;100010001000;111111111111;100010001000;111111111111;100010001000]
[111111111111;100010001000;111111111111;100010001000;111111111111]
[1111111111111;1000100010001;1111111111111;1000100010001;1111111111111]
[1111111111111;"1   1   1   1";1111111111111;"1   1   1   1";1111111111111]

最终输出:

C:\> pip.py 2 3 -ne "([1X4m]XbRLa+1)@<v.1R0s"
1111111111111
1   1   1   1
1111111111111
1   1   1   1
1111111111111

更多关于点子


6

Perl,72 63 52 50字节

我最短的版本还用于$/更紧凑地获取换行符:

$ perl -e 'print((($,="="."   ="x pop.$/)=~s/./=/gr)x(1+pop))' 2 5
=====================
=   =   =   =   =   =
=====================
=   =   =   =   =   =
=====================

先前的更新将大部分为空的行放在输出记录分隔符中$,,并打印连续行的列表。

$ perl -e 'print((($,="="."   ="x pop."\n")=~s/./=/gr)x(1+pop))' 2 5

对于不熟悉的读者,以前的版本可能会更清晰一些:

$ perl -E 'say($y=($x="="."   ="x pop)=~s/./=/gr);for(1..pop){say$x;say$y}' 2 5

使用的第一个版本@ARGV代替pop

$ perl -E 'say($y=($x="="."   ="x$ARGV[1])=~s/./=/gr);for(1..$ARGV[0]){say$x;say$y}' 2 5

5

Python 2,58 57字节

相当简单的实现。

def f(x,y):a="="*(4*y+1);print(a+"\n="+"   ="*y+"\n")*x+a

在这里查看。

感谢Sp3000节省了一个字节。


5

GNU sed -r,160

igh,我以为会小一些,但是无论如何都在这里。不幸的是,sed正则表达式没有任何环视功能。

:
s/(.*)1$/   =\1/;t
s/([= ]+)/\1\n\1/
:b
s/   (.*\n)/===\1/;tb
s/(1*)1 $/\n\1/
:c
s/([^\n]*\n[^\n]*\n)(1*)1$/\1\1\2/;tc
s/(=+)(.*)/\1\2\1/
s/(^|\n)(.)/\1=\2/g

将来自STDIN的输入作为一元:

$ sed -rf boxes.sed <<< "11 111"
=============
=   =   =   =
=============
=   =   =   =
=============
$

4

CJam,25个字节

q~)S3*'=5*+4/f*3f>\)*1>N*

CJam解释器中在线尝试。

怎么运行的

q~                        e# Read H and W from STDIN.
   S3*'=5*+               e# Push "   =====".
           4/             e# Chop into ["   =" "===="].
  )          f*           e# Repeat each string W+1 times.
               3f>        e# Cut off the first three characters.
                  \)*     e# Repeat the resulting array H+1 times.
                     1>   e# Remove the first string.
                       N* e# Join the lines.

4

Marbelous,168个字节

由于Marbelous语言的限制,此答案最多只能使用255x255而不是1000x1000。我正在使用32位库,但很快就无法准备就绪。

输入是作为两个命令行参数或功能参数提供给主板的。

@2@3}1@0
SLEL//>0\/
@3@1}0--
}1&0@0/\&0
@1/\@2}1\/
:SL
..}0@0
&0/\>0&0
EN..--\/
{0@0/\ES
:EL
..@0
..>0EN
}0--\/
@0/\EX
:EX
}0
\/3D3D3D3D
:ES
}0
\/3D202020
:EN
}0
{03D0A

伪代码:

MB(H,W):
    EL(W)
    for 1..H:
        SL(W)
        EL(W)
EL(W):
    for 1..W:
        EX()
    EN()
SL(W):
    for 1..W:
        ES()
    EN()
EX():
    print "===="
ES():
    print "=   "
EN():
    print "=\n"

3

CJam 52 51 46 41字节

l~:B;:A;'=:U{{U4*}B*N}:V~{U{SZ*U}B*NUV}A*

感谢Sp3000的-5个字符

感谢MartinBüttner♦另外5个字符

尝试一下


3

c函数,81

x,y;f(h,w){for(;y<=h*2;y++)for(x=0;x<w*4+2;x++)putchar(x>w*4?10:x&3&&y&1?32:61);}

测试程序:

x,y;f(h,w){for(;y<=h*2;y++)for(x=0;x<w*4+2;x++)putchar(x>w*4?10:x&3&&y&1?32:61);}

int main (int argc, char **argv)
{
  f(2, 3);
}

我删除了几个字符,将其视为单行而不是双行:x;f(h,w){for(w=w*4+2;x<=w*h*2+w;x++)putchar(x%w?x/w%2?x%w%4!=1?32:61:61:10);}-78

1
首先应该看其他答案= /,我的评论是Reto Koradi答案的较长版本。

是的,我非常努力(失败了),使它陷入单个(较短)循环中
Digital Trauma 2015年

3

PHP4.1,76个 71 69字节

尽我所能打高尔夫球。

$R=str_repeat;echo$R(($T=$R('-',4*$H+1))."
|{$R('   |',$H)}
",$V),$T;

期望键H具有行V数和每行的盒子数。

我正在使用-|只是这样盒子实际上看起来像盒子。如果需要,我可以将其更改为=。使用的char没关系。
离开-并且|也有助于明白是怎么回事的混乱。


旧方法,76个字节:

for($R=str_repeat;$H--;)echo$T=$R('-',($V*4)+1),"
|{$R('   |',$V)}
";echo$T;

输出示例:

http://localhost/file.php?H=2&V=3

-------------
|   |   |   |
-------------
|   |   |   |
-------------

3

朱莉娅59字节

(n,m)->(l="="^(4m+1)*"\n";print(l*("="*"   ="^m*"\n"*l)^n))

这将创建一个未命名函数,该函数接受两个整数作为输入并将结果打印到STDOUT。要给它起个名字,例如f=(n,m)->...

取消+说明:

function f(n, m)
    # Store the solid row
    l = "="^(4m + 1) * "\n"

    # Print all rows by repeating a pattern n times
    print(l * ("=" * "   ="^m * "\n" * l)^n)
end

例子:

julia> f(2, 3)
=============
=   =   =   =
=============
=   =   =   =
=============

julia> f(1, 5)
=====================
=   =   =   =   =   =
=====================

欢迎任何建议。


3

bash + coreutils,57岁

dc -e"2do$2 4*1+^1-pd8*F/1+$1si[fli1-dsi0<c]dscx"|tr 0 \ 

这用于dc打印二进制数字,其中的1s表示框边,0s表示空格。

  • X的全位数X由计算得出2 ^ (width * 4 + 1) - 1,然后推入并打印
  • 10001...0001数字由计算,然后按X* 8 / 15 + 1
  • 然后堆叠被转储height

tr随后的转换0s到空格字符。

输出量

$ ./boxes.sh 2 4
11111111111111111
1   1   1   1   1
11111111111111111
1   1   1   1   1
11111111111111111
$ 

3

R,83 81

作为以h和w为参数的未命名函数。将第一行和第二行构建为每一行的向量,并复制其h时间。为底线附加一个向量,然后cat使用fill来限制底线的长度。现在利用任何可见字符规则。

function(h,w)cat(rep(c(A<-rep(1,w*4+2),rep('   1',w)),h),A[-1],fill=w*4+1,sep='')

测试运行

> f=function(h,w)cat(rep(c(A<-rep(1,w*4+2),rep('   1',w)),h),A[-1],fill=w*4+1,sep='')
> f(4,2)
111111111
1   1   1
111111111
1   1   1
111111111
1   1   1
111111111
1   1   1
111111111
> 

3

3 2,160 87 85 79个字节

我知道这可能是一个golfed 很多比较多,我想提出一些建议,因为这是我第一次尝试打高尔夫球。

def d(x,y):
    for i in[1]*x:print'='*(4*y+1)+'\n'+'=   '*(y+1)
    print'='*(4*y+1)

由于@Cool盖伊和@ SP3000的提示,我缩小了尺寸下降到只有上面的一半以下。

例如:d(3,3)

=============
=   =   =   =   
=============
=   =   =   =   
=============
=   =   =   =   
=============

在这里尝试

请拖尾空格。


1
压痕程度可以降低。
Spikatrix

3
您无需先建立列表然后加入。字符串可以相乘'='*(4*y+1)
Sp3000

1
设置可w=4*y+1节省3个字节。
DLosc

@Cool Guy我正在使用制表符,而不是4个空格。
nsane 2015年

哦好的。没注意到。
Spikatrix

2

KDB(Q),37个字节

{(3+2*x-1)#(5+4*y-1)#'(4#"=";"=   ")}

说明

                      (4#"=";"=   ")     / box shape
           (5+4*y-1)#'                   / extend y axis
 (3+2*x-1)#                              / extend x axis
{                                   }    / lambda

测试

q){(3+2*x-1)#(5+4*y-1)#'(4#"=";"=   ")}[2;5]
"====================="
"=   =   =   =   =   ="
"====================="
"=   =   =   =   =   ="
"====================="

2

JavaScript,92 85个字节

我曾希望这会比其他JS答案(edc65一如既往的好)更短,但是哦。我觉得这里的数学可以进一步提高。

f=(r,c)=>(x=>{for(i=s='';(y=i++/x)<r-~r;)s+=i%x?' *'[-~y%2|!(-~i%4)]:'\n'})(4*c+2)||s

抱歉,数学运算无法解决-我的头在旋转……但这是一些技巧:f=(r,c)=>(x=>{for(i=s='';(y=i++/x)<r-~r;)s+=i%x?' *'[-~y%2|!(-~i%4)]:'\n'})(4*c+2)||s-> 85
edc65

@ edc65太好了,谢谢!之类的东西2*r+1=> r-~r正是我的意思由高尔夫球数学,这尤其是一个天才。:)
vvye 2015年

2

八度音阶 69 65岁 64

y=ones([2,4].*input()+1);y(1:2:end,:)=y(:,1:4:end)=4;char(y+31)

感谢DLosc指出导致-1的问题

将输入作为[1 1]和输出:

#####
##
#####

您也可以只输入“ 1”并获得1x1。如果确实需要输入1 1,则大小增加到88 8584

y=ones([2,4].*eval(['[',input(0,'s'),']'])+1);y(1:2:end,:)=y(:,1:4:end)=4;char(y+31)

注意:Matlab不允许Octave的链接或输入(整数),但这是Matlab版本(67):

y=ones([2,4].*input('')+1);y(1:2:end,:)=4;y(:,1:4:end)=4;char(y+31)


2

CJam,30个 29字节

+删除了多余的新版本(感谢Dennis):

l~_4*)'=*N+:F\'=S3*+*'=+N++*F

我知道Dennis已经发布了CJam解决方案,远远超过了它。但这是我对CJam的第一次尝试,因此它完全有效是一个奇迹。:)

蛮力的。从4 * H + 1 =符号构建第一行,然后从=重复的H次数构建第二行,并=添加另一行。然后将两行连接起来,重复整个过程V,然后添加第一行的另一个副本。

感觉我有太多的堆栈操作,甚至最终将第一行存储在变量中,因为我不得不在堆栈上乱堆东西。

总体来说不是很优雅,但是您必须从某个地方开始...我想先尝试一个简单的问题。


最后,您不需要+。CJam打印整个堆栈。
丹尼斯

2

CJam,23岁

q~[F8]f{2b*1+' f+N}*_0=

在线尝试

说明:

q~        read and evaluate the input (height width)
[F8]      make an array [15 8] - 1111 and 1000 in base 2
f{…}      for width and each of [15 8]
  2b      convert the number to base 2
  *       repeat the digits "width" times
  1+      append a 1 to the array of digits (right edge)
  ' f+    add the space character to each digit (0->' ', 1->'!')
  N       push a newline
*         repeat the resulting array "height" times
_0=       copy the first line (bottom edge)


1

爪哇省181

我希望根据

您可以编写完整的程序或函数。

它符合对函数的字节进行计数的规则,在这种情况下为181

import static java.lang.System.*;
public class Boxes
{
    public static void main(String[] args)
    {
        Boxes b=new Boxes();
        System.out.println("1,1:");
        b.b(1,1);
        System.out.println("1,2:");
        b.b(1,2);
        System.out.println("2,1:");
        b.b(2,1);
        System.out.println("2,2:");
        b.b(2,2);
        System.out.println("2,5:");
        b.b(2,5);
    }

    void b(int R, int C){String s="",e=s,x,y,z=s,a="====",n="=\n";int r,c;for(r=R;r-->0;){x=y=e;for(c=C;c-->0;){x+=a;y+="=   ";}s+=x+n+y+n;}for(c=C;c-->0;){z+=a;}s+=z+n;out.println(s);}
}

输出错误。参见输出 2:“ 每个盒子中应有三个水平空间 ”。您的代码输出两个空格,而不是三个空格
Spikatrix

@CoolGuy对此有误解-现在增加了2个字节,但这并没有太大变化...
Marco13 2015年

1
好。+1。通过更改for(r=R;r-->0;){x=y=e;for(c=C;c-->0;){x+=a;y+="= ";}s+=x+n+y+n;}for(r=R;r-->0;s+=x+n+y+n){x=y=e;for(c=C;c-->0;y+="= "){x+=a;}}
Spikatrix

1

C#,153 151 150

这并不能真正竞争,但这只是为了好玩:

(h,w)=>{string s="=",e="\n",a="====",b="   =",m=a,o;int i=0,j;for(;i++<=h*2;){o=s;for(j=0;j++<w+1;o=m)System.Console.Write(o);m=m==a?b:a;s=e+s;e="";}}

如何运行:

public class Program
{
    public static void Main()
    {
        new System.Action<int, int>((h,w)=>{string s="=",e="\n",a="====",b="   =",m=a,o;int i=0,j;for(;i++<=h*2;){o=s;for(j=0;j++<w+1;o=m)System.Console.Write(o);m=m==a?b:a;s=e+s;e="";}})(3, 4);
    }
}

开放改进。


用var替换字符串。
CSharpie 2015年

不幸的是,这是不允许的。看到这个
pmudra

1
int在循环外声明那些可以节省一个字节。
Spikatrix

1

Python 2.7,66个字节。

我知道python中已经有更好的解决方案,但这是我想出的最好的解决方案。

def f(x,y):a,b,c="="*4,"   =","\n=";print "="+a*y+(c+b*y+c+a*y)*x

例:

f(3,4)

=================
=   =   =   =   =
=================
=   =   =   =   =
=================
=   =   =   =   =
=================

抱歉,但是对于测试用例2,3和5,这会产生错误的输出。您将列和行混合在一起,却得到了相反的结果。
Spikatrix

1

红宝石,57 48 45

f=->h,w{l=?=*w*4+?=;(l+$/+'=   '*w+"=
")*h+l}

用法:

print f[2,5]

感谢manatwork节省了3个字节。


两种较小的改进可能性:'='?="<LF>"$/
manatwork 2015年

另一个小的:?=*(w*4+1)?=+?=*w*4
manatwork 2015年

1

Java,123 119字节

void p(int h,int w){String b="=",d="\n=";for(;w-->0;d+="   =")b+="====";for(d+="\n"+b;h-->0;b+=d);System.out.print(b);}

将输入参数用作计数器可极大地帮助减小代码大小。

感谢Cool Guy建议滥用for语法。


通过使用for循环而不是循环来打高尔夫球while
Spikatrix

不幸的是for(; w-> 0;)的长度与while(w-> 0)的长度相同
ECS 2015年

1
我的意思是while(w-->0){d+=" =";b+="====";}-> for(;w-->0;b+="====")d+=" =";节省了三个字节
Spikatrix

你是对的。由于您的建议,我实际上设法从中压缩了4个字节。
ECS

1

SAS,117 119

macro a array a[0:1]$4('#   ' '####');do x=1 to 2+2*&x-1;t=repeat(a[mod(x,2)],&y-1);put t $char%%eval(&y*3). '#';end;%

例:

%let x=4;
%let y=4;
data;a;run;

结果:

#############
#   #   #   #
#############
#   #   #   #
#############
#   #   #   #
#############
#   #   #   #
#############

有什么在线编译器可以测试吗?顺便说一句,根据您的结果,您的程序产生错误的输出。参见输出2:每个盒子中应有三个水平空间
Spikatrix

@CoolGuy,您是对的,我没有注意到,更新了我的帖子。您可以尝试SAS On Demand,这是在不设置自己的AWS实例的
Fried Egg

您的第一个链接对我不起作用。Chrome提供了DNS_PROBE_FINISHED_NXDOMAIN
Spikatrix

尝试此操作,尽管第一个链接对我而言SAS On Demand效果很好,或通过此页面上的链接到达此处
Fried Egg

我不知道为什么,但是去控制中心会导致与我之前的评论中提到的错误相同的问题:/
Spikatrix
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.