Membuat Crossed Square

23

Membuat Crossed Square

Anda harus mengambil input bilangan bulat dari satu atau lebih dan menampilkan kotak yang terbuat dari karakter yang dapat dicetak pilihan Anda dengan palang diagonal melalui tengah.

Gagasan umum adalah untuk output menjadi bujur sangkar yang memiliki lintas diagonal melalui itu.

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

Dalam contoh di atas, '* mewakili kotak luar dan' # 'mewakili lintas diagonal.

Perhatikan bahwa contoh di atas menggunakan dua karakter yang berbeda sehingga lebih mudah untuk melihat seperti apa outputnya, program Anda harus menggunakan satu karakter saja.

Memasukkan

Bilangan bulat 1 atau lebih, dijamin aneh.

Keluaran

Kotak yang terdiri dari karakter pilihan Anda dengan tanda silang di tengah.

  • Salib harus diagonal
  • Kuadrat dapat berupa output melalui fungsi atau ditulis ke output
  • Mengejar baris baru tidak apa-apa
  • Dapat ditampilkan sebagai grafik, diagram atau gambar jika Anda mau

Contohnya

Input: 1
Output:
*

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

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

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

Spesifikasi

  • Fungsi atau program lengkap diizinkan
  • Anda bisa mendapatkan input dengan cara pilihan Anda
  • Celah standar tidak diijinkan
  • Program harus bekerja tanpa ada pernyataan tambahan yaitu usingdalam C#, mereka harus dimasukkan dalam entri
  • Anda dapat mengeluarkan dari suatu fungsi atau mencetak hasilnya

Ini kode golf sehingga solusi terpendek menang.

TheLethalCoder
sumber
1
Bisakah kita juga mengindeks output ini dengan 0,1,2,3,...?
flawr
@ flawr Saya tidak 100% yakin apa yang Anda maksud
TheLethalCoder
@TheLethalCoder Dia bertanya apakah dia bisa mengambil input ndan mencetak ukuran persegi 2n+1.
Martin Ender
@ MartinEnder Oh jadi dalam contoh saya input 1 memberi *tetapi baginya itu akan menjadi input 0?
TheLethalCoder
1
@TheLethalCoder Ya, dan input 1akan menghasilkan contoh untuk Anda 3.
Martin Ender

Jawaban:

9

MATL , 20 19 17 byte

2-:XdtP!+~TTYa1YG

Anda dapat mencobanya secara eksperimental di MATL online . Anda mungkin perlu menyegarkan halaman jika tidak berhasil.

Contoh dijalankan:

masukkan deskripsi gambar di sini

Versi ASCII: 19 byte

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

Cobalah online!

Luis Mendo
sumber
Tetapi setidaknya pastikan bahwa garis-garisnya paralel & persegi panjang. : D
flawr
@ flawr Hm? Apa maksudmu?
Luis Mendo
Setidaknya di tengah tampak seolah-olah sisi kotak miring, tetapi itu hanya ilusi. Atau itu? (Mungkin juga ada lubang hitam di belakang layar saya, warping waktu ruang.)
flawr
@ flawr Atau mungkin pergi ke dokter mata :-P
Luis Mendo
Tidak berfungsi di MATL online, versi 19.0.0. Hmmm ...
Erik the Outgolfer
16

VBA Excel, 168 byte

Petunjuk:

Saya menemukan Excel dengan bantuan VBA adalah alat yang efektif dan memadai untuk tantangan ini. Atur lembar kerja Excel seperti berikut ini

masukkan deskripsi gambar di sini

Ya, kami menggunakan piksel kecil berbentuk persegi klasik seperti dulu dengan menggunakan sel dalam lembar kerja sebagai piksel. Ha ha...

Di sini saya menggunakan sel A1 sebagai input dan saya mengubah warna font menjadi merah. Mengapa merah Karena merah adalah tiga huruf sehingga cocok untuk bermain golf. Tulis dan jalankan kode berikut di Jendela Segera:

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

Ungolfed the code:

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

Penjelasan Langkah-demi-Langkah:

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

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

Looping melalui diagonal sel rentang: Cells(i, i).Interior.Color = vbRed

masukkan deskripsi gambar di sini

Langkah dan hasil akhir: Cells(i, N + 1 - i).Interior.Color = vbRed

masukkan deskripsi gambar di sini

Anastasiya-Romanova 秀
sumber
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>

