画一个ASCII矩形


20

给定两个整数作为数组中的输入,使用第一个整数作为宽度,第二个作为高度,绘制一个矩形。

或者,如果您的语言支持,则可以将两个整数作为单独的输入给出。

假设宽度和高度永远不会小于3,并且始终会给出。

输出示例:

[3,3]

|-|
| |
|-|

[5,8]

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

[10,3]

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

这是代码高尔夫球,因此以字节数最少的答案为准。

Answers:


6

Jolf,6个字节

,ajJ'|

在这里尝试!我内置的盒子终于派上用场了!:D

,ajJ'|
,a       draw a box
  j      with width (input 1)
   J     and height (input 2)
    '    with options
     |    - corner
          - the rest are defaults

10

果冻,14 字节

,þ%,ỊḄị“-|| ”Y

在线尝试!验证所有测试用例

怎么运行的

,þ%,ỊḄị“-|| ”Y  Main link. Left argument: w. Right argument: h

,þ              Pair table; yield a 2D array of all pairs [i, j] such that
                1 ≤ i ≤ w and 1 ≤ j ≤ h.
   ,            Pair; yield [w, h].
  %             Take the remainder of the element-wise division of each [i, j]
                by [w, h]. This replaces the highest coordinates with zeroes.
    Ị           Insignificant; map 0 and 1 to 1, all other coordinates to 0.
     Ḅ          Unbinary; convert each pair from base 2 to integer.
                  [0, 0] -> 0 (area)
                  [0, 1] -> 1 (top or bottom edge)
                  [1, 0] -> 2 (left or right edge)
                  [1, 1] -> 3 (vertex)
       “-|| ”   Yield that string. Indices are 1-based and modular in Jelly, so the
                indices of the characters in this string are 1, 2, 3, and 0.
      ị         At-index; replace the integers by the correspoding characters.
             Y  Join, separating by linefeeds.

这是对:)的一种出色用法:
Lynn

9

Matlab,69 65 56字节

感谢@WeeingIfFirst和@LuisMendo的一些字节=)

function z=f(a,b);z(b,a)=' ';z([1,b],:)=45;z(:,[1,a])='|'

在Matlab中,这确实很简单:首先创建所需大小的矩阵,然后索引第一行和最后一行以插入,然后对第一行和最后一列进行-相同的操作|

例如f(4,3)回报

|--|
|  |
|--|

@WeeingIfFirst哦,当然,非常感谢!
瑕疵的

短6个字节:z([1,b],1:a)=45;z(1:b,[1,a])=124;z=[z,'']
Stewie Griffin

甚至更短:z(b,a)=' ';z([1,b],:)=45;z(:,[1,a])=124
Luis Mendo

@LuisMendo谢谢!我们仍然需要字符串hard,否则将数组转换为数字1。
瑕疵的

@flawr z(b,a)=' '初始化为char。之后,您可以填写数字,它们会自动转换为char。z保持其原始类型
Luis Mendo

8

JavaScript(ES6),63个字节

f=
(w,h,g=c=>`|${c[0].repeat(w-2)}|
`)=>g`-`+g` `.repeat(h-2)+g`-`
;
<div oninput=o.textContent=f(w.value,h.value)><input id=w type=number min=3 value=3><input id=h type=number min=3 value=3><pre id=o>


传递模板函数作为默认参数?聪明!
弗洛里

8

Haskell,62 55字节

f[a,b]n=a:(b<$[3..n])++[a]
g i=unlines.f[f"|-"i,f"| "i]

用法示例:

*Main> putStr $ g 10 3
|--------|
|        |
|--------|

helper函数f接受一个由两个元素组成的列表[a,b]和一个数字,n并返回一个列表,列表由1 an-2 bs和1组成a。我们可以使用fthrice:来构建顶线/底线:f "|-" i,中线:f "| " i并从这两个中创建整个矩形:(f [<top>,<middle>] j注意:由于部分应用,j它不会作为参数出现g i)。

编辑:@dianne通过将两个Char参数合并String为长度2 来保存一些字节。非常感谢!


我喜欢这个#主意!
瑕疵的

2
我认为您可以通过定义(a:b)#n=a:([3..n]>>b)++[a]和写入来节省一些字节["|-"#i,"| "#i]#j
dianne

@dianne:非常聪明。非常感谢!
nimi

8

Python 2,61 58字节

@flornquake -3个字节(删除不必要的括号;h用作计数器)

def f(w,h):exec"print'|'+'- '[1<h<%d]*(w-2)+'|';h-=1;"%h*h

测试用例在ideone


('- '[1<i<h])不需要括号。
flornquake

