Tạo một hình vuông


23

Tạo một hình vuông

Bạn phải lấy đầu vào của một số nguyên của một hoặc nhiều và xuất ra một hình vuông được làm bằng bất kỳ ký tự có thể in nào bạn chọn với một đường chéo chéo qua tâm.

Ý tưởng chung là cho đầu ra là một hình vuông rỗng có đường chéo chéo qua nó.:

Input: 7
Output:
*******
*#   #*
* # # *
*  #  *
* # # *
*#   #*
*******

Trong ví dụ trên, '*' đại diện cho hộp bên ngoài và '#' s đại diện cho đường chéo chéo.

Lưu ý rằng ví dụ trên sử dụng hai ký tự khác nhau để dễ nhìn thấy đầu ra trông như thế nào, chương trình của bạn chỉ nên sử dụng một ký tự.

Đầu vào

Một số nguyên từ 1 trở lên, nó được đảm bảo là số lẻ.

Đầu ra

Một hình vuông được tạo thành từ một nhân vật bạn chọn với một chữ thập ở giữa.

  • Thánh giá phải là đường chéo
  • Hình vuông có thể là đầu ra thông qua chức năng hoặc được ghi vào đầu ra
  • Trailing newlines là được
  • Có thể xuất ra dưới dạng đồ họa, sơ đồ hoặc hình ảnh nếu bạn cũng muốn

Ví dụ

Input: 1
Output:
*

Input: 3
Output:
***
***
***

Input: 5
Output:
*****
** **
* * *
** **
*****

Input: 7
Output:
*******
**   **
* * * *
*  *  *
* * * *
**   **
*******

Thông số kỹ thuật

  • Chức năng hoặc chương trình đầy đủ được cho phép
  • Bạn có thể nhận đầu vào bằng phương tiện ưa thích của bạn
  • Các sơ hở tiêu chuẩn không được phép
  • Các chương trình phải hoạt động mà không có bất kỳ tuyên bố bổ sung nào, ví dụ như usingtrong C#, chúng phải được đưa vào mục
  • Bạn có thể xuất ra từ một chức năng hoặc in kết quả

Đây là mã golf nên giải pháp ngắn nhất sẽ thắng.


1
Chúng ta cũng có thể lập chỉ mục những đầu ra này với 0,1,2,3,...?
flawr

@flawr Tôi không chắc chắn 100% ý của bạn là gì
TheLethalCoder

@TheLethalCoder Anh ấy hỏi liệu anh ấy có thể lấy đầu vào nvà in một hình vuông có kích thước không 2n+1.
Martin Ender

@MartinEnder Oh vậy trong ví dụ của tôi, đầu vào 1 đưa ra *nhưng đối với anh ta, nó sẽ là đầu vào 0?
TheLethalCoder

1
@TheLethalCoder Có, và đầu vào 1sẽ mang lại ví dụ của bạn cho 3.
Martin Ender

Câu trả lời:


9

MATL , 20 19 17 byte

2-:XdtP!+~TTYa1YG

Bạn có thể thử nó trong MATL trực tuyến . Bạn có thể cần làm mới trang nếu nó không hoạt động.

Chạy mẫu:

nhập mô tả hình ảnh ở đây

Phiên bản ASCII: 19 byte

2-:XdtP!+~TTYa~42*c

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


Nhưng ít nhất hãy chắc chắn rằng các đường thẳng song song & hình chữ nhật. : D
flawr

@flawr Hửm? Ý anh là gì?
Luis Mendo

Ít nhất ở giữa trông như thể các cạnh của hình vuông bị nghiêng, nhưng đó chỉ là ảo ảnh. Hoặc là nó? (Cũng có thể là một lỗ đen phía sau màn hình của tôi, làm cong thời gian không gian.)
flawr

@flawr Hoặc có thể đến bác sĩ mắt :-P
Luis Mendo

Không hoạt động trên MATL trực tuyến, phiên bản 19.0.0. Ừm ...
Erik the Outgolfer

16

VBA Excel, 168 byte

Chỉ dẫn:

Tôi thấy Excel với sự trợ giúp của VBA là một công cụ hiệu quả và đủ cho thử thách này. Đặt bảng tính của Excel như sau

nhập mô tả hình ảnh ở đây

