Keluaran diagram visual gambar

22

Tulis program yang memasukkan dimensi lukisan, lebar anyaman, dan lebar bingkai untuk potret berbingkai. Program harus menampilkan diagram menggunakan simbol Xuntuk lukisan, +untuk anyaman, dan #untuk pembingkaian. Simbol harus dipisahkan dengan ruang. Trailing whitespace baik-baik saja, selama output secara visual sesuai dengan kriteria. Inputnya bisa 0.

INPUT: 3 2 1 2 (Lebar, Tinggi, Lebar Matte, Lebar Bingkai)

KELUARAN:

3 dan 2 pertama adalah lebar dan tinggi lukisan.  1 adalah lebar matte di sekitarnya.  2 adalah lebar bingkai di sekeliling semuanya.

Dalam bentuk teks:

# # # # # # # # #
# # # # # # # # #
# # + + + + + # #
# # + X X X + # #
# # + X X X + # #
# # + + + + + # #
# # # # # # # # #
# # # # # # # # #

Kode yang menang melengkapi kondisi dalam byte sekecil mungkin.

George Harris
sumber
2
Tantangan yang bagus! Untuk tantangan di masa mendatang, Anda mungkin ingin menggunakan The Sandbox
MilkyWay90
2
apakah Anda keberatan jika inputnya berbeda?
vityavv
1
Bisakah kita mengembalikan daftar string?
MilkyWay90
5
Bisakah salah satu input menjadi nol?
Laikoni
1
Bisakah kita memiliki ruang di akhir setiap baris?
Luis Mendo

Jawaban:

5

Python 2 , 98 byte

w,h,a,b=input()
a*='+'
b*='#'
for c in b+a+h*'X'+a+b:print' '.join(min(c,d)for d in b+a+w*'X'+a+b)

Cobalah online!

Mencetak kisi yang dipisahkan ruang, mengikuti spesifikasi secara ketat. Saya senang yang *=digunakan untuk mengkonversi adan bdari angka ke string.

Python 3 dapat menyimpan beberapa byte dengan menghindari ' '.join, mungkin lebih dengan menggunakan f-string dan ekspresi penugasan. Terima kasih kepada Jo King untuk -2 byte.

Python 3 , 93 byte

def f(w,h,a,b):a*='+';b*='#';[print(*[min(c,d)for d in b+a+w*'X'+a+b])for c in b+a+h*'X'+a+b]

Cobalah online!

Tidak
sumber
Saya sudah kalah besar! Pekerjaan bagus, sepertinya cukup golf
MilkyWay90
Golf yang bagus! Sangat pintar.
George Harris
4

JavaScript (ES6),  118 113  107 byte

(w,h,M,F)=>(g=(c,n)=>'01210'.replace(/./g,i=>c(i).repeat([F,M,n][i])))(y=>g(x=>'#+X'[x<y?x:y]+' ',w)+`
`,h)

Cobalah online!

Berkomentar

(w, h, M, F) => (       // given the 4 input variables
  g = (                 // g = helper function taking:
    c,                  //   c = callback function returning a string to repeat
    n                   //   n = number of times the painting part must be repeated
  ) =>                  //
    '01210'             // string describing the picture structure, with:
    .replace(           //   0 = frame, 1 = matte, 2 = painting
      /./g,             // for each character in the above string:
      i =>              //   i = identifier of the current area
        c(i)            //   invoke the callback function
        .repeat         //   and repeat the result ...
        ([F, M, n][i])  //   ... either F, M or n times
    )                   // end of replace()
)(                      // outer call to g:
  y =>                  //   callback function taking y:
    g(                  //     inner call to g:
      x =>              //       callback function taking x:
        '#+X'           //         figure out which character to use
        [x < y ? x : y] //         according to the current position
        + ' ',          //         append a space
      w                 //       repeat the painting part w times
    )                   //     end of inner call
    + '\n',             //     append a line feed
  h                     //   repeat the painting part h times
)                       // end of outer call
Arnauld
sumber
3

MATL , 24 byte

&l,ithYaQ]'#+X'w)TFX*cYv

