Generuj pudełka!

19

Twoim zadaniem jest generowanie pól przy użyciu dowolnego znaku ASCII w odniesieniu do podanych danych wejściowych.

Przypadki testowe

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

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

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

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

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

Wejście

  • Dane wejściowe można pobrać z jednego z poniższych

    • stdin
    • Argumenty wiersza polecenia
    • Argumenty funkcyjne (2 argumenty, po jednym dla każdej liczby)
  • Dane wejściowe, jeśli zostaną pobrane z stdinargumentów lub wiersza poleceń, będą zawierać dwie dodatnie liczby całkowite, oddzielone spacją.

  • Dwie liczby oznaczają liczbę pól w każdej kolumnie i rzędzie

Wynik

  • Pola muszą być wyprowadzane w stdout(lub najbliższym odpowiedniku)
  • Każde pudełko powinno mieć trzy poziome odstępy

Zasady

  • Obie liczby będą większe niż 0, ale nie przekroczą 1000
  • Do wyświetlania pól można użyć dowolnego widocznego znaku. (o ile nie są zbyt surowe dla oka!)
  • Możesz napisać pełny program lub funkcję.
  • Nie powinno być żadnych niepotrzebnych znaków oprócz opcjonalnego końcowego znaku nowej linii.

Punktacja

To jest , więc wygrywa najkrótsze przesłanie (w bajtach).

Spikatrix
źródło

Odpowiedzi:

10

Pyth, 23 bajty

Mjbmsm@"= "&%k4dh*4HhyG

Określa funkcję, gktóra działa zgodnie z potrzebami.

Demonstracja.

isaacg
źródło
10

Siatkówka , 57 bajtów

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


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

Pobiera dane wejściowe unarne z końcowym znakiem nowej linii.

Każda linia powinna przejść do własnego pliku i #powinna zostać zmieniona na nową linię w plikach. Jest to niepraktyczne, ale możesz uruchomić kod w postaci pliku z -sflagą, zachowując #znaczniki (i zmieniając końcowy znak nowej linii również #na wejściu). Jeśli chcesz, możesz zmienić #powrót do nowych linii w danych wyjściowych. Na przykład:

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

Metoda: 5 pojedynczych kroków podstawienia. Dwa pierwsze (4 pierwsze linie) Tworzy 2*N+1przez Msiatkę tych i następnych 3 etapach (6 linii) format go do wymaganej mocy.

Łańcuchy pośrednie (rozdzielone przez -'s):

11 111
------------------
111
111
111
111
 111
------------------
111
111
111
111
111
------------------
111
=   =   =   
111
=   =   =   
111
------------------
============
=   =   =   
============
=   =   =   
============
------------------
=============
=   =   =   =
=============
=   =   =   =
=============
randomra
źródło
Jeden plik na linię zawsze wydaje się bardzo dziwnym wyborem projektowym.
curiousdannii
1
@curiousdannii Zostało to zrobione w ten sposób, aby znak nowej linii był użyteczny w wyrażeniach regularnych bez ucieczki, ale planuje się zmianę na bardziej rozsądny format 1-pliku.
randomra
8

JavaScript ( ES6 ), 83

Funkcja z parametrami wierszy i kolumn. Za pomocą ciągów szablonów istnieją 2 osadzone znaki nowej linii, które są znaczące i zliczane.

Wyjście przez alert(popup). Jako alertużytku proporcjonalny czcionki, możemy uzyskać lepszy rezultat przy użyciu litery o szerokości podobna do przestrzeni zamiast =.

Przetestuj w Firefoksie za pomocą konsoli, aby uzyskać prawdziwe alertdane wyjściowe, lub uruchom poniższy fragment kodu.

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>

edc65
źródło
Uruchom fragment kodu nie działa dla mnie, po prostu zobacz pole z „2 3” w środku i strzałką, która wydaje się sugerować, że należy kliknąć go, aby uzyskać wynik. Użycie przycisku pełnej strony lub wypróbowanie innej przeglądarki niczego nie zmienia.
Dennis Jaheruddin
@DennisJaheruddin, To samo dzieje się w przypadku korzystania z chrome (nie obsługuje ES6). Spróbuj firefox.
Spikatrix
1
@DennisJaheruddinTest in Firefox
edc65
7

JavaScript (ES6), 75 73

Używając obfitych repeatwywołań, powtarzamy |, a następnie powtarzamy |z końcowymi spacjami i powtarzamy oba te powtórzenia, aby utworzyć wiersze:

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

(Nowe linie są znaczące, zgodnie z sugestią edc65 użycia ciągów szablonów).

Skrawek:

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

Bez ciągów szablonów, bez ponownego użycia nazwy metody i z dodanymi białymi znakami:

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

(Korzystanie z zalecenia edc65 w celu |uzyskania lepszych odstępów wizualnych).

apsillery
źródło
7

Pip, 29 24 = 23 + 1 bajtów

Wymaga -nflagi. Pobiera wysokość i szerokość jako argumenty wiersza poleceń i buduje pola 1s.

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

Wyjaśnienie:

                         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)