通过使用h作为计数器来保存另一个字节:exec"print'|'+'- '[1<h<%d]*(w-2)+'|';h-=1;"%h*h
flornquake 16/09/19

@flornquake我本来想检查那些括号的必要性,但是忘了。使用h计数器是聪明!谢谢。
乔纳森·艾伦


7

Vimscript,93 83 75 74 73 66 64 63字节

fu A(...)
exe "norm ".a:1."i|\ehv0lr-YpPgvr dd".a:2."p2dd"
endf

:call A(3,3)

说明

fun A(...)    " a function with unspecified params (a:1 and a:2)
exe           " exe(cute) command - to use the parameters we must concatenate :(
norm          " run in (norm) al mode
#i|           " insert # vertical bars
\e            " return (`\<Esc>`) to normal mode
hv0l          " move left, enter visual mode, go to the beginning of the line,  move right (selects inner `|`s)
r-            " (r)eplace the visual selection by `-`s
YpP           " (Y) ank the resulting line, and paste them twice
gv            " re-select the previous visual selection
r<Space>      " replace by spaces
dd            " Cut the line
#p            " Paste # times (all inner rows) 
2dd           " Remove extra lines

请注意,它没有使用,norm!因此可能会干扰vim自定义映射!


5

MATL,19字节

'|-| '2:"iqWQB]E!+)

在线尝试!

说明

该方法类似于该其他答案中使用的方法。该代码构建了以下形式的数字数组

3 2 2 2 3
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
3 2 2 2 3

然后将其值用作字符串中的(基于1的,模块化的)索引,'|-| '以产生所需的结果。

'|-| '                % Push this string
      2:"     ]       % Do this twice
         i            % Take input
          q           % Subtract 1
           W          % 2 raised to that
            Q         % Add 1
             B        % Convert to binary
               E      % Multiply by 2
                !     % Transpose
                 +    % Add with broadcast
                  )   % Index (modular, 1-based) into the string

5

05AB1E23 22 20字节

输入为高度,然后为宽度。

F„ -N_N¹<Q~è²Í×'|.ø,

说明

F                          # height number of times do
    N_                     # current row == first row
          ~                # OR
      N¹<Q                 # current row == last row
 „ -       è               # use this to index into " -"
            ²Í×            # repeat this char width-2 times
               '|          # push a pipe
                 .ø        # surround the repeated string with the pipe
                   ,       # print with newline

在线尝试!

由于节省了2个字节 Adnan,


使用子字符串代替if-else语句可节省两个字节:F„ -N_N¹<Q~è²Í×'|.ø,
阿德南

5

C,73个字节

i;f(w,h){for(i=++w*h;i--;)putchar(i%w?~-i%w%~-~-w?i/w%~-h?32:45:124:10);}

4

Python 2,56个字节

w,h=input()
for c in'-%*c'%(h-1,45):print'|'+c*(w-2)+'|'

flornquake保存了一个字节。


1
很好地使用字符串格式!您可以使用%c转换保存一个字节:'-%*c'%(h-1,45)
flornquake

哦,我以为%*c根本没有东西!谢谢。:)
林恩

'-%%%dc'%~-h%45也适用于相同的长度。
xnor

4

通用Lisp,104个字节

打高尔夫球:

(defun a(w h)(flet((f(c)(format t"|~v@{~A~:*~}|~%"(- w 2)c)))(f"-")(loop repeat(- h 2)do(f" "))(f"-")))

取消高尔夫:

(defun a (w h)
  (flet ((f (c) (format t "|~v@{~A~:*~}|~%" (- w 2) c)))
    (f "-")
    (loop repeat (- h 2) do
     (f " "))
    (f "-")))

3

Turtlèd,40个字节

解释是稍微不再窃听