Có, chúng tôi sử dụng các pixel hình vuông nhỏ, cổ điển như thời xưa bằng cách sử dụng các ô trong trang tính làm pixel. Ha-ha ...

Ở đây tôi sử dụng ô A1 làm đầu vào và tôi thay đổi màu phông chữ của nó thành màu đỏ. Tại sao màu đỏ? Bởi vì màu đỏ là ba chữ cái nên nó phù hợp để chơi gôn. Viết và chạy mã sau trong Cửa sổ ngay lập tức:

N=[A1]:Range("A1",Cells(N,N)).Interior.Color=vbRed:Range("B2",Cells(N-1,N-1)).Clear:For i=1To N:Cells(i,i).Interior.Color=vbRed:Cells(i,N+1-i).Interior.Color=vbRed:Next

Mã hóa:

Sub A()
    N = [A1]
    Range("A1", Cells(N, N)).Interior.Color = vbRed
    Range("B2", Cells(N - 1, N - 1)).Clear

    For i = 1 To N
        Cells(i, i).Interior.Color = vbRed
        Cells(i, N + 1 - i).Interior.Color = vbRed
    Next
End Sub

Giải thích từng bước:

N = [A1]: Range("A1", Cells(N, N)).Interior.Color = vbRed

nhập mô tả hình ảnh ở đây

Range("B2", Cells(N - 1, N - 1)).Clear

nhập mô tả hình ảnh ở đây

Vòng qua đường chéo của các ô phạm vi: Cells(i, i).Interior.Color = vbRed

nhập mô tả hình ảnh ở đây

Bước cuối cùng và đầu ra: Cells(i, N + 1 - i).Interior.Color = vbRed

nhập mô tả hình ảnh ở đây


Cells.RowHeight=48:set r=[A1]:r.Resize(r,r).Interior.Color=0:[B2].Resize(r-2,r-2).Clear:For i=1To[A1]:set r=Union(r,Cells(i,i),Cells(i,r-i+1)):Next:r.Interior.Color=0
Taylor Scott

8

JavaScript (ES6), 96 byte

f=
n=>[...Array(n--)].map((_,i,a)=>a.map((_,j)=>i&&j&&n-i&&n-j&&i-j&&n-i-j?' ':'*').join``).join`
`
;
<input type=number min=1 step=2 oninput=  o.textContent=f(this.value)><pre id=o>


7

Python 2, 65 byte

i=n=2**input()/2
while i:print bin((n>i>1or~-n)|n|i|n/i)[2:];i/=2

Sử dụng ý tưởng của Jonathan Allan về việc xuất các số nhị phân như:

11111
11011
10101
11011
11111

Các hàng được tạo với số học bit và được hiển thị dưới dạng nhị phân. Mỗi phần nó được đưa vào phần còn lại. Phần được sản xuất bởi quyền hạn 2 n(cố định) và i(rơi) thông qua

  1. Bên trái 1
  2. Bên phải n
  3. Đường chéo in/i
  4. Trên cùng và dưới cùng n-1khi i==1hoặc i==n.

Trên thực tế, (1) và (4) được kết hợp bằng cách sản xuất 1khi 1<i<nvà mặt n-1khác.


7

Con trăn, 114 110 96 90 byte

Hoàn toàn thay đổi:

lambda n:[bin(sum(2**p for p in[range(n),{0,n-1,r,n-1-r}][0<r<n-1]))[2:]for r in range(n)]

Trả về một danh sách các chuỗi, ký tự sử dụng 10.
-6 byte nhờ TheBikingViking

Kiểm tra nó tại ideone


Python trước 2 @ 110

def f(n):g=range(n);n-=1;print'\n'.join(''.join((c in(r,n-r,0,n)or r in(0,n))and'#'or' 'for c in g)for r in g)

Kiểm tra nó trên ideone


Lưu 6 byte bằng cách chuyển đổi sang lambda và cấu trúc lại biểu thức và hoặc : lambda n:[bin(sum(2**p for p in[range(n),{0,n-1,r,n-1-r}][0<r<n-1]))[2:]for r in range(n)].
TheBikingViking

@TheBikingViking À, bạn nói đúng - Tôi thực sự nên chơi golf để vặn vẹo một chút (ý định ban đầu của tôi) trước khi đưa ý tưởng ra đó và ngủ: p.
Jonathan Allan