Neil
sumber
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

Gunakan ide Jonathan Allan untuk menghasilkan angka biner seperti:

11111
11011
10101
11011
11111

Baris dibuat dengan bit aritmatika dan ditampilkan dalam biner. Masing-masing bagian itu or'ed ke sisanya. Bagian diproduksi oleh kekuatan 2 n(tetap) dan i(jatuh) melalui

  1. Sisi kiri 1
  2. Sisi kanan n
  3. Diagonal idann/i
  4. Atas dan bawah n-1saat i==1atau i==n.

Sebenarnya, (1) dan (4) dikombinasikan dengan memproduksi 1kapan 1<i<ndan n-1sebaliknya.

Tidak
sumber
7

Python, 114 110 96 90 byte

Benar-benar berubah:

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

Mengembalikan daftar string, karakter menggunakan 1dan 0.
-6 byte berkat TheBikingViking

Uji di ideone


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

Uji di ideone

Jonathan Allan
sumber
Hemat 6 byte dengan mengkonversi ke lambda dan restrukturisasi dan-atau ekspresi: 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 Ah, Anda benar - saya benar-benar harus bermain golf untuk sedikit memutar-mutar (maksud asli saya) sebelum meletakkan ide di luar sana dan tidur: 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 disimpan berkat @LeakyNun ;
1 byte disimpan berkat @ OliverGrégoire dalam jawaban saya untuk Draw a square of # dengan tantangan lebar yang diberikan ;
2 byte disimpan berkat @cliffroot .

Tidak digabungkan & kode uji:

Coba di sini.

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

Keluaran:

*

***
***
***

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

*******
**   **
* * * *
*  *  *
* * * *
**   **
*******
Kevin Cruijssen
sumber
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;}4 byte disimpan
Leaky Nun
@LeakyNun 3 sebenarnya. Anda masih membutuhkan ;bagian dalam untuk loop.
Kevin Cruijssen
1
pertama, saya percaya itu seharusnya i-->0bukan n-->0dan Anda juga dapat menggunakan i*j<1bukan i<1|j<1 untuk 2 byte
cliffroot
@cliffroot Tentu saja Anda harus menemukan sesuatu. Hehe, jk, terima kasih! ;) Saya ingat saya pernah melakukan sesuatu seperti itu sebelumnya dalam jawaban lain, sangat buruk saya lupa melakukannya di sini ..: S
Kevin Cruijssen
6

Matlab, 68 66 64 58 byte

Karena output grafis juga diperbolehkan:

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

Output mana misalnya

masukkan deskripsi gambar di sini

Versi ascii saja adalah:

Ini menggunakan pengindeksan 0,1,2,3,...

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

Atau dengan pengindeksan 1,3,7,...:

n=input('');k=1:n;m=eye(n);m([k,end-k+1])=1;[(m|flip(m'))*42,'']
cacat
sumber
Bagus, tidak hanya output grafis terlihat imo yang lebih baik, itu keren bahwa itu juga lebih pendek dalam hal byte. Biasanya membuat sesuatu yang lebih grafis daripada ASCII biasa hanya akan meningkatkan byte-count (biasanya banyak).
Kevin Cruijssen
6

C #, 112 101 byte

Terima kasih kepada TheLethalCoder untuk mengingatkan saya bahwa hal-hal pernyataan-maupun-ekspresi lambda anonim ini diperbolehkan dalam 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;};

Siapa bilang C # bukan bahasa golf yang menyenangkan?

Scepheo
sumber
Saya tau? 27591 bytes: p
Jonathan Allan
5

Logo, 155 byte

Solusi grafis, diimplementasikan sebagai fungsi

Saya memperlengkapi kembali jawaban saya untuk Alphabet Triangle dan sedikit mengubah sudut. Seperti sebelumnya, rmenggambar garis karakter. Kali ini, bfungsinya menggambar kotak dengan menggambar satu tepi lurus dan satu diagonal, berputar, dan berulang empat kali. Ini menyebabkan diagonal digambar dua kali (di atas satu sama lain), tapi itu kode kurang dari penanganan secara terpisah. Jawaban ini juga menangani angka genap dengan benar. Saya harus menambahkan penanganan khusus untuk masukan1 agar tidak maju.

Saya menerapkannya sebagai fungsi, byang mengambil ukuran sebagai argumen:

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

Cobalah di penerjemah Logo Calormen.com . Untuk memanggilnya, tambahkan baris dan panggil bdalam format berikut:

b 7

Sampel ukuran 7

... atau coba piring sampler, yang menarik empat sampel dalam ukuran 5, 7, 9, dan 11, berputar 90 derajat di antaranya:

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

Contoh berbagai ukuran

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

Perhatikan bahwa lebih efisien untuk mengekspresikan kondisi menggunakan% in% daripada i == 1 | j == 1 | ...

JDL
sumber
Dimungkinkan untuk bermain golf satu karakter jika inputnya dijamin lebih dari satu: 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
94 byte
Giuseppe
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=' '
  • Disimpan 2 byte, terima kasih kepada flawr .
  • Disimpan 4 byte lebih banyak dengan menggunakan daftar pemahaman.
  • 5 byte disimpan menggabungkan peningkatan flawr denganany
  • 4 byte disimpan dengan mengganti anydenganelem

Versi tidak disatukan:

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 = ' '

Saya yakin ini masih bisa diperbaiki, tetapi inilah yang saya buat untuk saat ini.

Versi lama:

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=' '
sudee
sumber
2
Anda menggunakan [1..s]dua kali, saya pikir Anda bisa mendefinisikannya di where.
flawr
Ini akan menghasilkan 102 byte juga, karena kita harus menambahkan ruang ekstra sebelum kata kunci 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
Ah benar, tetapi Anda bisa mengemasnya <$>[1..s]menjadi sebuah fungsi, bukan? Sukac 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
Poin bagus, itu memang berhasil. :)
sudee
1
PS:c s=unlines$f$f.(#)where f=(<$>[1..s]);m#n|or((==)<$>[n,m]<*>[1,s])||n==m||n==s-m+1='*'|1>0=' '
flawr
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":"*":" ");};

Program Tes

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);
Shaun Wild
sumber
+1! Saya akan menentukan bahwa itu Java 8, btw. Juga, Anda bisa sedikit golf dengan menghapus int sebelum jdan menggunakan int i=0,j;sebagai gantinya. Anda juga dapat mengganti semua ||dengan |dan menghapus tanda kurung di cek-ternary. Juga, Anda menggunakan s-1empat kali, jadi saya akan meletakkan ini dalam variabel. Anda juga dapat mengubah ==0ke <1. Jadi secara total menjadi 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 ) Cukup sedikit lebih pendek dari jawaban Java 7 saya , pendekatan yang sangat bagus!
Kevin Cruijssen
1
@KevinCruijssen Saya selalu berakhir dengan jawaban yang lebih pendek, tetapi dengan lebih banyak ruang untuk perbaikan daripada LMAO Anda. Bermain golf dengan baik teman saya.
Shaun Wild
Hehe. xD Jangan ragu untuk menggunakan btw versi 116 byte. Ini kodemu, hanya bermain golf lagi. ;) Jawaban Java 7 saya (yang sayangnya lebih lama) menggunakan pendekatan yang sedikit berbeda. Jika saya mengeditnya menjadi versi 116 byte, pada dasarnya saya mencuri jawaban Anda, yang saya tidak mau.
Kevin Cruijssen
Tidak ada gunanya hanya menyalin dan menempelkan golf Anda, saya biasanya memposting mock up cepat dan kemudian kembali lagi nanti untuk melihat apakah saya melewatkan sesuatu yang bisa golf. Tapi kau MENGHANCURKANNYA UNTUKKU :( haha ​​jk
Shaun Wild
Ah maaf. Sebagian besar tips yang saya berikan sebenarnya ada di Tips untuk bermain golf di Jawa . Saya kira saya hanya 2quick4u. ;)
Kevin Cruijssen
3

C, 140 121 114 byte

19 byte berkat Quentin.

7 byte disimpan dengan beralih dari loop bersarang ganda ke satu loop.

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

Saran bermain golf diterima.

Biarawati Bocor
sumber
Saya tidak pernah memprogram dalam C, tetapi apakah tidak mungkin untuk menempatkan int pada for-loop pertama seperti di Jawa? Ie int i,j;for(i=0;tofor(int i=0,j;
Kevin Cruijssen
1
Terakhir kali saya menggunakan C Anda bahkan tidak bisa memasukkan int i,j;setelah scanf!
Neil
Coba n+~i-jdll.
Neil
GCC baik-baik saja dengan menghapus #includesepenuhnya.
Quentin
@ Neil Apa yang kamu maksud dengan kamu tidak bisa menempatkan itu setelah itu?
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}}

