Sơ đồ hình ảnh đầu ra của hình ảnh


22

Viết chương trình nhập kích thước của bức tranh, chiều rộng mờ và chiều rộng khung cho bức chân dung được đóng khung. Chương trình sẽ xuất ra một sơ đồ bằng cách sử dụng biểu tượng Xcho bức tranh, +cho lớp phủ và #cho khung. Các biểu tượng phải được phân tách không gian. Khoảng trắng lưu trữ là ổn, miễn là đầu ra trực quan phù hợp với tiêu chí. Các đầu vào có thể được 0.

INPUT: 3 2 1 2 (Chiều rộng, Chiều cao, Chiều rộng mờ, Chiều rộng khung hình)

ĐẦU RA:

3 và 2 đầu tiên là chiều rộng và chiều cao sơn.  1 là chiều rộng mờ xung quanh nó.  2 là chiều rộng khung xung quanh toàn bộ.

Ở dạng văn bản:

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

Mã chiến thắng hoàn thành các điều kiện trong các byte ít nhất có thể.


2
Thử thách tốt đẹp! Đối với những thách thức trong tương lai, bạn có thể muốn sử dụng The Sandbox
MilkyWay90

2
Bạn có phiền nếu đầu vào theo một thứ tự khác không?
vityavv

1
Chúng ta có thể trả về một danh sách các chuỗi không?
MilkyWay90

5
Bất kỳ đầu vào có thể bằng không?
Laikoni

1
Chúng ta có thể có một khoảng trống ở cuối mỗi dòng không?
Luis Mendo

Câu trả lời:


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)

Hãy thử trực tuyến!

In một lưới ngăn cách không gian, theo đúng thông số kỹ thuật. Tôi thích thú *=được sử dụng để chuyển đổi abtừ số sang chuỗi.

Python 3 có thể lưu một số byte bằng cách tránh ' '.join, có thể nhiều hơn bằng cách sử dụng chuỗi f và biểu thức gán. Cảm ơn Jo King cho -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]

Hãy thử trực tuyến!


Tôi đã hết hồn! Công việc của NIce, có vẻ như được chơi golf
MilkyWay90

Chơi golf tốt Rất thông minh.
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)

Hãy thử trực tuyến!

Đã bình luận

(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

3

MATL , 24 byte

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

Đầu vào là: Chiều cao, Chiều rộng, Chiều rộng mờ, Chiều rộng khung.

Hãy thử trực tuyến!

Giải trình

&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


2

Than , 48 47 44 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Lưu ý: Không gian lưu trữ. Chỉnh sửa: Bây giờ sử dụng thuật toán của @ xnor. Giải trình:

≔×NXθ≔×NXη

Nhập chiều rộng và chiều cao và chuyển đổi chúng thành chuỗi Xs.

FE+#×Nι

Lặp lại các ký tự +#chuyển đổi chúng thành các chuỗi có độ dài được đưa ra bởi hai đầu vào còn lại. Sau đó lặp qua hai chuỗi đó.

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

Tiền tố và hậu tố bức tranh với các chuỗi cho thảm và khung.

Eη⪫⭆θ⌊⟦ιλ⟧ 

Lặp lại các chuỗi, lấy tối thiểu các ký tự ngang và dọc, sau đó nhân đôi các hàng, in ngầm mỗi hàng trên một dòng riêng.


2

05AB1E (di sản) / 05AB1E --no-lazy , 32 31 byte

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

Đưa đầu vào theo thứ tự height, width, matte, frame. Nếu thứ tự đầu vào được chỉ định trong thử thách là nghiêm ngặt (vẫn đang chờ OP xác minh), một hàng đầu s(trao đổi) có thể được thêm cho byte 1.

Yêu cầu --no-lazycờ trình biên dịch Elixir trong phiên bản mới của 05AB1E, vì Elixir có một số hành vi kỳ lạ do đánh giá lười biếng đối với các bản đồ / vòng lặp lồng nhau ( ở đây là kết quả không có cờ này ).

Dùng thử trực tuyến trong phiên bản kế thừa của 05AB1E.
Dùng thử trực tuyến trong phiên bản mới của 05AB1E có thêm --no-lazycờ.

Giải trình:

и              # 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)




1

Python 3.8 (tiền phát hành) , 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])

