Création d'un carré croisé

23

Création d'un carré croisé

Vous devez saisir un entier d'un ou plusieurs et sortir un carré composé de n'importe quel caractère imprimable de votre choix avec une croix diagonale au centre.

L'idée générale est que la sortie soit un carré creux traversé par une diagonale:

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

Dans l'exemple ci-dessus, les «*» représentent la boîte extérieure et les «#» représentent la croix diagonale.

Notez que l'exemple ci-dessus utilise deux caractères différents afin qu'il soit plus facile de voir à quoi ressemble la sortie, votre programme ne doit utiliser qu'un seul caractère.

Contribution

Un entier de 1 ou plus, il est garanti d'être impair.

Sortie

Un carré composé d'un personnage de votre choix avec une croix au milieu.

  • La croix doit être diagonale
  • Le carré peut être sorti via la fonction ou écrit dans la sortie
  • Les nouvelles lignes de fin sont correctes
  • Peut sortir sous forme de graphique, diagramme ou image si vous le souhaitez aussi

Exemples

Input: 1
Output:
*

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

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

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

Spécifications

  • Les fonctions ou programmes complets sont autorisés
  • Vous pouvez obtenir des commentaires par vos moyens préférés
  • Les failles standard sont interdites
  • Les programmes doivent fonctionner sans déclaration supplémentaire, c.-à- usingd.C# , ils doivent être inclus dans l'entrée
  • Vous pouvez sortir d'une fonction ou imprimer le résultat

C'est le golf de code, donc la solution la plus courte l'emporte.

TheLethalCoder
la source
1
Pourrions-nous également indexer ces sorties avec 0,1,2,3,...?
flawr
@flawr Je ne suis pas sûr à 100% de ce que vous voulez dire
TheLethalCoder
@TheLethalCoder Il demande s'il peut prendre des données net imprimer un carré de taille 2n+1.
Martin Ender
@MartinEnder Oh donc dans mes exemples l'entrée 1 donne *mais pour lui ce sera l'entrée 0?
TheLethalCoder
1
@TheLethalCoder Oui, et l'entrée 1donnerait votre exemple 3.
Martin Ender

Réponses:

9

MATL , 20 19 17 octets

2-:XdtP!+~TTYa1YG

Vous pouvez l'essayer expérimentalement dans MATL en ligne . Vous devrez peut-être actualiser la page si cela ne fonctionne pas.

Exemple d'exécution:

enter image description here

Version ASCII: 19 octets

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

Essayez-le en ligne!

Luis Mendo
la source
Mais assurez-vous au moins que les lignes sont parallèles et rectangulaires. : D
flawr
@flawr Hm? Que voulez-vous dire?
Luis Mendo
Au moins au milieu, on dirait que les côtés des carrés sont inclinés, mais ce ne sont que des illusions. Ou est-ce? (Peut-être aussi un trou noir derrière mon écran, déformant l'espace-temps.)
flawr
@flawr Ou peut-être aller chez l'ophtalmologiste :-P
Luis Mendo
Ne fonctionne pas sur MATL en ligne, version 19.0.0. Hmmm ...
Erik the Outgolfer
16

VBA Excel, 168 octets

Instruction:

Je trouve qu'Excel avec l'aide de VBA est un outil efficace et suffisant pour relever ce défi. Définissez la feuille de calcul d'Excel comme suit

enter image description here

Oui, nous utilisons les petits pixels classiques comme les anciens temps en utilisant les cellules d'une feuille de calcul comme pixels. Ha-ha ...

Ici, j'utilise la cellule A1 comme entrée et je change sa couleur de police en rouge. Pourquoi rouge? Parce que le rouge est une couleur à trois lettres, il convient donc au golf. Écrivez et exécutez le code suivant dans la fenêtre Exécution:

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

Déverrouillé le 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

Explication étape par étape:

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

enter image description here

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

enter image description here

Boucle à travers la diagonale des cellules de la plage: Cells(i, i).Interior.Color = vbRed

enter image description here

Étape finale et sortie: Cells(i, N + 1 - i).Interior.Color = vbRed

enter image description here

Anastasiya-Romanova 秀
la source
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 octets

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
la source
7

Python 2, 65 octets

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

Utilise l'idée de Jonathan Allan de produire des nombres binaires comme:

11111
11011
10101
11011
11111

Les lignes sont créées avec un bit arithmétique et affichées en binaire. Chaque partie est passée dans le reste. Les pièces sont produites par des puissances de 2 n(fixes) eti (descendant) via

  1. Côté gauche 1
  2. Côté droit n
  3. Diagonales i etn/i
  4. Haut et bas n-1quand i==1oui==n .

En fait, (1) et (4) sont combinés en produisant 1quand 1<i<net n-1autrement.

xnor
la source
7

Python, 114 110 96 90 octets

Totalement changé:

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

Renvoie une liste de chaînes, de caractères à l'aide de 1et 0.
-6 octets grâce à TheBikingViking

Testez-le chez ideone


Précédent 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)

Testez-le sur ideone