Ten program w dużym stopniu wykorzystuje fakt, że ciągi są liczbami, a liczby są ciągami w Pipie. (A trzy spacje w tych polach były w sam raz, aby skorzystać z wbudowanej mzmiennej!)

Oto, w jaki sposób lista jest budowana przy użyciu danych wejściowych 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]

I końcowy wynik:

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

Więcej na Pip

DLosc
źródło
6

Perl, 72 63 52 50 bajtów

Moja najkrótsza wersja wykorzystuje jeszcze $/bardziej zwięźle znak nowej linii:

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

Poprzednia aktualizacja umieszcza najczęściej puste linie w separatorze rekordów wyjściowych $,i drukuje listę linii ciągłych.

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

Poprzednia wersja może być nieco jaśniejsza dla zwykłego czytelnika:

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

Pierwsza wersja użyta @ARGVzamiast pop:

$ perl -E 'say($y=($x="="."   ="x$ARGV[1])=~s/./=/gr);for(1..$ARGV[0]){say$x;say$y}' 2 5
Stefan Majewsky
źródło
5

Python 2, 58 57 bajtów

Dość prosta implementacja.

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

Sprawdź to tutaj.

Dzięki Sp3000 za oszczędność jednego bajtu.

Kade
źródło
5

GNU sed -r, 160

Westch, myślałem, że będzie mniejszy, ale i tak jest. Niestety wyrażenia regularne sed nie mają żadnych możliwości wyszukiwania.

:
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

Przyjmowanie danych wejściowych jako jednostkowe z STDIN:

$ sed -rf boxes.sed <<< "11 111"
=============
=   =   =   =
=============
=   =   =   =
=============
$
Cyfrowa trauma
źródło
4

CJam, 25 bajtów

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

Wypróbuj online w interpretatorze CJam .

Jak to działa

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.
Dennis
źródło
4

Cudowny, 168 bajtów

Ta odpowiedź działa tylko do 255 x 255, a nie 1000 x 1000, ze względu na ograniczenia języka Marbelous. Pracuję nad biblioteką 32-bitową, ale nie będzie ona gotowa w najbliższym czasie.

Wejście jest dostarczane jako dwa parametry wiersza poleceń lub parametry funkcji na płycie głównej.

@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

Pseudo kod:

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"
Sparr
źródło
3

CJam 52 51 46 41 bajtów

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

Dzięki Sp3000 za -5 znaków

Podziękowania dla Martina Büttnera ♦ za kolejne 5 znaków

Spróbuj

TobiasR.
źródło
3

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

Program testowy:

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);
}
Cyfrowa trauma
źródło
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);}
1
Powinienem był najpierw spojrzeć na inne odpowiedzi = /, mój komentarz jest dłuższą wersją odpowiedzi Reto Koradi.
tak, bardzo się starałem (i nie udało mi się), aby uzyskać to w jednej (krótszej) pętli
Digital Trauma
3

PHP4.1, 76 71 69 bajtów

To jest tak golfa, jak tylko mogę.

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

Oczekuje to, że klucz Hbędzie miał liczbę linii i Vliczbę pól w linii.

Używam -i |właśnie dlatego pudełka faktycznie wyglądają jak pudełka. W razie potrzeby mogę go zmienić na =. Nie ma znaczenia zastosowany znak.
Opuszczenie, -a |także pomaga zrozumieć bałagan, który się dzieje.


Stara metoda, 76 bajtów:

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

Przykład wyniku:

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

-------------
|   |   |   |
-------------
|   |   |   |
-------------
Ismael Miguel
źródło
3

Julia, 59 bajtów

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

Tworzy to nienazwaną funkcję, która przyjmuje dwie liczby całkowite jako dane wejściowe i drukuje wynik do STDOUT. Aby to nazwać, nadaj mu nazwę, np f=(n,m)->....

Niegolfowane + wyjaśnienie:

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

Przykłady:

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

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

Wszelkie sugestie są mile widziane.

Alex A.
źródło
3

bash + coreutils, 57

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

