Vẽ một số ngôi sao ASCII


15

Viết chương trình hoặc chức năng vẽ một ngôi sao ASCII, với kích thước của các cánh tay làm đầu vào.

Đây là một ngôi sao có kích thước 1

_/\_
\  /
|/\|

Đây là một ngôi sao có kích thước 2

   /\
__/  \__
\      /
 \    /
 | /\ |
 |/  \|

Đây là một ngôi sao có kích thước 3

     /\
    /  \
___/    \___
\          /
 \        /
  \      /
  |  /\  |
  | /  \ |
  |/    \|

Và như thế.

Đầu vào

Một số nguyên dương duy nhất trong bất kỳ định dạng thuận tiện , n > 0.

Đầu ra

Một đại diện nghệ thuật ASCII của một ngôi sao, tuân theo các quy tắc trên. Dòng mới hàng đầu / dấu hoặc khoảng trắng khác là tùy chọn, miễn là các điểm xếp hàng một cách thích hợp.

Quy tắc

  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

6
Đây chỉ là màn hình của tôi, hay các ngôi sao trông cao và gầy một cách bất thường?
caird coinheringaahing

2
ASCII ngu ngốc và sự thiếu thốn nông cạn của nó ...
hoàn toàn là con người

@cairdcoinheringaahing Phông chữ được sử dụng bởi SE không vuông - có khoảng trắng đáng kể giữa các dòng, làm tăng độ méo.
admBorkBork

Câu trả lời:


12

Than , 20 17 byte

-3 byte nhờ Neil.

Nν↙ν↑↑ν↖ν ×_ν↗ν‖M

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng.

Tôi khá hài lòng với môn golf này nên ...

Giải trình

Nν                 take a number as input and store in ν
  ↙ν               print / ν times downwards to the left
    ↑              move up once
     ↑ν            print | ν times upwards
       ↖ν          print \ ν times upwards to the left
                   print a space
          ×_ν      print _ ν times
             ↗ν    print / ν times upwards to the right
               ‖M  reflect horizontally
     /\                           
    /  \    "No, this is Patrick!"
___/    \___                      
\   ☉ ☉    /                      
 \   𝐷    /                       
  \      /                        
  |  /\  |                        
  | /  \ |                        
  |/    \| 

Vẽ nó từ dưới lên trên tiết kiệm 2 byte.
Neil


Đó là bởi vì Polygonđể lại con trỏ trên ký tự cuối cùng, nhưng tôi đã không sử dụng Polygon... thực tế tôi cũng không sử dụng mã tốt nhất, hiện tại tôi đã xuống đến 17 tuổi.
Neil

Tôi không biết nếu tôi có 17 như bạn đã làm nhưng ... Cảm ơn!
hoàn toàn là

Gần đủ rồi. Tôi thực sự đã có Move(:Right); for (n) Print("_");.
Neil

5

SOGL V0.12 , 27 24 byte

╔*¹.╚№┼№.╝+ø┐.∙.1ž.╚┼+╬³

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

Giải trình:

╔*                        push a string with input amount of underscores
  ¹                       wrap that in an array
   .╚                     push a "/" diagonal of the size of the input (the top lines)
     №                    reverse vertically
      ┼                   add horizontally the underscores behind the array
       №                  reverse vertically back
        .╝+               below that add a "\" diagonal (middle lines)
           ø              push an empty string as the base of the vertical bars
            ┐.∙           get an array of "|" with the length of the input
               .1ž        at [input; 1] in the empty string insert that
                  .╚┼     horizontally append a "/" diagonal
                     +    add that below everything else
                      ╬³  palindromize horizontally

4

Python 2 ,  166 160 157 155  152 byte

Cách exectiếp cận chính xác là cùng một số byte.

i=input();t,z=" \\";y=t*2
for k in range(i*3):s=k%i;o=i+~s;p=i+o;g="_ "[i>k+1]*p;print[g+"/"+y*k+z+g,t*s+z+y*p+"/",~-i*t+"|"+o*t+"/"+y*s+z+o*t+"|"][k/i]

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

Lưu được 3 byte nhờ Jonathan Frech .


Bạn có thể lưu một số byte bằng cách thay thế t=" ";y,z=t*2,"\\"bằng t,z=" \\";y=t+t.
Jonathan Frech