Jonathan Allan
la source
Enregistrer 6 octets en convertissant à un lambda et la restructuration de l'expression et-ou: 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 du
@TheBikingViking Ah, vous avez raison - j'aurais vraiment dû jouer un peu au twiddling (mon intention initiale) avant de mettre l'idée en avant et de dormir: p.
Jonathan Allan
7

Java 7, 131 130 128 125 124 122 122 octets

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 octets enregistrés grâce à @LeakyNun ;
1 octet enregistré grâce à @ OliverGrégoire dans ma réponse pour le défi Dessiner un carré creux de # avec une largeur donnée ;
2 octets économisés grâce à @cliffroot .

Code non testé et testé:

Essayez-le ici.

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

Sortie:

*

***
***
***

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

*******
**   **
* * * *
*  *  *
* * * *
**   **
*******
Kevin Cruijssen
la source
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 octets enregistrés
Leaky Nun
@LeakyNun 3 en fait. Vous auriez toujours besoin de l' ;arrière de la boucle intérieure.
Kevin Cruijssen
1
tout d'abord, je pense que cela devrait être i-->0plutôt que n-->0et vous pouvez également utiliser i*j<1au lieu de i<1|j<1 pour 2 octets
cliffroot
@cliffroot Bien sûr, il fallait trouver quelque chose. Hehe, jk, merci! ;) Je me souviens que j'ai fait quelque chose comme ça avant dans une autre réponse, donc assez mauvais j'ai oublié de le faire ici ..: S
Kevin Cruijssen
6

Matlab, 68 66 64 58 octets

Étant donné que la sortie graphique est également autorisée:

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

Quelles sorties par exemple

enter image description here

Les seules versions ascii seraient:

Ceci utilise l'indexation 0,1,2,3,...

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

Alternativement avec l'indexation 1,3,7,...:

n=input('');k=1:n;m=eye(n);m([k,end-k+1])=1;[(m|flip(m'))*42,'']
flawr
la source
Bien, non seulement la sortie graphique est meilleure, mais c'est aussi plus court en termes d'octets. Habituellement, faire quelque chose de plus graphique au lieu de ASCII ordinaire ne ferait qu'augmenter le nombre d'octets (généralement de beaucoup).
Kevin Cruijssen
6

C #, 112 101 octets

Merci à TheLethalCoder de m'avoir rappelé que ces choses anonymes de déclaration ou d'expression lambda sont autorisées en 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;};

Qui a dit que C # n'était pas un langage de golf amusant?

Scepheo
la source
N'est-ce pas? 27591 octets: p
Jonathan Allan
5

Logo, 155 octets

Solution graphique, implémentée en fonction

J'ai réorganisé ma réponse pour Alphabet Triangle et changé un peu les angles. Comme précédemment, rtrace une ligne de caractères. Cette fois, la bfonction dessine une boîte en dessinant un bord droit et une diagonale, en tournant et en répétant quatre fois. Cela provoque le dessin des diagonales deux fois (les unes sur les autres), mais c'était moins de code que de les manipuler séparément. Cette réponse gère également correctement les nombres pairs. J'ai dû ajouter un traitement spécial pour une entrée de1 pour l'empêcher d'avancer.

Je l'ai implémenté en tant que fonction, bqui prend la taille en argument:

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

Essayez-le sur l'interpréteur de logo de Calormen.com . Pour l'appeler, ajoutez une ligne et appelez bau format suivant:

b 7

Sample of size 7

... ou essayez le plateau d'échantillonnage, qui attire quatre échantillons de tailles 5, 7, 9 et 11, tournant de 90 degrés entre les deux:

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

Sample of multiple sizes

GuitarPicker
la source
4

R, 102 octets

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

Notez qu'il est plus efficace d'exprimer la condition en utilisant% en% que i == 1 | j == 1 | ...

JDL
la source
Il est possible de jouer au golf avec un personnage si l'entrée est garantie à plusieurs: 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 octets
Giuseppe
4

Haskell, 102 100 96 91 87 octets

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=' '
  • Enregistré 2 octets, grâce à flawr .
  • Enregistré 4 octets de plus en utilisant des compréhensions de liste.
  • 5 octets économisés combinant l'amélioration de flawr avecany
  • 4 octets enregistrés en remplaçant anyparelem

Version non golfée:

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

Je suis sûr que cela peut encore être amélioré, mais c'est ce que j'ai trouvé pour l'instant.

Ancienne version:

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
la source
2
Vous utilisez [1..s]deux fois, je pense que vous pouvez définir cela dans where.
flawr
Il en résulterait également 102 octets, car il faudrait ajouter un espace supplémentaire avant le mot-clé 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 oui, mais vous pouvez intégrer <$>[1..s]une fonction, non? Commec 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
Bon point, cela fonctionne vraiment. :)
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 octets

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":"*":" ");};

Programme de test

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
la source
+1! Je précise que c'est Java 8, btw. En outre, vous pouvez jouer un peu au golf en supprimant l' int avant jet l'utiliser à la int i=0,j;place. Vous pouvez également tout remplacer ||par |et supprimer les parenthèses dans le test ternaire. En outre, vous utilisez s-1quatre fois, donc je mettrais cela dans une variable. Vous pouvez également changer le ==0en <1. Donc au total ça devient 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 octets ) Un peu plus court que ma réponse Java 7 , donc belle approche!
Kevin Cruijssen
1
@KevinCruijssen Je me retrouve toujours avec une réponse plus courte, mais avec plus de marge d'amélioration que vous LMAO. Bien joué mon ami.
Shaun Wild
Hehe. xD N'hésitez pas à utiliser la version 116 octets btw. C'est votre code, venez de jouer au golf un peu plus. ;) Ma réponse Java 7 (qui est malheureusement plus longue) utilise une approche légèrement différente. Si je voulais le modifier dans la version de 116 octets, je volerais essentiellement votre réponse, ce que je ne veux pas.
Kevin Cruijssen
Inutile de simplement copier et coller vos golfs, je poste normalement une maquette rapide puis j'y reviens plus tard pour voir si j'ai raté quelque chose qui pouvait être joué au golf. Mais vous l'avez RUINÉ POUR MOI :( haha ​​jk
Shaun Wild
Ah désolé. La plupart des conseils que j'ai donnés sont en fait présents dans les Conseils pour jouer au golf à Java . Je suppose que je suis juste 2quick4u. ;)
Kevin Cruijssen
3

