Narysuj prostokąt ASCII

20

Biorąc pod uwagę dwie liczby całkowite jako dane wejściowe w tablicy, narysuj prostokąt, używając pierwszej liczby całkowitej jako szerokości, a drugiej wysokości.

Lub, jeśli twój język to obsługuje, dwie liczby całkowite można podać jako osobne dane wejściowe.

Załóż, że szerokość i wysokość nigdy nie będą mniejsze niż 3 i zawsze będą podawane.

Przykładowe dane wyjściowe:

[3, 3]

|-|
| |
|-|

[5, 8]

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

[10, 3]

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

To jest golf golfowy, więc wygrywa odpowiedź z najmniejszą ilością bajtów.

MCMastery
źródło

Odpowiedzi:

6

Jolf, 6 bajtów

,ajJ'|

Wypróbuj tutaj! Moje wbudowane pudełko wreszcie się przydało! :RE

,ajJ'|
,a       draw a box
  j      with width (input 1)
   J     and height (input 2)
    '    with options
     |    - corner
          - the rest are defaults
Conor O'Brien
źródło
10

Galaretka , 14 bajtów

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

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

,þ%,ỊḄị“-|| ”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.
Dennis
źródło
To wspaniałe zastosowanie :)
Lynn,
9

Matlab, 69 65 56 bajtów

Dzięki @WeeingIfFirst i @LuisMendo za niektóre bajty =)

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

Jest to naprawdę proste w Matlabie: Najpierw utwórz macierz o pożądanym rozmiarze, a następnie zindeksuj pierwszy i ostatni wiersz, aby wstawić -, i zrób to samo z pierwszą i ostatnią kolumną, aby wstawić |.

Na przykład f(4,3)zwraca

|--|
|  |
|--|
wada
źródło
@WeeingIfFirst Och, oczywiście, dziękuję bardzo!
flawr
6 bajtów krótszych:z([1,b],1:a)=45;z(1:b,[1,a])=124;z=[z,'']
Stewie Griffin
Jeszcze krótszy:z(b,a)=' ';z([1,b],:)=45;z(:,[1,a])=124
Luis Mendo
@LuisMendo Thanks! Ciągle potrzebujemy ciągów, w przeciwnym razie tablica zostanie przekonwertowana na numeryczną.
flawr
@flawr inicjuje się z(b,a)=' 'jako char. Następnie możesz wypełnić liczby i są one automatycznie rzucane na char. zzachowuje swój oryginalny typ
Luis Mendo
8

JavaScript (ES6), 63 bajty

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>

Neil
źródło
Przekazujesz funkcję szablonu jako domyślny argument? Sprytny!
Florrie,
8

Haskell, 62 55 bajtów

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

Przykład użycia:

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

Funkcja pomocnika fpobiera listę dwóch elementów [a,b]i liczbę ni zwraca listę jednego, apo którym n-2 bnastępuje s, po którym następuje jeden a. Możemy użyć ftrzy razy: aby zbudować górną / dolną linię f "|-" i:, środkową linię: f "| " ii z tych dwóch cały prostokąt: f [<top>,<middle>] j(uwaga: jnie pojawia się jako parametr z g ipowodu częściowej aplikacji).

Edycja: @dianne zapisał niektóre bajty, łącząc dwa Charargumenty w jeden Stringo długości 2. Wielkie dzięki!

nimi
źródło
Podoba mi się ten #pomysł!
flawr
2
Myślę, że możesz zaoszczędzić kilka bajtów, definiując (a:b)#n=a:([3..n]>>b)++[a]i pisząc["|-"#i,"| "#i]#j
dianne,
@dianne: Bardzo sprytny. Wielkie dzięki!
nimi
8

Python 2, 61 58 bajtów

-3 bajty dzięki @flornquake (usuń niepotrzebne nawiasy; użyj hjako licznika)

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

Przypadki testowe są w ideone

Jonathan Allan
źródło
('- '[1<i<h])nie potrzebuje nawiasów.
trzęsienie ziemi
Zapisz kolejny bajt, używając h jako licznika:exec"print'|'+'- '[1<h<%d]*(w-2)+'|';h-=1;"%h*h
trzęsienie ziemi
@flornquake Chciałem sprawdzić konieczność nawiasów, ale zapomniałem. Używanie hjako licznika jest inteligentne! Dzięki.
Jonathan Allan,
8

PHP, 74 bajty

for(;$i<$n=$argv[2];)echo str_pad("|",$argv[1]-1,"- "[$i++&&$n-$i])."|\n";
Jörg Hülsermann
źródło
1
Nadal możesz wygrać jeden bajt za pomocą fizycznego podziału linii.
Tytus
1
-2 bajty z !$i|$n==++$izamiast!$i|$n-1==$i++
Tytus
1
kolejny bajt z$i++&&$n-$i?" ":"-"
Tytusa
1
$i++&&$n-$i?" ":"-"-> "- "[$i++&&$n-$i](-2)
Tytus
7