7

Java 7, 131 130 128 125 124 122 byte

String c(int n){String r="";for(int i=n,j;n-->0;r+="\n")for(j=0;j<n;r+=i*j<1|n-i<2|n-j<2|i==j|i==n-++j?"*":" ");return r;}

3 byte được lưu nhờ @LeakyNun ;
Lưu 1 byte nhờ @ OliverGrégoire trong câu trả lời của tôi cho Vẽ hình vuông rỗng # với thách thức chiều rộng đã cho ;
Lưu 2 byte nhờ @cliffroot .

Mã thử nghiệm & mã hóa:

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

class M{
  static String c(int n){
    String r = "";
    for(int i = n, j; n-- > 0; r += "\n"){
      for(j = 0; j < n;
            r += i < 1      // Responsible for the first horizontal line
               | j < 1      // Responsible for the first vertical line
               | n-i < 2    // Responsible for the last horizontal line
               | n-j < 2    // Responsible for the last vertical line
               | i == j     // Responsible for the top-left to bottom-right diagonal line
               | i == n-++j // Responsible for the top-right to bottom-left diagonal line (and increasing j)
             ? "*"
             : " ");
    }
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(1));
    System.out.println(c(3));
    System.out.println(c(5));
    System.out.println(c(7));
  }
}

Đầu ra:

*

***
***
***

*****
** **
* * *
** **
*****

*******
**   **
* * * *
*  *  *
* * * *
**   **
*******

1
String c(int n){String r="";for(int i=-1,j;++i<n;r+="\n")for(j=0;j<n;r+=i<1|j<1|n-i<2|n-j<2|i==j|i==n-++j?"*":" ")return r;}Đã lưu 4 byte
Leaky Nun

@LeakyNun 3 thực sự. Bạn vẫn sẽ cần ;phía sau vòng lặp for bên trong.
Kevin Cruijssen

1
đầu tiên, tôi tin rằng nó nên i-->0thay vì n-->0và bạn cũng có thể sử dụng i*j<1thay vì i<1|j<1 2 byte
cliffroot

@cliffroot Tất nhiên bạn phải tìm một cái gì đó. Hehe, jk, cảm ơn! ;) Tôi nhớ tôi đã thực hiện một cái gì đó như thế trước đây trong câu trả lời khác, do đó khá xấu tôi quên để làm điều đó ở đây ..: S
Kevin Cruijssen

6

Matlab, 68 66 64 58 byte

Vì đầu ra đồ họa cũng được cho phép:

k=input('');[x,y]=ndgrid(abs(-k:k));spy(~(max(x,y)<k&x-y))

Đầu ra nào

nhập mô tả hình ảnh ở đây

Các phiên bản duy nhất của ascii sẽ là:

Đây là sử dụng lập chỉ mục 0,1,2,3,...

k=input('');[x,y]=ndgrid(abs(-k:k));[(max(x,y)==k|~(x-y))*42,'']

Ngoài ra với việc lập chỉ mục 1,3,7,...:

n=input('');k=1:n;m=eye(n);m([k,end-k+1])=1;[(m|flip(m'))*42,'']

Thật tuyệt, không chỉ đầu ra đồ họa trông đẹp hơn imo, thật tuyệt khi nó còn ngắn hơn về mặt byte. Thông thường làm cho một cái gì đó đồ họa nhiều hơn thay vì ASCII đơn giản sẽ chỉ làm tăng số lượng byte (thường là rất nhiều).
Kevin Cruijssen

6

C #, 112 101 byte

Cảm ơn TheLethalCoder đã nhắc nhở tôi rằng những điều không phải là biểu thức và biểu thức lambda ẩn danh này được cho phép trong C #.

n=>{var r="";for(int y=n--,x;y-->0;r+="*\n")for(x=0;x<n;r+=y%n*x<1|y==x|y==n-x++?"*":" ");return r;};

Ai nói C # không phải là một ngôn ngữ chơi golf vui vẻ?


Tôi biết, phải không? 27591 byte: p
Jonathan Allan

5

Logo, 155 byte

Giải pháp đồ họa, được thực hiện như một chức năng

Tôi đã kiểm tra lại câu trả lời của mình cho Bảng chữ cái Tam giác và thay đổi các góc xung quanh một chút. Như trước, rvẽ một dòng các nhân vật. Lần này, bhàm vẽ một hộp bằng cách vẽ một cạnh thẳng và một đường chéo, xoay và lặp lại bốn lần. Điều này làm cho các đường chéo được vẽ hai lần (chồng lên nhau), nhưng nó ít mã hơn so với việc xử lý nó một cách riêng biệt. Câu trả lời này cũng xử lý đúng số chẵn. Tôi đã phải thêm xử lý đặc biệt cho một đầu vào của1 để ngăn chặn nó đi về phía trước.

Tôi đã triển khai nó như là một hàm, blấy kích thước làm đối số:

pu
to r:n:b:l repeat:n[rt:b label "A lt:b if repcount>1[fd:l]] end
to b:s
repeat 4[rt 90
r:s 90-heading 20 rt 135
r:s 90-heading 20*sqrt 2 rt 45]
end

Dùng thử trên trình thông dịch Logo của Calormen.com . Để gọi nó, nối một dòng và gọi btheo định dạng sau:

b 7

Mẫu cỡ 7

... hoặc thử đĩa lấy mẫu, trong đó rút ra bốn mẫu ở các kích cỡ 5, 7, 9 và 11, xoay 90 độ ở giữa:

repeat 4[
  b repcount*2+3
  rt 90
]

Mẫu nhiều kích cỡ


4

R, 102 byte

    n=scan();for(i in 1:n){for(j in 1:n){z=" ";if(i%in%c(1,n,n-j+1)|j%in%c(1,i,n))z="*";cat(z)};cat("\n")}

Lưu ý rằng sẽ hiệu quả hơn khi biểu thị điều kiện bằng cách sử dụng% in% so với i == 1 | j == 1 | ...


Có thể đánh gôn đi một ký tự nếu đầu vào được đảm bảo nhiều hơn một: n=scan();for(i in n:1){for(j in n:2){z=" ";if(i%in%c(1,n,n-j+1)|j%in%c(i,n))z="*";cat(z)};cat("*\n")}
JDL


4

Haskell, 102 100 96 91 87 byte

c s=unlines.f$f.(#)where f=(<$>[1..s]);x#y|elem y[1,s,x]||elem x[1,s,s-y+1]='*'|1>0=' '
  • Đã lưu 2 byte, nhờ flawr .
  • Đã lưu thêm 4 byte bằng cách sử dụng danh sách hiểu.
  • 5 byte được lưu kết hợp cải tiến của flawr vớiany
  • 4 byte được lưu bằng cách thay thế anybằngelem

Phiên bản bị đánh cắp:

cross :: Int -> String
cross s = unlines $ map line [1..s]
    where line y = map (pos y) [1..s]
          pos y x | x == y = '*'
                  | x == s - y + 1 = '*'
                  | y `elem` [1, s] = '*'
                  | x `elem` [1, s] = '*'
                  | otherwise = ' '

Tôi chắc chắn rằng điều này vẫn có thể được cải thiện, nhưng đây là những gì tôi nghĩ ra bây giờ.

Phiên bản cũ:

c s=unlines.f$f.(#)where f=(<$>[1..s]);x#y|any(==y)[1,s,x]||any(==x)[1,s,s-y+1]='*'|1>0=' '

2
Bạn đang sử dụng [1..s]hai lần, tôi nghĩ bạn có thể xác định điều đó trong where.
flawr

Nó cũng sẽ dẫn đến 102 byte, vì chúng ta phải thêm một khoảng trắng trước từ khóa where. c s=unlines$(\m->(m#)<$>z)<$>z where z=[1..s];m#n|or((==)<$>[n,m]<*>[1,s])||n==m||n==s-m+1='*'|1>0=' '
sudee

1
À đúng rồi, nhưng bạn có thể đóng gói <$>[1..s]thành một chức năng, phải không? Thíchc s=unlines$f(\m->f(m#))where m#n|or((==)<$>[n,m]<*>[1,s])||n==m||n==s-m+1='*'|1>0=' ';f=(<$>[1..s])
flawr

Điểm tốt, điều đó thực sự làm việc. :)
sudee

1
Tái c s=unlines$f$f.(#)where f=(<$>[1..s]);m#n|or((==)<$>[n,m]<*>[1,s])||n==m||n==s-m+1='*'|1>0=' '
bút

3

Java, 130 byte

s->{for(int i=0;i<s;i++)for(int j=0;j<s;j++)System.out.print((s-1-i==j||i==j||i==0||j==0||i==s-1||j==s-1)?j==s-1?"*\n":"*":" ");};

Chương trình kiểm tra

Consumer<Integer> consumer = s -> {
        for (int i = 0; i < s; i++) {
            for (int j = 0; j < s; j++) {
                System.out.print((s - 1 - i == j || i == j || i == 0 || j == 0 || i == s - 1 || j == s - 1) ? j == s - 1 ? "*\n" : "*" : " ");
            }
        }
    };

    consumer.accept(20);

+1! Tôi sẽ xác định rằng đó là Java 8, btw. Ngoài ra, bạn có thể chơi golf một chút bằng cách loại bỏ int trước đó jvà sử dụng int i=0,j;thay thế. Bạn cũng có thể thay thế tất cả ||bằng |và loại bỏ dấu ngoặc trong kiểm tra ternary. Ngoài ra, bạn sử dụng s-1bốn lần, vì vậy tôi sẽ đặt điều này trong một biến. Ngoài ra, bạn có thể thay đổi ==0thành <1. Vì vậy, tổng cộng nó trở thành s->{for(int i=0,j,x=s-1;i<s;i++)for(j=0;j<s;j++)System.out.print(x-i==j|i==j|i<1|j<1|i==x|j==x?j==x?"*\n":"*":" ");}( 116 byte ) Khá ngắn hơn một chút so với câu trả lời Java 7 của tôi , vì vậy cách tiếp cận rất hay!
Kevin Cruijssen

1
@KevinCruijssen Tôi luôn luôn có một câu trả lời ngắn hơn, nhưng có nhiều chỗ để cải thiện hơn bạn LMAO. Cũng đánh golf bạn của tôi.
Shaun Wild

Hehe. xD Hãy sử dụng phiên bản btw 116 byte. Đó là mã của bạn, chỉ cần chơi golf thêm một số. ;) Câu trả lời Java 7 của tôi (không may dài hơn) sử dụng một cách tiếp cận hơi khác. Nếu tôi chỉnh sửa nó thành phiên bản 116 byte, về cơ bản tôi sẽ đánh cắp câu trả lời của bạn, điều mà tôi không muốn.
Kevin Cruijssen

Không có điểm nào chỉ là sao chép và dán các gôn của bạn, tôi thường đăng một bản nháp nhanh lên và sau đó quay lại để xem nếu tôi bỏ lỡ bất cứ thứ gì có thể được đánh gôn. Nhưng bạn đã làm hỏng nó cho tôi :( haha ​​jk
Shaun Wild

Ồ xin lỗi. Hầu hết những lời khuyên tôi đưa ra thực sự có mặt trong Mẹo chơi golf trong Java . Tôi đoán tôi chỉ là 2quick4u. ;)
Kevin Cruijssen

3

C, 140 121 114 byte

19 byte nhờ Quentin.

7 byte được lưu bằng cách chuyển từ một vòng lặp lồng nhau sang một vòng lặp.

main(a){scanf("%d",&a);for(int i=0;i<a*a;i++,i%a||puts(""))putchar(i/a&&i/a^a-1&&i%a&&-~i%a&&i%-~a&&i%~-a?32:42);}

Gợi ý chơi golf chào mừng.


Tôi không bao giờ lập trình trong C, nhưng không thể đặt int trong vòng lặp for đầu tiên như trong Java? Tức int i,j;for(i=0;for(int i=0,j;
Kevin Cruijssen

1
Lần cuối cùng tôi sử dụng C, bạn thậm chí không thể đặt int i,j;sau scanf!
Neil

Hãy thử, n+~i-jv.v.
Neil

GCC là tốt với việc loại bỏ #includehoàn toàn.
Quentin

@Neil Ý bạn là gì khi bạn không thể đặt nó sau đó?
Leaky Nun

3

PowerShell (133)

filter s($x){1..$x|%{$o="";$r=$_;1..$x|%{if($_-eq1-or$r-eq1-or$_-eq$x-or$r-eq$x-or$r-eq$_-or$r-1-eq$x-$_){$o+="*"}else{$o+="_"}};$o}}

Clunky, nhưng nó hoạt động đủ tốt.

s(11)
***********
**_______**
*_*_____*_*
*__*___*__*
*___*_*___*
*____*____*
*___*_*___*
*__*___*__*
*_*_____*_*
**_______**
***********

Đề xuất chơi gôn chắc chắn được chào đón, đã quá lâu kể từ khi tôi có PowerShell.


3

Silos , 212 byte

readIO 
a = i
lbla
a - 1
t = a
t + 1
t % i
t * a
b = i
lblb
b - 1
u = b
u + 1
u % i
u * b
u * t
v = a
v - b
u * v
v = a
v + b
v + 1
v % i
u * v
u |
if u c
print #
GOTO d
lblc
print .
lbld
if b b
printLine 
if a a

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


:) cảm ơn vì đã chú ý hơn đến ngôn ngữ này
Rohan Jhunjhunwala

1
@RohanJhunjhunwala Tôi rất thích lập trình trong đó, cảm ơn bạn đã tạo ra một ngôn ngữ tuyệt vời như vậy.
Nữ tu bị rò rỉ

3

GNU sed, 117 114 + 1 (cờ r) = 115 byte

p;/^0$/Q;/^000$/{p;q}
h;s/./ /3g;s/  $/00/
:f;/ 00 /!{G;h;s/\n.*//p;t;:}
s/^(0 *)0  ?( *)0/\1 0\20 /
tf;s/00/0/p;g

Vì sed không có hỗ trợ riêng cho các số, nên đầu vào được đưa ra một cách đơn nhất dựa trên điều này sự đồng thuận . Nửa sau của hình vuông là nửa đầu được lưu theo thứ tự ngược lại trong không gian giữ.

Chạy:

sed -rf crossed_square.sed <<< "00000"

Đầu ra:

00000
00 00
0 0 0
00 00
00000

3

Python, 89 byte

Đây là một sự trở lại! Tôi đã sử dụng mô-đun rùa của trăn.

from turtle import*
n=input()
for i in[(n,n),(n,0),(0,n),(0,0),(n,0),(0,n),(n,n)]:goto(i)

Đây là kết quả khi n = 200:

nhập mô tả hình ảnh ở đây


1
+1 cho sự sáng tạo
mbx

2

Scala, 141 137 byte

val s=args(0).toInt-1;val t=0 to s;print(t.map{x=>t.map{y=>if(x==0||x==s||y==0||y==s||x==y||x==s-y)"*" else " "}.mkString+"\n"}.mkString)

Chạy:

$ scala cross.scala 10

Về mặt kỹ thuật tôi có thể loại bỏ các công cụ in và đi đến một cái gì đó như

def c(n:Int)={val (s,t)=(n-1,0 to n-1);t.map{x=>t.map{y=>if(x==0||x==s||y==0||y==s||x==y||x==s-y)"*" else " "}.mkString+"\n"}.mkString}

Điều này sẽ làm cho nó 135 hoặc 121 byte tùy thuộc vào việc bạn đếm các công cụ cú pháp hàm.

Phiên bản dễ đọc:

def cross(n: Int) = {
   // Declares both s and t as variables with tuple expansion
   // s is the zero-based size and t is a range from 0 to s
   val (s,t) = (n-1, 0 to n-1)

   // Maps all rows by mapping the columns to a star or a space
   t.map { x =>
      t.map { y =>
        if (x == 0 || x == s || y == 0 || y == s || x == y || x == s-y) "*" 
        else " "
      }.mkString+"\n" // Concatenate the stars and spaces and add a newline
   }.mkString         // Concatenate the created strings
 }


2

Python 2, 83 byte

i=n=input()
while i:l=['* '[1<i<n]]*n;i-=1;l[0]=l[~0]=l[i]=l[~i]='*';print`l`[2::5]

Sửa đổi danh sách các ký tự của hàng để đặt *vào vị trí đầu tiên, cuối cùng, thứ i và thứ cuối cùng. Hàng đầu tiên và cuối cùng bắt đầu như tất cả *, và phần còn lại là tất cả các không gian. Làm việc cho evens quá. Một lambdabiểu thức có thể ngắn hơn sửa đổi, nhưng tôi thích phương pháp này.



2

Toán học, 81 byte

""<>#&/@Table[If[i^2==j^2||i^2==#^2||j^2==#^2,"*"," "],{i,-#,#},{j,-#,#}]&[(#-1)/2]&

Tạo một hệ tọa độ có gốc tọa độ ở trung tâm và tính toán vị trí *của s. Xuất ra một chuỗi các chuỗi, mỗi chuỗi một hàng.


2

Javascript ( 289 270 byte)

function s(a){b=[];for(i=0;i<a;i++)if(b.push([]),0==i||i==a-1)for(j=0;j<a;j++)b[i].push("*");else for(j=0;j<a;j++)0==j||j==a-1?b[i].push("*"):j==i||a-1-j==i?b[i].push("*"):b[i].push(" ");c="";for(i=0;i<b.length;i++){for(j=0;j<b[i].length;j++)c+=b[i][j];c+="\n"}return c}

Ung dung:

function square(size){
str=[];

for(i=0;i<size;i++){
    str.push([]);
    if(i==0||i==size-1){
        for(j=0;j<size;j++){
            str[i].push("*");
        }
    }else{
        for(j=0;j<size;j++){
            if(j==0||j==size-1){
                str[i].push("*");
            }else if(j==i||size-1-j==i){
                str[i].push("*");
            }else{
                str[i].push(" ");
            }
        }
    }
}

out="";
for(i=0;i<str.length;i++){
    for(j=0;j<str[i].length;j++){
        out+=str[i][j];
    }
    out+="\n";
}
return out;
}

EDIT: Đã lưu 19 byte nhờ Philipp Flenker.


Vì các dòng mới đều ổn, tôi nghĩ bạn không cần kiểm trasize==1
Philipp Flenker

1
@PhilippFlenker Đúng.
Paul Schmitz

1

Perl, 83 +1 = 84 byte

Chạy với -ncờ.

$\="*
*";print$c="*"x($_+1);for$b(1..$_){@a=($")x$_;@a[$b-1,-$b]=(a,a);print@a}say$c

Dòng mới bằng chữ tiết kiệm hơn 1 byte \nhoặc $/.

Có thể đọc được

$\="*\n*";
print$c="*"x($_+1);
for$b(1..$_){
    @a=($")x$_;
    @a[$b-1,-$b]=(a,a);
    print@a
}
say$c

Mã in dòng trên cùng và lưu nó vào $c, sau đó in một loạt các khoảng trắng với các vị trí thích hợp được thay thế bằnga s, sau đó in lại dòng trên cùng.

Việc gán cho $\biến cho trình thông dịch in nội dung (dấu hoa thị, dòng mới và dấu hoa thị khác) sau mỗi lần print, nhưng điều này KHÔNG xảy ra sau a say.


1

SmileBASIC, 46 byte

INPUT I
GBOX I,I,1,1GLINE 1,I,I,1GLINE 1,1,I,I

(Không, SB KHÔNG sử dụng đồ họa 1 chỉ mục ...)


1

Than, 8 byte (không biên dịch; thách thức postdates ngôn ngữ)

GH+↘↑↙N*

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải thích: Khi được sử dụng làm tham số cho PolygonHollowlệnh, hãy +vẽ một hộp và các mũi tên sau đó tạo các đường chéo. Có một số ký tự phím tắt khác nhưng chúng sẽ cần được xác định lại để trở nên hữu ích, ví dụ như Ytương đương với ↖↗↓nhưng nếu nó là hiệu quả ↗↓↖thì Y+sẽ đủ.


1

SHELL ( 135 byte ):

 C(){ j=$(($1-1));for i in $(seq 0 $j);do dc<<<2o10i`echo $((1|2**$i|2**($j-$i)|2**$j|(($i==0||$i==$j))*(2**$j-1)))`p;done|tr 01 ' X';}

kiểm tra:

 C 1
 X

 C 3
 XXX
 XXX
 XXX

 C 5
 XXXXX
 XX XX
 X X X
 XX XX
 XXXXX

 C 7
 XXXXXXX
 XX   XX
 X X X X
 X  X  X
 X X X X
 XX   XX
 XXXXXXX

 C 9
 XXXXXXXXX
 XX     XX
 X X   X X
 X  X X  X
 X   X   X
 X  X X  X
 X X   X X
 XX     XX
 XXXXXXXXX

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.