?;,u[*'|u]'|?@-[*:l'|l[|,l]d@ ],ur[|'-r]

说明

?                            - input integer into register
 ;                           - move down by the contents of register
  ,                          - write the char variable, default *
   u                         - move up
    [*   ]                   - while current cell is not *
      '|                     - write |
        u                    - move up
          '|                 - write | again
            ?                - input other integer into register
             @-              - set char variable to -
               [*             ] - while current char is not *
                 :l'|l          - move right by amount in register, move left, write |, move left again
                      [|,l]     - while current cell is not |, write char variable, move left
                           d@   - move down, set char variable to space (this means all but first iteration of loop writes space)
                               ,ur   -write char variable, move up, right
                                  [|   ] -while current char is not |
                                    '-r - write -, move right

3

Mathematica,67 64字节

感谢lastresort和TuukkaX提醒我,高尔夫球手应该偷偷摸摸,并节省3个字节!

简单实施。返回字符串数组。

Table[Which[j<2||j==#,"|",i<2||i==#2,"-",0<1," "],{i,#2},{j,#}]&

1
使用0<1代替True
u54112

1
我认为j==1可以降低到j<1i==1i<1
Yytsi's

3

Python 3、104 95字节

(来自@ mbomb007的反馈:-9个字节)

def d(x,y):return'\n'.join(('|'+('-'*(x-2)if n<1or n==~-y else' '*(x-2))+'|')for n in range(y))

(我的第一个代码高尔夫球,感谢反馈)


欢迎!您可以删除一些空格,使用range(y)代替range(0,y),如果n从不为负,则可以使用if n<1or n==~-y else
mbomb007'9


@ mbomb007谢谢!我会检查出来的。
Biarity

2

批处理,128字节

@set s=
@for /l %%i in (3,1,%1)do @call set s=-%%s%%
@echo ^|%s%^|
@for /l %%i in (3,1,%2)do @echo ^|%s:-= %^|
@echo ^|%s%^|

将width和height作为命令行参数。


2

HAXE,112个 106字节

function R(w,h){for(l in 0...h){var s="";for(i in 0...w)s+=i<1||i==w-1?'|':l<1||l==h-1?'-':' ';trace(s);}}

测试用例

R(5, 8)
|---|
|   |
|   |
|   |
|   |
|   |
|   |
|---|

R(10, 3)
|---------|
|         |
|---------|

2

Java 135字节

public String rect(int x, int y){
String o="";
for(int i=-1;++i<y;){
o+="|";
for(int j=2;++j<x)
if(i<1||i==y-1)
o+="-";
else
o+=" ";
o+="|\n";
}
return o;
}

打高尔夫球:

String r(int x,int y){String o="";for(int i=-1;++i<y;){o+="|";for(int j=2;++j<x;)if(i<1||i==y-1)o+="-";else o+=" ";o+="|\n";}return o;}

我数136 :)您也可以通过在第一个逗号后删除空格来保存字符。
Christian Rondeau

1
首先,此代码无法编译。即使可以编译,它也不会像OP当前所希望的那样“绘制”矩形。-1。
Yytsi

@TuukkaX我修复了换行符问题,但是我看不出为什么不应该编译它的任何原因。当然,您必须将该代码放在类中,但随后它应该可以工作。
罗曼·格拉夫(RomanGräf)

1
“我看不出它不应该编译的任何理由”。那是什么o+=x "|\n"?你是说把那放在+那里吗?
Yytsi's

谢谢。我不想在那里放置任何字符。
罗曼·格拉夫(RomanGräf)

2

PowerShell v3 +,55个字节

param($a,$b)1..$b|%{"|$((' ','-')[$_-in1,$b]*($a-2))|"}

接受输入$a$b。从循环1$b。每次迭代,我们都构造一个字符串。从两个单长度字符串的数组中选择中间,然后将乘以,然后将$a-2其用管道包围。结果字符串留在管道上,并通过隐式输出Write-Output在程序完成时使用默认的换行符分隔符。

或者,也为55个字节

param($a,$b)1..$b|%{"|$((''+' -'[$_-in1,$b])*($a-2))|"}

之所以如此,是因为我试图通过使用字符串代替中间的阵列选择。但是,由于[char]时间[int]未定义,因此我们需要使用parens和转换为字符串,从而浪费了节省的时间''+

两种版本都要求v3或更高版本-in

例子

PS C:\Tools\Scripts\golfing> .\draw-an-ascii-rectangle.ps1 10 3
|--------|
|        |
|--------|

PS C:\Tools\Scripts\golfing> .\draw-an-ascii-rectangle.ps1 7 6
|-----|
|     |
|     |
|     |
|     |
|-----|

2

PHP,82字节

list(,$w,$h)=$argv;for($p=$h--*$w;$p;)echo$p--%$w?$p%$w?$p/$w%$h?" ":"-":"|
":"|";

索引包含换行符的静态字符串

list(,$w,$h)=$argv;         // import arguments
for($p=$h--*++$w;$p;)       // loop $p through all positions counting backwards
    // decrease $h and increase $w to avoid parens in ternary conditions
    echo" -|\n"[
        $p--%$w             // not (last+1 column -> 3 -> "\n")
        ?   $p%$w%($w-2)    // not (first or last row -> 2 -> "|")
            ?+!($p/$w%$h)   // 0 -> space for not (first or last row -> 1 -> "-")
            :2
        :3
    ];

亲爱的唐纳德:为什么?
泰特斯(Titus)

1
可能是因为用户在查看队列中看到您的答案被标记为低质量。如果发布代码说明或单行代码以外的内容,则可以避免自动标记该代码。
mbomb007'9

@mbomb:我从未见过有人用非eso语言发布有关oneliner的描述。
泰特斯(Titus)2016年

或输出,或非高尔夫版本。只要内容不是太短就没有关系。但是,如果您还没看过的话,也许您已经走了很久了。一些Python一线可能非常复杂。看一些@xnor的。
mbomb007'9

2

红宝石,59 54 52字节

哦,这要简单得多:)

->x,y{y.times{|i|puts"|#{(-~i%y<2??-:' ')*(x-2)}|"}}

在ideone上试运行


1
您可以使用文字换行符代替来节省几个字节\n
约旦

1
您可以通过不定义i和来保存字节j。将i的定义替换为x-=2。而是j使用(y-2)
m-chrzan

是的,谢谢:)
daniero