Kikuk, tetapi itu bekerja dengan cukup baik.

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

Saran bermain golf pasti diterima, sudah terlalu lama sejak saya menggunakan PowerShell.

fuandon
sumber
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

Cobalah online!

Biarawati Bocor
sumber
:) terima kasih telah membawa lebih banyak perhatian ke bahasa ini
Rohan Jhunjhunwala
1
@RohanJhunjhunwala Saya menikmati pemrograman di dalamnya, terima kasih telah menciptakan bahasa yang begitu cemerlang.
Leaky Nun
3

GNU sed, 117 114 +1 (r flag) = 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

Karena sed tidak memiliki dukungan asli untuk angka, input diberikan secara unary berdasarkan konsensus ini . Bagian kedua dari kotak adalah bagian pertama yang disimpan dalam urutan terbalik di ruang tunggu.

Menjalankan:

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

Keluaran:

00000
00 00
0 0 0
00 00
00000
seshoumara
sumber
3

Python, 89 byte

Ini adalah kemunduran! Saya menggunakan modul kura-kura python.

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

Inilah hasilnya ketika n = 200:

masukkan deskripsi gambar di sini

ren
sumber
1
+1 untuk kreativitas
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)

Menjalankan:

$ scala cross.scala 10

Secara teknis saya bisa menghapus barang cetakan dan pergi ke sesuatu seperti

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}

Ini akan membuatnya 135 atau 121 byte tergantung pada apakah Anda menghitung hal-hal sintaks fungsi.

Versi yang dapat dibaca:

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
 }
AmazingDreams
sumber
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]

Memodifikasi daftar karakter baris untuk menempatkan tempat *pertama, terakhir, ke-i, dan ke-ke-terakhir. Baris pertama dan terakhir dimulai sebagai semua *, dan sisanya sebagai semua spasi. Berfungsi untuk evens juga. Sebuah lambdaekspresi mungkin lebih pendek dari modifikasi, tapi aku suka metode ini.

Tidak
sumber
2

Mathematica, 81 byte

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

Menciptakan sistem koordinat dengan asal di tengah, dan menghitung kemana *s harus pergi. Output array string, satu per baris.

Greg Martin
sumber
2

Javascript ( 289 270 bytes)

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}

Tidak Disatukan:

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: Disimpan 19 byte berkat Philipp Flenker.

Paul Schmitz
sumber
Karena mengikuti baris baru tidak apa-apa, saya pikir Anda tidak perlu memeriksa untuksize==1
Philipp Flenker
1
@PhilippFlenker Benar.
Paul Schmitz
1

Perl, 83 +1 = 84 byte

Jalankan dengan -nbendera.

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

Baris baru literal menyimpan 1 byte lebih dari \natau $/.

Dapat dibaca:

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

Kode mencetak baris teratas dan menyimpannya $c, lalu mencetak banyak ruang dengan slot yang sesuai digantia s, lalu mencetak baris atas lagi.

Penugasan ke $\variabel memberi tahu juru bahasa untuk mencetak konten (tanda bintang, baris baru, dan tanda bintang lain) setiap kali selesai print, tetapi ini TIDAK terjadi setelah a say.

Gabriel Benamy
sumber
1

SmileBASIC, 46 byte

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

(Tidak, SB TIDAK menggunakan grafik 1-indeks ...)

12Me21
sumber
1

Arang, 8 byte (tidak bersaing; tantangan tanggal akhir bahasa)

GH+↘↑↙N*

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan: Saat digunakan sebagai parameter pada PolygonHollowperintah, +gambarlah sebuah kotak, dan panah kemudian buat diagonal. Ada beberapa karakter cara pintas lain tetapi mereka perlu didefinisikan ulang untuk menjadi berguna misalnya Ysetara dengan ↖↗↓tetapi jika itu setara ↗↓↖maka Y+akan cukup.

Neil
sumber
1

SHELL ( 135 Bytes ):

 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';}

tes:

 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
Ali ISSA
sumber
1

Kotlin , 123 116 byte

ubah jika dengan \ n ke println

{s:Int->val n=s-1
for(r in 0..n){for(c in 0..n)print(if(n-r==c||r==c||r<1||c<1||r==n||c==n)"#"
else " ")
println()}}

Cobalah online!

JohnWells
sumber