Нарисуйте прямоугольник ASCII


20

Используя два целых числа в качестве входных данных в массиве, нарисуйте прямоугольник, используя первое целое число как ширину, а второе как высоту.

Или, если ваш язык поддерживает это, два целых числа могут быть заданы как отдельные входные данные.

Предположим, ширина и высота никогда не будут меньше 3, и они всегда будут заданы.

Пример выходов:

[3, 3]

|-|
| |
|-|

[5, 8]

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

[10, 3]

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

Это код-гольф, поэтому выигрывает ответ с наименьшим количеством байтов.

Ответы:



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.

Это замечательное использование :)
Линн

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 О, конечно, большое спасибо!
flawr

На 6 байт короче:z([1,b],1:a)=45;z(1:b,[1,a])=124;z=[z,'']
Стьюи Гриффин,

Еще короче:z(b,a)=' ';z([1,b],:)=45;z(:,[1,a])=124
Луис Мендо

@ LuisMendo Спасибо! Нам по-прежнему нужна жесткая строка, иначе массив преобразуется в числовой.
Flawr

@flawr инициализируется z(b,a)=' 'как char. После этого вы можете заполнить номера, и они автоматически приводятся к символу. zсохраняет свой первоначальный тип
Луис Мендо

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
|--------|
|        |
|--------|

Вспомогательная функция fберет список из двух элементов [a,b]и число nи возвращает список из одного, aза которым следует n-2 bs, а затем один a. Мы можем использовать fтрижды: для построения верхней / нижней строки:, f "|-" iсредней линии: f "| " iи из этих двух целого прямоугольника: f [<top>,<middle>] j(примечание: jне отображается в качестве параметра g iиз-за частичного применения).

Редактировать: @dianne сохранил несколько байтов, объединив два Charаргумента в Stringдлину 2. Большое спасибо!


Мне нравится #идея!
Flawr

2
Я думаю, что вы можете сэкономить несколько байтов, определив (a:b)#n=a:([3..n]>>b)++[a]и написав["|-"#i,"| "#i]#j
Диана

@dianne: очень умно Большое спасибо!
Nimi

8

Python 2, 61 58 байт

-3 байта благодаря @flornquake (удалите ненужные скобки; используйте в hкачестве счетчика)

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

Тестовые случаи в идеоне


('- '[1<i<h])не нуждается в скобках.
ураган

Сохраните другой байт, используя h в качестве счетчика:exec"print'|'+'- '[1<h<%d]*(w-2)+'|';h-=1;"%h*h
flornquake

@flornquake Я хотел проверить необходимость этих скобок, но забыл. Использование hв качестве счетчика разумно! Благодарю.
Джонатан Аллан

8

PHP, 74 байта

for(;$i<$n=$argv[2];)echo str_pad("|",$argv[1]-1,"- "[$i++&&$n-$i])."|\n";

1
Вы все еще можете выиграть один байт с физическим разрывом строки.
Тит

1
-2 байта с !$i|$n==++$iвместо!$i|$n-1==$i++
Титус

1
еще один байт с$i++&&$n-$i?" ":"-"
Титус

1
$i++&&$n-$i?" ":"-"-> "- "[$i++&&$n-$i](-2)
Тит

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

05AB1E , 23 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 байта благодаря Аднану


Использование подстрок вместо if-другое заявление сохраняет два байта: 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

Common Lisp, 104 байта

Golfed:

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

Ungolfed:

(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 байт

Интерпретатор немного больше не Buggèd

?;,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<1и i==1к i<1.
Yytsi

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

Смотрите страницу с советами по Python
mbomb007

@ mbomb007 спасибо! Я проверю это.
Биарность 19.09.16

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%^|

Принимает ширину и высоту в качестве параметров командной строки.


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);}}

Testcases

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;
}

Golfed:

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 :) Вы также можете сохранить символ, удалив пробел после первой запятой.
Кристиан Рондо,

1
Прежде всего, этот код не компилируется. Даже если это скомпилируется, оно не «нарисует» прямоугольник, как этого требует OP. -1.
Yytsi

@TuukkaX Я исправил эту проблему с новой строкой, но не вижу причин, по которым она не должна компилироваться. Конечно, вы должны поместить этот код в класс, но тогда он должен работать.
Роман Греф,

1
«Я не вижу причин, по которым он не должен компилироваться». Что это тогда: o+=x "|\n"? Вы хотели положить +туда?
Yytsi

Благодарю. Я не хотел размещать там никаких персонажей.
Роман Грэф

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]не определены, мы теряем на экономии, так как нам нужно привести в качестве строки с паренсами и ''+.

Обе версии требуют 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
    ];

Уважаемый downvoter: почему?
Тит

1
Это может быть связано с тем, что пользователь увидел, что ваш ответ помечен как низкокачественный в очереди на проверку. Если вы публикуете объяснение своего кода или что-то большее, чем однострочный, вы можете избежать его автоматической пометки.
mbomb007

@mbomb: я никогда не видел, чтобы кто-нибудь опубликовал описание для oneliner на не-eso языке.
Тит

Или выходной, или версия без гольфа. Это не имеет значения, пока контент не слишком короткий. Но вы, вероятно, не были вокруг долго, если вы не видели это. Некоторые строки Python могут быть довольно сложными. Посмотрите на некоторые из @ xnor's.
mbomb007

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

Да, спасибо :)
Даниеро

2

Perl, 48 байт

Включает +1 для -n

Дайте размеры как 2 строки на STDIN

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

Просто код:

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

Хороший, как всегда. Обратите внимание, что в конце строки есть обратный удар, а вы, вероятно, хотели написать одинарную кавычку ;-)
Dada

@ Дада Исправлено. Благодарю.
Тон Хоспел

2

Луа, 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

Ungolfed:

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

MATL , 21 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_tagиregister_globals включены.

Для этого требуется доступ через веб-сервер (например, Apache), передавая значения через переменные session / cookie / POST / GET.
Ключ Wконтролирует ширину, а ключ Hконтролирует высоту.
Например:http://localhost/file.php?W=3&H=5


@ Titus Вы должны прочитать ссылку. Цитата: «Начиная с PHP 4.2.0, эта директива по умолчанию выключена ».
Исмаэль Мигель

Ой, извини, я все забрал. У вас есть версия в вашем названии. Я должен читать более внимательно.
Титус

@ Титус Все в порядке, не волнуйся. Извините за грубость с вами.
Исмаэль Мигель

Ничего; это цена, которую я плачу за педантизм. : D
Тит

@ Titus Не беспокойся об этом. Как вы знаете, около половины моих ответов написаны на PHP 4.1. Это экономит тонны байтов с вводом
Ismael Miguel


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 " ")) "|"]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.