Służy dcdo drukowania liczb binarnych, które mają 1s dla krawędzi pola i 0s dla spacji.

  • liczba jedynek X jest obliczana przez 2 ^ (width * 4 + 1) - 1, a następnie wypychana i drukowana
  • 10001...0001liczba jest obliczana , a potem pchnąłX* 8 / 15 + 1
  • stos jest następnie zrzucany heightrazy

trNastępnie konwertuje 0s do znaków spacji.

Wynik

$ ./boxes.sh 2 4
11111111111111111
1   1   1   1   1
11111111111111111
1   1   1   1   1
11111111111111111
$ 
Cyfrowa trauma
źródło
3

R, 83 81

Jako funkcja bez nazwy przyjmująca hi jako parametry. Konstruuje pierwszą i drugą linię w wektorze dla każdego wiersza i powiela go hrazy. Dołącza wektor do dolnej linii i catwysuwa wektor za pomocą, fillaby ograniczyć długość linii. Teraz korzysta z dowolnej widocznej reguły postaci.

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

Testowe uruchomienie

> 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
> 
MickyT
źródło
3

Python 3 2, 160 87 85 79 bajtów

Wiem, że to może być golfed dużo więcej, chciałbym kilka wskazówek jak to jest moja pierwsza próba w golfa.

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

Dzięki wskazówkom @Cool Guy i @ Sp3000 zmniejszyłem rozmiar do nieco powyżej połowy.

Np .: d (3,3)

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

Wypróbuj tutaj .

Przepraszam za końcowe białe znaki.

nsane
źródło
1
Poziom wcięcia można zmniejszyć.
Spikatrix
3
Nie musisz budować listy, a następnie dołączyć. Ciągi można mnożyć'='*(4*y+1)
Sp3000
1
Ustawienie w=4*y+1oszczędza 3 bajty.
DLosc
@Cool Guy Używam tabulacji, a nie 4 spacji.
nsane
Oh ok Nie zauważyłem tego.
Spikatrix
2

KDB (Q), 37 bajtów

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

Wyjaśnienie

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

Test

q){(3+2*x-1)#(5+4*y-1)#'(4#"=";"=   ")}[2;5]
"====================="
"=   =   =   =   =   ="
"====================="
"=   =   =   =   =   ="
"====================="
WooiKent Lee
źródło
2

JavaScript, 92 85 bajtów

Miałem nadzieję, że będzie to krótsza odpowiedź niż inna odpowiedź JS (dobra robota jak zawsze, edc65), ale no cóż. Mam przeczucie, że matematykę można pograć w golfa.

f=(r,c)=>(x=>{for(i=s='';(y=i++/x)<r-~r;)s+=i%x?' *'[-~y%2|!(-~i%4)]:'\n'})(4*c+2)||s
vvye
źródło
Niestety, nie mogę pomóc w obliczeniach matematycznych - moja głowa kręci się ... ale oto kilka mikroopatów: 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 to świetnie, dzięki! Rzeczy takie jak 2*r+1=> r-~rsą dokładnie tym, co miałem na myśli, grając w matematykę, a ten konkretny jest genialny. :)
vvye
2

Oktawa, 69 65 64

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

Dzięki DLosc za wskazanie problemów, które doprowadziły do ​​-1

Pobiera dane wejściowe [1 1]i wyjściowe:

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

Możesz także wpisać „1” i otrzymać 1x1. Jeśli dane wejściowe naprawdę muszą być 1 1, rozmiar wzrasta do88 8584 :

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

Uwaga: Matlab nie zezwala na tworzenie łańcuchów lub danych Octave (liczba całkowita), ale oto wersja Matlab ( 67 ):

y=ones([2,4].*input('')+1);y(1:2:end,:)=4;y(:,1:4:end)=4;char(y+31)
sudo rm -rf slash
źródło
2

C, 76 bajtów

w,n;f(r,c){for(w=c*4+2,n=w*r*2+w;n--;)putchar(n%w?n/w%2&&n%w%4-1?32:61:10);}

Wywoływany jako funkcja z liczbą wierszy i kolumn jako argumentów. Na przykład:

f(5, 2)
Reto Koradi
źródło
2

CJam, 30 29 bajtów

Nowa wersja z nadmiarowymi +na końcu usunięta (dzięki, Dennis):

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

Wiem, że Dennis opublikował już rozwiązanie CJam, które pokonuje to o mile. Ale to moja pierwsza próba w CJam, więc to cud, że w ogóle działa. :)

Dość brutalna siła. Tworzy pierwszą linię ze 4 * H + 1 =znaków, a następnie drugą linię z =powtarzanych Hczasów, z kolejną =dodaną. Następnie łączy dwie linie, powtarza cały Vczas, a następnie dodaje kolejną kopię pierwszej linii.