2

Perl,48个字节

包括+1 -n

在STDIN上将大小设为2行

perl -nE 'say"|".$_ x($`-2)."|"for"-",($")x(<>-1-/$/),"-"'
3
8
^D

只是代码:

say"|".$_ x($`-2)."|"for"-",($")x(<>-1-/$/),"-"

一如既往的好。请注意,您可能想写一个单引号,这时在行尾有一个反引号;-)
Dada

@Dada固定。谢谢。
Ton Hospel '16

2

Lua,120 93字节

通过消除愚蠢的复杂性节省了很多字节。

function(w,h)function g(s)return'|'..s:rep(w-2)..'|\n'end b=g'-'print(b..g' ':rep(h-2)..b)end

取消高尔夫:

function(w,h)                           -- Define Anonymous Function
    function g(s)                       -- Define 'Row Creation' function. We use this twice, so it's less bytes to function it.
        return'|'..s:rep(w-2)..'|\n'    -- Sides, Surrounding the chosen filler character (' ' or '-'), followed by a newline
    end
    b=g'-'                              -- Assign the top and bottom rows to the g of '-', which gives '|---------|', or similar.
    print(b..g' ':rep(h-2)..b)          -- top, g of ' ', repeated height - 2 times, bottom. Print.
end

在Repl.it上尝试


1

Python 2,67个字节

def f(a,b):c="|"+"-"*(a-2)+"|\n";print c+c.replace("-"," ")*(b-2)+c

例子

f(3,3)

|-|
| |
|-|

f(5,8)

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

f(10,3)

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

1

MATL21 17字节

Z"45ILJhY('|'5MZ(

这与MATL-God的方法稍有不同。

Z"                   Make a matrix of spaces of the given size
  45ILJhY(           Fill first and last row with '-' (code 45)
          '|'5MZ(    Fill first and last column with '|' (using the automatic clipboard entry 5M to get ILJh back)

感谢@LuisMendo的所有帮助!

在线尝试!


1

PHP 4.1,76字节

<?$R=str_repeat;echo$l="|{$R('-',$w=$W-2)}|
",$R("|{$R(' ',$w)}|
",$H-2),$l;

假定您具有php.ini该版本的默认设置,包括short_open_tagregister_globals启用。

这需要通过Web服务器(例如Apache)进行访问,并将值传递到session / cookie / POST / GET变量中。
按键W控制宽度,按键H控制高度。
例如:http://localhost/file.php?W=3&H=5


@Titus您应该阅读链接。引用:“从PHP 4.2.0开始,此伪指令默认为off ”。
Ismael Miguel

抱歉,我把所有东西都还了。您的标题中有版本。我应该仔细阅读。
泰特斯(Titus)2016年

@Titus没关系,不用担心。对不起,对不起。
Ismael Miguel

没关系; 那是我要花学夫的代价。:D
Titus

@Titus不用担心。众所周知,我的答案中大约有一半是用PHP 4.1编写的。使用输入可以节省大量字节
Ismael Miguel

1

Python 3,74个字符

p="|"
def r(w,h):m=w-2;b=p+"-"*m+p;return b+"\n"+(p+m*" "+p+"\n")*(h-2)+b

1

Swift(2.2)190字节

let v = {(c:String,n:Int) -> String in var s = "";for _ in 1...n {s += c};return s;};_ = {var s = "|"+v("-",$0-2)+"|\n" + v("|"+v(" ",$0-2)+"|\n",$1-2) + "|"+v("-",$0-2)+"|";print(s);}(10,5)

我认为Swift 3可以打更多的高尔夫,但我不想下载Swift 3。


1

F#,131个字节

let d x y=
 let q = String.replicate (x-2)
 [for r in [1..y] do printfn "%s%s%s" "|" (if r=y||r=1 then(q "-")else(q " ")) "|"]
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.