Ein gekreuztes Quadrat erstellen

23

Ein gekreuztes Quadrat erstellen

Sie müssen eine ganze Zahl oder mehrere eingeben und ein Quadrat aus einem beliebigen druckbaren Zeichen Ihrer Wahl mit einem diagonalen Kreuz durch die Mitte ausgeben.

Die allgemeine Idee ist, dass die Ausgabe ein hohles Quadrat ist, durch das ein diagonales Kreuz verläuft:

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

Im obigen Beispiel repräsentieren die '*' den äußeren Rahmen und die '#' das diagonale Kreuz.

Beachten Sie, dass im obigen Beispiel zwei verschiedene Zeichen verwendet werden, damit Sie besser sehen können, wie die Ausgabe aussieht. Ihr Programm sollte nur ein Zeichen verwenden.

Eingang

Eine ganze Zahl von 1 oder mehr ist garantiert ungerade.

Ausgabe

Ein Quadrat, das sich aus einem Charakter Ihrer Wahl mit einem Kreuz durch die Mitte zusammensetzt.

  • Das Kreuz muss diagonal sein
  • Das Quadrat kann über die Funktion ausgegeben oder in die Ausgabe geschrieben werden
  • Nachgestellte Zeilenumbrüche sind in Ordnung
  • Kann auf Wunsch auch als Grafik, Diagramm oder Bild ausgegeben werden

Beispiele

Input: 1
Output:
*

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

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

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

Technische Daten

  • Funktionen oder Vollprogramme sind erlaubt
  • Sie können Eingaben auf Ihre bevorzugte Weise erhalten
  • Standardlücken sind nicht zulässig
  • Programme müssen ohne zusätzliche Anweisungen funktionieren, dh usings in C#, sie müssen im Eintrag enthalten sein
  • Sie können eine Funktion ausgeben oder das Ergebnis ausdrucken

Dies ist Codegolf, also gewinnt die kürzeste Lösung.

TheLethalCoder
quelle
1
Können wir diese Ausgaben auch mit indexieren 0,1,2,3,...?
Fehler
@flawr Ich bin nicht 100% sicher, was du meinst
TheLethalCoder
@TheLethalCoder Er fragt, ob er Eingaben machen nund ein Quadrat drucken kann 2n+1.
Martin Ender
@MartinEnder Oh, also in meinen Beispielen gibt *es Eingang 1, aber für ihn wird es Eingang 0 sein?
TheLethalCoder
1
@TheLethalCoder Ja, und die Eingabe 1würde Ihr Beispiel für ergeben 3.
Martin Ender

Antworten:

9

MATL , 20 - 19 - 17 Bytes

2-:XdtP!+~TTYa1YG

Sie können es in MATL online experimentell ausprobieren . Möglicherweise müssen Sie die Seite aktualisieren, wenn dies nicht funktioniert.

Probelauf:

Bildbeschreibung hier eingeben

ASCII-Version: 19 Byte

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

Probieren Sie es online!