Input adalah: Tinggi, Lebar, Lebar Matte, Lebar Bingkai.

Cobalah online!

Penjelasan

&l      % Take height and width implicitly. Push matrix of that size with all
        % entries equal to 1
,       % Do twice
  i     %   Take input
  th    %   Duplicate, concatenate: gives a 1×2 vector with the number repeated
  Ya    %   Pad matrix with those many zeros vertically and horizontally
  Q     %   Add 1 to each entry 
]       % End
'#+X'   % Push this string
w)      % Index into the string with the padded matrix
TF      % Push row vector [1 0]
X*      % Kronecker product. This inserts columns of zeros
c       % Convert to char again. Char 0 is will be displayed as space
Yv      % Remove trailing spaces in each line. Implicitly display
Luis Mendo
sumber
2

Bahasa Wolfram (Mathematica) , 142 byte

(t=(p=Table)["# ",2(c=#4+#3)+#2,2c+#];p[t[[i,j]]="+ ",{j,z=#4+1,c+#3+#},{i,z,c+#3+#2}];p[t[[i,j]]="X ",{j,#3+z,c+#},{i,#3+z,c+#2}];""<>#&/@t)&

Cobalah online!

J42161217
sumber
2

Arang , 48 47 44 byte

≔×NXθ≔×NXηFE+#×Nι«≔⁺ι⁺θιθ≔⁺ι⁺ηιη»Eη⪫⭆θ⌊⟦ιλ⟧ 

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Catatan: Ruang tambahan. Sunting: Sekarang menggunakan algoritma @ xnor. Penjelasan:

≔×NXθ≔×NXη

Masukkan lebar dan tinggi dan ubah menjadi string Xs.

FE+#×Nι

Ulangi karakter +dan #, ubah menjadi string panjang yang diberikan oleh dua input yang tersisa. Kemudian lilitkan kedua tali itu.

«≔⁺ι⁺θιθ≔⁺ι⁺ηιη»

Awali dan sufiks lukisan dengan string untuk anyaman dan framing.

Eη⪫⭆θ⌊⟦ιλ⟧ 

Ulangi string, ambil karakter horizontal dan vertikal seminimal mungkin, kemudian spasi dua baris, secara implisit mencetak setiap baris pada barisnya sendiri.

Neil
sumber
2

05AB1E (lawas) / 05AB1E --no-lazy , 32 31 byte

и'Xׄ+#vyI©×UεX.ø}®FDнgy×.ø]€S»

Mengambil input dalam urutan height, width, matte, frame. Jika urutan input yang ditentukan dalam tantangan itu ketat (masih menunggu OP untuk verifikasi), yang memimpins (swap) dapat ditambahkan untuk +1 byte.

Diperlukan --no-lazyflag compiler Elixir dalam versi baru 05AB1E, karena Elixir memiliki beberapa perilaku aneh karena evaluasi malas untuk peta / loop bersarang (di sini hasilnya tanpa flag ini ).

Cobalah online di versi lawas 05AB1E.
Cobalah online di versi baru 05AB1E dengan --no-lazybendera tambahan .

Penjelasan:

и              # Repeat the second (implicit) input the first (implicit) input amount of
               # times as list
 'X×          '# Repeat "X" that many times
„+#v           # Loop `y` over the characters ["+","#"]:
    y          #  Push character `y`
     I         #  Push the next input (matte in the first iteration; frame in the second)
      ©        #  And store it in the register (without popping)
       ×       #  Repeat character `y` that input amount of times
        U      #  Pop and store that string in variable `X`
    εX.ø}      #  Surround each string in the list with string `X`
    ®F         #  Inner loop the value from the register amount of times:
      Dнg      #   Get the new width by taking the length of the first string
         y×    #   Repeat character `y` that many times
             #   And surround the list with this leading and trailing string
   ]           # Close both the inner and outer loops
    S         # Convert each inner string to a list of characters
      »        # Join every list of characters by spaces, and then every string by newlines
               # (and output the result implicitly)
Kevin Cruijssen
sumber
2

Jelly , 17 byte

;ŒB“#+X+#”xʋⱮ«Ɱ/G

Cobalah online!

Argumen 1: [Frame width, Matte width]
Argumen 2:[Width, Height]

Erik the Outgolfer
sumber
1

Kanvas , 24 byte

X;«[lx*e⤢}
X×*+⁸#⁸ *J ×O

Coba di sini!

Seharusnya lebih pendek 5 byte, tetapi bukan karena Canvas buggy ..

dzaima
sumber
1

R , 119 byte

function(w,h,m,f)write(Reduce(function(x,y)rbind(y,cbind(y,x,y),y),rep(c("+","#"),c(m,f)),matrix("X",w,h)),1,w+2*f+2*m)

Cobalah online!

Giuseppe
sumber
1

Python 3.8 (pra-rilis) , 116 115 113 byte

lambda a,b,c,d:"\n".join((g:=['#'*(a+2*c+2*d)]*d+[(h:='#'*d)+'+'*(a+c*2)+h]*c)+[h+'+'*c+'X'*a+'+'*c+h]*b+g[::-1])

Cobalah online!

Upaya pertama bermain golf, akan segera ditingkatkan. aadalah lebar, badalah tinggi, cadalah lebar matte, dand lebar bingkai.

-1 byte menggunakan :=operator untuk mendefinisikan hsebagaie * d

-2 byte terima kasih kepada Jo King menyarankan saya untuk menghapus parameter e dan f

PENJELASAN:

lambda a,b,c,d:          Define a lambda which takes in arguments a, b, c, and d (The width of the painting, the height of the painting, the padding of the matte, and the padding of the frame width, respectively).
    "\n".join(                       Turn the list into a string, where each element is separated by newlines
        (g:=                         Define g as (while still evaling the lists)...
            ['#'*(a+2*c+2*d)]*d+       Form the top rows (the ones filled with hashtags)
            [(h:='#'*d)+'+'*(a+c*2)+h]*c Form the middle-top rows (uses := to golf this section)
        )+
        [h+'+'*c+'X'*a+'+'*c+h]*b+       Form the middle row
        g[::-1]                      Uses g to golf the code (forms the entire middle-bottom-to-bottom)
    )
MilkyWay90
sumber
Menghapus etugas menghemat dua byte, ftugas tidak menghemat apa pun
Jo King
@JoKing Oh wow, saya lupa menghapus edan ftugas setelah menemukan jalan gpintas
MilkyWay90
0

Javascript, 158 byte

(w,h,m,f)=>(q="repeat",(z=("#"[q](w+2*(m+f)))+`
`)[q](f))+(x=((e="#"[q](f))+(r="+"[q](m))+(t="+"[q](w))+r+e+`
`)[q](m))+(e+r+"X"[q](w)+r+e+`
`)[q](h)+x+z)