C, 140 121 114 octets

19 octets grâce à Quentin.

7 octets enregistrés en passant d'une boucle double imbriquée à une boucle.

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

Suggestions de golf bienvenues.

Leaky Nun
la source
Je ne programme jamais en C, mais n'est-il pas possible de placer l'int dans la première boucle for comme en Java? -À- dire int i,j;for(i=0;àfor(int i=0,j;
Kevin Cruijssen
1
The last time I used C you couldn't even put the int i,j; after the scanf!
Neil
Try n+~i-j etc.
Neil
GCC is fine with removing the #include completely.
Quentin
@Neil What do you mean by you couldn't put that after that?
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, but it works well enough.

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

Golfing suggestions definitely welcome, it's been too long since I've PowerShell'd.

fuandon
la source
3

S.I.L.O.S, 212 bytes

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

Try it online!

Leaky Nun
la source
:) thanks for bringing more attention to this language
Rohan Jhunjhunwala
1
@RohanJhunjhunwala I enjoyed programming in it, thank you for creating such a brilliant language.
Leaky Nun
3

GNU sed, 117 114 + 1(r flag) = 115 bytes

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

Since sed has no native support for numbers, the input is given in unary based on this consensus. The second half of the square is the first half that was stored in reverse order in hold space.

Run:

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

Output:

00000
00 00
0 0 0
00 00
00000
seshoumara
la source
3

Python, 89 bytes

This was a throwback! I used python's turtle module.

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

Here's the result when n=200:

enter image description here

ren
la source
1
+1 for creativity
mbx
2

Scala, 141 137 bytes

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)

Run:

$ scala cross.scala 10

Technically I could remove the print stuff and go to something like

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}

This would make it 135 or 121 bytes depending on whether you count the function syntax stuff.

Readable version:

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
la source
2

Python 2, 83 bytes

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

Modifies a list of the row's characters to put a * into the first, last, i'th, and i'th-to-last place. The first and last row start as all *, and the rest as all spaces. Works for evens too. A lambda expression is probably shorter than modification, but I like this method.

xnor
la source
2

Mathematica, 81 bytes

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

Creates a coordinate system with the origin in the center, and computes where the *s should go. Outputs an array of strings, one per row.

Greg Martin
la source
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}

Ungolfed:

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: Saved 19 bytes thanks to Philipp Flenker.

Paul Schmitz
la source
Since trailing newlines are okay, I think you don't need the check for size==1
Philipp Flenker
1
@PhilippFlenker Correct.
Paul Schmitz
1

Perl, 83 +1 = 84 bytes

Run with the -n flag.

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

The literal newline saves 1 byte over \n or $/.

Readable:

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

The code prints the top line and saves it in $c, then prints a bunch of spaces with the appropriate slots replaced with as, then prints the top line again.

The assignment to the $\ variable tells the interpreter to print the contents (an asterisk, a newline, and another asterisk) after every print, but this does NOT occur after a say.

Gabriel Benamy
la source
1

SmileBASIC, 46 bytes

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

(No, SB does NOT use 1-indexed graphics...)

12Me21
la source
1

Charcoal, 8 bytes (noncompeting; language postdates challenge)

GH+↘↑↙N*

Try it online! Link is to verbose version of code. Explanation: When used as a parameter to the PolygonHollow command, + draws a box, and the arrows then create the diagonals. There are some other shortcut characters but they would need to be redefined to be useful e.g. Y is equivalent to ↖↗↓ but if it was eqivalent to ↗↓↖ then Y+ would suffice.

Neil
la source
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';}

tests:

 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
la source
1

Kotlin, 123 116 bytes

change if with \n to 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()}}

Try it online!

JohnWells
la source