Mam wrażenie, że mam zbyt wiele manipulacji na stosie, a nawet zapisałem pierwszą linię w zmiennej, ponieważ musiałem tasować rzeczy na stosie jeszcze bardziej.

Ogólnie niezbyt elegancki, ale musisz gdzieś zacząć ... a ja najpierw chciałem spróbować prostego problemu.

Reto Koradi
źródło
Na +koniec nie potrzebujesz . CJam drukuje cały stos.
Dennis
2

CJam, 23

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

Wypróbuj online

Wyjaśnienie:

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)
aditsu
źródło
1

Java, 181

Mam nadzieję, że według

Możesz napisać pełny program lub funkcję.

jest zgodny z regułami, aby policzyć bajty funkcji , która w tym przypadku wynosi 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);}
}
Marco13
źródło
Dane wyjściowe są nieprawidłowe. Patrz wyjście nr 2: „ Każde pudełko powinno mieć trzy poziome odstępy ”. Twój kod wyświetla dwie spacje, a nie trzy
Spikatrix
@CoolGuy Przeliczył to - teraz 2 bajty więcej, ale to niewiele zmienia ...
Marco13,
1
dobrze. +1. Zaoszczędź dwa bajty, zmieniając for(r=R;r-->0;){x=y=e;for(c=C;c-->0;){x+=a;y+="= ";}s+=x+n+y+n;}nafor(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

To naprawdę nie może konkurować, ale tutaj jest tylko dla zabawy:

(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="";}}

Jak uruchomić:

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

Otwarty na ulepszenia.

pmudra
źródło
zamień ciąg na var.
CSharpie
Niestety nie jest to dozwolone. Zobacz to
pmudra,
1
Zadeklarowanie tych intpoza pętlą może zaoszczędzić bajt.
Spikatrix
1

Python 2.7, 66 bajtów.

Wiem, że w Pythonie są już lepsze rozwiązania, ale to najlepsze, jakie wymyśliłem.

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

Przykład:

f(3,4)

=================
=   =   =   =   =
=================
=   =   =   =   =
=================
=   =   =   =   =
=================
heo
źródło
Przykro nam, ale powoduje to niepoprawny wynik dla przypadków testowych 2,3 i 5. Zmieszałeś kolumny i wiersze i uzyskałeś odwrotnie.
Spikatrix,
1

Ruby, 57 48 45

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

Stosowanie:

print f[2,5]

Dzięki manatwork za oszczędność 3 bajtów.

rr
źródło
Dwie małe możliwości poprawy: '='?=i "<LF>"$/.
manatwork
Kolejny mały: ?=*(w*4+1)?=+?=*w*4
manatwork
1

Java, 123 119 bajtów

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

Nadużywanie parametrów wejściowych jako liczników znacznie pomogło w zmniejszeniu rozmiaru kodu.

Podziękowania dla Cool Guy za sugerowanie nadużywania składni.

ECS
źródło
Zagraj w golfa bardziej, używając forpętli zamiast whilepętli.
Spikatrix,
Niestety dla (; w -> 0;) ma taką samą długość jak podczas (w -> 0)
ECS
1
Miałem na myśli while(w-->0){d+=" =";b+="====";}-> for(;w-->0;b+="====")d+=" =";który oszczędza trzy bajty
Spikatrix
Masz rację. Właściwie udało mi się wycisnąć z tego 4 bajty dzięki twojej sugestii.
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;%

Przykład:

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

Wynik:

#############
#   #   #   #
#############
#   #   #   #
#############
#   #   #   #
#############
#   #   #   #
#############
Jajko sadzone
źródło
Czy jest jakiś kompilator online, w którym mógłbym to przetestować? BTW, zgodnie z twoim wynikiem, twój program generuje nieprawidłowe dane wyjściowe. Zobacz wyjście2: Każde pudełko powinno mieć trzy poziome odstępy
Spikatrix
@CoolGuy, masz rację, nie złapałem tego, zaktualizowałem swój post. Możesz wypróbować SAS na żądanie , byłby to najmniej kłopotliwy sposób na uzyskanie dostępu do kompilatora online bez konfigurowania własnej instancji AWS
Fried Egg
Twój pierwszy link nie działa dla mnie. Chrome dajeDNS_PROBE_FINISHED_NXDOMAIN
Spikatrix
Wypróbuj ten, chociaż pierwszy link działa dobrze dla mnie SAS na żądanie lub kliknij link na tej stronie do „Centrum sterowania” tutaj
Fried Egg
Nie wiem dlaczego, ale przejście do centrum kontroli powoduje taki sam błąd, jak wspomniany w moim wcześniejszym komentarzu: /
Spikatrix