Vẽ các hộp ASCII trong các hộp


23

Vấn đề

đầu vào đã cho a,b,c

nơi a,b,clà các số nguyên thậm chí tích cực

a > b > c

Tạo một hộp của bất kỳ ký tự được phép với kích thước a x a

Căn giữa một hộp của một ký tự được phép khác với các kích thước b x btrong trước đó

Căn giữa một hộp của một ký tự khác được phép khác với các kích thước c x ctrong trước

Các ký tự được phép là các ký tự ASCII nằm trong [a-zA-z0-9!@#$%^&*()+,./<>?:";=_-+]

Đầu vào a=6, b=4, c=2

######
#****#
#*@@*#
#*@@*#
#****#
######

Đầu vào a=8, b=6, c=2

########
#******#
#******#
#**@@**#
#**@@**#
#******#
#******#
########

Đầu vào a=12, b=6, c=2

############
############
############
###******###
###******###
###**@@**###
###**@@**###
###******###
###******###
############
############
############

Quy tắc

  • Mã ngắn nhất sẽ thắng
  • Hãy nhớ rằng bạn có thể chọn char nào sẽ in trong phạm vi đã cho
  • Trailing newlines được chấp nhận
  • Khoảng trống được chấp nhận
  • các hàm có thể trả về chuỗi với dòng mới, mảng chuỗi hoặc in nó

5
Đầu vào sẽ luôn hợp lệ (tức là mỗi số ít hơn 2 ít hơn số trước)? Và các số luôn luôn là (tất cả chẵn) hay (tất cả lẻ) để đảm bảo vẽ đối xứng?
phân tán

Khá giống với Hiển thị vòng cây .
manatwork

1
@Christian 3 dòng đầu tiên xác định các yêu cầu đó, vui lòng cho tôi biết nếu chúng đủ.
LiefdeWen

@StefanDelport Đúng là bạn, tôi đã bỏ lỡ điều đó. Cảm ơn.
phân tán

Câu trả lời:



7

Thạch ,  20  19 byte

-1 byte bằng cách sử dụng nhanh `để tránh một liên kết, như được đề xuất bởi Erik Outgolfer.

H»þ`€Ḣ>ЀHSUṚm€0m0Y

Một chương trình đầy đủ lấy một danh sách [a,b,c]in các hộp bằng cách sử dụng a:2 b:1 c:0
... trên thực tế, như vậy, nó sẽ hoạt động cho tối đa 10 hộp, trong đó hộp trong cùng là 0( ví dụ ).

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

Làm sao?

H»þ`€Ḣ>ЀHSUṚm€0m0Y - Main link: list of boxes, B = [a, b, c]
H                   - halve B = [a/2, b/2, c/2]
    €               - for €ach:
   `                -   repeat left argument as the right argument of the dyadic operation:
  þ                 -     outer product with the dyadic operation:
 »                  -       maximum
                    - ... Note: implicit range building causes this to yield
                    -       [[max(1,1),max(1,2),...,max(1,n)],
                    -        [max(2,1),max(2,2),...,max(2,n)],
                    -        ...
                    -        [max(n,1),max(n,2),...,max(n,n)]]
                    -       for n in [a/2,b/2,c/2]
     Ḣ              - head (we only really want n=a/2 - an enumeration of a quadrant)
         H          - halve B = [a/2, b/2, c/2]
       Ѐ           - map across right with dyadic operation:
      >             -   is greater than?
                    - ...this yields three copies of the lower-right quadrant
                    -    with 0 if the location is within each box and 1 if not
          S         - sum ...yielding one with 0 for the innermost box, 1 for the next, ...
           U        - upend (reverse each) ...making it the lower-left
            Ṛ       - reverse ...making it the upper-right
             m€0    - reflect €ach row (mod-index, m, with right argument 0 reflects)
                m0  - reflect the rows ...now we have the whole thing with integers
                  Y - join with newlines ...making a mixed list of integers and characters
                    - implicit print - the representation of a mixed list is "smashed"

7

Python 2, 107 103 byte

a,b,c=input()
r=range(1-a,a,2)
for y in r:
 s=''
 for x in r:m=max(x,y,-x,-y);s+=`(m>c)+(m>b)`
 print s

Chương trình đầy đủ, in hộp với a=2, b=1.c=0

Câu trả lời hơi tệ hơn, với khả năng hiểu danh sách (104 byte):

a,b,c=input()
r=range(1-a,a,2)
for y in r:print''.join(`(m>c)+(m>b)`for x in r for m in[max(x,y,-x,-y)])

5

C #, 274 232 byte

using System.Linq;(a,b,c)=>{var r=new string[a].Select(l=>new string('#',a)).ToArray();for(int i=0,j,m=(a-b)/2,n=(a-c)/2;i<b;++i)for(j=0;j<b;)r[i+m]=r[i+m].Remove(j+m,1).Insert(j+++m,i+m>=n&i+m<n+c&j+m>n&j+m<=n+c?"@":"*");return r;}

Kinh khủng ngay cả đối với C # vì vậy chắc chắn có thể bị đánh gôn nhưng đầu óc tôi trống rỗng.

Phiên bản đầy đủ / được định dạng:

using System;
using System.Linq;

class P
{
    static void Main()
    {
        Func<int, int, int, string[]> f = (a,b,c) =>
        {
            var r = new string[a].Select(l => new string('#', a)).ToArray();

            for (int i = 0, j, m = (a - b) / 2, n = (a - c) / 2; i < b; ++i)
                for (j = 0; j < b;)
                    r[i + m] = r[i + m].Remove(j + m, 1).Insert(j++ + m,
                        i + m >= n & i + m < n + c &
                        j + m > n & j + m <= n + c ? "@" : "*");

            return r;
        };

        Console.WriteLine(string.Join("\n", f(6,4,2)) + "\n");
        Console.WriteLine(string.Join("\n", f(8,6,2)) + "\n");
        Console.WriteLine(string.Join("\n", f(12,6,2)) + "\n");

        Console.ReadLine();
    }
}

Bạn dường như đã lấy lại được tâm trí của mình, j + m <= n + ccó thể trở thành n + c > j + m
LiefdeWen

Cũng sau đó là i + m >= nđếnn < i + m
LiefdeWen

bạn sử dụng i+m4 lần, vì vậy bạn có thể thêm nó vào một biến trong số của mình forđể lưu một số
LiefdeWen

Không kiểm tra những thứ này đúng cách, nhưng: bạn không bao giờ sử dụng một icách cô lập, chỉ khởi tạo i=mvà so sánh i<b+m; hoặc ... chỉ sử dụng i, init i=0nhưng lặp lại i<a, sau đó thêm r[i]=new string('#',a),bên cạnh j=0và thêm một điều kiện để kiểm tra itrong giới hạn jcủa vòng lặp (điều này phải trả hết, vì bạn mất tất cả Linq).
VisualMelon


3

JavaScript (ES6), 174 170 147 byte

a=>b=>c=>(d=("#"[r="repeat"](a)+`
`)[r](f=a/2-b/2))+(e=((g="#"[r](f))+"*"[r](b)+g+`
`)[r](h=b/2-c/2))+(g+(i="*"[r](h))+"@"[r](c)+i+g+`
`)[r](c)+e+d

Thử nó

fn=
a=>b=>c=>(d=("#"[r="repeat"](a)+`
`)[r](f=a/2-b/2))+(e=((g="#"[r](f))+"*"[r](b)+g+`
`)[r](h=b/2-c/2))+(g+(i="*"[r](h))+"@"[r](c)+i+g+`
`)[r](c)+e+d
oninput=_=>+x.value>+y.value&&+y.value>+z.value&&(o.innerText=fn(+x.value)(+y.value)(+z.value))
o.innerText=fn(x.value=12)(y.value=6)(z.value=2)
label,input{font-family:sans-serif;}
input{margin:0 5px 0 0;width:50px;}
<label for=x>a: </label><input id=x min=6 type=number step=2><label for=y>b: </label><input id=y min=4 type=number step=2><label for=z>c: </label><input id=z min=2 type=number step=2><pre id=o>


Giải trình

a=>b=>c=>            :Anonymous function taking the 3 integers as input via parameters a, b & c
(d=...)              :Assign to variable d...
("#"[r="repeat"](a)  :  # repeated a times, with the repeat method aliased to variable r in the process.
+`\n`)               :  Append a literal newline.
[r](f=a/2-b/2)       :  Repeat the resulting string a/2-b/2 times, assigning the result of that calculation to variable f.
+                    :Append.
(e=...)              :Assign to variable e...
(g=...)              :  Assign to variable g...
"#"[r](f)            :    # repeated f times.
+"*"[r](b)           :  Append * repeated b times.
+g+`\n`)             :  Append g and a literal newline.
[r](h=b/2-c/2)       :  Repeat the resulting string b/2-c/2 times, assigning the result of that calculation to variable h.
+(...)               :Append ...
g+                   :  g
(i=...)              :  Assign to variable i...
"*"[r](h)            :    * repeated h times.
+"@"[r](c)           :  @ repeated c times
+i+g+`\n`)           :  Append i, g and a literal newline.
[r](c)               :...repeated c times.
+e+d                 :Append e and d.