Vimscript, 93 83 75 74 73 66 64 63 bajty

Kod

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

Przykład

:call A(3,3)

Wyjaśnienie

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

Zauważ, że nie używa, norm!więc może zakłócać niestandardowe mapowania vima!

Christian Rondeau
źródło
5

MATL , 19 bajtów

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

Wypróbuj online!

Wyjaśnienie

Podejście jest podobne do tego zastosowanego w tej drugiej odpowiedzi . Kod buduje tablicę liczbową formularza

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

a następnie jego wartości są używane jako (oparte na 1, modułowe) indeksy w ciągu, '|-| 'aby uzyskać pożądany wynik.

'|-| '                % 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
Luis Mendo
źródło
5

05AB1E , 23 22 20 bajtów

Dane wejściowe przyjmuje się jako wysokość, a następnie szerokość.

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

Wyjaśnienie

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

Wypróbuj online!

Zaoszczędzono 2 bajty dzięki Adnan

Emigna
źródło
Korzystanie podciągi zamiast rachunku if-else zapisuje dwa bajty: F„ -N_N¹<Q~è²Í×'|.ø,.
Adnan
5

C, 73 bajty

i;f(w,h){for(i=++w*h;i--;)putchar(i%w?~-i%w%~-~-w?i/w%~-h?32:45:124:10);}
orlp
źródło
4

Python 2, 56 bajtów

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

trzęsienie ziemi uratowało jeden bajt.

Lynn
źródło
1
Ładne użycie formatowania ciągów! Możesz zapisać bajt za pomocą %ckonwersji:'-%*c'%(h-1,45)
flornquake
Och, myślałem, że %*cto nawet nie było nic! Dziękuję Ci. :)
Lynn,
'-%%%dc'%~-h%45działa również dla tej samej długości.
xnor
4

Common Lisp, 104 bajty

Gra w golfa:

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

Nie golfowany:

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

źródło
3

Turtlèd , 40 bajtów

Interpreter jest nieco nie na podsłuchu

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

Wyjaśnienie

?                            - 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
Zniszczalna cytryna
źródło
3

Mathematica, 67 64 bajtów

Dzięki lastresort i TuukkaX za przypomnienie mi, że golfiści powinni być podstępni i oszczędzać 3 bajty!

Prosta implementacja. Zwraca tablicę ciągów.

Table[Which[j<2||j==#,"|",i<2||i==#2,"-",0<1," "],{i,#2},{j,#}]&
Greg Martin
źródło
1
Użyj 0<1zamiastTrue
u54112,
1
Myślę, że j==1można to zredukować do j<1i i==1do i<1.
Yytsi
3

Python 3, 104 95 bajtów

(informacje zwrotne od @ mbomb007: -9 bajtów)

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

(mój pierwszy golfowy kod, doceniam opinie)

Biarity
źródło
Witamy! Możesz usunąć niektóre spacje, użyć range(y)zamiast range(0,y), a jeśli nnigdy nie jest to negatywne, możesz użyćif n<1or n==~-y else
mbomb007 19.09.16
Zobacz stronę ze wskazówkami w Pythonie
mbomb007,
@ mbomb007 dzięki! Sprawdzę to.
Biarity,
2

Partia, 128 bajtów

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

Przyjmuje szerokość i wysokość jako parametry wiersza polecenia.

Neil
źródło
2

Haxe, 112 106 bajtów

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

Przypadki testowe

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

R(10, 3)
|---------|
|         |
|---------|
Yytsi
źródło
2

Java 135 bajtów

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

Gra w golfa:

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;}
Roman Gräf
źródło
Liczę 136 :) Możesz także zapisać znak, usuwając spację po pierwszym przecinku.
Christian Rondeau,
1
Po pierwsze, ten kod się nie kompiluje. Nawet jeśli to się skompiluje, nie „narysuje” prostokąta, jak chce OP. -1.
Yytsi
@TuukkaX Naprawiłem ten problem nowej linii, ale nie widzę żadnego powodu, dla którego miałby się nie kompilować. Oczywiście musisz umieścić ten kod w klasie, ale wtedy powinien działać.
Roman Gräf,
1
„Nie widzę żadnego powodu, dla którego miałby się nie kompilować”. Co to jest wtedy: o+=x "|\n"? Czy chciałeś +tam umieścić ?
Yytsi
Dzięki. Nie chciałem tam umieszczać żadnych postaci.
Roman Gräf,
2

PowerShell v3 +, 55 bajtów

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

Pobiera dane wejściowe $ai $b. Pętle od 1do $b. W każdej iteracji tworzymy pojedynczy ciąg. Środek jest wybierany z tablicy dwóch ciągów o pojedynczej długości, a następnie pomnożony przez $a-2, podczas gdy jest otoczony rurami. Wynikowe ciągi znaków są pozostawione w potoku, a dane wyjściowe za pośrednictwem niejawnego mają Write-Outputmiejsce po zakończeniu programu, z domyślnym separatorem nowego wiersza.

Alternatywnie również w 55 bajtach

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