@JonathanFrech Cảm ơn bạn.
Ông Xcoder

3

Java 8, 385 376 344 304 285 280 268 264 252 250 + 19 byte

n -> {int s = 2 * n, w = 2 * s, e = n-1, i = 0, o, l [] [] = new int [n * 3] [w]; for (; i <n; l [i] [s + ~ i] = l [n + i] [w + ~ i] = l [o] [s + ~ i] = 47, l [i] [o] = l [o] [ o] = l [n + i] [i] = 92, l [e] [i] = l [e] [w - ++ i] = 95, l [o] [e] = l [o] [ s + n] = 124) o = s + i; for (int [] b: l) System.out.println (Chuỗi mới (b, 0, w) .replace (" ", ""));}

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


Bạn có thể rút ngắn nó xuống 10 byte bằng các thủ thuật bitwise và di chuyển tất cả các khai báo số nguyên bên ngoài các vòng lặp của bạn ( 270 byte )
Ông Xcoder

Và bạn có thể lưu thêm 2 byte nữa bằng cách di chuyển int o=bên ngoài vòng lặp ( 268 byte )
Ông Xcoder

Bạn có thể lưu thêm 4 byte bằng cách loại bỏ các dấu ngoặc lặp và sử dụng ++trực tiếp vào lần xuất hiện cuối cùng i, như thế này: 264 byte .
Kevin Cruijssen


@Nevay Rất thông minh, cảm ơn bạn
Roberto Graham

2

Toán học, 189 byte

n(
  s_±x_±y_:=s->Array[If[x==y,s," "]&,{n,n}];
  StringRiffle[Characters@{"_/\\_","\\  /","|/\\:"}/.
    {"_"±#±n,"|"±#2±n,":"±#2±1,"\\"±#±#2,"/"±(n-#+1)±#2," "±0±1}
    /.":"->"|"//ArrayFlatten,"
",""])

Dòng 2 định nghĩa toán tử trợ giúp ±, được sử dụng để đánh giá dòng 4 thành:

{"_"  -> Array[If[#1 == n,          "_", " "] &, {n, n}], 
 "|"  -> Array[If[#2 == n,          "|", " "] &, {n, n}], 
 ":"  -> Array[If[#2 == 1,          ":", " "] &, {n, n}], 
 "\\" -> Array[If[#1 == #2,         "\\"," "] &, {n, n}], 
 "/"  -> Array[If[1 + n - #1 == #2, "/", " "] &, {n, n}], 
 " "  -> Array[If[0 == 1,           " ", " "] &, {n, n}]}

Trong dòng 3, ReplaceAll( /.) lấy một ma trận đại diện cho ngôi sao có kích thước 1 cũng như danh sách các quy tắc ở trên. Đối với các bước cuối cùng, chúng tôi sử dụng ArrayFlatten, ngắn hơn SubstitutionSystem, và StringRiffle.


2

Java 7, 295 byte

Giải pháp là phương pháp f.

String s(String s,int n){while(n-->0)s=" "+s;return s;}String f(int x){String n="\n",s="/",b="\\",o="",u="_";int i=0;for(x--;i<x;u+="_")o+=s(s,2*x-i+1)+s(b,2*i++)+n;o+=u+s+s(b,2*i)+u+n;while(i>=0)o+=s(b,x-i)+s(s,4*x-2*(x+~i--))+n;while(i++<x)o+=s("|",x)+s(s,x-i)+s(b,2*i)+s("|",x-i)+n;return o;}

Dùng thử trực tuyến (JDK 8)

Ung dung

String s(String s, int n) {
    while (n-- > 0)
        s = " " + s;
    return s;
}

String f(int x) {
    String
        n = "\n",
        s = "/",
        b = "\\",
        o = "",
        u = "_"
    ;
    int i = 0;
    for (x--; i < x; u += "_")
        o += s(s, 2*x - i + 1) + s(b, 2 * i++) + n;
    o += u + s + s(b, 2 * i) + u + n;
    while (i >= 0)
        o += s(b, x - i) + s(s, 4*x - 2*(x + ~i--)) + n;
    while (i++ < x)
        o += s("|", x) + s(s, x - i) + s(b, 2 * i) + s("|", x - i) + n;
    return o;
}

Sự nhìn nhận

  • -1 byte nhờ Kevin Cruijssen


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.