Mungkin bisa dipangkas sedikit

f=

(w,h,m,f)=>(q="repeat",(z=("# "[q](w+2*(m+f))+`
`)[q](f))+(x=((e="# "[q](f))+(r="+ "[q](m))+(t="+ "[q](w))+r+e+`
`)[q](m))+(e+r+"X "[q](w)+r+e+`
`)[q](h)+x+z)

console.log(f(3,2,1,2))

vityavv
sumber
0

Perl 6 , 98 byte

{map(&min,[X] map (($_='#'x$^d~'+'x$^c)~'X'x*~.flip).comb,$^a,$^b).rotor($b+2*($c+$d)).join("\n")}

Cobalah online!

Ini adalah port jawaban Python xnor .

Perl 6 , 115 byte

->\a,\b,\c,\d{$_=['#'xx$!*2+a]xx($!=c+d)*2+b;.[d..^*-d;d..^a+$!+c]='+'xx*;.[$!..^*-$!;$!..^a+$!]='X'xx*;.join("
")}

Cobalah online!

Codeblock yang di-golf dengan kasar menggunakan penugasan daftar multi-dimensi dari Perl 6. Sebagai contoh,@a[1;2] = 'X'; akan menetapkan 'X'elemen dengan indeks 2 dari daftar dengan indeks 1, dan @a[1,2,3;3,4,5]='X'xx 9;akan mengganti semua elemen dengan indeks 3,4,5daftar dengan indeks 1,2,3dengan'X' .

Penjelasan:

Pertama, kami menginisialisasi daftar sebagai a a+2*(c+d) oleh b+2*(c+d)persegi panjang #s.

$_=['#'xx$!*2+a]xx($!=c+d)*2+a;
State:
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #

Kemudian kita menetapkan persegi panjang dalam +s

.[d..^*-d;d..^a+$!+c]='+'xx*;
State:
# # # # # # # # #
# # # # # # # # #
# # + + + + + # #
# # + + + + + # #
# # + + + + + # #
# # + + + + + # #
# # # # # # # # #
# # # # # # # # #

Akhirnya, kotak terdalam Xs.

.[$!..^*-$!;$!..^a+$!]='X'xx*;
# # # # # # # # #
# # # # # # # # #
# # + + + + + # #
# # + X X X + # #
# # + X X X + # #
# # + + + + + # #
# # # # # # # # #
# # # # # # # # #
Jo King
sumber
0

Jelly , 35 31 28 24 byte

Dịx@“#+X+#”
⁽-Fç«þ⁽-ȥç$G

Cobalah online!

Mengambil input dalam bingkai urutan, matte, lebar, tinggi; dipisahkan koma. Menghasilkan gambar ASCII-art dengan bingkai dan matte. Jika urutan input ketat, saya perlu menambahkan lebih banyak byte (sesuai posting asli saya).

Pasangan golf berdasarkan jawaban @ EriktheOutgolfer; Saya menyadari karakter berada dalam urutan ASCII tetapi tidak memikirkan cara terbaik untuk mengambil keuntungan dari itu, dan telah melupakannya G. Jawabannya masih lebih baik!

Nick Kennedy
sumber
Saya tidak pernah memprogram dalam Jelly, tapi pasti 43134.43234 dapat dikompres? EDIT: Saya perlu belajar membaca, Anda menyebutkan bahwa mereka memang dapat dikodekan dalam 4 byte masing-masing. Tapi apa hubungannya input-order dengan apakah angka-angka ini dapat dikodekan atau tidak? : S
Kevin Cruijssen
@KevinCruijssen integer maksimum yang dapat dikodekan menggunakan sintaks dua byte adalah 32250; karena keduanya melebihi itu saya tidak bisa menyimpan byte. Untuk saat ini saya akan berasumsi saya dapat bertukar hal-hal di sekitar dan kembali jika tidak diizinkan!
Nick Kennedy
Ah ok, begitu. 43134akan membutuhkan 3 karakter penyandian, yang termasuk karakter utama / tambahan untuk menunjukkan bahwa itu dikodekan akan menjadi 5 byte juga. Dan apakah Jelly mungkin memiliki duplikat, karena angka kedua adalah 100 lebih besar dari yang pertama? Tidak yakin apakah tindakan mendorong 43134, menggandakan, mendorong 100, plus, pasangan mungkin dan lebih pendek di Jelly?
Kevin Cruijssen
@KevinCruijssen Saya awalnya mencoba menggunakan +0,100 yang tidak menyimpan apa pun. Saya pikir saya bisa menggunakan rantai nilad untuk menggunakan fakta bahwa dalam nilad ³ adalah 100, tetapi jika saya diizinkan untuk menyusun ulang input, basis 250 integer lebih baik
Nick Kennedy
0

Perl 5, 115 byte

$_=(X x$F[0].$/)x$F[1];sub F{s,^|\z,/.*/;$_[0]x"@+".$/,ge,s/^|(?=
)/$_[0]/gm while$_[1]--}F('+',$F[2]);F('#',$F[3])

TIO

Nahuel Fouilleul
sumber
0

PowerShell , 132 byte

param($w,$h,$m,$f)filter l{"$(,'#'*$f+,$_[0]*$m+,$_[1]*$w+,$_[0]*$m+,'#'*$f)"}($a=@('##'|l)*$f)
($b=@('++'|l)*$m)
@('+X'|l)*$h
$b
$a

Cobalah online!

mazzy
sumber