Ten powstał, ponieważ próbowałem zagrać w golfa w tablicy wyboru pośrodku, używając zamiast tego sznurka. Ponieważ jednak [char]czasy [int]nie są określone, tracimy na oszczędnościach , ponieważ musimy rzucić jako sznurek z parens i ''+.

Obie wersje wymagają od -inoperatora wersji v3 lub nowszej .

Przykłady

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

PS C:\Tools\Scripts\golfing> .\draw-an-ascii-rectangle.ps1 7 6
|-----|
|     |
|     |
|     |
|     |
|-----|
AdmBorkBork
źródło
2

PHP, 82 bajty

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

indeksowanie ciągu statycznego, w tym nowego wiersza

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
    ];
Tytus
źródło
Drogi downvoter: dlaczego?
Tytus
1
Może to być spowodowane tym, że użytkownik zobaczył, że Twoja odpowiedź została oznaczona jako niska jakość w kolejce do sprawdzenia. Jeśli opublikujesz wyjaśnienie swojego kodu lub coś więcej niż jedno-liniowy, możesz uniknąć automatycznego oznaczania go.
mbomb007,
@mbomb: Nigdy nie widziałem, aby ktokolwiek publikował opis onelinera w języku innym niż eso.
Tytus
Lub wyjście lub wersja bez golfa. Nie ma to znaczenia, o ile treść nie jest zbyt krótka. Ale prawdopodobnie nie byłeś w pobliżu długo, jeśli tego nie widziałeś. Niektóre liniowce w Pythonie mogą być dość skomplikowane. Spójrz na niektóre z xnor.
mbomb007,
2

Ruby, 59 54 52 bajtów

Och, to o wiele prostsze :)

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

Uruchom test w ideone

daniero
źródło
1
Możesz zapisać kilka bajtów, używając dosłownych znaków nowej linii zamiast \n.
Jordan
1
Możesz zapisać bajty, nie definiując ii j. Zamień idefinicję na x-=2. Zamiast tego po jprostu użyj (y-2).
m-chrzan
Tak, dzięki :)
daniero,
2

Perl, 48 bajtów

Obejmuje +1 dla -n

Podaj rozmiary jako 2 linie na STDIN

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

Tylko kod:

say"|".$_ x($`-2)."|"for"-",($")x(<>-1-/$/),"-"
Ton Hospel
źródło
Niezły jak zawsze. Zwróć uwagę, że na końcu linii masz backstick, podczas gdy prawdopodobnie chciałeś napisać pojedynczy cytat ;-)
Dada
@Dada Naprawiono. Dzięki.
Ton Hospel,
2

Lua, 120 93 bajtów

Zaoszczędziłem sporo bajtów, usuwając głupie z powodu złożoności.

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

Nie golfowany:

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

Wypróbuj na Repl.it

ATaco
źródło
1

Python 2, 67 bajtów

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

Przykłady

f(3,3)

|-|
| |
|-|

f(5,8)

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

f(10,3)

|--------|
|        |
|--------|
ElPedro
źródło
1

MATL , 21 17 bajtów

Z"45ILJhY('|'5MZ(

Jest to nieco inne podejście niż w przypadku MATL-Boga .

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)

Dzięki @LuisMendo za wszelką pomoc!

Wypróbuj online!

wada
źródło
1

PHP 4.1, 76 bajtów

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

Zakłada się, że masz domyślne php.iniustawienia dla tej wersji, w tym short_open_tagiregister_globals włączone.

Wymaga to dostępu przez serwer WWW (np .: Apache), przekazując wartości przez zmienne session / cookie / POST / GET.
Klucz Wkontroluje szerokość, a klucz Hkontroluje wysokość.
Na przykład:http://localhost/file.php?W=3&H=5

Ismael Miguel
źródło
@Titus Powinieneś przeczytać link. Cytując: „Od PHP 4.2.0 ta dyrektywa domyślnie jest wyłączona ”.
Ismael Miguel
Och, przepraszam, że biorę wszystko z powrotem. Masz wersję w swoim tytule. Powinienem przeczytać uważniej.
Tytus
@Titus W porządku, nie martw się. Przepraszam, że jestem dla ciebie surowy.
Ismael Miguel
Nieważne; to cena, którą płacę za bycie pedantycznym. : D
Tytus
@Titus Nie martw się tym. Wiesz, około połowa moich odpowiedzi jest napisana w PHP 4.1. Oszczędza to mnóstwo bajtów z wejściem
Ismael Miguel
1

Python 3, 74 znaki

p="|"
def r(w,h):m=w-2;b=p+"-"*m+p;return b+"\n"+(p+m*" "+p+"\n")*(h-2)+b
vpzomtrrfrt
źródło
1

Swift (2.2) 190 bajtów

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)

Myślę, że Swift 3 mógłby grać w golfa o wiele bardziej, ale nie mam ochoty pobierać Swift 3.

Danwakeem
źródło
1

F #, 131 bajtów

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 " ")) "|"]
Biarity
źródło