2

V , 70, 44 , 42 byte

Àé#@aÄÀG@b|{r*ÀG@c|{r@òjdòÍ.“.
ç./æ$pYHP

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

Điều này thật gớm ghiếc. Ồ Tốt hơn nhiều. Vẫn không phải là ngắn nhất, nhưng ít nhất là hơi golf.

Đã lưu hai byte nhờ @ nmjmcman101!

Hexdump:

00000000: c0e9 2340 61c4 c047 4062 7c16 7b72 2ac0  ..#@a..G@b|.{r*.
00000010: 4740 637c 167b 7240 f26a 64f2 cd2e 932e  G@c|.{r@.jd.....
00000020: 0ae7 2e2f e624 7059 4850                 .../.$pYHP

Bạn có thể kết hợp hai dòng cuối cùng của mình để tiết kiệm hai byte Hãy thử trực tuyến!
nmjcman101

@ nmjcman101 À, điểm tốt. Cảm ơn!
DJMcMayhem


1

Toán học, 49 byte

Print@@@Fold[#~CenterArray~{#2,#2}+1&,{{}},{##}]&

Đưa đầu vào [c, b, a]. Đầu ra là a=1, b=2, c=3.

Làm sao?

Print@@@Fold[#~CenterArray~{#2,#2}+1&,{{}},{##}]&
                                                &  (* Function *)
        Fold[                        ,{{}},{##}]   (* Begin with an empty 2D array.
                                                      iterate through the input: *)
                                    &              (* Function *)
             #~CenterArray~{#2,#2}                 (* Create a 0-filled array, size
                                                      (input)x(input), with the array
                                                      from the previous iteration
                                                      in the center *)
                                  +1               (* Add one *)
Print@@@                                           (* Print the result *)

@Jenny_mathy Trong câu hỏi: * các hàm có thể trả về chuỗi với dòng mới, mảng chuỗi hoặc in nó. " GridKhông tạo ra Stringnó cũng không Print.
JungHwan Min

0

PHP> = 7.1, 180 byte

Trong trường hợp này tôi ghét rằng các biến bắt đầu bằng một $PHP

for([,$x,$y,$z]=$argv;$i<$x*$x;$p=$r%$x)echo XYZ[($o<($l=$x-$a=($x-$y)/2)&$o>($k=$a-1)&$p>$k&$p<$l)+($o>($m=$k+$b=($y-$z)/2)&$o<($n=$l-$b)&$p>$m&$p<$n)],($o=++$i%$x)?"":"\n".!++$r;

PHP Sandbox trực tuyến


Trong trường hợp này, sơn trước khi in ngắn hơn rất nhiều. : D Hoặc là vì tôi sử dụng $argvnhư một mảng? Bạn đã thử chưa? Bạn đã thử ternaries riêng biệt?
Tít

@Titus Tôi không biết nhưng sự chấp thuận của tôi sửa đầu vào của các số lẻ không hợp lệ
Jörg Hülsermann

0

Toán học, 173 byte

(d=((a=#1)-(b=#2))/2;e=(b-(c=#3))/2;z=1+d;x=a-d;h=Table["*",a,a];h[[z;;x,z;;x]]=h[[z;;x,z;;x]]/.{"*"->"#"};h[[z+e;;x-e,z+e;;x-e]]=h[[z+e;;x-e,z+e;;x-e]]/.{"#"->"@"};Grid@h)&

đầu vào

[12,6,2]


0

Python 2 , 87 byte

a,_,_=t=input();r=~a
exec"r+=2;print sum(10**x/9*10**((a-x)/2)*(r*r<x*x)for x in t);"*a

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

Tính toán một cách hợp lý các số cần in bằng cách thêm các số của biểu mẫu 111100. Có rất nhiều điều xấu xí, có lẽ là cơ hội để cải thiện.


0

Java 8, 265 252 byte

 a->b->c->{int r[][]=new int[a][a],x=0,y,t;for(;x<a;x++)for(y=0;y<a;r[x][y++]=0);for(t=(a-b)/2,x=t;x<b+t;x++)for(y=t;y<b+t;r[x][y++]=1);for(t=(a-c)/2,x=t;x<c+t;x++)for(y=t;y<c+t;r[x][y++]=8);String s="";for(int[]q:r){for(int Q:q)s+=Q;s+="\n";}return s;}

-13 byte bằng cách thay thế các ký tự bằng chữ số.

Chắc chắn có thể được đánh golf bằng cách sử dụng một cách tiếp cận khác.

Giải trình:

Hãy thử nó ở đây.

a->b->c->{                         // Method with three integer parameters and String return-type
  int r[][]=new int[a][a],         //  Create a grid the size of `a` by `a`
      x=0,y,t;                     //  Some temp integers
  for(;x<a;x++)for(y=0;y<a;r[x][y++]=0);
                                   //  Fill the entire grid with zeros
  for(t=(a-b)/2,x=t;               //  Start at position `(a-b)/2` (inclusive)
      x<b+t;x++)                   //  to position `b+((a-b)/2)` (exclusive)
    for(y=t;y<b+t;r[x][y++]=1);    //   And replace the zeros with ones
  for(t=(a-c)/2,x=t;               //  Start at position `(a-c)/2` (inclusive)
      x<c+t;x++)                   //  to position `c+((a-b)/2)` (exclusive)
    for(y=t;y<c+t;r[x][y++]=8);    //   And replace the ones with eights
  String s="";                     //  Create a return-String
  for(int[]q:r){                   //  Loop over the rows
    for(int Q:q)                   //   Inner loop over the columns
      s+=Q;                        //    and append the result-String with the current digit
                                   //   End of columns-loop (implicit / single-line body)
    s+="\n";                       //   End add a new-line after every row
  }                                //  End of rows-loop
  return s;                        //  Return the result-String
}                                  // End of method

0

JavaScript (ES6), 112

Hàm ẩn danh trả về một chuỗi nhiều dòng. Ký tự 0,1,2

(a,b,c)=>eval("for(o='',i=-a;i<a;o+=`\n`,i+=2)for(j=-a;j<a;j+=2)o+=(i>=c|i<-c|j>=c|j<-c)+(i>=b|i<-b|j>=b|j<-b)")

Ít chơi gôn

(a,b,c)=>{
  for(o='',i=-a;i<a;o+=`\n`,i+=2)
    for(j=-a;j<a;j+=2)
      o+=(i>=c|i<-c|j>=c|j<-c)+(i>=b|i<-b|j>=b|j<-b)
  return o
}  

var F=
(a,b,c)=>eval("for(o='',i=-a;i<a;o+=`\n`,i+=2)for(j=-a;j<a;j+=2)o+=(i>=c|i<-c|j>=c|j<-c)+(i>=b|i<-b|j>=b|j<-b)")

function update()
{
  var [a,b,c]=I.value.match(/\d+/g)
  O.textContent=F(a,b,c)
}

update()
  
a,b,c <input id=I value='10 6 2' oninput='update()'>
<pre id=O></pre>


0

PHP> = 5.6, 121 byte

for($r=A;$p?:$p=($z=$argv[++$i])**2;)$r[((--$p/$z|0)+$o=($w=$w?:$z)-$z>>1)*$w+$p%$z+$o]=_BCD[$i];echo chunk_split($r,$w);

Chạy với -nrhoặc kiểm tra nó trực tuyến .

Kết hợp các vòng lặp một lần nữa ... Tôi yêu chúng!

phá vỡ

for($r=A;                           # initialize $r (result) to string
    $p?:$p=($z=$argv[++$i])**2;)    # loop $z through arguments, loop $p from $z**2-1 to 0
    $r[((--$p/$z|0)+$o=
        ($w=$w?:$z)                     # set $w (total width) to first argument
        -$z>>1)*$w+$p%$z+$o]            # calculate position: (y+offset)*$w+x+offset
        =_BCD[$i];                      # paint allowed character (depending on $i)
echo chunk_split($r,$w);            # insert newline every $w characters and print
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.