Намалюйте прямокутник 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

Матлаб, 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 ініціалізується 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 bслідує s a. Ми можемо використовувати fтричі: для створення верхнього / нижнього рядка:, 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: Дуже розумно. Дуже дякую!
німі

8

Python 2, 61 58 байт

-3 байти завдяки @flornquake (видаліть непотрібні дужки; використовуйте 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

@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

Лист звичайний, 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

Математика, 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 дякую! Я перевірю це.
Біарність

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

Хакс, 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 :) Ви також можете зберегти знак, видаливши пробіл після першої коми.
Крістіан Рондо

1
Перш за все, цей код не компілюється. Навіть якщо це складеться, воно не буде «малювати» прямокутник, як зараз хоче ОП. -1.
Yytsi

@TuukkaX Я виправив цю проблему з новим рядком, але не бачу жодної причини, чому вона не повинна компілюватися. Звичайно, ви повинні поставити цей код у класі, але тоді він повинен працювати.
Роман Ґраф

1
"Я не бачу жодної причини, чому він не повинен складатись". Що це тоді o+=x "|\n":? Ви мали намір поставити +туди?
Іци

Спасибі. Я не хотів розміщувати там жодних персонажів.
Роман Греф

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]не визначений, ми втрачаємо на заощадженнях, потребуючи відтворення як рядок з паронами та ''+.

Обидві версії потребують -inоператора v3 або новішої .

Приклади

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

Шановний донор: чому?
Тит

1
Це може бути тому, що користувач побачив, що ваша відповідь позначена як низька якість у черзі на огляд. Якщо ви опублікуєте пояснення свого коду або що-небудь більше, ніж однолінійний, ви можете уникнути його автоматичного позначення.
mbomb007

@mbomb: Я ніколи не бачив, щоб хтось розміщував опис oneliner мовою, що не належить до езо.
Тит

Або вихід, або версія для гольфу. Не має значення, доки вміст не надто короткий. Але ви, мабуть, не були довгими, якщо цього не бачили. Деякі однофайлові 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

Так, дякую :)
daniero

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

@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

Безголівки:

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-Бога .

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 ця директива за замовчуванням вимикається ".
Ісмаїл Мігель

Пробачте, я все повертаю назад. Ви маєте версію у своєму заголовку. Мені слід уважніше читати.
Тит

@Titus Це добре, не хвилюйся. Вибачте, що жорстоко ставитесь до вас.
Ісмаїл Мігель

Не зважай; Це ціна, яку я плачу за педантичність. : D
Тіт

@Titus Не турбуйся про це. Просто ви знаєте, приблизно половина моїх відповідей написана в PHP 4.1. Він економить тонни байтів із вхідними даними
Ісмаель Мігель

1

Пітон 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 " ")) "|"]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.