Luis Mendo
quelle
Aber stellen Sie zumindest sicher, dass die Linien parallel und rechteckig sind. : D
flawr
@flawr Hm? Was meinst du?
Luis Mendo
Zumindest in der Mitte sieht es so aus, als wären die Seiten der Quadrate abgeschrägt, aber es ist nur eine Illusion. Oder ist es? (Könnte auch ein schwarzes Loch hinter meinem Bildschirm sein und die Raumzeit
verzerren
@flawr Oder vielleicht zum Augenarzt gehen :-P
Luis Mendo
Funktioniert nicht über MATL Online, Version 19.0.0. Hmmm ...
Erik der Outgolfer
16

VBA Excel, 168 Bytes

Anweisung:

Ich finde, Excel mit Hilfe von VBA ist ein effektives und ausreichendes Werkzeug für diese Herausforderung. Stellen Sie das Arbeitsblatt von Excel wie folgt ein

Bildbeschreibung hier eingeben

Ja, wir verwenden die kleinen, klassischen quadratischen Pixel wie in früheren Zeiten, indem wir die Zellen in einem Arbeitsblatt als Pixel verwenden. Haha...

Hier verwende ich die Zelle A1 als Eingabe und ändere ihre Schriftfarbe in Rot. Warum rot? Da Rot aus drei Buchstaben besteht, eignet es sich auch zum Golfen. Schreiben Sie den folgenden Code und führen Sie ihn im Direktfenster aus:

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 den 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

Schritt für Schritt Erklärung:

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

Bildbeschreibung hier eingeben

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

Bildbeschreibung hier eingeben

Durch die Diagonale der Entfernungszellen gehen: Cells(i, i).Interior.Color = vbRed

Bildbeschreibung hier eingeben

Letzter Schritt und Ausgabe: Cells(i, N + 1 - i).Interior.Color = vbRed

Bildbeschreibung hier eingeben

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

Python 2, 65 Bytes

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

Verwendet Jonathan Allans Idee, Binärzahlen wie folgt auszugeben:

11111
11011
10101
11011
11111

Die Zeilen werden mit Bitarithmetik erstellt und binär dargestellt. Jeder Teil ging in den Rest ein. Die Teile werden durch Potenzen von 2 n(fest) und i(fallend) über erzeugt

  1. Linke Seite 1
  2. Rechte Seite n
  3. Diagonalen iundn/i
  4. Oben und unten bis n-1wann i==1oder i==n.

Tatsächlich werden (1) und (4) kombiniert, indem 1wann 1<i<nund auf n-1andere Weise produziert wird.

xnor
quelle
7

Python, 114 110 96 90 Bytes

Total verändert:

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

Gibt eine Liste von Zeichenfolgen, Zeichen mit 1und zurück 0.
-6 Bytes dank TheBikingViking

Teste es bei ideone


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

Teste es auf ideone

Jonathan Allan
quelle
Speicher von 6 Bytes zu einem Lambda - Umwandlung und zur Restrukturierung des UND-ODER - Ausdrucks: 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, Sie haben Recht - ich hätte wirklich spielen sollen, um ein bisschen herumzudrehen (meine ursprüngliche Absicht), bevor ich die Idee hier rausbringe und schlafe: p.
Jonathan Allan
7

Java 7, 131 130 128 125 124 122 Bytes

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 Bytes gespart dank @LeakyNun ;
1 Byte gespart dank @ OliverGrégoire in meiner Antwort für das Zeichnen eines hohlen Quadrats von # mit gegebener Breite Herausforderung;
2 Bytes gespart dank @cliffroot .

Ungolfed & Testcode:

Probieren Sie es hier aus.

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

Ausgabe:

*

***
***
***

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

*******
**   **
* * * *
*  *  *
* * * *
**   **
*******
Kevin Cruijssen
quelle
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 Bytes gespeichert
Undichte Nonne
@LeakyNun 3 eigentlich. Du würdest immer noch das ;hinter der inneren for-Schleife brauchen .
Kevin Cruijssen
1
Erstens glaube ich, es sollte i-->0eher sein als n-->0und Sie können auch i*j<1anstelle von i<1|j<1 2 Bytes verwenden
Cliffroot
@cliffroot Natürlich Sie hatte etwas zu finden. Hehe, jk, danke! ;) Ich erinnere mich, dass ich so etwas schon in einer anderen Antwort gemacht habe, so ziemlich, dass ich vergessen habe, es hier zu tun ..: S
Kevin Cruijssen
6

Matlab, 68 66 64 58 Bytes

Da die grafische Ausgabe auch erlaubt ist:

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

Welche Ausgänge z

Bildbeschreibung hier eingeben

Die ASCII-Versionen wären:

Dies nutzt die Indizierung 0,1,2,3,...

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

Alternativ mit der Indizierung 1,3,7,... :