Hãy thử trực tuyến!

Nỗ lực đầu tiên tại golf, sẽ được cải thiện sớm. alà chiều rộng, bchiều cao, cchiều rộng mờ và dchiều rộng khung.

-1 byte sử dụng :=toán tử để định nghĩa he * d

-2 byte nhờ Jo King gợi ý tôi loại bỏ các tham số e và f

GIẢI TRÌNH:

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

Xóa ebài tập giúp bạn tiết kiệm hai byte, fbài tập không tiết kiệm cho bạn bất cứ điều gì
Jo King

@JoKing Oh wow, tôi đã quên xóa evà các fbài tập sau khi khám phá ra glối tắt
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)

Có lẽ có thể được cắt giảm một chút

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


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

Hãy thử trực tuyến!

Đây là một cổng của câu trả lời Python của 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("
")}

Hãy thử trực tuyến!

Codeblock ẩn danh được đánh golf thô sơ sử dụng phân công danh sách đa chiều của Perl 6. Ví dụ: @a[1;2] = 'X';sẽ gán 'X'cho phần tử có chỉ mục 2 từ danh sách bằng chỉ mục 1 và @a[1,2,3;3,4,5]='X'xx 9;sẽ thay thế tất cả các phần tử bằng chỉ mục 3,4,5của danh sách bằng chỉ mục1,2,3 bằng 'X'.

Giải trình:

Đầu tiên, chúng ta khởi tạo danh sách như một a+2*(c+d)bằng b+2*(c+d)hình chữ nhật của #s.

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

Sau đó, chúng ta gán hình chữ nhật bên trong của +s

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

Cuối cùng, hình chữ nhật trong cùng của Xs.

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

0

Thạch , 35 31 28 24 byte

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

Hãy thử trực tuyến!

Lấy đầu vào trong khung thứ tự, mờ, chiều rộng, chiều cao; dấu phẩy tách ra. Xuất ra hình ảnh nghệ thuật ASCII với khung và mờ. Nếu thứ tự đầu vào nghiêm ngặt, tôi cần thêm nhiều byte hơn (theo bài viết gốc của tôi).

Cặp golf dựa trên câu trả lời của @ EriktheOutgolfer; Tôi nhận ra các nhân vật theo thứ tự ASCII nhưng không nghĩ cách tận dụng điều đó tốt nhất và đã quên mất G. Vẫn là một câu trả lời tốt hơn!


Tôi không bao giờ lập trình trong Jelly, nhưng chắc chắn có thể nén được 43034,43234? EDIT: Tôi cần học cách đọc, bạn đề cập đến chúng thực sự có thể được mã hóa thành 4 byte mỗi cái. Nhưng những gì có thứ tự đầu vào để làm với liệu những con số này có thể được mã hóa hay không? : S
Kevin Cruijssen

@KevinCruijssen số nguyên tối đa có thể được mã hóa bằng cú pháp hai byte là 32250; vì cả hai vượt quá mà tôi không thể lưu các byte. Bây giờ tôi sẽ cho rằng tôi có thể trao đổi mọi thứ xung quanh và hoàn nguyên nếu không được phép!
Nick Kennedy

À, tôi hiểu rồi. 43134sẽ cần 3 ký tự mã hóa, bao gồm ký tự đầu / cuối để chỉ ra mã được mã hóa cũng sẽ là 5 byte. Và Jelly có lẽ có một bản sao nào đó không, vì số thứ hai lớn hơn số thứ nhất 100? Không chắc chắn nếu các hành động đẩy 43134, nhân đôi, đẩy 100, cộng, cặp có thể và ngắn hơn trong Jelly không?
Kevin Cruijssen

@KevinCruijssen Ban đầu tôi đã thử sử dụng +0,100 mà không lưu bất kỳ. Tôi nghĩ rằng tôi có thể sử dụng chuỗi nilad để sử dụng thực tế là trong nilad ³ là 100, nhưng nếu tôi được phép sắp xếp lại đầu vào thì số nguyên 250 cơ bản sẽ tốt hơn
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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.