n=input('');k=1:n;m=eye(n);m([k,end-k+1])=1;[(m|flip(m'))*42,'']
Fehler
quelle
Schön, dass die grafische Ausgabe nicht nur besser aussieht, es ist auch cool, dass sie auch in Bezug auf Bytes kürzer ist. Normalerweise würde eine grafischere Darstellung anstelle von einfachem ASCII-Code nur die Anzahl der Bytes erhöhen (normalerweise um ein Vielfaches).
Kevin Cruijssen
6

C #, 112 101 Bytes

Vielen Dank an TheLethalCoder, der mich daran erinnert hat, dass diese anonymen Lambda-Anweisungs- und -Normal-Ausdrücke in C # zulässig sind.

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

Wer hat gesagt, dass C # keine unterhaltsame Golfsprache ist?

Scepheo
quelle
Ich weiß es schon gut? 27591 Bytes: p
Jonathan Allan
5

Logo, 155 Bytes

Grafische Lösung, als Funktion implementiert

Ich habe meine Antwort für Alphabet Triangle umgerüstet und die Winkel ein wenig geändert. Zeichnet nach wie vor reine Zeichenreihe. Diesmal zeichnet die bFunktion eine Box, indem sie eine gerade Kante und eine Diagonale zeichnet, sich dreht und viermal wiederholt. Dies führt dazu, dass die Diagonalen zweimal (übereinander) gezeichnet werden, aber es war weniger Code als das separate Behandeln. Diese Antwort behandelt auch gerade Zahlen richtig. Ich musste eine spezielle Behandlung für eine Eingabe von hinzufügen1 , um zu verhindern, dass es vorwärts geht.

Ich habe es als eine Funktion implementiert, bdie die Größe als Argument nimmt:

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

Probieren Sie es mit dem Logo-Interpreter von Calormen.com aus . Um es aufzurufen, hängen Sie eine Zeile an und rufen Sie bim folgenden Format auf:

b 7

Probe von Größe 7

... oder probieren Sie den Sampler-Plattenteller, der vier Proben in den Größen 5, 7, 9 und 11 zeichnet und dazwischen um 90 Grad dreht:

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

Probe von mehreren Größen

GuitarPicker
quelle
4

R, 102 Bytes

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

Beachten Sie, dass es effizienter ist, die Bedingung mit% in% auszudrücken, als mit i == 1 | j == 1 | ...

JDL
quelle
Es ist möglich, einen Charakter abzuspielen, wenn die Eingabe garantiert mehr als eins beträgt: 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 Bytes
Giuseppe
4

Haskell, 102 100 96 91 87 Bytes

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=' '
  • 2 Bytes gespart, dank flawr .
  • 4 weitere Bytes durch Verwendung von Listenverständnissen gespart.
  • 5 Bytes gespart, wenn man die Verbesserung von flawr mit kombiniertany
  • 4 Bytes gespeichert durch Ersetzen anymitelem

Ungolfed-Version:

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

Ich bin mir sicher, dass dies noch verbessert werden kann, aber das habe ich mir erst einmal ausgedacht.

Alte 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
quelle
2
Sie verwenden [1..s]zweimal, ich denke, Sie könnten das in definieren where.
Fehler
Dies würde ebenfalls 102 Bytes ergeben, da wir vor dem Schlüsselwort where ein zusätzliches Leerzeichen einfügen müssten. 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=' '
Sonntag,
1
Ah, richtig, aber Sie können <$>[1..s]in eine Funktion packen , richtig? Likec 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
Guter Punkt, das funktioniert in der Tat. :)
Sonntag,
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=' '
Fehler
3

Java, 130 Bytes

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

Testprogramm

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
quelle
+1! Ich würde angeben, dass es Java 8 ist, übrigens. Auch Sie können Golf spielen es ein wenig durch das Entfernen int vor jund Nutzung int i=0,j;statt. Sie können auch alle ||durch ersetzen |und die Klammern im Ternary-Check entfernen. Außerdem verwenden Sie s-1vier Mal, also würde ich dies in eine Variable einfügen. Sie können auch die ==0zu ändern <1. Insgesamt wird es also 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 Bytes ) ein bisschen kürzer als meine Java 7 Antwort , also netter Ansatz!
Kevin Cruijssen
1
@ KevinCruijssen Ich habe immer eine kürzere Antwort, aber mehr Raum für Verbesserungen als Sie LMAO. Gut golfen mein Freund.
Shaun Wild
Hehe xD Sie können auch die 116-Byte-Version verwenden. Es ist Ihr Code, nur noch ein bisschen mehr Golf gespielt. ;) Meine Java 7 Antwort (die leider länger ist) verwendet einen etwas anderen Ansatz. Wenn ich es in die 116-Byte-Version ändern würde, würde ich im Grunde Ihre Antwort stehlen, die ich nicht möchte.
Kevin Cruijssen
Es macht keinen Sinn, nur Ihre Golfs zu kopieren und einzufügen. Normalerweise poste ich eine kurze Verspottung und komme später wieder darauf zurück, um zu sehen, ob ich etwas übersehen habe, das Golf spielen könnte. Aber du hast es für mich ruiniert :( haha ​​jk
Shaun Wild
Oh, tut mir leid. Die meisten Tipps, die ich gegeben habe, sind in den Tipps zum Golfen in Java enthalten . Ich denke ich bin nur 2quick4u. ;)
Kevin Cruijssen
3

C 140 121 114 Bytes

19 Bytes danke an Quentin.

7 Bytes gespart durch Umschalten von einer doppelt verschachtelten Schleife auf eine Schleife.

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

Golfen Vorschläge willkommen.

Undichte Nonne
quelle
Ich programmiere nie in C, aber ist es nicht möglich, das int wie in Java in der ersten for-Schleife zu platzieren? Dhint i,j;for(i=0; zufor(int i=0,j;
Kevin Cruijssen
1
Das letzte Mal, als ich C benutzte, konnte man das nicht einmal int i,j;nach dem setzen scanf!
Neil
Probieren Sie n+~i-jusw.
Neil
GCC ist in Ordnung mit dem #includevollständigen Entfernen .
Quentin
@Neil Was meinst du damit, dass du das danach nicht mehr sagen konntest?
Undichte Nonne
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}}

Klobig, aber es funktioniert gut genug.

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

Golfvorschläge sind definitiv willkommen, es ist zu lange her, seit ich PowerShell habe.

fuandon
quelle
3

SILOS , 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

Probieren Sie es online!

Undichte Nonne
quelle
:) danke, dass du mehr Aufmerksamkeit auf diese Sprache
lenkst
1
@RohanJhunjhunwala Ich habe es genossen, darin zu programmieren. Vielen Dank, dass Sie eine so brillante Sprache erstellt haben.
Undichte Nonne
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

Da sed keine native Unterstützung für Zahlen hat, wird die Eingabe basierend darauf in unary angegeben Konsens . Die zweite Hälfte des Quadrats ist die erste Hälfte, die in umgekehrter Reihenfolge im Laderaum gespeichert wurde.

Lauf:

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

Ausgabe:

00000
00 00
0 0 0
00 00
00000
Seshoumara
quelle
3

Python, 89 Bytes

Das war ein Rückschritt! Ich habe Pythons Turtle-Modul verwendet.

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

Hier ist das Ergebnis, wenn n = 200 ist:

enter image description here

ren
quelle
1
+1 für Kreativität
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)

Lauf:

$ scala cross.scala 10

Technisch könnte ich das Druckmaterial entfernen und auf sowas gehen

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}

Dies würde 135 oder 121 Bytes ergeben, je nachdem, ob Sie die Funktionssyntax-Informationen zählen.

Lesbare 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
quelle
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]

Ändert eine Liste der Zeichen der Zeile, um a *an die erste, letzte, i-te und i-te bis letzte Stelle zu setzen. Die erste und letzte Reihe beginnen wie alle *, der Rest wie alle Leerzeichen. Funktioniert auch für Events. Ein lambdaAusdruck ist wahrscheinlich kürzer als eine Änderung, aber ich mag diese Methode.

xnor
quelle
2

Mathematica, 81 Bytes

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

Erstellt ein Koordinatensystem mit dem Ursprung in der Mitte und berechnet, wohin das *s gehen soll. Gibt ein Array von Zeichenfolgen aus, eine pro Zeile.

Greg Martin
quelle
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}

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: Dank Philipp Flenker 19 Bytes gespeichert.

Paul Schmitz
quelle
Da nachfolgende Zeilenumbrüche in Ordnung sind, brauchen Sie den Check fürsize==1
Philipp Flenker
1
@PhilippFlenker Richtig.
Paul Schmitz
1

Perl, 83 +1 = 84 Bytes

Laufen Sie mit der -nFlagge.

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

Die Literal Newline speichert 1 Byte über \noder $/.

Lesbar:

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

Der Code druckt die oberste Zeile und speichert sie in $c . Anschließend werden eine Reihe von Leerzeichen mit den entsprechenden Slots durch ersetzta s ersetzt werden, und druckt dann die oberste Zeile erneut.

Die Zuweisung zu der $\Variablen weist den Interpreter an, den Inhalt (ein Sternchen, eine neue Zeile und ein anderes Sternchen) nach jedem Ausdruck zu drucken. printDies geschieht jedoch NICHT nach einem say.

Gabriel Benamy
quelle
1

SmileBASIC, 46 Bytes

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

(Nein, SB verwendet KEINE 1-indizierten Grafiken ...)

12Me21
quelle
1

Kohle, 8 Bytes (nicht konkurrierend; Sprachnachbereitung)

GH+↘↑↙N*

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung: Zeichnet als Parameter für den PolygonHollowBefehl +ein Kästchen und erstellt dann mit den Pfeilen die Diagonalen. Es gibt einige andere Verknüpfung Zeichen , aber sie müssten neu definiert werden als nützlich zB Yentspricht ↖↗↓aber wenn es eqivalent war ↗↓↖dann Y+ausreichen würde.

Neil
quelle
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 IVSS
quelle
1

Kotlin , 123 116 Bytes

ändere wenn mit \ n zu 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()}}

Probieren Sie es online!

JohnWells
quelle